From 78f1bb3cc9d8c63fbaacea2e86f28590027d097f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Mon, 14 Feb 2022 23:48:12 +0100 Subject: [PATCH 01/23] Update sass submodule --- data/gnome-shell-sass | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/gnome-shell-sass b/data/gnome-shell-sass index b267200d..f0bbabd7 160000 --- a/data/gnome-shell-sass +++ b/data/gnome-shell-sass @@ -1 +1 @@ -Subproject commit b267200d75be0d0d4b9aa625b63e31cb068c059d +Subproject commit f0bbabd76b9631cbaa385d41cc26defc7d4b12ea From 31e48437ecfeadfae939200a2cf7dad882032c7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Mon, 14 Feb 2022 23:49:00 +0100 Subject: [PATCH 02/23] classic: Update list of sass sources --- data/meson.build | 1 - 1 file changed, 1 deletion(-) diff --git a/data/meson.build b/data/meson.build index 81547592..c22ed764 100644 --- a/data/meson.build +++ b/data/meson.build @@ -82,7 +82,6 @@ theme_sources = files( 'gnome-shell-sass/widgets/_slider.scss', 'gnome-shell-sass/widgets/_switcher-popup.scss', 'gnome-shell-sass/widgets/_switches.scss', - 'gnome-shell-sass/widgets/_tiled-previews.scss', 'gnome-shell-sass/widgets/_window-picker.scss', 'gnome-shell-sass/widgets/_workspace-switcher.scss', 'gnome-shell-sass/widgets/_workspace-thumbnails.scss' From 4fd2be744ee6a1728095145196e853a9e5f1f0b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20=C4=8Cernock=C3=BD?= Date: Wed, 16 Feb 2022 10:00:12 +0100 Subject: [PATCH 03/23] Updated Czech translation --- po/cs.po | 81 +++++++++++++++++++++++++++++++------------------------- 1 file changed, 45 insertions(+), 36 deletions(-) diff --git a/po/cs.po b/po/cs.po index 7d3258dc..ddc64000 100644 --- a/po/cs.po +++ b/po/cs.po @@ -2,15 +2,15 @@ # Copyright (C) 2011 gnome-shell-extensions's COPYRIGHT HOLDER # This file is distributed under the same license as the gnome-shell-extensions package. # Petr Kovar , 2013. -# Marek Černocký , 2011, 2012, 2013, 2014, 2015, 2017, 2019, 2020. +# Marek Černocký , 2011, 2012, 2013, 2014, 2015, 2017, 2019, 2020, 2022. # msgid "" msgstr "" "Project-Id-Version: gnome-shell-extensions\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/" "issues\n" -"POT-Creation-Date: 2020-05-28 00:55+0000\n" -"PO-Revision-Date: 2020-08-28 22:18+0200\n" +"POT-Creation-Date: 2021-11-06 14:08+0000\n" +"PO-Revision-Date: 2022-02-16 09:58+0100\n" "Last-Translator: Marek Černocký \n" "Language-Team: Czech \n" "Language: cs\n" @@ -20,19 +20,28 @@ msgstr "" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Generator: Gtranslator 2.91.6\n" -#: data/gnome-classic.desktop.in:3 data/gnome-classic.session.desktop.in:3 +#: data/gnome-classic.desktop.in:3 msgid "GNOME Classic" msgstr "GNOME klasik" -#: data/gnome-classic.desktop.in:4 +#: data/gnome-classic.desktop.in:4 data/gnome-classic-wayland.desktop.in:4 +#: data/gnome-classic-xorg.desktop.in:4 msgid "This session logs you into GNOME Classic" msgstr "Toto sezení vás přihlásí do GNOME klasik" -#: extensions/apps-menu/extension.js:113 +#: data/gnome-classic-wayland.desktop.in:3 +msgid "GNOME Classic on Wayland" +msgstr "GNOME klasik na Waylandu" + +#: data/gnome-classic-xorg.desktop.in:3 +msgid "GNOME Classic on Xorg" +msgstr "GNOME klasik na Xorg" + +#: extensions/apps-menu/extension.js:112 msgid "Favorites" msgstr "Oblíbené" -#: extensions/apps-menu/extension.js:369 +#: extensions/apps-menu/extension.js:366 msgid "Applications" msgstr "Aplikace" @@ -48,26 +57,26 @@ msgstr "" "Seznam řetězců, z nichž každý obsahuje ID aplikace (název souboru pracovní " "plochy), následovaný dvojtečkou a číslem pracovní plochy" -#: extensions/auto-move-windows/prefs.js:35 +#: extensions/auto-move-windows/prefs.js:34 msgid "Workspace Rules" msgstr "Pravidla pracovních ploch" -#: extensions/auto-move-windows/prefs.js:243 +#: extensions/auto-move-windows/prefs.js:236 msgid "Add Rule" msgstr "Přidat pravidlo" #. TRANSLATORS: %s is the filesystem name -#: extensions/drive-menu/extension.js:112 +#: extensions/drive-menu/extension.js:133 #: extensions/places-menu/placeDisplay.js:233 #, javascript-format msgid "Ejecting drive “%s” failed:" msgstr "Vysunutí disku „%s“ selhalo:" -#: extensions/drive-menu/extension.js:128 +#: extensions/drive-menu/extension.js:149 msgid "Removable devices" msgstr "Výměnná zařízení" -#: extensions/drive-menu/extension.js:155 +#: extensions/drive-menu/extension.js:171 msgid "Open Files" msgstr "Otevřít soubory" @@ -99,8 +108,8 @@ msgstr "" "přepíše výchozí chování shellu, který jej umisťuje dolů. Změna tohoto " "nastavení vyžaduje restart shellu, aby se projevila." -#: extensions/places-menu/extension.js:89 -#: extensions/places-menu/extension.js:93 +#: extensions/places-menu/extension.js:88 +#: extensions/places-menu/extension.js:91 msgid "Places" msgstr "Místa" @@ -143,47 +152,47 @@ msgstr "Název motivu" msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell" msgstr "Název motivu, který se má načíst z ~/.themes/name/gnome-shell" -#: extensions/window-list/extension.js:98 +#: extensions/window-list/extension.js:72 msgid "Close" msgstr "Zavřít" -#: extensions/window-list/extension.js:118 +#: extensions/window-list/extension.js:92 msgid "Unminimize" msgstr "Zrušit minimalizaci" -#: extensions/window-list/extension.js:118 +#: extensions/window-list/extension.js:92 msgid "Minimize" msgstr "Minimalizovat" -#: extensions/window-list/extension.js:125 +#: extensions/window-list/extension.js:99 msgid "Unmaximize" msgstr "Zrušit maximalizaci" -#: extensions/window-list/extension.js:125 +#: extensions/window-list/extension.js:99 msgid "Maximize" msgstr "Maximalizovat" -#: extensions/window-list/extension.js:428 +#: extensions/window-list/extension.js:434 msgid "Minimize all" msgstr "Minimalizovat všechna" -#: extensions/window-list/extension.js:434 +#: extensions/window-list/extension.js:440 msgid "Unminimize all" msgstr "Zrušit minimalizaci všech" -#: extensions/window-list/extension.js:440 +#: extensions/window-list/extension.js:446 msgid "Maximize all" msgstr "Maximalizovat všechna" -#: extensions/window-list/extension.js:448 +#: extensions/window-list/extension.js:454 msgid "Unmaximize all" msgstr "Zrušit maximalizaci všech" -#: extensions/window-list/extension.js:456 +#: extensions/window-list/extension.js:462 msgid "Close all" msgstr "Zavřít všechna" -#: extensions/window-list/extension.js:734 +#: extensions/window-list/extension.js:741 msgid "Window List" msgstr "Seznam oken" @@ -200,7 +209,7 @@ msgstr "" "hodnoty jsou „never“ (nikdy), „auto“ (automaticky) a „always“ (vždy)." #: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20 -#: extensions/window-list/prefs.js:100 +#: extensions/window-list/prefs.js:86 msgid "Show windows from all workspaces" msgstr "Zobrazovat okna ze všech pracovních ploch" @@ -220,40 +229,40 @@ msgstr "" "Zda zobrazovat seznam oken na všech připojených monitorech nebo jen na " "hlavním." -#: extensions/window-list/prefs.js:29 +#: extensions/window-list/prefs.js:39 msgid "Window Grouping" msgstr "Seskupování oken" -#: extensions/window-list/prefs.js:58 +#: extensions/window-list/prefs.js:63 msgid "Never group windows" msgstr "Nikdy neseskupovat okna" -#: extensions/window-list/prefs.js:59 +#: extensions/window-list/prefs.js:64 msgid "Group windows when space is limited" msgstr "Seskupovat okna při nedostatku místa" -#: extensions/window-list/prefs.js:60 +#: extensions/window-list/prefs.js:65 msgid "Always group windows" msgstr "Vždy seskupovat okna" -#: extensions/window-list/prefs.js:94 +#: extensions/window-list/prefs.js:81 msgid "Show on all monitors" msgstr "Zobrazovat na všech monitorech" -#: extensions/window-list/workspaceIndicator.js:207 -#: extensions/workspace-indicator/extension.js:213 +#: extensions/window-list/workspaceIndicator.js:249 +#: extensions/workspace-indicator/extension.js:254 msgid "Workspace Indicator" msgstr "Ukazatel pracovní plochy" -#: extensions/workspace-indicator/prefs.js:34 +#: extensions/workspace-indicator/prefs.js:33 msgid "Workspace Names" msgstr "Názvy pracovních ploch" -#: extensions/workspace-indicator/prefs.js:67 +#: extensions/workspace-indicator/prefs.js:66 #, javascript-format msgid "Workspace %d" msgstr "Pracovní plocha %d" -#: extensions/workspace-indicator/prefs.js:218 +#: extensions/workspace-indicator/prefs.js:207 msgid "Add Workspace" msgstr "Přidat pracovní plochu" From 22e4ca8925c2081457b19599f6b4c7587ed9db01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Mon, 14 Feb 2022 00:38:44 +0100 Subject: [PATCH 04/23] ci: Bump gnome-shell image We are about to make use of new language features, so update to an image that has the necessary tooling. Part-of: --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 18851e9a..b4a0f7f9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -2,7 +2,7 @@ include: - remote: 'https://gitlab.freedesktop.org/freedesktop/ci-templates/-/raw/bbe5232986c9b98eb1efe62484e07216f7d1a4df/templates/fedora.yml' - remote: "https://gitlab.freedesktop.org/freedesktop/ci-templates/-/raw/6f86b8bcb0cd5168c32779c4fea9a893c4a0c046/templates/ci-fairy.yml" -image: registry.gitlab.gnome.org/gnome/gnome-shell/fedora/34:2021-08-12.0 +image: registry.gitlab.gnome.org/gnome/gnome-shell/fedora/35:2022-02-18.0 stages: - pre_review From f6f34c634174845d0ef1b0dc1ea8293f0f62f88d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Mon, 14 Feb 2022 18:39:13 +0100 Subject: [PATCH 05/23] ci: Replace js78 job Provided we use the correct version of the SpiderMonkey shell, we can perform checks using the same engine that is used by gjs. However some engine features are opt-in, so the set of features enabled by gjs and js91 may differ. The obvious option for avoiding this is replacing js91 with gjs for tests. Switch to the newly added gjs-check-syntax script, which does precisely that. Part-of: --- .gitlab-ci.yml | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b4a0f7f9..9a9ba426 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -26,7 +26,6 @@ default: variables: FDO_UPSTREAM_REPO: GNOME/gnome-shell-extensions LINT_LOG: "eslint-report.xml" - JS_LOG: "js-report.txt" workflow: rules: @@ -103,12 +102,7 @@ js_check: stage: review <<: *prereview_req script: - - find extensions -name '*.js' -exec js78 -c '{}' ';' 2>&1 | tee $JS_LOG - - (! grep -q . $JS_LOG) - artifacts: - paths: - - ${JS_LOG} - when: on_failure + - gjs-check-syntax eslint: stage: review From b35df9062c3e1aa41f63a010bf487f2643acfa9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Thu, 10 Feb 2022 01:49:05 +0100 Subject: [PATCH 06/23] lint: Sync with gjs This is needed for eslint to recognize static class blocks. Part-of: --- lint/eslintrc-gjs.yml | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/lint/eslintrc-gjs.yml b/lint/eslintrc-gjs.yml index dadf40bd..97e728f9 100644 --- a/lint/eslintrc-gjs.yml +++ b/lint/eslintrc-gjs.yml @@ -2,8 +2,7 @@ # SPDX-License-Identifier: MIT OR LGPL-2.0-or-later # SPDX-FileCopyrightText: 2018 Claudio André env: - es6: true - es2020: true + es2021: true extends: 'eslint:recommended' plugins: - jsdoc @@ -86,7 +85,10 @@ rules: linebreak-style: - error - unix - lines-between-class-members: error + lines-between-class-members: + - error + - always + - exceptAfterSingleLine: true max-nested-callbacks: error max-statements-per-line: error new-parens: error @@ -259,5 +261,10 @@ globals: window: readonly TextEncoder: readonly TextDecoder: readonly + console: readonly + setTimeout: readonly + setInterval: readonly + clearTimeout: readonly + clearInterval: readonly parserOptions: - ecmaVersion: 2020 + ecmaVersion: 2022 From 0be8b1099566f1a3daaf9e1943b96afc94be478d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Sun, 13 Feb 2022 02:52:12 +0100 Subject: [PATCH 07/23] cleanup: Simplify action handling GTK4 has dedicated API for widget-specific actions, make use of that instead of explicitly managing an action group. Part-of: --- extensions/auto-move-windows/prefs.js | 50 ++++++++----------- extensions/workspace-indicator/prefs.js | 65 ++++++++++++------------- 2 files changed, 53 insertions(+), 62 deletions(-) diff --git a/extensions/auto-move-windows/prefs.js b/extensions/auto-move-windows/prefs.js index fd787af0..1e3603d9 100644 --- a/extensions/auto-move-windows/prefs.js +++ b/extensions/auto-move-windows/prefs.js @@ -14,6 +14,17 @@ const WORKSPACE_MAX = 36; // compiled in limit of mutter const AutoMoveSettingsWidget = GObject.registerClass( class AutoMoveSettingsWidget extends Adw.PreferencesGroup { + static _classInit(klass) { + super._classInit(klass); + + klass.install_action('rules.add', null, self => self._addNewRule()); + klass.install_action('rules.remove', 's', + (self, name, param) => self._removeRule(param.unpack())); + klass.install_action('rules.update', null, self => self._saveRules()); + + return klass; + } + _init() { super._init({ title: _('Workspace Rules'), @@ -27,29 +38,6 @@ class AutoMoveSettingsWidget extends Adw.PreferencesGroup { this._list.append(new NewRuleRow()); - this._actionGroup = new Gio.SimpleActionGroup(); - this._list.insert_action_group('rules', this._actionGroup); - - let action; - action = new Gio.SimpleAction({ name: 'add' }); - action.connect('activate', this._onAddActivated.bind(this)); - this._actionGroup.add_action(action); - - action = new Gio.SimpleAction({ - name: 'remove', - parameter_type: new GLib.VariantType('s'), - }); - action.connect('activate', this._onRemoveActivated.bind(this)); - this._actionGroup.add_action(action); - - action = new Gio.SimpleAction({ name: 'update' }); - action.connect('activate', () => { - this._settings.set_strv(SETTINGS_KEY, - this._getRuleRows().map(row => `${row.id}:${row.value}`)); - }); - this._actionGroup.add_action(action); - this._updateAction = action; - this._settings = ExtensionUtils.getSettings(); this._changedId = this._settings.connect('changed', this._sync.bind(this)); @@ -58,7 +46,7 @@ class AutoMoveSettingsWidget extends Adw.PreferencesGroup { this.connect('destroy', () => this._settings.run_dispose()); } - _onAddActivated() { + _addNewRule() { const dialog = new NewRuleDialog(this.get_root()); dialog.connect('response', (dlg, id) => { const appInfo = id === Gtk.ResponseType.OK @@ -74,15 +62,19 @@ class AutoMoveSettingsWidget extends Adw.PreferencesGroup { dialog.show(); } - _onRemoveActivated(action, param) { - const removed = param.deepUnpack(); + _removeRule(removedId) { this._settings.set_strv(SETTINGS_KEY, this._settings.get_strv(SETTINGS_KEY).filter(entry => { const [id] = entry.split(':'); - return id !== removed; + return id !== removedId; })); } + _saveRules() { + this._settings.set_strv(SETTINGS_KEY, + this._getRuleRows().map(row => `${row.id}:${row.value}`)); + } + _getRuleRows() { return [...this._list].filter(row => !!row.id); } @@ -95,7 +87,7 @@ class AutoMoveSettingsWidget extends Adw.PreferencesGroup { }); this._settings.block_signal_handler(this._changedId); - this._updateAction.enabled = false; + this.action_set_enabled('rules.update', false); newRules.forEach(({ id, value }, index) => { const row = oldRules.find(r => r.id === id); @@ -113,7 +105,7 @@ class AutoMoveSettingsWidget extends Adw.PreferencesGroup { removed.forEach(r => this._list.remove(r)); this._settings.unblock_signal_handler(this._changedId); - this._updateAction.enabled = true; + this.action_set_enabled('rules.update', true); } }); diff --git a/extensions/workspace-indicator/prefs.js b/extensions/workspace-indicator/prefs.js index 8734e1a2..8baa9de3 100644 --- a/extensions/workspace-indicator/prefs.js +++ b/extensions/workspace-indicator/prefs.js @@ -13,6 +13,19 @@ const WORKSPACE_KEY = 'workspace-names'; const WorkspaceSettingsWidget = GObject.registerClass( class WorkspaceSettingsWidget extends Adw.PreferencesGroup { + static _classInit(klass) { + klass = super._classInit(klass); + + klass.install_action('workspaces.add', null, + self => self._addNewName()); + klass.install_action('workspaces.remove', 's', + (self, name, param) => self._removeName(param.unpack())); + klass.install_action('workspaces.update', null, + self => self._saveNames()); + + return klass; + } + _init() { super._init({ title: _('Workspace Names'), @@ -27,39 +40,6 @@ class WorkspaceSettingsWidget extends Adw.PreferencesGroup { this._list.append(new NewWorkspaceRow()); - this._actionGroup = new Gio.SimpleActionGroup(); - this._list.insert_action_group('workspaces', this._actionGroup); - - let action; - action = new Gio.SimpleAction({ name: 'add' }); - action.connect('activate', () => { - const names = this._settings.get_strv(WORKSPACE_KEY); - this._settings.set_strv(WORKSPACE_KEY, [ - ...names, - _('Workspace %d').format(names.length + 1), - ]); - }); - this._actionGroup.add_action(action); - - action = new Gio.SimpleAction({ - name: 'remove', - parameter_type: new GLib.VariantType('s'), - }); - action.connect('activate', (a, param) => { - const removed = param.deepUnpack(); - this._settings.set_strv(WORKSPACE_KEY, - this._settings.get_strv(WORKSPACE_KEY) - .filter(name => name !== removed)); - }); - this._actionGroup.add_action(action); - - action = new Gio.SimpleAction({ name: 'update' }); - action.connect('activate', () => { - const names = this._getWorkspaceRows().map(row => row.name); - this._settings.set_strv(WORKSPACE_KEY, names); - }); - this._actionGroup.add_action(action); - this._settings = new Gio.Settings({ schema_id: WORKSPACE_SCHEMA, }); @@ -68,6 +48,25 @@ class WorkspaceSettingsWidget extends Adw.PreferencesGroup { this._sync(); } + _addNewName() { + const names = this._settings.get_strv(WORKSPACE_KEY); + this._settings.set_strv(WORKSPACE_KEY, [ + ...names, + _('Workspace %d').format(names.length + 1), + ]); + } + + _removeName(removedName) { + this._settings.set_strv(WORKSPACE_KEY, + this._settings.get_strv(WORKSPACE_KEY) + .filter(name => name !== removedName)); + } + + _saveNames() { + const names = this._getWorkspaceRows().map(row => row.name); + this._settings.set_strv(WORKSPACE_KEY, names); + } + _getWorkspaceRows() { return [...this._list].filter(row => row.name); } From 08db193b3132c92743c691fb8f86e52e0dedbfe0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Wed, 9 Feb 2022 23:52:39 +0100 Subject: [PATCH 08/23] cleanup: Use regular constructors in GObject subclasses As a side-effect of supporting class fields, regular constructors now work in GObject subclasses. Using _init() still works and there's no functional difference, but it's simply much nicer to use the same syntax for all classes. Part-of: --- extensions/apps-menu/extension.js | 12 +++---- extensions/auto-move-windows/prefs.js | 22 ++++++------ extensions/drive-menu/extension.js | 8 ++--- extensions/places-menu/extension.js | 8 ++--- extensions/user-theme/prefs.js | 8 ++--- extensions/window-list/extension.js | 38 ++++++++++---------- extensions/window-list/prefs.js | 4 +-- extensions/window-list/windowPicker.js | 28 +++++++-------- extensions/window-list/workspaceIndicator.js | 12 +++---- extensions/windowsNavigator/extension.js | 8 ++--- extensions/workspace-indicator/extension.js | 12 +++---- extensions/workspace-indicator/prefs.js | 12 +++---- 12 files changed, 86 insertions(+), 86 deletions(-) diff --git a/extensions/apps-menu/extension.js b/extensions/apps-menu/extension.js index b9c3fca3..ef4741d3 100644 --- a/extensions/apps-menu/extension.js +++ b/extensions/apps-menu/extension.js @@ -26,8 +26,8 @@ Gio._promisify(Gio._LocalFilePrototype, 'set_attributes_async', 'set_attributes_ var ApplicationMenuItem = GObject.registerClass( class ApplicationMenuItem extends PopupMenu.PopupBaseMenuItem { - _init(button, app) { - super._init(); + constructor(button, app) { + super(); this._app = app; this._button = button; @@ -97,8 +97,8 @@ class ApplicationMenuItem extends PopupMenu.PopupBaseMenuItem { var CategoryMenuItem = GObject.registerClass( class CategoryMenuItem extends PopupMenu.PopupBaseMenuItem { - _init(button, category) { - super._init(); + constructor(button, category) { + super(); this._category = category; this._button = button; @@ -355,8 +355,8 @@ Signals.addSignalMethods(DesktopTarget.prototype); let ApplicationsButton = GObject.registerClass( class ApplicationsButton extends PanelMenu.Button { - _init() { - super._init(1.0, null, false); + constructor() { + super(1.0, null, false); this.setMenu(new ApplicationsMenu(this, 1.0, St.Side.TOP, this)); Main.panel.menuManager.addMenu(this.menu); diff --git a/extensions/auto-move-windows/prefs.js b/extensions/auto-move-windows/prefs.js index 1e3603d9..908d3289 100644 --- a/extensions/auto-move-windows/prefs.js +++ b/extensions/auto-move-windows/prefs.js @@ -15,7 +15,7 @@ const WORKSPACE_MAX = 36; // compiled in limit of mutter const AutoMoveSettingsWidget = GObject.registerClass( class AutoMoveSettingsWidget extends Adw.PreferencesGroup { static _classInit(klass) { - super._classInit(klass); + klass = super._classInit(klass); klass.install_action('rules.add', null, self => self._addNewRule()); klass.install_action('rules.remove', 's', @@ -25,8 +25,8 @@ class AutoMoveSettingsWidget extends Adw.PreferencesGroup { return klass; } - _init() { - super._init({ + constructor() { + super({ title: _('Workspace Rules'), }); @@ -125,8 +125,8 @@ const WorkspaceSelector = GObject.registerClass({ return klass; } - _init() { - super._init(); + constructor() { + super(); this.layout_manager.spacing = 6; @@ -180,8 +180,8 @@ const RuleRow = GObject.registerClass({ 1, WORKSPACE_MAX, 1), }, }, class RuleRow extends Adw.ActionRow { - _init(appInfo, value) { - super._init({ + constructor(appInfo, value) { + super({ activatable: false, title: appInfo.get_display_name(), value, @@ -221,8 +221,8 @@ const RuleRow = GObject.registerClass({ const NewRuleRow = GObject.registerClass( class NewRuleRow extends Gtk.ListBoxRow { - _init() { - super._init({ + constructor() { + super({ action_name: 'rules.add', child: new Gtk.Image({ icon_name: 'list-add-symbolic', @@ -240,8 +240,8 @@ class NewRuleRow extends Gtk.ListBoxRow { const NewRuleDialog = GObject.registerClass( class NewRuleDialog extends Gtk.AppChooserDialog { - _init(parent) { - super._init({ + constructor(parent) { + super({ transient_for: parent, modal: true, }); diff --git a/extensions/drive-menu/extension.js b/extensions/drive-menu/extension.js index 75e7763e..7c74b4cd 100644 --- a/extensions/drive-menu/extension.js +++ b/extensions/drive-menu/extension.js @@ -14,8 +14,8 @@ Gio._promisify(Gio.File.prototype, 'query_filesystem_info_async'); var MountMenuItem = GObject.registerClass( class MountMenuItem extends PopupMenu.PopupBaseMenuItem { - _init(mount) { - super._init({ + constructor(mount) { + super({ style_class: 'drive-menu-item', }); @@ -135,8 +135,8 @@ class MountMenuItem extends PopupMenu.PopupBaseMenuItem { let DriveMenu = GObject.registerClass( class DriveMenu extends PanelMenu.Button { - _init() { - super._init(0.0, _('Removable devices')); + constructor() { + super(0.0, _('Removable devices')); let icon = new St.Icon({ icon_name: 'media-eject-symbolic', diff --git a/extensions/places-menu/extension.js b/extensions/places-menu/extension.js index 3fe9d9fe..d2636868 100644 --- a/extensions/places-menu/extension.js +++ b/extensions/places-menu/extension.js @@ -18,8 +18,8 @@ const PLACE_ICON_SIZE = 16; var PlaceMenuItem = GObject.registerClass( class PlaceMenuItem extends PopupMenu.PopupBaseMenuItem { - _init(info) { - super._init({ + constructor(info) { + super({ style_class: 'place-menu-item', }); this._info = info; @@ -84,8 +84,8 @@ const SECTIONS = [ let PlacesMenu = GObject.registerClass( class PlacesMenu extends PanelMenu.Button { - _init() { - super._init(0.0, _('Places')); + constructor() { + super(0.0, _('Places')); let label = new St.Label({ text: _('Places'), diff --git a/extensions/user-theme/prefs.js b/extensions/user-theme/prefs.js index 41776834..94e2d3e7 100644 --- a/extensions/user-theme/prefs.js +++ b/extensions/user-theme/prefs.js @@ -17,8 +17,8 @@ Gio._promisify(Gio.FileEnumerator.prototype, 'next_files_async'); const UserThemePrefsWidget = GObject.registerClass( class UserThemePrefsWidget extends Adw.PreferencesGroup { - _init() { - super._init({ title: 'Themes' }); + constructor() { + super({ title: 'Themes' }); this._actionGroup = new Gio.SimpleActionGroup(); this.insert_action_group('theme', this._actionGroup); @@ -105,13 +105,13 @@ class UserThemePrefsWidget extends Adw.PreferencesGroup { const ThemeRow = GObject.registerClass( class ThemeRow extends Adw.ActionRow { - _init(name) { + constructor(name) { const check = new Gtk.CheckButton({ action_name: 'theme.name', action_target: new GLib.Variant('s', name), }); - super._init({ + super({ title: name || 'Default', activatable_widget: check, }); diff --git a/extensions/window-list/extension.js b/extensions/window-list/extension.js index f872ef7e..7b833139 100644 --- a/extensions/window-list/extension.js +++ b/extensions/window-list/extension.js @@ -108,15 +108,15 @@ class WindowContextMenu extends PopupMenu.PopupMenu { const WindowTitle = GObject.registerClass( class WindowTitle extends St.BoxLayout { - _init(metaWindow) { - this._metaWindow = metaWindow; - - super._init({ + constructor(metaWindow) { + super({ style_class: 'window-button-box', x_expand: true, y_expand: true, }); + this._metaWindow = metaWindow; + this._icon = new St.Bin({ style_class: 'window-button-icon' }); this.add(this._icon); this.label_actor = new St.Label({ y_align: Clutter.ActorAlign.CENTER }); @@ -187,18 +187,18 @@ const BaseButton = GObject.registerClass({ false), }, }, class BaseButton extends St.Button { - _init(perMonitor, monitorIndex) { - this._perMonitor = perMonitor; - this._monitorIndex = monitorIndex; - this._ignoreWorkspace = false; - - super._init({ + constructor(perMonitor, monitorIndex) { + super({ style_class: 'window-button', can_focus: true, x_expand: true, button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE, }); + this._perMonitor = perMonitor; + this._monitorIndex = monitorIndex; + this._ignoreWorkspace = false; + this.connect('notify::allocation', this._updateIconGeometry.bind(this)); this.connect('clicked', this._onClicked.bind(this)); @@ -349,8 +349,8 @@ const BaseButton = GObject.registerClass({ const WindowButton = GObject.registerClass( class WindowButton extends BaseButton { - _init(metaWindow, perMonitor, monitorIndex) { - super._init(perMonitor, monitorIndex); + constructor(metaWindow, perMonitor, monitorIndex) { + super(perMonitor, monitorIndex); this.metaWindow = metaWindow; this._skipTaskbarId = metaWindow.connect('notify::skip-taskbar', () => { @@ -485,8 +485,8 @@ class AppContextMenu extends PopupMenu.PopupMenu { const AppButton = GObject.registerClass( class AppButton extends BaseButton { - _init(app, perMonitor, monitorIndex) { - super._init(perMonitor, monitorIndex); + constructor(app, perMonitor, monitorIndex) { + super(perMonitor, monitorIndex); this.app = app; this._updateVisibility(); @@ -675,11 +675,8 @@ class AppButton extends BaseButton { const WindowList = GObject.registerClass( class WindowList extends St.Widget { - _init(perMonitor, monitor) { - this._perMonitor = perMonitor; - this._monitor = monitor; - - super._init({ + constructor(perMonitor, monitor) { + super({ name: 'panel', style_class: 'bottom-panel solid', reactive: true, @@ -688,6 +685,9 @@ class WindowList extends St.Widget { }); this.connect('destroy', this._onDestroy.bind(this)); + this._perMonitor = perMonitor; + this._monitor = monitor; + let box = new St.BoxLayout({ x_expand: true, y_expand: true }); this.add_actor(box); diff --git a/extensions/window-list/prefs.js b/extensions/window-list/prefs.js index ab581520..e6c8750d 100644 --- a/extensions/window-list/prefs.js +++ b/extensions/window-list/prefs.js @@ -14,8 +14,8 @@ function init() { const WindowListPrefsWidget = GObject.registerClass( class WindowListPrefsWidget extends Adw.PreferencesPage { - _init() { - super._init(); + constructor() { + super(); this._actionGroup = new Gio.SimpleActionGroup(); this.insert_action_group('window-list', this._actionGroup); diff --git a/extensions/window-list/windowPicker.js b/extensions/window-list/windowPicker.js index 658a5db5..e4c2c98b 100644 --- a/extensions/window-list/windowPicker.js +++ b/extensions/window-list/windowPicker.js @@ -15,11 +15,10 @@ const { let MyWorkspacesDisplay = GObject.registerClass( class MyWorkspacesDisplay extends WorkspacesDisplay { - _init(controls, overviewAdjustment) { + constructor(controls, overviewAdjustment) { let workspaceManager = global.workspace_manager; - this._overviewAdjustment = overviewAdjustment; - this._workspaceAdjustment = new St.Adjustment({ + const workspaceAdjustment = new St.Adjustment({ value: workspaceManager.get_active_workspace_index(), lower: 0, page_increment: 1, @@ -28,14 +27,15 @@ class MyWorkspacesDisplay extends WorkspacesDisplay { upper: workspaceManager.n_workspaces, }); + super(controls, workspaceAdjustment, overviewAdjustment); + + this._workspaceAdjustment = workspaceAdjustment; + this._workspaceAdjustment.actor = this; + this._nWorkspacesChangedId = workspaceManager.connect('notify::n-workspaces', this._updateAdjustment.bind(this)); - super._init(controls, this._workspaceAdjustment, this._overviewAdjustment); - - this._workspaceAdjustment.actor = this; - this.add_constraint( new Layout.MonitorConstraint({ primary: true, @@ -79,8 +79,8 @@ class MyWorkspacesDisplay extends WorkspacesDisplay { const MyWorkspace = GObject.registerClass( class MyWorkspace extends Workspace.Workspace { - _init(...args) { - super._init(...args); + constructor(...args) { + super(...args); this._adjChangedId = this._overviewAdjustment.connect('notify::value', () => { @@ -145,15 +145,15 @@ var WindowPicker = GObject.registerClass({ 'open-state-changed': { param_types: [GObject.TYPE_BOOLEAN] }, }, }, class extends Clutter.Actor { - _init() { + constructor() { + super({ reactive: true }); + this._visible = false; this._modal = false; this._overlayKeyId = 0; this._stageKeyPressId = 0; - super._init({ reactive: true }); - this._adjustment = new OverviewAdjustment(this); this.connect('destroy', this._onDestroy.bind(this)); @@ -315,7 +315,7 @@ var WindowPicker = GObject.registerClass({ var WindowPickerToggle = GObject.registerClass( class WindowPickerToggle extends St.Button { - _init() { + constructor() { let iconBin = new St.Widget({ layout_manager: new Clutter.BinLayout(), }); @@ -327,7 +327,7 @@ class WindowPickerToggle extends St.Button { x_align: Clutter.ActorAlign.CENTER, y_align: Clutter.ActorAlign.CENTER, })); - super._init({ + super({ style_class: 'window-picker-toggle', child: iconBin, visible: !Main.sessionMode.hasOverview, diff --git a/extensions/window-list/workspaceIndicator.js b/extensions/window-list/workspaceIndicator.js index 06646cc9..610c3aab 100644 --- a/extensions/window-list/workspaceIndicator.js +++ b/extensions/window-list/workspaceIndicator.js @@ -16,8 +16,8 @@ const MAX_THUMBNAILS = 6; let WindowPreview = GObject.registerClass( class WindowPreview extends St.Button { - _init(window) { - super._init({ + constructor(window) { + super({ style_class: 'window-list-window-preview', }); @@ -103,8 +103,8 @@ class WorkspaceLayout extends Clutter.LayoutManager { let WorkspaceThumbnail = GObject.registerClass( class WorkspaceThumbnail extends St.Button { - _init(index) { - super._init({ + constructor(index) { + super({ style_class: 'workspace', child: new Clutter.Actor({ layout_manager: new WorkspaceLayout(), @@ -245,8 +245,8 @@ class WorkspaceThumbnail extends St.Button { var WorkspaceIndicator = GObject.registerClass( class WorkspaceIndicator extends PanelMenu.Button { - _init() { - super._init(0.0, _('Workspace Indicator'), true); + constructor() { + super(0.0, _('Workspace Indicator'), true); this.setMenu(new PopupMenu.PopupMenu(this, 0.0, St.Side.BOTTOM)); this.add_style_class_name('window-list-workspace-indicator'); this.remove_style_class_name('panel-button'); diff --git a/extensions/windowsNavigator/extension.js b/extensions/windowsNavigator/extension.js index a2cab423..c3c0faf0 100644 --- a/extensions/windowsNavigator/extension.js +++ b/extensions/windowsNavigator/extension.js @@ -11,8 +11,8 @@ const WINDOW_SLOT = 4; var MyWorkspace = GObject.registerClass( class MyWorkspace extends Workspace.Workspace { - _init(...args) { - super._init(...args); + constructor(...args) { + super(...args); if (this.metaWorkspace && this.metaWorkspace.index() < 9) { this._tip = new St.Label({ @@ -119,8 +119,8 @@ class MyWorkspace extends Workspace.Workspace { var MyWorkspacesView = GObject.registerClass( class MyWorkspacesView extends WorkspacesView.WorkspacesView { - _init(...args) { - super._init(...args); + constructor(...args) { + super(...args); this._pickWorkspace = false; this._pickWindow = false; diff --git a/extensions/workspace-indicator/extension.js b/extensions/workspace-indicator/extension.js index a2c95b6a..07d01a46 100644 --- a/extensions/workspace-indicator/extension.js +++ b/extensions/workspace-indicator/extension.js @@ -21,8 +21,8 @@ const MAX_THUMBNAILS = 6; let WindowPreview = GObject.registerClass( class WindowPreview extends St.Button { - _init(window) { - super._init({ + constructor(window) { + super({ style_class: 'workspace-indicator-window-preview', }); @@ -108,8 +108,8 @@ class WorkspaceLayout extends Clutter.LayoutManager { let WorkspaceThumbnail = GObject.registerClass( class WorkspaceThumbnail extends St.Button { - _init(index) { - super._init({ + constructor(index) { + super({ style_class: 'workspace', child: new Clutter.Actor({ layout_manager: new WorkspaceLayout(), @@ -250,8 +250,8 @@ class WorkspaceThumbnail extends St.Button { let WorkspaceIndicator = GObject.registerClass( class WorkspaceIndicator extends PanelMenu.Button { - _init() { - super._init(0.0, _('Workspace Indicator')); + constructor() { + super(0.0, _('Workspace Indicator')); let container = new St.Widget({ layout_manager: new Clutter.BinLayout(), diff --git a/extensions/workspace-indicator/prefs.js b/extensions/workspace-indicator/prefs.js index 8baa9de3..dcc38485 100644 --- a/extensions/workspace-indicator/prefs.js +++ b/extensions/workspace-indicator/prefs.js @@ -26,8 +26,8 @@ class WorkspaceSettingsWidget extends Adw.PreferencesGroup { return klass; } - _init() { - super._init({ + constructor() { + super({ title: _('Workspace Names'), }); @@ -89,8 +89,8 @@ class WorkspaceSettingsWidget extends Adw.PreferencesGroup { const WorkspaceRow = GObject.registerClass( class WorkspaceRow extends Adw.PreferencesRow { - _init(name) { - super._init({ name }); + constructor(name) { + super({ name }); const box = new Gtk.Box({ spacing: 12, @@ -167,8 +167,8 @@ class WorkspaceRow extends Adw.PreferencesRow { const NewWorkspaceRow = GObject.registerClass( class NewWorkspaceRow extends Adw.PreferencesRow { - _init() { - super._init({ + constructor() { + super({ action_name: 'workspaces.add', child: new Gtk.Image({ icon_name: 'list-add-symbolic', From 9f673f27ef5c652af4773c47580015cc54bfdf11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Thu, 10 Feb 2022 01:49:22 +0100 Subject: [PATCH 09/23] cleanup: Use static class blocks for gtype registration gjs enabled support for static class blocks, which gives us a less error-prone and more readable alternative to _classInit(), provided we make sure to call registerClass() first. Part-of: --- extensions/apps-menu/extension.js | 21 +++++-- extensions/auto-move-windows/prefs.js | 59 +++++++++++--------- extensions/drive-menu/extension.js | 14 +++-- extensions/places-menu/extension.js | 14 +++-- extensions/user-theme/prefs.js | 14 +++-- extensions/window-list/extension.js | 54 +++++++++++------- extensions/window-list/prefs.js | 7 ++- extensions/window-list/windowPicker.js | 44 ++++++++++----- extensions/window-list/workspaceIndicator.js | 31 ++++++---- extensions/windowsNavigator/extension.js | 14 +++-- extensions/workspace-indicator/extension.js | 28 +++++++--- extensions/workspace-indicator/prefs.js | 29 +++++----- 12 files changed, 212 insertions(+), 117 deletions(-) diff --git a/extensions/apps-menu/extension.js b/extensions/apps-menu/extension.js index ef4741d3..cc1d697c 100644 --- a/extensions/apps-menu/extension.js +++ b/extensions/apps-menu/extension.js @@ -24,8 +24,11 @@ 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'); -var ApplicationMenuItem = GObject.registerClass( class ApplicationMenuItem extends PopupMenu.PopupBaseMenuItem { + static { + GObject.registerClass(this); + } + constructor(button, app) { super(); this._app = app; @@ -93,10 +96,13 @@ class ApplicationMenuItem extends PopupMenu.PopupBaseMenuItem { icon.style_class = 'icon-dropshadow'; this._iconBin.set_child(icon); } -}); +} -var CategoryMenuItem = GObject.registerClass( class CategoryMenuItem extends PopupMenu.PopupBaseMenuItem { + static { + GObject.registerClass(this); + } + constructor(button, category) { super(); this._category = category; @@ -214,7 +220,7 @@ class CategoryMenuItem extends PopupMenu.PopupBaseMenuItem { this._button.selectCategory(this._category); this._button.scrollToCatButton(this); } -}); +} class ApplicationsMenu extends PopupMenu.PopupMenu { constructor(sourceActor, arrowAlignment, arrowSide, button) { @@ -353,8 +359,11 @@ class DesktopTarget { } Signals.addSignalMethods(DesktopTarget.prototype); -let ApplicationsButton = GObject.registerClass( class ApplicationsButton extends PanelMenu.Button { + static { + GObject.registerClass(this); + } + constructor() { super(1.0, null, false); @@ -665,7 +674,7 @@ class ApplicationsButton extends PanelMenu.Button { return applist; } -}); +} let appsMenuButton; diff --git a/extensions/auto-move-windows/prefs.js b/extensions/auto-move-windows/prefs.js index 908d3289..793db067 100644 --- a/extensions/auto-move-windows/prefs.js +++ b/extensions/auto-move-windows/prefs.js @@ -12,17 +12,14 @@ const SETTINGS_KEY = 'application-list'; const WORKSPACE_MAX = 36; // compiled in limit of mutter -const AutoMoveSettingsWidget = GObject.registerClass( class AutoMoveSettingsWidget extends Adw.PreferencesGroup { - static _classInit(klass) { - klass = super._classInit(klass); + static { + GObject.registerClass(this); - klass.install_action('rules.add', null, self => self._addNewRule()); - klass.install_action('rules.remove', 's', + this.install_action('rules.add', null, self => self._addNewRule()); + this.install_action('rules.remove', 's', (self, name, param) => self._removeRule(param.unpack())); - klass.install_action('rules.update', null, self => self._saveRules()); - - return klass; + this.install_action('rules.update', null, self => self._saveRules()); } constructor() { @@ -107,22 +104,20 @@ class AutoMoveSettingsWidget extends Adw.PreferencesGroup { this._settings.unblock_signal_handler(this._changedId); this.action_set_enabled('rules.update', true); } -}); +} -const WorkspaceSelector = GObject.registerClass({ - Properties: { +class WorkspaceSelector extends Gtk.Widget { + static [GObject.properties] = { 'number': GObject.ParamSpec.uint( 'number', 'number', 'number', GObject.ParamFlags.READWRITE, 1, WORKSPACE_MAX, 1), - }, -}, class WorkspaceSelector extends Gtk.Widget { - static _classInit(klass) { - super._classInit(klass); + }; - klass.set_layout_manager_type(Gtk.BoxLayout); + static { + GObject.registerClass(this); - return klass; + this.set_layout_manager_type(Gtk.BoxLayout); } constructor() { @@ -166,10 +161,10 @@ const WorkspaceSelector = GObject.registerClass({ this._decButton.sensitive = this.number > 1; this._incButton.sensitive = this.number < WORKSPACE_MAX; } -}); +} -const RuleRow = GObject.registerClass({ - Properties: { +class RuleRow extends Adw.ActionRow { + static [GObject.properties] = { 'id': GObject.ParamSpec.string( 'id', 'id', 'id', GObject.ParamFlags.READABLE, @@ -178,8 +173,12 @@ const RuleRow = GObject.registerClass({ 'value', 'value', 'value', GObject.ParamFlags.READWRITE, 1, WORKSPACE_MAX, 1), - }, -}, class RuleRow extends Adw.ActionRow { + }; + + static { + GObject.registerClass(this); + } + constructor(appInfo, value) { super({ activatable: false, @@ -217,10 +216,13 @@ const RuleRow = GObject.registerClass({ get id() { return this._appInfo.get_id(); } -}); +} -const NewRuleRow = GObject.registerClass( class NewRuleRow extends Gtk.ListBoxRow { + static { + GObject.registerClass(this); + } + constructor() { super({ action_name: 'rules.add', @@ -236,10 +238,13 @@ class NewRuleRow extends Gtk.ListBoxRow { this.update_property( [Gtk.AccessibleProperty.LABEL], [_('Add Rule')]); } -}); +} -const NewRuleDialog = GObject.registerClass( class NewRuleDialog extends Gtk.AppChooserDialog { + static { + GObject.registerClass(this); + } + constructor(parent) { super({ transient_for: parent, @@ -264,7 +269,7 @@ class NewRuleDialog extends Gtk.AppChooserDialog { this.set_response_sensitive(Gtk.ResponseType.OK, appInfo && !rules.some(i => i.startsWith(appInfo.get_id()))); } -}); +} /** */ function init() { diff --git a/extensions/drive-menu/extension.js b/extensions/drive-menu/extension.js index 7c74b4cd..d054f879 100644 --- a/extensions/drive-menu/extension.js +++ b/extensions/drive-menu/extension.js @@ -12,8 +12,11 @@ const _ = ExtensionUtils.gettext; Gio._promisify(Gio.File.prototype, 'query_filesystem_info_async'); -var MountMenuItem = GObject.registerClass( class MountMenuItem extends PopupMenu.PopupBaseMenuItem { + static { + GObject.registerClass(this); + } + constructor(mount) { super({ style_class: 'drive-menu-item', @@ -131,10 +134,13 @@ class MountMenuItem extends PopupMenu.PopupBaseMenuItem { super.activate(event); } -}); +} -let DriveMenu = GObject.registerClass( class DriveMenu extends PanelMenu.Button { + static { + GObject.registerClass(this); + } + constructor() { super(0.0, _('Removable devices')); @@ -204,7 +210,7 @@ class DriveMenu extends PanelMenu.Button { super._onDestroy(); } -}); +} /** */ function init() { diff --git a/extensions/places-menu/extension.js b/extensions/places-menu/extension.js index d2636868..7c51220c 100644 --- a/extensions/places-menu/extension.js +++ b/extensions/places-menu/extension.js @@ -16,8 +16,11 @@ const N_ = x => x; const PLACE_ICON_SIZE = 16; -var PlaceMenuItem = GObject.registerClass( class PlaceMenuItem extends PopupMenu.PopupBaseMenuItem { + static { + GObject.registerClass(this); + } + constructor(info) { super({ style_class: 'place-menu-item', @@ -73,7 +76,7 @@ class PlaceMenuItem extends PopupMenu.PopupBaseMenuItem { this._icon.gicon = info.icon; this._label.text = info.name; } -}); +} const SECTIONS = [ 'special', @@ -82,8 +85,11 @@ const SECTIONS = [ 'network', ]; -let PlacesMenu = GObject.registerClass( class PlacesMenu extends PanelMenu.Button { + static { + GObject.registerClass(this); + } + constructor() { super(0.0, _('Places')); @@ -130,7 +136,7 @@ class PlacesMenu extends PanelMenu.Button { this._sections[id].actor.visible = places.length > 0; } -}); +} /** */ function init() { diff --git a/extensions/user-theme/prefs.js b/extensions/user-theme/prefs.js index 94e2d3e7..3876c5a3 100644 --- a/extensions/user-theme/prefs.js +++ b/extensions/user-theme/prefs.js @@ -15,8 +15,11 @@ Gio._promisify(Gio.File.prototype, 'enumerate_children_async'); Gio._promisify(Gio.File.prototype, 'query_info_async'); Gio._promisify(Gio.FileEnumerator.prototype, 'next_files_async'); -const UserThemePrefsWidget = GObject.registerClass( class UserThemePrefsWidget extends Adw.PreferencesGroup { + static { + GObject.registerClass(this); + } + constructor() { super({ title: 'Themes' }); @@ -101,10 +104,13 @@ class UserThemePrefsWidget extends Adw.PreferencesGroup { return fileInfos.map(info => info.get_name()); } -}); +} -const ThemeRow = GObject.registerClass( class ThemeRow extends Adw.ActionRow { + static { + GObject.registerClass(this); + } + constructor(name) { const check = new Gtk.CheckButton({ action_name: 'theme.name', @@ -117,7 +123,7 @@ class ThemeRow extends Adw.ActionRow { }); this.add_prefix(check); } -}); +} /** */ function init() { diff --git a/extensions/window-list/extension.js b/extensions/window-list/extension.js index 7b833139..f7e0a418 100644 --- a/extensions/window-list/extension.js +++ b/extensions/window-list/extension.js @@ -106,8 +106,11 @@ class WindowContextMenu extends PopupMenu.PopupMenu { } } -const WindowTitle = GObject.registerClass( class WindowTitle extends St.BoxLayout { + static { + GObject.registerClass(this); + } + constructor(metaWindow) { super({ style_class: 'window-button-box', @@ -175,18 +178,21 @@ class WindowTitle extends St.BoxLayout { this._metaWindow.disconnect(this._notifyWmClass); this._metaWindow.disconnect(this._notifyAppId); } -}); +} +class BaseButton extends St.Button { + static { + GObject.registerClass({ + GTypeFlags: GObject.TypeFlags.ABSTRACT, + Properties: { + 'ignore-workspace': GObject.ParamSpec.boolean( + 'ignore-workspace', 'ignore-workspace', 'ignore-workspace', + GObject.ParamFlags.READWRITE, + false), + }, + }, this); + } -const BaseButton = GObject.registerClass({ - GTypeFlags: GObject.TypeFlags.ABSTRACT, - Properties: { - 'ignore-workspace': GObject.ParamSpec.boolean( - 'ignore-workspace', 'ignore-workspace', 'ignore-workspace', - GObject.ParamFlags.READWRITE, - false), - }, -}, class BaseButton extends St.Button { constructor(perMonitor, monitorIndex) { super({ style_class: 'window-button', @@ -344,11 +350,13 @@ const BaseButton = GObject.registerClass({ global.display.disconnect(this._windowLeftMonitorId); this._windowLeftMonitorId = 0; } -}); +} - -const WindowButton = GObject.registerClass( class WindowButton extends BaseButton { + static { + GObject.registerClass(this); + } + constructor(metaWindow, perMonitor, monitorIndex) { super(perMonitor, monitorIndex); @@ -422,8 +430,7 @@ class WindowButton extends BaseButton { global.display.disconnect(this._notifyFocusId); this._contextMenu.destroy(); } -}); - +} class AppContextMenu extends PopupMenu.PopupMenu { constructor(source) { @@ -483,8 +490,11 @@ class AppContextMenu extends PopupMenu.PopupMenu { } } -const AppButton = GObject.registerClass( class AppButton extends BaseButton { + static { + GObject.registerClass(this); + } + constructor(app, perMonitor, monitorIndex) { super(perMonitor, monitorIndex); @@ -670,11 +680,13 @@ class AppButton extends BaseButton { this.app.disconnect(this._windowsChangedId); this._menu.destroy(); } -}); +} - -const WindowList = GObject.registerClass( class WindowList extends St.Widget { + static { + GObject.registerClass(this); + } + constructor(perMonitor, monitor) { super({ name: 'panel', @@ -1082,7 +1094,7 @@ class WindowList extends St.Widget { for (let i = 0; i < windows.length; i++) windows[i].metaWindow.set_icon_geometry(null); } -}); +} class Extension { constructor() { diff --git a/extensions/window-list/prefs.js b/extensions/window-list/prefs.js index e6c8750d..02b52341 100644 --- a/extensions/window-list/prefs.js +++ b/extensions/window-list/prefs.js @@ -12,8 +12,11 @@ function init() { ExtensionUtils.initTranslations(); } -const WindowListPrefsWidget = GObject.registerClass( class WindowListPrefsWidget extends Adw.PreferencesPage { + static { + GObject.registerClass(this); + } + constructor() { super(); @@ -79,7 +82,7 @@ class WindowListPrefsWidget extends Adw.PreferencesPage { row.add_suffix(toggle); miscGroup.add(row); } -}); +} /** * @returns {Gtk.Widget} - the prefs widget diff --git a/extensions/window-list/windowPicker.js b/extensions/window-list/windowPicker.js index e4c2c98b..db331565 100644 --- a/extensions/window-list/windowPicker.js +++ b/extensions/window-list/windowPicker.js @@ -13,8 +13,11 @@ const { ControlsState, } = imports.ui.overviewControls; -let MyWorkspacesDisplay = GObject.registerClass( class MyWorkspacesDisplay extends WorkspacesDisplay { + static { + GObject.registerClass(this); + } + constructor(controls, overviewAdjustment) { let workspaceManager = global.workspace_manager; @@ -75,10 +78,13 @@ class MyWorkspacesDisplay extends WorkspacesDisplay { super._onDestroy(); } -}); +} -const MyWorkspace = GObject.registerClass( class MyWorkspace extends Workspace.Workspace { + static { + GObject.registerClass(this); + } + constructor(...args) { super(...args); @@ -102,10 +108,13 @@ class MyWorkspace extends Workspace.Workspace { this._overviewAdjustment.disconnect(this._adjChangedId); this._adjChangedId = 0; } -}); +} -const MyWorkspaceBackground = GObject.registerClass( class MyWorkspaceBackground extends Workspace.WorkspaceBackground { + static { + GObject.registerClass(this); + } + _updateBorderRadius() { } @@ -138,13 +147,17 @@ class MyWorkspaceBackground extends Workspace.WorkspaceBackground { offsets.top + contentHeight + offsets.bottom); this._backgroundGroup.allocate(contentBox); } -}); +} -var WindowPicker = GObject.registerClass({ - Signals: { +var WindowPicker = class WindowPicker extends Clutter.Actor { + static [GObject.signals] = { 'open-state-changed': { param_types: [GObject.TYPE_BOOLEAN] }, - }, -}, class extends Clutter.Actor { + }; + + static { + GObject.registerClass(this); + } + constructor() { super({ reactive: true }); @@ -311,10 +324,13 @@ var WindowPicker = GObject.registerClass({ global.stage.disconnect(this._stageKeyPressId); this._stageKeyPressId = 0; } -}); +}; + +var WindowPickerToggle = class WindowPickerToggle extends St.Button { + static { + GObject.registerClass(this); + } -var WindowPickerToggle = GObject.registerClass( -class WindowPickerToggle extends St.Button { constructor() { let iconBin = new St.Widget({ layout_manager: new Clutter.BinLayout(), @@ -345,4 +361,4 @@ class WindowPickerToggle extends St.Button { this.checked = Main.windowPicker.visible; }); } -}); +}; diff --git a/extensions/window-list/workspaceIndicator.js b/extensions/window-list/workspaceIndicator.js index 610c3aab..36d66bb6 100644 --- a/extensions/window-list/workspaceIndicator.js +++ b/extensions/window-list/workspaceIndicator.js @@ -14,8 +14,11 @@ const TOOLTIP_ANIMATION_TIME = 150; const MAX_THUMBNAILS = 6; -let WindowPreview = GObject.registerClass( class WindowPreview extends St.Button { + static { + GObject.registerClass(this); + } + constructor(window) { super({ style_class: 'window-list-window-preview', @@ -69,10 +72,13 @@ class WindowPreview extends St.Button { this._window.window_type !== Meta.WindowType.DESKTOP && this._window.showing_on_its_workspace(); } -}); +} -let WorkspaceLayout = GObject.registerClass( class WorkspaceLayout extends Clutter.LayoutManager { + static { + GObject.registerClass(this); + } + vfunc_get_preferred_width() { return [0, 0]; } @@ -99,10 +105,13 @@ class WorkspaceLayout extends Clutter.LayoutManager { child.allocate(childBox); } } -}); +} -let WorkspaceThumbnail = GObject.registerClass( class WorkspaceThumbnail extends St.Button { + static { + GObject.registerClass(this); + } + constructor(index) { super({ style_class: 'workspace', @@ -241,10 +250,13 @@ class WorkspaceThumbnail extends St.Button { this._workspace.disconnect(this._windowRemovedId); global.display.disconnect(this._restackedId); } -}); +} + +var WorkspaceIndicator = class WorkspaceIndicator extends PanelMenu.Button { + static { + GObject.registerClass(this); + } -var WorkspaceIndicator = GObject.registerClass( -class WorkspaceIndicator extends PanelMenu.Button { constructor() { super(0.0, _('Workspace Indicator'), true); this.setMenu(new PopupMenu.PopupMenu(this, 0.0, St.Side.BOTTOM)); @@ -435,5 +447,4 @@ class WorkspaceIndicator extends PanelMenu.Button { let newIndex = this._currentWorkspace + diff; this._activate(newIndex); } -}); - +}; diff --git a/extensions/windowsNavigator/extension.js b/extensions/windowsNavigator/extension.js index c3c0faf0..f2794305 100644 --- a/extensions/windowsNavigator/extension.js +++ b/extensions/windowsNavigator/extension.js @@ -9,8 +9,11 @@ const WorkspacesView = imports.ui.workspacesView; const WINDOW_SLOT = 4; -var MyWorkspace = GObject.registerClass( class MyWorkspace extends Workspace.Workspace { + static { + GObject.registerClass(this); + } + constructor(...args) { super(...args); @@ -115,10 +118,13 @@ class MyWorkspace extends Workspace.Workspace { return clone; } -}); +} -var MyWorkspacesView = GObject.registerClass( class MyWorkspacesView extends WorkspacesView.WorkspacesView { + static { + GObject.registerClass(this); + } + constructor(...args) { super(...args); @@ -243,7 +249,7 @@ class MyWorkspacesView extends WorkspacesView.WorkspacesView { } return false; } -}); +} class Extension { constructor() { diff --git a/extensions/workspace-indicator/extension.js b/extensions/workspace-indicator/extension.js index 07d01a46..e424a69a 100644 --- a/extensions/workspace-indicator/extension.js +++ b/extensions/workspace-indicator/extension.js @@ -19,8 +19,11 @@ const TOOLTIP_ANIMATION_TIME = 150; const MAX_THUMBNAILS = 6; -let WindowPreview = GObject.registerClass( class WindowPreview extends St.Button { + static { + GObject.registerClass(this); + } + constructor(window) { super({ style_class: 'workspace-indicator-window-preview', @@ -74,10 +77,13 @@ class WindowPreview extends St.Button { this._window.window_type !== Meta.WindowType.DESKTOP && this._window.showing_on_its_workspace(); } -}); +} -let WorkspaceLayout = GObject.registerClass( class WorkspaceLayout extends Clutter.LayoutManager { + static { + GObject.registerClass(this); + } + vfunc_get_preferred_width() { return [0, 0]; } @@ -104,10 +110,13 @@ class WorkspaceLayout extends Clutter.LayoutManager { child.allocate(childBox); } } -}); +} -let WorkspaceThumbnail = GObject.registerClass( class WorkspaceThumbnail extends St.Button { + static { + GObject.registerClass(this); + } + constructor(index) { super({ style_class: 'workspace', @@ -246,10 +255,13 @@ class WorkspaceThumbnail extends St.Button { this._workspace.disconnect(this._windowRemovedId); global.display.disconnect(this._restackedId); } -}); +} -let WorkspaceIndicator = GObject.registerClass( class WorkspaceIndicator extends PanelMenu.Button { + static { + GObject.registerClass(this); + } + constructor() { super(0.0, _('Workspace Indicator')); @@ -440,7 +452,7 @@ class WorkspaceIndicator extends PanelMenu.Button { let newIndex = global.workspace_manager.get_active_workspace_index() + diff; this._activate(newIndex); } -}); +} /** */ function init() { diff --git a/extensions/workspace-indicator/prefs.js b/extensions/workspace-indicator/prefs.js index dcc38485..bf64fed7 100644 --- a/extensions/workspace-indicator/prefs.js +++ b/extensions/workspace-indicator/prefs.js @@ -11,19 +11,16 @@ const N_ = e => e; const WORKSPACE_SCHEMA = 'org.gnome.desktop.wm.preferences'; const WORKSPACE_KEY = 'workspace-names'; -const WorkspaceSettingsWidget = GObject.registerClass( class WorkspaceSettingsWidget extends Adw.PreferencesGroup { - static _classInit(klass) { - klass = super._classInit(klass); + static { + GObject.registerClass(this); - klass.install_action('workspaces.add', null, + this.install_action('workspaces.add', null, self => self._addNewName()); - klass.install_action('workspaces.remove', 's', + this.install_action('workspaces.remove', 's', (self, name, param) => self._removeName(param.unpack())); - klass.install_action('workspaces.update', null, + this.install_action('workspaces.update', null, self => self._saveNames()); - - return klass; } constructor() { @@ -85,10 +82,13 @@ class WorkspaceSettingsWidget extends Adw.PreferencesGroup { this._list.insert(new WorkspaceRow(n), newNames.indexOf(n)); }); } -}); +} -const WorkspaceRow = GObject.registerClass( class WorkspaceRow extends Adw.PreferencesRow { + static { + GObject.registerClass(this); + } + constructor(name) { super({ name }); @@ -163,10 +163,13 @@ class WorkspaceRow extends Adw.PreferencesRow { this.grab_focus(); this._stack.visible_child_name = 'display'; } -}); +} -const NewWorkspaceRow = GObject.registerClass( class NewWorkspaceRow extends Adw.PreferencesRow { + static { + GObject.registerClass(this); + } + constructor() { super({ action_name: 'workspaces.add', @@ -182,7 +185,7 @@ class NewWorkspaceRow extends Adw.PreferencesRow { this.update_property( [Gtk.AccessibleProperty.LABEL], [_('Add Workspace')]); } -}); +} /** */ function init() { From 57f7f21ecb621fadbc595f73d8b7aaed987ea722 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Sun, 13 Feb 2022 14:53:13 +0100 Subject: [PATCH 10/23] workspace-indicator: Bind name to action target Since we now have an override for bind_properties_full(), we can use that instead of an explicit notify handler. Part-of: --- extensions/workspace-indicator/prefs.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/extensions/workspace-indicator/prefs.js b/extensions/workspace-indicator/prefs.js index bf64fed7..3cffbcfe 100644 --- a/extensions/workspace-indicator/prefs.js +++ b/extensions/workspace-indicator/prefs.js @@ -112,12 +112,17 @@ class WorkspaceRow extends Adw.PreferencesRow { const button = new Gtk.Button({ action_name: 'workspaces.remove', - action_target: new GLib.Variant('s', name), icon_name: 'edit-delete-symbolic', has_frame: false, }); box.append(button); + this.bind_property_full('name', + button, 'action-target', + GObject.BindingFlags.SYNC_CREATE, + (bind, target) => [true, new GLib.Variant('s', target)], + null); + this._entry = new Gtk.Entry({ max_width_chars: 25, }); @@ -147,10 +152,8 @@ class WorkspaceRow extends Adw.PreferencesRow { this._stopEdit(); }); - this.connect('notify::name', () => { - button.action_target = new GLib.Variant('s', this.name); - this.activate_action('workspaces.update', null); - }); + this.connect('notify::name', + () => this.activate_action('workspaces.update', null); } edit() { From f0e46f4b12db6f83ee6986c4d998ba4e2124499c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Sun, 13 Feb 2022 15:06:39 +0100 Subject: [PATCH 11/23] workspace-indicator: Change 'update' action to 'rename' Limiting the action to the row that changed instead of the list as a whole makes it easier to only update the changed value and not recreate the entire list. This doesn't make a difference right now, because we carefully sync the list to reuse existing rows, but we are about to back the list with a GListModel instead of updating it manually. Part-of: --- extensions/workspace-indicator/prefs.js | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/extensions/workspace-indicator/prefs.js b/extensions/workspace-indicator/prefs.js index 3cffbcfe..b0dfca8d 100644 --- a/extensions/workspace-indicator/prefs.js +++ b/extensions/workspace-indicator/prefs.js @@ -19,8 +19,8 @@ class WorkspaceSettingsWidget extends Adw.PreferencesGroup { self => self._addNewName()); this.install_action('workspaces.remove', 's', (self, name, param) => self._removeName(param.unpack())); - this.install_action('workspaces.update', null, - self => self._saveNames()); + this.install_action('workspaces.rename', '(ss)', + (self, name, param) => self._changeName(...param.deepUnpack())); } constructor() { @@ -59,8 +59,13 @@ class WorkspaceSettingsWidget extends Adw.PreferencesGroup { .filter(name => name !== removedName)); } - _saveNames() { - const names = this._getWorkspaceRows().map(row => row.name); + _changeName(oldName, newName) { + const names = this._settings.get_strv(WORKSPACE_KEY); + const pos = names.indexOf(oldName); + if (pos < 0) + return; + + names.splice(pos, 1, newName); this._settings.set_strv(WORKSPACE_KEY, names); } @@ -143,6 +148,8 @@ class WorkspaceRow extends Adw.PreferencesRow { this.child = this._stack; this._entry.connect('activate', () => { + this.activate_action('workspaces.rename', + new GLib.Variant('(ss)', [this.name, this._entry.text])); this.name = this._entry.text; this._stopEdit(); }); @@ -151,9 +158,6 @@ class WorkspaceRow extends Adw.PreferencesRow { return; this._stopEdit(); }); - - this.connect('notify::name', - () => this.activate_action('workspaces.update', null); } edit() { From f91275ffd2a6ee9dc200d5ba7b868269e5ed3688 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Sun, 13 Feb 2022 07:09:33 +0100 Subject: [PATCH 12/23] workspace-indicator: Bind list to model Using a model gives us a clear separation between data and representation, as well as between regular rows and the "new item" row at the end. Part-of: --- extensions/workspace-indicator/prefs.js | 168 ++++++++++++++++-------- 1 file changed, 115 insertions(+), 53 deletions(-) diff --git a/extensions/workspace-indicator/prefs.js b/extensions/workspace-indicator/prefs.js index b0dfca8d..5a1da46a 100644 --- a/extensions/workspace-indicator/prefs.js +++ b/extensions/workspace-indicator/prefs.js @@ -11,16 +11,117 @@ const N_ = e => e; const WORKSPACE_SCHEMA = 'org.gnome.desktop.wm.preferences'; const WORKSPACE_KEY = 'workspace-names'; +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 WorkspacesList extends GObject.Object { + static [GObject.interfaces] = [Gio.ListModel]; + static { + GObject.registerClass(this); + } + + #settings = new Gio.Settings({ schema_id: WORKSPACE_SCHEMA }); + #names = this.#settings.get_strv(WORKSPACE_KEY); + #items = Gtk.StringList.new(this.#names); + #changedId; + + constructor() { + super(); + + this.#changedId = + this.#settings.connect(`changed::${WORKSPACE_KEY}`, () => { + const removed = this.#names.length; + this.#names = this.#settings.get_strv(WORKSPACE_KEY); + this.#items.splice(0, removed, this.#names); + this.items_changed(0, removed, this.#names.length); + }); + } + + append() { + const name = _('Workspace %d').format(this.#names.length + 1); + + this.#names.push(name); + this.#settings.block_signal_handler(this.#changedId); + this.#settings.set_strv(WORKSPACE_KEY, this.#names); + this.#settings.unblock_signal_handler(this.#changedId); + + const pos = this.#items.get_n_items(); + this.#items.append(name); + this.items_changed(pos, 0, 1); + } + + remove(name) { + const pos = this.#names.indexOf(name); + if (pos < 0) + return; + + this.#names.splice(pos, 1); + + this.#settings.block_signal_handler(this.#changedId); + this.#settings.set_strv(WORKSPACE_KEY, this.#names); + this.#settings.unblock_signal_handler(this.#changedId); + + this.#items.remove(pos); + this.items_changed(pos, 1, 0); + } + + rename(oldName, newName) { + const pos = this.#names.indexOf(oldName); + if (pos < 0) + return; + + this.#names.splice(pos, 1, newName); + this.#items.splice(pos, 1, [newName]); + + this.#settings.block_signal_handler(this.#changedId); + this.#settings.set_strv(WORKSPACE_KEY, this.#names); + this.#settings.unblock_signal_handler(this.#changedId); + } + + vfunc_get_item_type() { + return Gtk.StringObject; + } + + vfunc_get_n_items() { + return this.#items.get_n_items(); + } + + vfunc_get_item(pos) { + return this.#items.get_item(pos); + } +} + class WorkspaceSettingsWidget extends Adw.PreferencesGroup { static { GObject.registerClass(this); this.install_action('workspaces.add', null, - self => self._addNewName()); + self => self._workspaces.append()); this.install_action('workspaces.remove', 's', - (self, name, param) => self._removeName(param.unpack())); + (self, name, param) => self._workspaces.remove(param.unpack())); this.install_action('workspaces.rename', '(ss)', - (self, name, param) => self._changeName(...param.deepUnpack())); + (self, name, param) => self._workspaces.rename(...param.deepUnpack())); } constructor() { @@ -28,6 +129,13 @@ class WorkspaceSettingsWidget extends Adw.PreferencesGroup { title: _('Workspace Names'), }); + this._workspaces = new WorkspacesList(); + + const store = new Gio.ListStore({ item_type: Gio.ListModel }); + const listModel = new Gtk.FlattenListModel({ model: store }); + store.append(this._workspaces); + store.append(new NewItemModel()); + this._list = new Gtk.ListBox({ selection_mode: Gtk.SelectionMode.NONE, css_classes: ['boxed-list'], @@ -35,56 +143,10 @@ class WorkspaceSettingsWidget extends Adw.PreferencesGroup { this._list.connect('row-activated', (l, row) => row.edit()); this.add(this._list); - this._list.append(new NewWorkspaceRow()); - - this._settings = new Gio.Settings({ - schema_id: WORKSPACE_SCHEMA, - }); - this._settings.connect(`changed::${WORKSPACE_KEY}`, - this._sync.bind(this)); - this._sync(); - } - - _addNewName() { - const names = this._settings.get_strv(WORKSPACE_KEY); - this._settings.set_strv(WORKSPACE_KEY, [ - ...names, - _('Workspace %d').format(names.length + 1), - ]); - } - - _removeName(removedName) { - this._settings.set_strv(WORKSPACE_KEY, - this._settings.get_strv(WORKSPACE_KEY) - .filter(name => name !== removedName)); - } - - _changeName(oldName, newName) { - const names = this._settings.get_strv(WORKSPACE_KEY); - const pos = names.indexOf(oldName); - if (pos < 0) - return; - - names.splice(pos, 1, newName); - this._settings.set_strv(WORKSPACE_KEY, names); - } - - _getWorkspaceRows() { - return [...this._list].filter(row => row.name); - } - - _sync() { - const rows = this._getWorkspaceRows(); - - const oldNames = rows.map(row => row.name); - const newNames = this._settings.get_strv(WORKSPACE_KEY); - - const removed = oldNames.filter(n => !newNames.includes(n)); - const added = newNames.filter(n => !oldNames.includes(n)); - - removed.forEach(n => this._list.remove(rows.find(r => r.name === n))); - added.forEach(n => { - this._list.insert(new WorkspaceRow(n), newNames.indexOf(n)); + this._list.bind_model(listModel, item => { + return item instanceof NewItem + ? new NewWorkspaceRow() + : new WorkspaceRow(item.string); }); } } From 725cf83551ef22d0ad5f49468731650547bc44d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Sun, 13 Feb 2022 15:23:20 +0100 Subject: [PATCH 13/23] auto-move-windows: Change 'update' action to 'rename' Limiting the action to the row that changed instead of the list as a whole makes it easier to only update the changed value and not recreate the entire list. This doesn't make a difference right now, because we carefully sync the list to reuse existing rows, but we are about to back the list with a GListModel instead of updating it manually. Part-of: --- extensions/auto-move-windows/prefs.js | 31 ++++++++++++++++----------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/extensions/auto-move-windows/prefs.js b/extensions/auto-move-windows/prefs.js index 793db067..125b4313 100644 --- a/extensions/auto-move-windows/prefs.js +++ b/extensions/auto-move-windows/prefs.js @@ -19,7 +19,8 @@ class AutoMoveSettingsWidget extends Adw.PreferencesGroup { this.install_action('rules.add', null, self => self._addNewRule()); this.install_action('rules.remove', 's', (self, name, param) => self._removeRule(param.unpack())); - this.install_action('rules.update', null, self => self._saveRules()); + this.install_action('rules.change-workspace', '(si)', + (self, name, param) => self._changeWorkspace(...param.deepUnpack())); } constructor() { @@ -67,24 +68,28 @@ class AutoMoveSettingsWidget extends Adw.PreferencesGroup { })); } - _saveRules() { - this._settings.set_strv(SETTINGS_KEY, - this._getRuleRows().map(row => `${row.id}:${row.value}`)); - } + _changeWorkspace(id, workspace) { + const rules = this._settings.get_strv(SETTINGS_KEY); + const pos = rules.findIndex(r => r.startsWith(`${id}:`)); + if (pos < 0) + return; - _getRuleRows() { - return [...this._list].filter(row => !!row.id); + rules.splice(pos, 1, `${id}:${workspace}`); + + this._settings.block_signal_handler(this._changedId); + this._settings.set_strv(SETTINGS_KEY, rules); + this._settings.unblock_signal_handler(this._changedId); } _sync() { - const oldRules = this._getRuleRows(); + const oldRules = [...this._list].filter(row => !!row.id); const newRules = this._settings.get_strv(SETTINGS_KEY).map(entry => { const [id, value] = entry.split(':'); return { id, value }; }); this._settings.block_signal_handler(this._changedId); - this.action_set_enabled('rules.update', false); + this.action_set_enabled('rules.change-workspace', false); newRules.forEach(({ id, value }, index) => { const row = oldRules.find(r => r.id === id); @@ -102,7 +107,7 @@ class AutoMoveSettingsWidget extends Adw.PreferencesGroup { removed.forEach(r => this._list.remove(r)); this._settings.unblock_signal_handler(this._changedId); - this.action_set_enabled('rules.update', true); + this.action_set_enabled('rules.change-workspace', true); } } @@ -209,8 +214,10 @@ class RuleRow extends Adw.ActionRow { }); this.add_suffix(button); - this.connect('notify::value', - () => this.activate_action('rules.update', null)); + this.connect('notify::value', () => { + this.activate_action('rules.change-workspace', + new GLib.Variant('(si)', [this.id, this.value])); + }); } get id() { From 3c5a56b440c2854d9f039072c19f1f7afb32db61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Sun, 13 Feb 2022 17:48:18 +0100 Subject: [PATCH 14/23] auto-move: Bind list to model Using a model gives us a clear separation between data and representation, as well as between regular rows and the "new item" row at the end. Part-of: --- extensions/auto-move-windows/prefs.js | 246 ++++++++++++++++---------- 1 file changed, 153 insertions(+), 93 deletions(-) diff --git a/extensions/auto-move-windows/prefs.js b/extensions/auto-move-windows/prefs.js index 125b4313..acfd7fa2 100644 --- a/extensions/auto-move-windows/prefs.js +++ b/extensions/auto-move-windows/prefs.js @@ -12,15 +12,139 @@ 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 = ExtensionUtils.getSettings(); + #rules = []; + #changedId; + + constructor() { + super(); + + 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._removeRule(param.unpack())); + (self, name, param) => self._rules.remove(param.unpack())); this.install_action('rules.change-workspace', '(si)', - (self, name, param) => self._changeWorkspace(...param.deepUnpack())); + (self, name, param) => self._rules.changeWorkspace(...param.deepUnpack())); } constructor() { @@ -28,20 +152,24 @@ class AutoMoveSettingsWidget extends Adw.PreferencesGroup { title: _('Workspace Rules'), }); + this._rules = new RulesList(); + + 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.append(new NewRuleRow()); - - this._settings = ExtensionUtils.getSettings(); - this._changedId = this._settings.connect('changed', - this._sync.bind(this)); - this._sync(); - - this.connect('destroy', () => this._settings.run_dispose()); + this._list.bind_model(listModel, item => { + return item instanceof NewItem + ? new NewRuleRow() + : new RuleRow(item); + }); } _addNewRule() { @@ -49,66 +177,12 @@ class AutoMoveSettingsWidget extends Adw.PreferencesGroup { dialog.connect('response', (dlg, id) => { const appInfo = id === Gtk.ResponseType.OK ? dialog.get_widget().get_app_info() : null; - if (appInfo) { - this._settings.set_strv(SETTINGS_KEY, [ - ...this._settings.get_strv(SETTINGS_KEY), - `${appInfo.get_id()}:1`, - ]); - } + if (appInfo) + this._rules.append(appInfo); dialog.destroy(); }); dialog.show(); } - - _removeRule(removedId) { - this._settings.set_strv(SETTINGS_KEY, - this._settings.get_strv(SETTINGS_KEY).filter(entry => { - const [id] = entry.split(':'); - return id !== removedId; - })); - } - - _changeWorkspace(id, workspace) { - const rules = this._settings.get_strv(SETTINGS_KEY); - const pos = rules.findIndex(r => r.startsWith(`${id}:`)); - if (pos < 0) - return; - - rules.splice(pos, 1, `${id}:${workspace}`); - - this._settings.block_signal_handler(this._changedId); - this._settings.set_strv(SETTINGS_KEY, rules); - this._settings.unblock_signal_handler(this._changedId); - } - - _sync() { - const oldRules = [...this._list].filter(row => !!row.id); - const newRules = this._settings.get_strv(SETTINGS_KEY).map(entry => { - const [id, value] = entry.split(':'); - return { id, value }; - }); - - this._settings.block_signal_handler(this._changedId); - this.action_set_enabled('rules.change-workspace', false); - - newRules.forEach(({ id, value }, index) => { - const row = oldRules.find(r => r.id === id); - const appInfo = row - ? null : Gio.DesktopAppInfo.new(id); - - if (row) - row.set({ value }); - else if (appInfo) - this._list.insert(new RuleRow(appInfo, value), index); - }); - - const removed = oldRules.filter( - ({ id }) => !newRules.find(r => r.id === id)); - removed.forEach(r => this._list.remove(r)); - - this._settings.unblock_signal_handler(this._changedId); - this.action_set_enabled('rules.change-workspace', true); - } } class WorkspaceSelector extends Gtk.Widget { @@ -169,28 +243,18 @@ class WorkspaceSelector extends Gtk.Widget { } class RuleRow extends Adw.ActionRow { - static [GObject.properties] = { - 'id': GObject.ParamSpec.string( - 'id', 'id', 'id', - GObject.ParamFlags.READABLE, - ''), - 'value': GObject.ParamSpec.uint( - 'value', 'value', 'value', - GObject.ParamFlags.READWRITE, - 1, WORKSPACE_MAX, 1), - }; - static { GObject.registerClass(this); } - constructor(appInfo, value) { + constructor(rule) { + const { appInfo } = rule; + const id = appInfo.get_id(); + super({ activatable: false, - title: appInfo.get_display_name(), - value, + title: rule.appInfo.get_display_name(), }); - this._appInfo = appInfo; const icon = new Gtk.Image({ css_classes: ['icon-dropshadow'], @@ -200,28 +264,24 @@ class RuleRow extends Adw.ActionRow { this.add_prefix(icon); const wsButton = new WorkspaceSelector(); - this.bind_property('value', + rule.bind_property('workspace', wsButton, 'number', - GObject.BindingFlags.SYNC_CREATE | GObject.BindingFlags.BIDIRECTIONAL); + 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', this.id), + action_target: new GLib.Variant('s', id), icon_name: 'edit-delete-symbolic', has_frame: false, valign: Gtk.Align.CENTER, }); this.add_suffix(button); - - this.connect('notify::value', () => { - this.activate_action('rules.change-workspace', - new GLib.Variant('(si)', [this.id, this.value])); - }); - } - - get id() { - return this._appInfo.get_id(); } } From d9f5726d4549b17ebc15eb48d0143c625a0d6770 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Du=C5=A1an=20Kazik?= Date: Fri, 25 Feb 2022 07:14:55 +0000 Subject: [PATCH 15/23] Update Slovak translation --- po/sk.po | 81 +++++++++++++++++++++++++++++++------------------------- 1 file changed, 45 insertions(+), 36 deletions(-) diff --git a/po/sk.po b/po/sk.po index d352e15a..9e8d20eb 100644 --- a/po/sk.po +++ b/po/sk.po @@ -9,8 +9,8 @@ msgstr "" "Project-Id-Version: gnome-shell-extensions\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/" "issues\n" -"POT-Creation-Date: 2020-05-28 00:55+0000\n" -"PO-Revision-Date: 2020-09-02 14:02+0200\n" +"POT-Creation-Date: 2021-11-06 14:08+0000\n" +"PO-Revision-Date: 2022-02-25 08:14+0100\n" "Last-Translator: Dušan Kazik \n" "Language-Team: Slovak \n" "Language: sk\n" @@ -18,22 +18,31 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0;\n" -"X-Generator: Poedit 2.4.1\n" +"X-Generator: Poedit 3.0\n" -#: data/gnome-classic.desktop.in:3 data/gnome-classic.session.desktop.in:3 +#: data/gnome-classic.desktop.in:3 msgid "GNOME Classic" msgstr "Klasické prostredie GNOME" -#: data/gnome-classic.desktop.in:4 +#: data/gnome-classic.desktop.in:4 data/gnome-classic-wayland.desktop.in:4 +#: data/gnome-classic-xorg.desktop.in:4 msgid "This session logs you into GNOME Classic" msgstr "Táto relácia vás prihlási do klasického prostredia GNOME" -#: extensions/apps-menu/extension.js:113 +#: data/gnome-classic-wayland.desktop.in:3 +msgid "GNOME Classic on Wayland" +msgstr "Klasické prostredie GNOME so systémom Wayland" + +#: data/gnome-classic-xorg.desktop.in:3 +msgid "GNOME Classic on Xorg" +msgstr "Klasické prostredie GNOME so systémom Xorg" + +#: extensions/apps-menu/extension.js:112 msgid "Favorites" msgstr "Obľúbené" # TreeViewColumn -#: extensions/apps-menu/extension.js:369 +#: extensions/apps-menu/extension.js:366 msgid "Applications" msgstr "Aplikácie" @@ -52,30 +61,30 @@ msgstr "" "súboru .desktop), nasledovaný čiarkou a číslom pracovného priestoru" # Label -#: extensions/auto-move-windows/prefs.js:35 +#: extensions/auto-move-windows/prefs.js:34 msgid "Workspace Rules" msgstr "Pravidlá pracovného priestoru" # ToolButton label -#: extensions/auto-move-windows/prefs.js:243 +#: extensions/auto-move-windows/prefs.js:236 msgid "Add Rule" msgstr "Pridať pravidlo" # https://bugzilla.gnome.org/show_bug.cgi?id=687590 #. TRANSLATORS: %s is the filesystem name -#: extensions/drive-menu/extension.js:112 +#: extensions/drive-menu/extension.js:133 #: extensions/places-menu/placeDisplay.js:233 #, javascript-format msgid "Ejecting drive “%s” failed:" msgstr "Zlyhalo vysúvanie jednotky „%s“:" #  Menu -#: extensions/drive-menu/extension.js:128 +#: extensions/drive-menu/extension.js:149 msgid "Removable devices" msgstr "Vymeniteľné zariadenia" # Menu Action -#: extensions/drive-menu/extension.js:155 +#: extensions/drive-menu/extension.js:171 msgid "Open Files" msgstr "Otvoriť aplikáciu Súbory" @@ -112,8 +121,8 @@ msgstr "" "nadol. Aby sa prejavila zmena, je potrebné reštartovať shell." #  menu item -#: extensions/places-menu/extension.js:89 -#: extensions/places-menu/extension.js:93 +#: extensions/places-menu/extension.js:88 +#: extensions/places-menu/extension.js:91 msgid "Places" msgstr "Miesta" @@ -160,56 +169,56 @@ msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell" msgstr "Názov témy, ktorá sa načíta z ~/.themes/nazov/gnome-shell" # PopupMenuItem -#: extensions/window-list/extension.js:98 +#: extensions/window-list/extension.js:72 msgid "Close" msgstr "Zavrieť" # label -#: extensions/window-list/extension.js:118 +#: extensions/window-list/extension.js:92 msgid "Unminimize" msgstr "Odminimalizovať" # label -#: extensions/window-list/extension.js:118 +#: extensions/window-list/extension.js:92 msgid "Minimize" msgstr "Minimalizovať" # label -#: extensions/window-list/extension.js:125 +#: extensions/window-list/extension.js:99 msgid "Unmaximize" msgstr "Odmaximalizovať" # label -#: extensions/window-list/extension.js:125 +#: extensions/window-list/extension.js:99 msgid "Maximize" msgstr "Maximalizovať" # PopupMenuItem -#: extensions/window-list/extension.js:428 +#: extensions/window-list/extension.js:434 msgid "Minimize all" msgstr "Minimalizovať všetko" # PopupMenuItem -#: extensions/window-list/extension.js:434 +#: extensions/window-list/extension.js:440 msgid "Unminimize all" msgstr "Odminimalizovať všetko" # PopupMenuItem -#: extensions/window-list/extension.js:440 +#: extensions/window-list/extension.js:446 msgid "Maximize all" msgstr "Maximalizovať všetko" # PopupMenuItem -#: extensions/window-list/extension.js:448 +#: extensions/window-list/extension.js:454 msgid "Unmaximize all" msgstr "Odmaximalizovať všetko" # PopupMenuItem -#: extensions/window-list/extension.js:456 +#: extensions/window-list/extension.js:462 msgid "Close all" msgstr "Zavrieť všetko" -#: extensions/window-list/extension.js:734 +#: extensions/window-list/extension.js:741 msgid "Window List" msgstr "Zoznam okien" @@ -227,7 +236,7 @@ msgstr "" # CheckButton #: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20 -#: extensions/window-list/prefs.js:100 +#: extensions/window-list/prefs.js:86 msgid "Show windows from all workspaces" msgstr "Zobraziť okná zo všetkých pracovných priestorov" @@ -249,45 +258,45 @@ msgstr "" "Určuje, či sa má zobraziť zoznam okien na všetkých pripojených monitoroch, " "alebo iba na hlavnom." -#: extensions/window-list/prefs.js:29 +#: extensions/window-list/prefs.js:39 msgid "Window Grouping" msgstr "Zoskupenie okien" -#: extensions/window-list/prefs.js:58 +#: extensions/window-list/prefs.js:63 msgid "Never group windows" msgstr "Nikdy nezoskupovať okná" -#: extensions/window-list/prefs.js:59 +#: extensions/window-list/prefs.js:64 msgid "Group windows when space is limited" msgstr "Zoskupovať okna ak je obmedzený priestor" -#: extensions/window-list/prefs.js:60 +#: extensions/window-list/prefs.js:65 msgid "Always group windows" msgstr "Vždy zoskupovať okná" -#: extensions/window-list/prefs.js:94 +#: extensions/window-list/prefs.js:81 msgid "Show on all monitors" msgstr "Zobraziť na všetkých monitoroch" # Label -#: extensions/window-list/workspaceIndicator.js:207 -#: extensions/workspace-indicator/extension.js:213 +#: extensions/window-list/workspaceIndicator.js:249 +#: extensions/workspace-indicator/extension.js:254 msgid "Workspace Indicator" msgstr "Indikátor pracovného priestoru" # Label -#: extensions/workspace-indicator/prefs.js:34 +#: extensions/workspace-indicator/prefs.js:33 msgid "Workspace Names" msgstr "Názvy pracovných priestorov" # store label -#: extensions/workspace-indicator/prefs.js:67 +#: extensions/workspace-indicator/prefs.js:66 #, javascript-format msgid "Workspace %d" msgstr "Pracovný priestor č. %d" # TreeViewColumn; Label -#: extensions/workspace-indicator/prefs.js:218 +#: extensions/workspace-indicator/prefs.js:207 msgid "Add Workspace" msgstr "Pridať pracovný priestor" From 694b0552c290705ea9599a566e99b620967a8835 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Dr=C4=85g?= Date: Sat, 26 Feb 2022 15:17:47 +0100 Subject: [PATCH 16/23] Update Polish translation --- po/pl.po | 85 +++++++++++++++++++++++++++++++------------------------- 1 file changed, 47 insertions(+), 38 deletions(-) diff --git a/po/pl.po b/po/pl.po index bcfe2d6a..ddcb4710 100644 --- a/po/pl.po +++ b/po/pl.po @@ -1,16 +1,16 @@ # Polish translation for gnome-shell-extensions. -# Copyright © 2011-2020 the gnome-shell-extensions authors. +# Copyright © 2011-2022 the gnome-shell-extensions authors. # This file is distributed under the same license as the gnome-shell-extensions package. -# Piotr Drąg , 2011-2020. -# Aviary.pl , 2011-2020. +# Piotr Drąg , 2011-2022. +# Aviary.pl , 2011-2022. # msgid "" msgstr "" "Project-Id-Version: gnome-shell-extensions\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/" "issues\n" -"POT-Creation-Date: 2020-05-28 00:55+0000\n" -"PO-Revision-Date: 2020-08-15 11:39+0200\n" +"POT-Creation-Date: 2021-11-06 14:08+0000\n" +"PO-Revision-Date: 2022-02-26 15:15+0100\n" "Last-Translator: Piotr Drąg \n" "Language-Team: Polish \n" "Language: pl\n" @@ -20,19 +20,28 @@ msgstr "" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" -#: data/gnome-classic.desktop.in:3 data/gnome-classic.session.desktop.in:3 +#: data/gnome-classic.desktop.in:3 msgid "GNOME Classic" msgstr "Klasyczne GNOME" -#: data/gnome-classic.desktop.in:4 +#: data/gnome-classic.desktop.in:4 data/gnome-classic-wayland.desktop.in:4 +#: data/gnome-classic-xorg.desktop.in:4 msgid "This session logs you into GNOME Classic" msgstr "Ta sesja loguje do klasycznego środowiska GNOME" -#: extensions/apps-menu/extension.js:113 +#: data/gnome-classic-wayland.desktop.in:3 +msgid "GNOME Classic on Wayland" +msgstr "Klasyczne GNOME (Wayland)" + +#: data/gnome-classic-xorg.desktop.in:3 +msgid "GNOME Classic on Xorg" +msgstr "Klasyczne GNOME (Xorg)" + +#: extensions/apps-menu/extension.js:112 msgid "Favorites" msgstr "Ulubione" -#: extensions/apps-menu/extension.js:369 +#: extensions/apps-menu/extension.js:366 msgid "Applications" msgstr "Programy" @@ -48,26 +57,26 @@ msgstr "" "Lista ciągów, każdy zawierający identyfikator programu (nazwę pliku ." "desktop) z przecinkiem i numerem obszaru roboczego" -#: extensions/auto-move-windows/prefs.js:35 +#: extensions/auto-move-windows/prefs.js:34 msgid "Workspace Rules" msgstr "Reguły obszarów roboczych" -#: extensions/auto-move-windows/prefs.js:243 +#: extensions/auto-move-windows/prefs.js:236 msgid "Add Rule" msgstr "Dodaj regułę" #. TRANSLATORS: %s is the filesystem name -#: extensions/drive-menu/extension.js:112 +#: extensions/drive-menu/extension.js:133 #: extensions/places-menu/placeDisplay.js:233 #, javascript-format msgid "Ejecting drive “%s” failed:" msgstr "Wysunięcie napędu „%s” się nie powiodło:" -#: extensions/drive-menu/extension.js:128 +#: extensions/drive-menu/extension.js:149 msgid "Removable devices" msgstr "Urządzenia wymienne" -#: extensions/drive-menu/extension.js:155 +#: extensions/drive-menu/extension.js:171 msgid "Open Files" msgstr "Otwórz menedżer plików" @@ -100,8 +109,8 @@ msgstr "" "powłokę. Zmiana tego ustawienia wymaga ponownego uruchomienia powłoki, aby " "uwzględnić zmiany." -#: extensions/places-menu/extension.js:89 -#: extensions/places-menu/extension.js:93 +#: extensions/places-menu/extension.js:88 +#: extensions/places-menu/extension.js:91 msgid "Places" msgstr "Miejsca" @@ -144,47 +153,47 @@ msgstr "Nazwa motywu" msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell" msgstr "Nazwa motywu do wczytania z katalogu ~/.themes/name/gnome-shell" -#: extensions/window-list/extension.js:98 +#: extensions/window-list/extension.js:72 msgid "Close" msgstr "Zamknij" -#: extensions/window-list/extension.js:118 +#: extensions/window-list/extension.js:92 msgid "Unminimize" msgstr "Cofnij minimalizację" -#: extensions/window-list/extension.js:118 +#: extensions/window-list/extension.js:92 msgid "Minimize" msgstr "Zminimalizuj" -#: extensions/window-list/extension.js:125 +#: extensions/window-list/extension.js:99 msgid "Unmaximize" msgstr "Cofnij maksymalizację" -#: extensions/window-list/extension.js:125 +#: extensions/window-list/extension.js:99 msgid "Maximize" msgstr "Zmaksymalizuj" -#: extensions/window-list/extension.js:428 +#: extensions/window-list/extension.js:434 msgid "Minimize all" msgstr "Zminimalizuj wszystkie" -#: extensions/window-list/extension.js:434 +#: extensions/window-list/extension.js:440 msgid "Unminimize all" msgstr "Cofnij minimalizację wszystkich" -#: extensions/window-list/extension.js:440 +#: extensions/window-list/extension.js:446 msgid "Maximize all" msgstr "Zmaksymalizuj wszystkie" -#: extensions/window-list/extension.js:448 +#: extensions/window-list/extension.js:454 msgid "Unmaximize all" msgstr "Cofnij maksymalizację wszystkich" -#: extensions/window-list/extension.js:456 +#: extensions/window-list/extension.js:462 msgid "Close all" msgstr "Zamknij wszystkie" -#: extensions/window-list/extension.js:734 +#: extensions/window-list/extension.js:741 msgid "Window List" msgstr "Lista okien" @@ -201,7 +210,7 @@ msgstr "" "wartości to „never” (nigdy), „auto” (automatycznie) i „always” (zawsze)." #: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20 -#: extensions/window-list/prefs.js:100 +#: extensions/window-list/prefs.js:86 msgid "Show windows from all workspaces" msgstr "Wyświetlanie okien ze wszystkich obszarów roboczych" @@ -222,40 +231,40 @@ msgstr "" "Czy wyświetlać listę okien na wszystkich podłączonych monitorach, czy tylko " "na głównym." -#: extensions/window-list/prefs.js:29 +#: extensions/window-list/prefs.js:39 msgid "Window Grouping" msgstr "Grupowanie okien" -#: extensions/window-list/prefs.js:58 +#: extensions/window-list/prefs.js:63 msgid "Never group windows" msgstr "Bez grupowania okien" -#: extensions/window-list/prefs.js:59 +#: extensions/window-list/prefs.js:64 msgid "Group windows when space is limited" msgstr "Grupowanie okien, kiedy miejsce jest ograniczone" -#: extensions/window-list/prefs.js:60 +#: extensions/window-list/prefs.js:65 msgid "Always group windows" msgstr "Stałe grupowanie okien" -#: extensions/window-list/prefs.js:94 +#: extensions/window-list/prefs.js:81 msgid "Show on all monitors" msgstr "Wyświetlanie na wszystkich monitorach" -#: extensions/window-list/workspaceIndicator.js:207 -#: extensions/workspace-indicator/extension.js:213 +#: extensions/window-list/workspaceIndicator.js:249 +#: extensions/workspace-indicator/extension.js:254 msgid "Workspace Indicator" msgstr "Wskaźnik obszaru roboczego" -#: extensions/workspace-indicator/prefs.js:34 +#: extensions/workspace-indicator/prefs.js:33 msgid "Workspace Names" msgstr "Nazwy obszarów roboczych" -#: extensions/workspace-indicator/prefs.js:67 +#: extensions/workspace-indicator/prefs.js:66 #, javascript-format msgid "Workspace %d" msgstr "%d. obszar roboczy" -#: extensions/workspace-indicator/prefs.js:218 +#: extensions/workspace-indicator/prefs.js:207 msgid "Add Workspace" msgstr "Dodaj obszar roboczy" From 5712dd05d96fb523a1738ca0ab07b489453cc78c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jiri=20Gr=C3=B6nroos?= Date: Sun, 27 Feb 2022 16:54:51 +0000 Subject: [PATCH 17/23] Update Finnish translation --- po/fi.po | 79 +++++++++++++++++++++++++++++++------------------------- 1 file changed, 44 insertions(+), 35 deletions(-) diff --git a/po/fi.po b/po/fi.po index e5ab20ef..b3b51685 100644 --- a/po/fi.po +++ b/po/fi.po @@ -12,8 +12,8 @@ msgstr "" "Project-Id-Version: gnome-shell-extensions\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/" "issues\n" -"POT-Creation-Date: 2020-10-17 20:14+0000\n" -"PO-Revision-Date: 2021-03-15 21:32+0200\n" +"POT-Creation-Date: 2021-11-06 14:08+0000\n" +"PO-Revision-Date: 2022-02-27 18:54+0200\n" "Last-Translator: JR-Fi \n" "Language-Team: suomi \n" "Language: fi\n" @@ -21,7 +21,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 2.0.6\n" +"X-Generator: Poedit 3.0.1\n" "X-Project-Style: gnome\n" "X-POT-Import-Date: 2012-03-05 15:06:12+0000\n" @@ -29,15 +29,24 @@ msgstr "" msgid "GNOME Classic" msgstr "Perinteinen Gnome" -#: data/gnome-classic.desktop.in:4 +#: data/gnome-classic.desktop.in:4 data/gnome-classic-wayland.desktop.in:4 +#: data/gnome-classic-xorg.desktop.in:4 msgid "This session logs you into GNOME Classic" msgstr "Tämä istunto kirjaa sinut perinteiseen Gnomeen" -#: extensions/apps-menu/extension.js:113 +#: data/gnome-classic-wayland.desktop.in:3 +msgid "GNOME Classic on Wayland" +msgstr "Perinteinen Gnome Waylandia käyttäen" + +#: data/gnome-classic-xorg.desktop.in:3 +msgid "GNOME Classic on Xorg" +msgstr "Perinteinen Gnome Xorgia käyttäen" + +#: extensions/apps-menu/extension.js:112 msgid "Favorites" msgstr "Suosikit" -#: extensions/apps-menu/extension.js:369 +#: extensions/apps-menu/extension.js:366 msgid "Applications" msgstr "Sovellukset" @@ -53,26 +62,26 @@ msgstr "" "Lista merkkijonoja, jossa jokainen on ohjelman tunnus (työpöydän " "tiedostonimi), jota seuraa kaksoispiste ja työtilan numero" -#: extensions/auto-move-windows/prefs.js:35 +#: extensions/auto-move-windows/prefs.js:34 msgid "Workspace Rules" msgstr "Työtilojen säännöt" -#: extensions/auto-move-windows/prefs.js:243 +#: extensions/auto-move-windows/prefs.js:236 msgid "Add Rule" msgstr "Lisää sääntö" #. TRANSLATORS: %s is the filesystem name -#: extensions/drive-menu/extension.js:112 +#: extensions/drive-menu/extension.js:133 #: extensions/places-menu/placeDisplay.js:233 #, javascript-format msgid "Ejecting drive “%s” failed:" msgstr "Aseman “%s” irrottaminen epäonnistui:" -#: extensions/drive-menu/extension.js:128 +#: extensions/drive-menu/extension.js:149 msgid "Removable devices" msgstr "Erilliset tallennusvälineet" -#: extensions/drive-menu/extension.js:155 +#: extensions/drive-menu/extension.js:171 msgid "Open Files" msgstr "Avaa tiedostonhallinta" @@ -104,8 +113,8 @@ msgstr "" "Tämä syrjäyttää oletusasetuksen, eli otsikkotekstin asettamisen pienoiskuvan " "alle. Tämän asetuksen muutos vaatii Gnomen uudelleenkäynnistyksen." -#: extensions/places-menu/extension.js:89 -#: extensions/places-menu/extension.js:93 +#: extensions/places-menu/extension.js:88 +#: extensions/places-menu/extension.js:91 msgid "Places" msgstr "Sijainnit" @@ -149,47 +158,47 @@ msgstr "Teeman nimi" msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell" msgstr "Teeman nimi, ladataan sijainnista ~/.themes/name/gnome-shell" -#: extensions/window-list/extension.js:98 +#: extensions/window-list/extension.js:72 msgid "Close" msgstr "Sulje" -#: extensions/window-list/extension.js:118 +#: extensions/window-list/extension.js:92 msgid "Unminimize" msgstr "Palauta pienennys" -#: extensions/window-list/extension.js:118 +#: extensions/window-list/extension.js:92 msgid "Minimize" msgstr "Pienennä" -#: extensions/window-list/extension.js:125 +#: extensions/window-list/extension.js:99 msgid "Unmaximize" msgstr "Palauta suurennus" -#: extensions/window-list/extension.js:125 +#: extensions/window-list/extension.js:99 msgid "Maximize" msgstr "Suurenna" -#: extensions/window-list/extension.js:432 +#: extensions/window-list/extension.js:434 msgid "Minimize all" msgstr "Pienennä kaikki" -#: extensions/window-list/extension.js:438 +#: extensions/window-list/extension.js:440 msgid "Unminimize all" msgstr "Palauta kaikkien koko" -#: extensions/window-list/extension.js:444 +#: extensions/window-list/extension.js:446 msgid "Maximize all" msgstr "Suurenna kaikki" -#: extensions/window-list/extension.js:452 +#: extensions/window-list/extension.js:454 msgid "Unmaximize all" msgstr "Palauta kaikkien koko" -#: extensions/window-list/extension.js:460 +#: extensions/window-list/extension.js:462 msgid "Close all" msgstr "Sulje kaikki" -#: extensions/window-list/extension.js:738 +#: extensions/window-list/extension.js:741 msgid "Window List" msgstr "Ikkunaluettelo" @@ -206,7 +215,7 @@ msgstr "" "Mahdolliset arvot ovat “never”, “auto” ja “always”." #: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20 -#: extensions/window-list/prefs.js:100 +#: extensions/window-list/prefs.js:86 msgid "Show windows from all workspaces" msgstr "Näytä ikkunat kaikista työtiloista" @@ -228,41 +237,41 @@ msgstr "" "Näytetäänkö ikkunaluettelo kaikilla liitetyillä näytöillä vai ainoastaan " "ensisijaisella näytöllä." -#: extensions/window-list/prefs.js:29 +#: extensions/window-list/prefs.js:39 msgid "Window Grouping" msgstr "Ikkunoiden ryhmitys" -#: extensions/window-list/prefs.js:58 +#: extensions/window-list/prefs.js:63 msgid "Never group windows" msgstr "Älä ryhmitä ikkunoita koskaan" -#: extensions/window-list/prefs.js:59 +#: extensions/window-list/prefs.js:64 msgid "Group windows when space is limited" msgstr "Ryhmitä ikkunat tilan ollessa rajallinen" -#: extensions/window-list/prefs.js:60 +#: extensions/window-list/prefs.js:65 msgid "Always group windows" msgstr "Ryhmitä ikkunat aina" -#: extensions/window-list/prefs.js:94 +#: extensions/window-list/prefs.js:81 msgid "Show on all monitors" msgstr "Näytä kaikilla näytöillä" -#: extensions/window-list/workspaceIndicator.js:207 -#: extensions/workspace-indicator/extension.js:213 +#: extensions/window-list/workspaceIndicator.js:249 +#: extensions/workspace-indicator/extension.js:254 msgid "Workspace Indicator" msgstr "Työtilan ilmaisin" -#: extensions/workspace-indicator/prefs.js:34 +#: extensions/workspace-indicator/prefs.js:33 msgid "Workspace Names" msgstr "Työtilojen nimet" -#: extensions/workspace-indicator/prefs.js:67 +#: extensions/workspace-indicator/prefs.js:66 #, javascript-format msgid "Workspace %d" msgstr "Työtila %d" -#: extensions/workspace-indicator/prefs.js:218 +#: extensions/workspace-indicator/prefs.js:207 msgid "Add Workspace" msgstr "Lisää työtila" From bd002fa96d75bfd89cd882f8a64352e617c43e32 Mon Sep 17 00:00:00 2001 From: Luna Jernberg Date: Mon, 28 Feb 2022 15:17:45 +0000 Subject: [PATCH 18/23] Update Swedish translation --- po/sv.po | 82 +++++++++++++++++++++++++++++++------------------------- 1 file changed, 46 insertions(+), 36 deletions(-) diff --git a/po/sv.po b/po/sv.po index 989074aa..22a5eef9 100644 --- a/po/sv.po +++ b/po/sv.po @@ -4,35 +4,45 @@ # Daniel Nylander , 2011, 2012. # Mattias Eriksson , 2014. # Anders Jonsson , 2015, 2017, 2019, 2020, 2021. +# Luna Jernberg , 2021. # msgid "" msgstr "" "Project-Id-Version: gnome-shell-extensions\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/" "issues\n" -"POT-Creation-Date: 2020-10-17 20:14+0000\n" -"PO-Revision-Date: 2021-03-27 21:12+0100\n" -"Last-Translator: Anders Jonsson \n" +"POT-Creation-Date: 2021-11-06 14:08+0000\n" +"PO-Revision-Date: 2021-11-07 10:48+0100\n" +"Last-Translator: Luna Jernberg \n" "Language-Team: Swedish \n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.4.2\n" +"X-Generator: Poedit 3.0\n" #: data/gnome-classic.desktop.in:3 msgid "GNOME Classic" msgstr "GNOME Klassisk" -#: data/gnome-classic.desktop.in:4 +#: data/gnome-classic.desktop.in:4 data/gnome-classic-wayland.desktop.in:4 +#: data/gnome-classic-xorg.desktop.in:4 msgid "This session logs you into GNOME Classic" msgstr "Denna session loggar in dig till GNOME Klassisk" -#: extensions/apps-menu/extension.js:113 +#: data/gnome-classic-wayland.desktop.in:3 +msgid "GNOME Classic on Wayland" +msgstr "GNOME Klassisk på Wayland" + +#: data/gnome-classic-xorg.desktop.in:3 +msgid "GNOME Classic on Xorg" +msgstr "GNOME Klassisk på Xorg" + +#: extensions/apps-menu/extension.js:112 msgid "Favorites" msgstr "Favoriter" -#: extensions/apps-menu/extension.js:369 +#: extensions/apps-menu/extension.js:366 msgid "Applications" msgstr "Program" @@ -48,26 +58,26 @@ msgstr "" "En lista över strängar, var och en innehållande ett program-id " "(skrivbordsfilnamn), följt av ett kolontecken och arbetsytans nummer" -#: extensions/auto-move-windows/prefs.js:35 +#: extensions/auto-move-windows/prefs.js:34 msgid "Workspace Rules" msgstr "Regler för arbetsyta" -#: extensions/auto-move-windows/prefs.js:243 +#: extensions/auto-move-windows/prefs.js:236 msgid "Add Rule" msgstr "Lägg till regel" #. TRANSLATORS: %s is the filesystem name -#: extensions/drive-menu/extension.js:112 +#: extensions/drive-menu/extension.js:133 #: extensions/places-menu/placeDisplay.js:233 #, javascript-format msgid "Ejecting drive “%s” failed:" msgstr "Utmatning av disk ”%s” misslyckades:" -#: extensions/drive-menu/extension.js:128 +#: extensions/drive-menu/extension.js:149 msgid "Removable devices" msgstr "Flyttbara enheter" -#: extensions/drive-menu/extension.js:155 +#: extensions/drive-menu/extension.js:171 msgid "Open Files" msgstr "Öppna filer" @@ -100,8 +110,8 @@ msgstr "" "skalets standardplacering under miniatyrbilden. För att ändra denna " "inställning krävs att skalet startas om för att den ska få effekt." -#: extensions/places-menu/extension.js:89 -#: extensions/places-menu/extension.js:93 +#: extensions/places-menu/extension.js:88 +#: extensions/places-menu/extension.js:91 msgid "Places" msgstr "Platser" @@ -144,47 +154,47 @@ msgstr "Temanamn" msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell" msgstr "Namnet på temat, kommer att läsas in från ~/.themes/name/gnome-shell" -#: extensions/window-list/extension.js:98 +#: extensions/window-list/extension.js:72 msgid "Close" msgstr "Stäng" -#: extensions/window-list/extension.js:118 +#: extensions/window-list/extension.js:92 msgid "Unminimize" msgstr "Avminimera" -#: extensions/window-list/extension.js:118 +#: extensions/window-list/extension.js:92 msgid "Minimize" msgstr "Minimera" -#: extensions/window-list/extension.js:125 +#: extensions/window-list/extension.js:99 msgid "Unmaximize" msgstr "Avmaximera" -#: extensions/window-list/extension.js:125 +#: extensions/window-list/extension.js:99 msgid "Maximize" msgstr "Maximera" -#: extensions/window-list/extension.js:432 +#: extensions/window-list/extension.js:434 msgid "Minimize all" msgstr "Minimera alla" -#: extensions/window-list/extension.js:438 +#: extensions/window-list/extension.js:440 msgid "Unminimize all" msgstr "Avminimera alla" -#: extensions/window-list/extension.js:444 +#: extensions/window-list/extension.js:446 msgid "Maximize all" msgstr "Maximera alla" -#: extensions/window-list/extension.js:452 +#: extensions/window-list/extension.js:454 msgid "Unmaximize all" msgstr "Avmaximera alla" -#: extensions/window-list/extension.js:460 +#: extensions/window-list/extension.js:462 msgid "Close all" msgstr "Stäng alla" -#: extensions/window-list/extension.js:738 +#: extensions/window-list/extension.js:741 msgid "Window List" msgstr "Fönsterlista" @@ -201,7 +211,7 @@ msgstr "" "värden är ”never” (aldrig), ”auto” och ”always” (alltid)." #: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20 -#: extensions/window-list/prefs.js:100 +#: extensions/window-list/prefs.js:86 msgid "Show windows from all workspaces" msgstr "Visa fönster från alla arbetsytor" @@ -222,40 +232,40 @@ msgstr "" "Huruvida fönsterlistan ska visas på alla anslutna skärmar eller bara på den " "primära." -#: extensions/window-list/prefs.js:29 +#: extensions/window-list/prefs.js:39 msgid "Window Grouping" msgstr "Fönstergruppering" -#: extensions/window-list/prefs.js:58 +#: extensions/window-list/prefs.js:63 msgid "Never group windows" msgstr "Gruppera aldrig fönster" -#: extensions/window-list/prefs.js:59 +#: extensions/window-list/prefs.js:64 msgid "Group windows when space is limited" msgstr "Gruppera fönster när utrymmet är begränsat" -#: extensions/window-list/prefs.js:60 +#: extensions/window-list/prefs.js:65 msgid "Always group windows" msgstr "Gruppera alltid fönster" -#: extensions/window-list/prefs.js:94 +#: extensions/window-list/prefs.js:81 msgid "Show on all monitors" msgstr "Visa på alla skärmar" -#: extensions/window-list/workspaceIndicator.js:207 -#: extensions/workspace-indicator/extension.js:213 +#: extensions/window-list/workspaceIndicator.js:249 +#: extensions/workspace-indicator/extension.js:254 msgid "Workspace Indicator" msgstr "Arbetsyteindikator" -#: extensions/workspace-indicator/prefs.js:34 +#: extensions/workspace-indicator/prefs.js:33 msgid "Workspace Names" msgstr "Namn på arbetsytor" -#: extensions/workspace-indicator/prefs.js:67 +#: extensions/workspace-indicator/prefs.js:66 #, javascript-format msgid "Workspace %d" msgstr "Arbetsyta %d" -#: extensions/workspace-indicator/prefs.js:218 +#: extensions/workspace-indicator/prefs.js:207 msgid "Add Workspace" msgstr "Lägg till arbetsyta" From a8b73861a67edea5991ad97f1b349e867ac63405 Mon Sep 17 00:00:00 2001 From: Alan Mortensen Date: Mon, 28 Feb 2022 18:46:32 +0100 Subject: [PATCH 19/23] Updated Danish translation --- po/da.po | 79 +++++++++++++++++++++++++++++++------------------------- 1 file changed, 44 insertions(+), 35 deletions(-) diff --git a/po/da.po b/po/da.po index bc592f02..fdd65451 100644 --- a/po/da.po +++ b/po/da.po @@ -11,8 +11,8 @@ msgstr "" "Project-Id-Version: gnome-shell-extensions master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/" "issues\n" -"POT-Creation-Date: 2020-05-28 00:55+0000\n" -"PO-Revision-Date: 2020-09-07 18:36+0200\n" +"POT-Creation-Date: 2021-11-06 14:08+0000\n" +"PO-Revision-Date: 2022-02-27 13:21+0100\n" "Last-Translator: Alan Mortensen \n" "Language-Team: Danish \n" "Language: da\n" @@ -22,19 +22,28 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.3\n" -#: data/gnome-classic.desktop.in:3 data/gnome-classic.session.desktop.in:3 +#: data/gnome-classic.desktop.in:3 msgid "GNOME Classic" msgstr "GNOME Classic" -#: data/gnome-classic.desktop.in:4 +#: data/gnome-classic.desktop.in:4 data/gnome-classic-wayland.desktop.in:4 +#: data/gnome-classic-xorg.desktop.in:4 msgid "This session logs you into GNOME Classic" msgstr "Denne session logger dig ind i GNOME Classic" -#: extensions/apps-menu/extension.js:113 +#: data/gnome-classic-wayland.desktop.in:3 +msgid "GNOME Classic on Wayland" +msgstr "GNOME Classic på Wayland" + +#: data/gnome-classic-xorg.desktop.in:3 +msgid "GNOME Classic on Xorg" +msgstr "GNOME Classic på Xorg" + +#: extensions/apps-menu/extension.js:112 msgid "Favorites" msgstr "Favoritter" -#: extensions/apps-menu/extension.js:369 +#: extensions/apps-menu/extension.js:366 msgid "Applications" msgstr "Programmer" @@ -50,26 +59,26 @@ msgstr "" "En liste over strenge, som hver indeholder et program-id " "(skrivebordsfilnavn), efterfulgt af et kolon og arbejdsområdets nummer" -#: extensions/auto-move-windows/prefs.js:35 +#: extensions/auto-move-windows/prefs.js:34 msgid "Workspace Rules" msgstr "Regler for arbejdsområde" -#: extensions/auto-move-windows/prefs.js:243 +#: extensions/auto-move-windows/prefs.js:236 msgid "Add Rule" msgstr "Tilføj regel" #. TRANSLATORS: %s is the filesystem name -#: extensions/drive-menu/extension.js:112 +#: extensions/drive-menu/extension.js:133 #: extensions/places-menu/placeDisplay.js:233 #, javascript-format msgid "Ejecting drive “%s” failed:" msgstr "Udskubning af drevet “%s” mislykkedes:" -#: extensions/drive-menu/extension.js:128 +#: extensions/drive-menu/extension.js:149 msgid "Removable devices" msgstr "Flytbare enheder" -#: extensions/drive-menu/extension.js:155 +#: extensions/drive-menu/extension.js:171 msgid "Open Files" msgstr "Åbn filer" @@ -103,8 +112,8 @@ msgstr "" "Ændring af denne indstilling kræver at shell'en genstartes for at træde i " "kraft." -#: extensions/places-menu/extension.js:89 -#: extensions/places-menu/extension.js:93 +#: extensions/places-menu/extension.js:88 +#: extensions/places-menu/extension.js:91 msgid "Places" msgstr "Steder" @@ -147,47 +156,47 @@ msgstr "Temanavn" msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell" msgstr "Navnet på temaet, som indlæses fra ~/.themes/name/gnome-shell" -#: extensions/window-list/extension.js:98 +#: extensions/window-list/extension.js:72 msgid "Close" msgstr "Luk" -#: extensions/window-list/extension.js:118 +#: extensions/window-list/extension.js:92 msgid "Unminimize" msgstr "Afminimér" -#: extensions/window-list/extension.js:118 +#: extensions/window-list/extension.js:92 msgid "Minimize" msgstr "Minimér" -#: extensions/window-list/extension.js:125 +#: extensions/window-list/extension.js:99 msgid "Unmaximize" msgstr "Afmaksimér" -#: extensions/window-list/extension.js:125 +#: extensions/window-list/extension.js:99 msgid "Maximize" msgstr "Maksimér" -#: extensions/window-list/extension.js:428 +#: extensions/window-list/extension.js:434 msgid "Minimize all" msgstr "Minimér" -#: extensions/window-list/extension.js:434 +#: extensions/window-list/extension.js:440 msgid "Unminimize all" msgstr "Afminimér alle" -#: extensions/window-list/extension.js:440 +#: extensions/window-list/extension.js:446 msgid "Maximize all" msgstr "Maksimér alle" -#: extensions/window-list/extension.js:448 +#: extensions/window-list/extension.js:454 msgid "Unmaximize all" msgstr "Afmaksimér alle" -#: extensions/window-list/extension.js:456 +#: extensions/window-list/extension.js:462 msgid "Close all" msgstr "Luk alle" -#: extensions/window-list/extension.js:734 +#: extensions/window-list/extension.js:741 msgid "Window List" msgstr "Vinduesliste" @@ -204,7 +213,7 @@ msgstr "" "Mulige værdier er “never” (aldrig), “auto” (automatisk) og “always” (altid)." #: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20 -#: extensions/window-list/prefs.js:100 +#: extensions/window-list/prefs.js:86 msgid "Show windows from all workspaces" msgstr "Vis vinduer fra alle arbejdsområder" @@ -225,41 +234,41 @@ msgstr "" "Om vindueslisten skal vise på alle tilsluttede skærme, eller kun på den " "primære." -#: extensions/window-list/prefs.js:29 +#: extensions/window-list/prefs.js:39 msgid "Window Grouping" msgstr "Vinduesgruppering" -#: extensions/window-list/prefs.js:58 +#: extensions/window-list/prefs.js:63 msgid "Never group windows" msgstr "Gruppér aldrig vinduer" -#: extensions/window-list/prefs.js:59 +#: extensions/window-list/prefs.js:64 msgid "Group windows when space is limited" msgstr "Gruppér vinduer når pladsen er begrænset" -#: extensions/window-list/prefs.js:60 +#: extensions/window-list/prefs.js:65 msgid "Always group windows" msgstr "Gruppér altid vinduer" -#: extensions/window-list/prefs.js:94 +#: extensions/window-list/prefs.js:81 msgid "Show on all monitors" msgstr "Vis på alle skærme" -#: extensions/window-list/workspaceIndicator.js:207 -#: extensions/workspace-indicator/extension.js:213 +#: extensions/window-list/workspaceIndicator.js:249 +#: extensions/workspace-indicator/extension.js:254 msgid "Workspace Indicator" msgstr "Arbejdsområdeindikator" -#: extensions/workspace-indicator/prefs.js:34 +#: extensions/workspace-indicator/prefs.js:33 msgid "Workspace Names" msgstr "Navne på arbejdsområder" -#: extensions/workspace-indicator/prefs.js:67 +#: extensions/workspace-indicator/prefs.js:66 #, javascript-format msgid "Workspace %d" msgstr "Arbejdsområde %d" -#: extensions/workspace-indicator/prefs.js:218 +#: extensions/workspace-indicator/prefs.js:207 msgid "Add Workspace" msgstr "Tilføj arbejdsområde" From b010bff5d963237fc28dc19c7bb1b8b327fabdec Mon Sep 17 00:00:00 2001 From: Charles Monzat Date: Thu, 3 Mar 2022 07:53:48 +0000 Subject: [PATCH 20/23] Update French translation --- po/fr.po | 86 ++++++++++++++++++++++++++++++++------------------------ 1 file changed, 49 insertions(+), 37 deletions(-) diff --git a/po/fr.po b/po/fr.po index ffa70d96..226cbf1e 100644 --- a/po/fr.po +++ b/po/fr.po @@ -3,36 +3,48 @@ # This file is distributed under the same license as the gnome-shell-extensions package. # Claude Paroz , 2011. # Alain Lojewski , 2012-2013. -# Charles Monzat , 2018. +# Charles Monzat , 2018-2022. # msgid "" msgstr "" "Project-Id-Version: gnome-shell-extensions master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/" "issues\n" -"POT-Creation-Date: 2020-05-28 00:55+0000\n" -"PO-Revision-Date: 2020-08-10 12:50+0200\n" -"Last-Translator: Claude Paroz \n" +"POT-Creation-Date: 2021-11-06 14:08+0000\n" +"PO-Revision-Date: 2022-03-01 21:04+0100\n" +"Last-Translator: Charles Monzat \n" "Language-Team: GNOME French Team \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Gtranslator 40.0\n" -#: data/gnome-classic.desktop.in:3 data/gnome-classic.session.desktop.in:3 +#: data/gnome-classic.desktop.in:3 msgid "GNOME Classic" msgstr "GNOME Classique" -#: data/gnome-classic.desktop.in:4 +#: data/gnome-classic.desktop.in:4 data/gnome-classic-wayland.desktop.in:4 +#: data/gnome-classic-xorg.desktop.in:4 msgid "This session logs you into GNOME Classic" msgstr "Cette session vous connecte à GNOME Classique" -#: extensions/apps-menu/extension.js:113 +#: data/gnome-classic-wayland.desktop.in:3 +#| msgid "GNOME Classic" +msgid "GNOME Classic on Wayland" +msgstr "GNOME Classique sur Wayland" + +#: data/gnome-classic-xorg.desktop.in:3 +#| msgid "GNOME Classic" +msgid "GNOME Classic on Xorg" +msgstr "GNOME Classique sur Xorg" + +#: extensions/apps-menu/extension.js:112 msgid "Favorites" msgstr "Favoris" -#: extensions/apps-menu/extension.js:369 +#: extensions/apps-menu/extension.js:366 msgid "Applications" msgstr "Applications" @@ -49,26 +61,26 @@ msgstr "" "d’application (nom de fichier desktop), suivi par un deux-points et le " "numéro de l’espace de travail" -#: extensions/auto-move-windows/prefs.js:35 +#: extensions/auto-move-windows/prefs.js:34 msgid "Workspace Rules" msgstr "Règles des espaces de travail" -#: extensions/auto-move-windows/prefs.js:243 +#: extensions/auto-move-windows/prefs.js:236 msgid "Add Rule" msgstr "Ajouter une règle" #. TRANSLATORS: %s is the filesystem name -#: extensions/drive-menu/extension.js:112 +#: extensions/drive-menu/extension.js:133 #: extensions/places-menu/placeDisplay.js:233 #, javascript-format msgid "Ejecting drive “%s” failed:" msgstr "L’éjection du disque « %s » a échoué :" -#: extensions/drive-menu/extension.js:128 +#: extensions/drive-menu/extension.js:149 msgid "Removable devices" msgstr "Périphériques amovibles" -#: extensions/drive-menu/extension.js:155 +#: extensions/drive-menu/extension.js:171 msgid "Open Files" msgstr "Ouvrir Fichiers" @@ -102,8 +114,8 @@ msgstr "" "dessous. Pour que ce paramètre soit pris en compte, il faut redémarrer le " "Shell." -#: extensions/places-menu/extension.js:89 -#: extensions/places-menu/extension.js:93 +#: extensions/places-menu/extension.js:88 +#: extensions/places-menu/extension.js:91 msgid "Places" msgstr "Emplacements" @@ -146,47 +158,47 @@ msgstr "Nom du thème" msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell" msgstr "Le nom du thème, à charger à partir de ~/.themes/name/gnome-shell" -#: extensions/window-list/extension.js:98 +#: extensions/window-list/extension.js:72 msgid "Close" msgstr "Fermer" -#: extensions/window-list/extension.js:118 +#: extensions/window-list/extension.js:92 msgid "Unminimize" msgstr "Restaurer" -#: extensions/window-list/extension.js:118 +#: extensions/window-list/extension.js:92 msgid "Minimize" msgstr "Réduire" -#: extensions/window-list/extension.js:125 +#: extensions/window-list/extension.js:99 msgid "Unmaximize" msgstr "Restaurer" -#: extensions/window-list/extension.js:125 +#: extensions/window-list/extension.js:99 msgid "Maximize" msgstr "Maximiser" -#: extensions/window-list/extension.js:428 +#: extensions/window-list/extension.js:434 msgid "Minimize all" msgstr "Tout réduire" -#: extensions/window-list/extension.js:434 +#: extensions/window-list/extension.js:440 msgid "Unminimize all" msgstr "Tout restaurer" -#: extensions/window-list/extension.js:440 +#: extensions/window-list/extension.js:446 msgid "Maximize all" msgstr "Tout maximiser" -#: extensions/window-list/extension.js:448 +#: extensions/window-list/extension.js:454 msgid "Unmaximize all" msgstr "Tout restaurer" -#: extensions/window-list/extension.js:456 +#: extensions/window-list/extension.js:462 msgid "Close all" msgstr "Tout fermer" -#: extensions/window-list/extension.js:734 +#: extensions/window-list/extension.js:741 msgid "Window List" msgstr "Liste de fenêtres" @@ -204,7 +216,7 @@ msgstr "" "« always » (toujours)." #: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20 -#: extensions/window-list/prefs.js:100 +#: extensions/window-list/prefs.js:86 msgid "Show windows from all workspaces" msgstr "Afficher les fenêtres de tous les espaces de travail" @@ -226,41 +238,41 @@ msgstr "" "Indique s’il faut afficher la liste des fenêtres sur tous les écrans " "connectés ou seulement l’écran principal." -#: extensions/window-list/prefs.js:29 +#: extensions/window-list/prefs.js:39 msgid "Window Grouping" msgstr "Regroupement de fenêtres" -#: extensions/window-list/prefs.js:58 +#: extensions/window-list/prefs.js:63 msgid "Never group windows" msgstr "Ne jamais regrouper les fenêtres" -#: extensions/window-list/prefs.js:59 +#: extensions/window-list/prefs.js:64 msgid "Group windows when space is limited" msgstr "Regrouper les fenêtres quand l’espace est limité" -#: extensions/window-list/prefs.js:60 +#: extensions/window-list/prefs.js:65 msgid "Always group windows" msgstr "Toujours regrouper les fenêtres" -#: extensions/window-list/prefs.js:94 +#: extensions/window-list/prefs.js:81 msgid "Show on all monitors" msgstr "Afficher sur tous les écrans" -#: extensions/window-list/workspaceIndicator.js:207 -#: extensions/workspace-indicator/extension.js:213 +#: extensions/window-list/workspaceIndicator.js:249 +#: extensions/workspace-indicator/extension.js:254 msgid "Workspace Indicator" msgstr "Indicateur d’espace de travail" -#: extensions/workspace-indicator/prefs.js:34 +#: extensions/workspace-indicator/prefs.js:33 msgid "Workspace Names" msgstr "Noms des espaces de travail" -#: extensions/workspace-indicator/prefs.js:67 +#: extensions/workspace-indicator/prefs.js:66 #, javascript-format msgid "Workspace %d" msgstr "Espace de travail %d" -#: extensions/workspace-indicator/prefs.js:218 +#: extensions/workspace-indicator/prefs.js:207 msgid "Add Workspace" msgstr "Ajouter un espace de travail" From 95b8aa38cbf02592bee9fe1113b2959b875d5eb3 Mon Sep 17 00:00:00 2001 From: Changwoo Ryu Date: Thu, 3 Mar 2022 12:45:28 +0000 Subject: [PATCH 21/23] Update Korean translation --- po/ko.po | 83 +++++++++++++++++++++++++++++++------------------------- 1 file changed, 46 insertions(+), 37 deletions(-) diff --git a/po/ko.po b/po/ko.po index aeb5010c..05248ce6 100644 --- a/po/ko.po +++ b/po/ko.po @@ -1,17 +1,17 @@ # Korean translation for gnome-shell-extensions. -# Copyright (C) 2012 gnome-shell-extensions's COPYRIGHT HOLDER +# Copyright (C) 2012-2022 gnome-shell-extensions's COPYRIGHT HOLDER # This file is distributed under the same license as the gnome-shell-extensions package. # # Seong-ho Cho , 2012. -# Changwoo Ryu , 2013-2015, 2017, 2019-2020. +# Changwoo Ryu , 2013-2015, 2017, 2019-2020, 2022. # msgid "" msgstr "" "Project-Id-Version: gnome-shell-extensions\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/" "issues\n" -"POT-Creation-Date: 2020-05-28 00:55+0000\n" -"PO-Revision-Date: 2020-08-28 22:25+0900\n" +"POT-Creation-Date: 2021-11-06 14:08+0000\n" +"PO-Revision-Date: 2022-03-03 00:15+0900\n" "Last-Translator: Changwoo Ryu \n" "Language-Team: Korean \n" "Language: ko\n" @@ -20,19 +20,28 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: data/gnome-classic.desktop.in:3 data/gnome-classic.session.desktop.in:3 +#: data/gnome-classic.desktop.in:3 msgid "GNOME Classic" msgstr "그놈 클래식" -#: data/gnome-classic.desktop.in:4 +#: data/gnome-classic.desktop.in:4 data/gnome-classic-wayland.desktop.in:4 +#: data/gnome-classic-xorg.desktop.in:4 msgid "This session logs you into GNOME Classic" msgstr "이 세션을 사용하면 그놈 클래식에 로그인합니다" -#: extensions/apps-menu/extension.js:113 +#: data/gnome-classic-wayland.desktop.in:3 +msgid "GNOME Classic on Wayland" +msgstr "그놈 클래식 (웨일랜드)" + +#: data/gnome-classic-xorg.desktop.in:3 +msgid "GNOME Classic on Xorg" +msgstr "그놈 클래식 (Xorg)" + +#: extensions/apps-menu/extension.js:112 msgid "Favorites" msgstr "즐겨찾기" -#: extensions/apps-menu/extension.js:369 +#: extensions/apps-menu/extension.js:366 msgid "Applications" msgstr "프로그램" @@ -48,26 +57,26 @@ msgstr "" "문자열 목록, 각각은 프로그램 ID(데스크톱 파일 이름) 다음에 콜론 뒤에 작업 공" "간 번호." -#: extensions/auto-move-windows/prefs.js:35 +#: extensions/auto-move-windows/prefs.js:34 msgid "Workspace Rules" msgstr "작업 공간 규칙" -#: extensions/auto-move-windows/prefs.js:243 +#: extensions/auto-move-windows/prefs.js:236 msgid "Add Rule" msgstr "규칙 추가" #. TRANSLATORS: %s is the filesystem name -#: extensions/drive-menu/extension.js:112 +#: extensions/drive-menu/extension.js:133 #: extensions/places-menu/placeDisplay.js:233 #, javascript-format msgid "Ejecting drive “%s” failed:" msgstr "“%s” 드라이브를 빼는데 실패했습니다:" -#: extensions/drive-menu/extension.js:128 +#: extensions/drive-menu/extension.js:149 msgid "Removable devices" msgstr "이동식 장치" -#: extensions/drive-menu/extension.js:155 +#: extensions/drive-menu/extension.js:171 msgid "Open Files" msgstr "파일 열기" @@ -99,8 +108,8 @@ msgstr "" "참이면, 창의 이름을 각 섬네일 위에 표시합니다. 셸의 기본값은 아래에 창 이름" "을 표시합니다. 이 설정을 바꾸면 셸을 다시 시작해야 적용됩니다." -#: extensions/places-menu/extension.js:89 -#: extensions/places-menu/extension.js:93 +#: extensions/places-menu/extension.js:88 +#: extensions/places-menu/extension.js:91 msgid "Places" msgstr "위치" @@ -143,47 +152,47 @@ msgstr "테마 이름" msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell" msgstr "테마 이름, ~/.themes/name/gnome-shell 아래에서 읽어들입니다." -#: extensions/window-list/extension.js:98 +#: extensions/window-list/extension.js:72 msgid "Close" msgstr "닫기" -#: extensions/window-list/extension.js:118 +#: extensions/window-list/extension.js:92 msgid "Unminimize" msgstr "최소화 취소" -#: extensions/window-list/extension.js:118 +#: extensions/window-list/extension.js:92 msgid "Minimize" msgstr "최소화" -#: extensions/window-list/extension.js:125 +#: extensions/window-list/extension.js:99 msgid "Unmaximize" msgstr "최대화 취소" -#: extensions/window-list/extension.js:125 +#: extensions/window-list/extension.js:99 msgid "Maximize" msgstr "최대화" -#: extensions/window-list/extension.js:428 +#: extensions/window-list/extension.js:434 msgid "Minimize all" msgstr "모두 최소화" -#: extensions/window-list/extension.js:434 +#: extensions/window-list/extension.js:440 msgid "Unminimize all" msgstr "모두 최소화 취소" -#: extensions/window-list/extension.js:440 +#: extensions/window-list/extension.js:446 msgid "Maximize all" msgstr "모두 최대화" -#: extensions/window-list/extension.js:448 +#: extensions/window-list/extension.js:454 msgid "Unmaximize all" msgstr "모두 최대화 취소" -#: extensions/window-list/extension.js:456 +#: extensions/window-list/extension.js:462 msgid "Close all" msgstr "모두 닫기" -#: extensions/window-list/extension.js:734 +#: extensions/window-list/extension.js:741 msgid "Window List" msgstr "창 목록" @@ -200,7 +209,7 @@ msgstr "" "“never”, “auto”, “always”입니다." #: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20 -#: extensions/window-list/prefs.js:100 +#: extensions/window-list/prefs.js:86 msgid "Show windows from all workspaces" msgstr "모든 작업 공간의 창을 표시합니다" @@ -220,41 +229,41 @@ msgstr "" "연결된 모든 모니터에 있는 창 목록을 표시할지, 아니면 주 모니터에 있는 창 목록" "만 표시할지." -#: extensions/window-list/prefs.js:29 +#: extensions/window-list/prefs.js:39 msgid "Window Grouping" msgstr "창 모으기" -#: extensions/window-list/prefs.js:58 +#: extensions/window-list/prefs.js:63 msgid "Never group windows" msgstr "창을 모으지 않기" -#: extensions/window-list/prefs.js:59 +#: extensions/window-list/prefs.js:64 msgid "Group windows when space is limited" msgstr "공간이 부족할 때 창 모으기" -#: extensions/window-list/prefs.js:60 +#: extensions/window-list/prefs.js:65 msgid "Always group windows" msgstr "항상 창 모으기" -#: extensions/window-list/prefs.js:94 +#: extensions/window-list/prefs.js:81 msgid "Show on all monitors" msgstr "모든 모니터 보이기" -#: extensions/window-list/workspaceIndicator.js:207 -#: extensions/workspace-indicator/extension.js:213 +#: extensions/window-list/workspaceIndicator.js:249 +#: extensions/workspace-indicator/extension.js:254 msgid "Workspace Indicator" msgstr "작업 공간 표시" -#: extensions/workspace-indicator/prefs.js:34 +#: extensions/workspace-indicator/prefs.js:33 msgid "Workspace Names" msgstr "작업 공간 이름" -#: extensions/workspace-indicator/prefs.js:67 +#: extensions/workspace-indicator/prefs.js:66 #, javascript-format msgid "Workspace %d" msgstr "작업 공간 %d" -#: extensions/workspace-indicator/prefs.js:218 +#: extensions/workspace-indicator/prefs.js:207 msgid "Add Workspace" msgstr "작업 공간 추가" From 06af10e0d359bd8c4a20c3759c717a09f7749ffc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Mon, 7 Mar 2022 16:03:40 +0100 Subject: [PATCH 22/23] Update sass submodule Part-of: --- data/gnome-shell-sass | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/gnome-shell-sass b/data/gnome-shell-sass index f0bbabd7..06b3065c 160000 --- a/data/gnome-shell-sass +++ b/data/gnome-shell-sass @@ -1 +1 @@ -Subproject commit f0bbabd76b9631cbaa385d41cc26defc7d4b12ea +Subproject commit 06b3065c959ec1b4a39ca06c975187a0f13f3e49 From 80e68be9fa7d593a1122f0ffa08cc13ea99be6fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Mon, 7 Mar 2022 16:04:51 +0100 Subject: [PATCH 23/23] Bump version to 42.rc Update NEWS. Part-of: --- NEWS | 12 ++++++++++++ meson.build | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index bc833886..f59b55f5 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,15 @@ +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] diff --git a/meson.build b/meson.build index d8531b9d..8cfa4692 100644 --- a/meson.build +++ b/meson.build @@ -1,5 +1,5 @@ project('gnome-shell-extensions', - version: '42.beta', + version: '42.rc', meson_version: '>= 0.53.0', license: 'GPL2+' )