Import Upstream version 41.0
Sophie Brun
2 years ago
0 | patterns: | |
1 | deny: | |
2 | - regex: '^$CI_MERGE_REQUEST_PROJECT_URL/(-/)?merge_requests/$CI_MERGE_REQUEST_IID$' | |
3 | message: Commit message must not contain a link to its own merge request | |
4 | - regex: '^extensions/' | |
5 | message: Commit message subject should not be prefixed with 'extensions/', use the extension name instead | |
6 | where: subject | |
7 | - regex: '^[^:]+: [a-z]' | |
8 | message: "Commit message subject should be properly Capitalized. E.g. 'window: Marginalize extradicity'" | |
9 | where: subject | |
10 | - regex: '^\S*\.js:' | |
11 | message: Commit message subject prefix should not include .js | |
12 | where: subject |
0 | include: | |
1 | - remote: 'https://gitlab.freedesktop.org/freedesktop/ci-templates/-/raw/bbe5232986c9b98eb1efe62484e07216f7d1a4df/templates/fedora.yml' | |
2 | - remote: "https://gitlab.freedesktop.org/freedesktop/ci-templates/-/raw/6f86b8bcb0cd5168c32779c4fea9a893c4a0c046/templates/ci-fairy.yml" | |
3 | ||
4 | image: registry.gitlab.gnome.org/gnome/gnome-shell/fedora/34:2021-08-12.0 | |
5 | ||
6 | stages: | |
7 | - pre_review | |
8 | - prepare | |
9 | - review | |
10 | - build | |
11 | - deploy | |
12 | ||
13 | default: | |
14 | # Cancel jobs if newer commits are pushed to the branch | |
15 | interruptible: true | |
16 | # Auto-retry jobs in case of infra failures | |
17 | retry: | |
18 | max: 1 | |
19 | when: | |
20 | - 'runner_system_failure' | |
21 | - 'stuck_or_timeout_failure' | |
22 | - 'scheduler_failure' | |
23 | - 'api_failure' | |
24 | ||
25 | variables: | |
26 | FDO_UPSTREAM_REPO: GNOME/gnome-shell-extensions | |
27 | LINT_LOG: "eslint-report.xml" | |
28 | JS_LOG: "js-report.txt" | |
29 | ||
30 | workflow: | |
31 | rules: | |
32 | - if: '$CI_MERGE_REQUEST_IID' | |
33 | - if: '$CI_COMMIT_TAG' | |
34 | - if: '$CI_COMMIT_BRANCH' | |
35 | ||
36 | .pipeline_guard: &pipeline_guard | |
37 | rules: | |
38 | - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' | |
39 | - if: '$CI_COMMIT_TAG' | |
40 | - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' | |
41 | - if: '$CI_COMMIT_BRANCH =~ /^gnome-[0-9-]+$/' | |
42 | - when: 'manual' | |
43 | ||
44 | .gnome-shell-extensions.fedora:34: | |
45 | variables: | |
46 | FDO_DISTRIBUTION_VERSION: 34 | |
47 | FDO_DISTRIBUTION_TAG: '2021-08-31.0' | |
48 | FDO_DISTRIBUTION_PACKAGES: > | |
49 | meson git gettext sassc | |
50 | ||
51 | .prereview_req: &prereview_req | |
52 | needs: | |
53 | - check_commit_log | |
54 | - check-merge-request | |
55 | ||
56 | check_commit_log: | |
57 | extends: | |
58 | - .fdo.ci-fairy | |
59 | stage: pre_review | |
60 | script: | |
61 | - if [[ x"$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" != "x" ]] ; | |
62 | then | |
63 | ci-fairy check-commits --junit-xml=commit-message-junit-report.xml ; | |
64 | else | |
65 | echo "Not a merge request" ; | |
66 | fi | |
67 | <<: *pipeline_guard | |
68 | artifacts: | |
69 | expire_in: 1 week | |
70 | paths: | |
71 | - commit-message-junit-report.xml | |
72 | reports: | |
73 | junit: commit-message-junit-report.xml | |
74 | ||
75 | check-merge-request: | |
76 | extends: | |
77 | - .fdo.ci-fairy | |
78 | stage: pre_review | |
79 | script: | |
80 | - if [[ x"$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" != "x" ]] ; | |
81 | then | |
82 | ci-fairy check-merge-request --require-allow-collaboration --junit-xml=check-merge-request-report.xml ; | |
83 | else | |
84 | echo "Not a merge request" ; | |
85 | fi | |
86 | <<: *pipeline_guard | |
87 | artifacts: | |
88 | expire_in: 1 week | |
89 | paths: | |
90 | - check-merge-request-report.xml | |
91 | reports: | |
92 | junit: check-merge-request-report.xml | |
93 | ||
94 | build-fedora-container: | |
95 | extends: | |
96 | - .fdo.container-build@fedora@x86_64 | |
97 | - .gnome-shell-extensions.fedora:34 | |
98 | stage: prepare | |
99 | <<: *prereview_req | |
100 | ||
101 | js_check: | |
102 | stage: review | |
103 | <<: *prereview_req | |
104 | script: | |
105 | - find extensions -name '*.js' -exec js78 -c '{}' ';' 2>&1 | tee $JS_LOG | |
106 | - (! grep -q . $JS_LOG) | |
107 | artifacts: | |
108 | paths: | |
109 | - ${JS_LOG} | |
110 | when: on_failure | |
111 | ||
112 | eslint: | |
113 | stage: review | |
114 | <<: *prereview_req | |
115 | script: | |
116 | - eslint -o $LINT_LOG -f junit --resolve-plugins-relative-to $(npm root -g) extensions | |
117 | artifacts: | |
118 | paths: | |
119 | - ${LINT_LOG} | |
120 | reports: | |
121 | junit: ${LINT_LOG} | |
122 | ||
123 | build-bundles: | |
124 | stage: build | |
125 | <<: *prereview_req | |
126 | script: | |
127 | - ./export-zips.sh | |
128 | artifacts: | |
129 | name: 'Extension bundles' | |
130 | expose_as: 'Get Extension bundles here' | |
131 | paths: | |
132 | - zip-files/ | |
133 | ||
134 | fedora-build: | |
135 | extends: | |
136 | - .fdo.distribution-image@fedora | |
137 | - .gnome-shell-extensions.fedora:34 | |
138 | stage: build | |
139 | needs: | |
140 | - build-fedora-container | |
141 | before_script: | |
142 | - git submodule update --init | |
143 | script: | |
144 | - meson setup build --werror -Dextension_set=all -Dclassic_mode=true | |
145 | - meson compile -C build | |
146 | - meson test -C build | |
147 | - meson install -C build | |
148 | artifacts: | |
149 | paths: | |
150 | - build | |
151 | ||
152 | fedora-dist: | |
153 | extends: | |
154 | - .fdo.distribution-image@fedora | |
155 | - .gnome-shell-extensions.fedora:34 | |
156 | stage: deploy | |
157 | needs: | |
158 | - fedora-build | |
159 | before_script: | |
160 | - git submodule update --init | |
161 | script: | |
162 | - meson dist -C build | |
163 | rules: | |
164 | - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' | |
165 | changes: | |
166 | - "**/meson.build" | |
167 | - meson/* | |
168 | ||
169 | fedora-dist-tarball: | |
170 | extends: fedora-dist | |
171 | artifacts: | |
172 | expose_as: 'Get tarball here' | |
173 | paths: | |
174 | - build/meson-dist/$CI_PROJECT_NAME-$CI_COMMIT_TAG.tar.xz | |
175 | rules: | |
176 | - if: '$CI_COMMIT_TAG' |
27 | 27 | the other for Shell API. Within the same group, put everything |
28 | 28 | in alphabetic order. |
29 | 29 | |
30 | [coding-style]: https://gitlab.gnome.org/GNOME/gjs/blob/master/doc/Style_Guide.md | |
30 | [coding-style]: https://gitlab.gnome.org/GNOME/gjs/blob/HEAD/doc/Style_Guide.md |
0 | 40.4 | |
0 | 41.0 | |
1 | 1 | ==== |
2 | * drive-menu: Fix indicator visibility [Florian; !176] | |
2 | * Bump version | |
3 | ||
4 | 41.rc.1 | |
5 | ======= | |
6 | * Fix pre-generating stylesheets in tarball [Florian; !190] | |
7 | ||
8 | Contributors: | |
9 | Florian Müllner | |
10 | ||
11 | 41.rc | |
12 | ===== | |
13 | * window-list: Adapt to overview-on-startup [Florian; !185] | |
14 | * apps-menu: Use a custom 'toggle-menu' shortcut [Florian; !173] | |
15 | * Misc. bug fixes and cleanups [Florian; !186] | |
16 | ||
17 | Contributors: | |
18 | Florian Müllner | |
19 | ||
20 | 41.beta | |
21 | ======= | |
22 | * window-list: Extend reactive area of minimap to screen edges [Adam; !171] | |
23 | * drive-menu: Improve detection of network mounts [Florian; !27, !176] | |
3 | 24 | * Use distinct gettext domain for e.g.o uploads [Florian; #335] |
4 | ||
5 | Contributors: | |
6 | Florian Müllner | |
7 | ||
8 | ||
9 | 40.3 | |
10 | ==== | |
11 | * drive-menu: Improve detection of network mounts [Florian; !27] | |
12 | * Misc. bug fixes [Florian; #340] | |
13 | ||
14 | Contributors: | |
15 | Florian Müllner | |
16 | ||
17 | 40.2 | |
18 | ==== | |
19 | * window-list: Extend reactive area of minimap to screen edges [Adam; !171] | |
20 | * Misc. bug fixes [Florian; !172] | |
21 | ||
22 | Contributors: | |
23 | Adam Goode, Florian Müllner | |
24 | ||
25 | Translators: | |
26 | Hugo Carvalho [pt], Juliano de Souza Camargo [pt] | |
25 | * Misc. bug fixes and cleanups [Florian; !172, !174, !177, !167, !178, !180, | |
26 | !181, !182, !183] | |
27 | ||
28 | Contributors: | |
29 | Marco Trevisan (Treviño), Adam Goode, Florian Müllner | |
30 | ||
31 | Translators: | |
32 | Hugo Carvalho [pt], Juliano de Souza Camargo [pt], Alexander Shopov [bg] | |
27 | 33 | |
28 | 34 | 40.1 |
29 | 35 | ==== |
68 | 68 | |
69 | 69 | Adds a simple workspace switcher to the top bar. |
70 | 70 | |
71 | ## Default branch | |
72 | ||
73 | The default development branch is `main`. If you still have a local | |
74 | checkout under the old name, use: | |
75 | ```sh | |
76 | git checkout master | |
77 | git branch -m master main | |
78 | git fetch | |
79 | git branch --unset-upstream | |
80 | git branch -u origin/master | |
81 | git symbolic-ref refs/remotes/origin/HEAD refs/remotes/origin/main | |
82 | ``` | |
83 | ||
71 | 84 | ## License |
72 | 85 | |
73 | 86 | GNOME Shell Extensions are distributed under the terms of the GNU General |
83 | 83 | } |
84 | 84 | |
85 | 85 | #appMenu { |
86 | padding: 0 8px 0 8px; | |
87 | 86 | spinner-image: url("classic-process-working.svg"); |
87 | .panel-status-menu-box { padding: 0; } | |
88 | 88 | } |
89 | 89 | .tile-preview-left.on-primary, |
90 | 90 | .tile-preview-right.on-primary, |
10 | 10 | GNOME Shell Sass is distributed under the terms of the GNU General Public |
11 | 11 | License, version 2 or later. See the [COPYING][license] file for details. |
12 | 12 | |
13 | [shell-subtree]: https://gitlab.gnome.org/GNOME/gnome-shell/tree/master/data/theme/gnome-shell-sass | |
13 | [shell-subtree]: https://gitlab.gnome.org/GNOME/gnome-shell/tree/HEAD/data/theme/gnome-shell-sass | |
14 | 14 | [sass-repo]: https://gitlab.gnome.org/GNOME/gnome-shell-sass |
15 | 15 | [license]: COPYING |
45 | 45 | border-color: if($fc==$selected_bg_color, |
46 | 46 | $selected_borders_color, |
47 | 47 | darken($fc,35%)); |
48 | box-shadow: inset 0 0 0 1px $fc; | |
48 | box-shadow: inset 0 0 0 2px $fc; | |
49 | 49 | } |
50 | 50 | @if $t==hover { } |
51 | 51 | @if $t==insensitive { |
107 | 107 | } |
108 | 108 | |
109 | 109 | // right-click app menu |
110 | .app-menu, | |
111 | .app-well-menu { | |
110 | .app-menu { | |
112 | 111 | max-width: 27.25em; |
113 | 112 | } |
114 | 113 |
2 | 2 | StEntry { |
3 | 3 | border-radius: $base_border_radius; |
4 | 4 | padding: 8px; |
5 | border-width: 1px; | |
5 | border-width: 0; | |
6 | 6 | color: $fg_color; |
7 | 7 | @include entry(normal); |
8 | 8 | //&:hover { @include entry(hover);} |
24 | 24 | // NOTE: remove the padding if notification_bubble could remove margin for drop shadow |
25 | 25 | padding: $base_margin; |
26 | 26 | spacing: $base_spacing * 2; |
27 | ||
28 | .dnd-button { | |
29 | // We need this because the focus outline isn't inset like for the buttons | |
30 | // so the dnd button would grow when it gets focus if we didn't change only | |
31 | // its color when focusing. | |
32 | border-width: 2px; | |
33 | border-color: transparent; | |
34 | border-radius: 99px; | |
35 | border-style: solid; | |
36 | ||
37 | &:focus { | |
38 | border-color: transparentize($selected_bg_color, 0.4); | |
39 | } | |
40 | } | |
27 | 41 | } |
28 | 42 | |
29 | 43 | // message bubbles |
9 | 9 | border-radius: $search_entry_height * 0.5; // half the height |
10 | 10 | color: transparentize($fg_color,0.3); |
11 | 11 | background-color: $bg_color; |
12 | border-color: $borders_color; | |
13 | 12 | margin-top: $base_spacing * 2; |
14 | 13 | margin-bottom: $base_spacing; |
15 | ||
14 | border-width: 2px; | |
15 | border-color: transparent; | |
16 | 16 | &:hover { |
17 | 17 | background-color: $hover_bg_color; |
18 | border-color: $hover_borders_color; | |
19 | 18 | color: $hover_fg_color; |
20 | 19 | } |
21 | 20 | |
22 | 21 | &:focus { |
23 | padding: $base_padding $base_padding+2; // 1px less to account for wider border | |
24 | border-width: 2px; | |
25 | 22 | border-style: solid; |
26 | 23 | border-color: $selected_bg_color; |
27 | 24 | color: $fg_color; |
47 | 47 | .workspace-background { |
48 | 48 | // keep in sync with BACKGROUND_CORNER_RADIUS_PIXELS in workspace.js |
49 | 49 | border-radius: 30px; |
50 | background-color: $osd_bg_color; | |
51 | 50 | box-shadow: 0 4px 16px 4px transparentize(darken($osd_bg_color, 30%), 0.7); |
52 | 51 | } |
6 | 6 | installdir=`mktemp -p $srcdir -d _install.XXXXXX` || exit 1 |
7 | 7 | |
8 | 8 | meson setup --prefix=$installdir -Dextension_set=all $srcdir $builddir |
9 | ninja -C$builddir install | |
9 | meson install -C $builddir | |
10 | 10 | |
11 | 11 | rm -rf $srcdir/zip-files |
12 | 12 | mkdir $srcdir/zip-files |
11 | 11 | const PanelMenu = imports.ui.panelMenu; |
12 | 12 | const PopupMenu = imports.ui.popupMenu; |
13 | 13 | |
14 | const Me = ExtensionUtils.getCurrentExtension(); | |
15 | const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); | |
16 | const _ = Gettext.gettext; | |
14 | const _ = ExtensionUtils.gettext; | |
17 | 15 | |
18 | 16 | const appSys = Shell.AppSystem.get_default(); |
19 | 17 | |
379 | 377 | this._hidingId = Main.overview.connect('hiding', () => { |
380 | 378 | this.remove_accessible_state(Atk.StateType.CHECKED); |
381 | 379 | }); |
382 | Main.layoutManager.connect('startup-complete', | |
383 | this._setKeybinding.bind(this)); | |
384 | this._setKeybinding(); | |
380 | Main.wm.addKeybinding( | |
381 | 'apps-menu-toggle-menu', | |
382 | ExtensionUtils.getSettings(), | |
383 | Meta.KeyBindingFlags.IGNORE_AUTOREPEAT, | |
384 | Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW, | |
385 | () => this.menu.toggle()); | |
385 | 386 | |
386 | 387 | this._desktopTarget = new DesktopTarget(); |
387 | 388 | this._desktopTarget.connect('app-dropped', () => { |
432 | 433 | this._tree.disconnect(this._treeChangedId); |
433 | 434 | this._tree = null; |
434 | 435 | |
435 | Main.wm.setCustomKeybindingHandler('panel-main-menu', | |
436 | Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW, | |
437 | Main.sessionMode.hasOverview | |
438 | ? Main.overview.toggle.bind(Main.overview) | |
439 | : null); | |
436 | Main.wm.removeKeybinding('apps-menu-toggle-menu'); | |
440 | 437 | |
441 | 438 | this._desktopTarget.destroy(); |
442 | 439 | } |
476 | 473 | this.mainBox.show(); |
477 | 474 | } |
478 | 475 | super._onOpenStateChanged(menu, open); |
479 | } | |
480 | ||
481 | _setKeybinding() { | |
482 | Main.wm.setCustomKeybindingHandler('panel-main-menu', | |
483 | Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW, | |
484 | () => this.menu.toggle()); | |
485 | 476 | } |
486 | 477 | |
487 | 478 | _redisplay() { |
673 | 664 | |
674 | 665 | let appsMenuButton; |
675 | 666 | |
667 | /** */ | |
676 | 668 | function enable() { |
677 | 669 | appsMenuButton = new ApplicationsButton(); |
678 | 670 | let index = Main.sessionMode.panel.left.indexOf('activities') + 1; |
679 | 671 | Main.panel.addToStatusArea('apps-menu', appsMenuButton, index, 'left'); |
680 | 672 | } |
681 | 673 | |
674 | /** */ | |
682 | 675 | function disable() { |
683 | 676 | Main.panel.menuManager.removeMenu(appsMenuButton.menu); |
684 | 677 | appsMenuButton.destroy(); |
685 | 678 | } |
686 | 679 | |
680 | /** */ | |
687 | 681 | function init() { |
688 | 682 | ExtensionUtils.initTranslations(); |
689 | 683 | } |
2 | 2 | output: metadata_name, |
3 | 3 | configuration: metadata_conf |
4 | 4 | ) |
5 | extension_schemas += files(metadata_conf.get('gschemaname') + '.gschema.xml') |
0 | 0 | { |
1 | 1 | "extension-id": "@extension_id@", |
2 | 2 | "uuid": "@uuid@", |
3 | "settings-schema": "@gschemaname@", | |
3 | 4 | "gettext-domain": "@gettext_domain@", |
4 | 5 | "name": "Applications Menu", |
5 | 6 | "description": "Add a category-based menu for applications.\nThis extension is part of Classic Mode and is officially supported by GNOME. Please do not report bugs using the form below, use GNOME's GitLab instance instead.", |
0 | <schemalist gettext-domain="gnome-shell-extensions"> | |
1 | <schema id="org.gnome.shell.extensions.apps-menu" | |
2 | path="/org/gnome/shell/extensions/apps-menu/"> | |
3 | <key name="apps-menu-toggle-menu" type="as"> | |
4 | <default>["<Alt>F1"]</default> | |
5 | <summary>Keybinding to open the applications menu</summary> | |
6 | <description> | |
7 | Keybinding to open the applications menu. | |
8 | </description> | |
9 | </key> | |
10 | </schema> | |
11 | </schemalist> |
107 | 107 | let prevCheckWorkspaces; |
108 | 108 | let winMover; |
109 | 109 | |
110 | /** */ | |
110 | 111 | function init() { |
111 | 112 | ExtensionUtils.initTranslations(); |
112 | 113 | } |
113 | 114 | |
115 | /** | |
116 | * @returns {bool} - false (used as MetaLater handler) | |
117 | */ | |
114 | 118 | function myCheckWorkspaces() { |
115 | 119 | let keepAliveWorkspaces = []; |
116 | 120 | let foundNonEmpty = false; |
131 | 135 | return false; |
132 | 136 | } |
133 | 137 | |
138 | /** */ | |
134 | 139 | function enable() { |
135 | 140 | prevCheckWorkspaces = Main.wm._workspaceTracker._checkWorkspaces; |
136 | 141 | Main.wm._workspaceTracker._checkWorkspaces = myCheckWorkspaces; |
138 | 143 | winMover = new WindowMover(); |
139 | 144 | } |
140 | 145 | |
146 | /** */ | |
141 | 147 | function disable() { |
142 | 148 | Main.wm._workspaceTracker._checkWorkspaces = prevCheckWorkspaces; |
143 | 149 | winMover.destroy(); |
4 | 4 | const { Gio, GLib, GObject, Gtk, Pango } = imports.gi; |
5 | 5 | |
6 | 6 | const ExtensionUtils = imports.misc.extensionUtils; |
7 | const Me = ExtensionUtils.getCurrentExtension(); | |
8 | ||
9 | const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); | |
10 | const _ = Gettext.gettext; | |
7 | ||
8 | const _ = ExtensionUtils.gettext; | |
11 | 9 | |
12 | 10 | const SETTINGS_KEY = 'application-list'; |
13 | 11 | |
266 | 264 | } |
267 | 265 | }); |
268 | 266 | |
267 | /** */ | |
269 | 268 | function init() { |
270 | 269 | ExtensionUtils.initTranslations(); |
271 | 270 | } |
272 | 271 | |
272 | /** | |
273 | * @returns {Gtk.Widget} - the prefs widget | |
274 | */ | |
273 | 275 | function buildPrefsWidget() { |
274 | 276 | return new AutoMoveSettingsWidget(); |
275 | 277 | } |
7 | 7 | const PopupMenu = imports.ui.popupMenu; |
8 | 8 | const ShellMountOperation = imports.ui.shellMountOperation; |
9 | 9 | |
10 | const Me = ExtensionUtils.getCurrentExtension(); | |
11 | const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); | |
12 | const _ = Gettext.gettext; | |
10 | const _ = ExtensionUtils.gettext; | |
13 | 11 | |
14 | 12 | var MountMenuItem = GObject.registerClass( |
15 | 13 | class MountMenuItem extends PopupMenu.PopupBaseMenuItem { |
217 | 215 | } |
218 | 216 | }); |
219 | 217 | |
218 | /** */ | |
220 | 219 | function init() { |
221 | 220 | ExtensionUtils.initTranslations(); |
222 | 221 | } |
223 | 222 | |
224 | 223 | let _indicator; |
225 | 224 | |
225 | /** */ | |
226 | 226 | function enable() { |
227 | 227 | _indicator = new DriveMenu(); |
228 | 228 | Main.panel.addToStatusArea('drive-menu', _indicator); |
229 | 229 | } |
230 | 230 | |
231 | /** */ | |
231 | 232 | function disable() { |
232 | 233 | _indicator.destroy(); |
233 | 234 | } |
2 | 2 | |
3 | 3 | let _activateOriginal = null; |
4 | 4 | |
5 | /** */ | |
5 | 6 | function enable() { |
6 | 7 | _activateOriginal = AppDisplay.AppIcon.prototype.activate; |
7 | 8 | AppDisplay.AppIcon.prototype.activate = function () { |
9 | 10 | }; |
10 | 11 | } |
11 | 12 | |
13 | /** */ | |
12 | 14 | function disable() { |
13 | 15 | AppDisplay.AppIcon.prototype.activate = _activateOriginal; |
14 | 16 | } |
237 | 237 | |
238 | 238 | let winInjections, workspaceInjections; |
239 | 239 | |
240 | /** */ | |
240 | 241 | function resetState() { |
241 | 242 | winInjections = { }; |
242 | 243 | workspaceInjections = { }; |
243 | 244 | } |
244 | 245 | |
246 | /** */ | |
245 | 247 | function enable() { |
246 | 248 | resetState(); |
247 | 249 | |
281 | 283 | }; |
282 | 284 | } |
283 | 285 | |
286 | /** | |
287 | * @param {Object} object - object that was modified | |
288 | * @param {Object} injection - the map of previous injections | |
289 | * @param {string} name - the @injection key that should be removed | |
290 | */ | |
284 | 291 | function removeInjection(object, injection, name) { |
285 | 292 | if (injection[name] === undefined) |
286 | 293 | delete object[name]; |
288 | 295 | object[name] = injection[name]; |
289 | 296 | } |
290 | 297 | |
298 | /** */ | |
291 | 299 | function disable() { |
292 | 300 | var i; |
293 | 301 |
8 | 8 | const PopupMenu = imports.ui.popupMenu; |
9 | 9 | |
10 | 10 | const Me = ExtensionUtils.getCurrentExtension(); |
11 | const PlaceDisplay = Me.imports.placeDisplay; | |
11 | 12 | |
12 | const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); | |
13 | const _ = Gettext.gettext; | |
13 | const _ = ExtensionUtils.gettext; | |
14 | 14 | const N_ = x => x; |
15 | ||
16 | const PlaceDisplay = Me.imports.placeDisplay; | |
17 | 15 | |
18 | 16 | const PLACE_ICON_SIZE = 16; |
19 | 17 | |
133 | 131 | } |
134 | 132 | }); |
135 | 133 | |
134 | /** */ | |
136 | 135 | function init() { |
137 | 136 | ExtensionUtils.initTranslations(); |
138 | 137 | } |
139 | 138 | |
140 | 139 | let _indicator; |
141 | 140 | |
141 | /** */ | |
142 | 142 | function enable() { |
143 | 143 | _indicator = new PlacesMenu(); |
144 | 144 | |
148 | 148 | Main.panel.addToStatusArea('places-menu', _indicator, pos, 'left'); |
149 | 149 | } |
150 | 150 | |
151 | /** */ | |
151 | 152 | function disable() { |
152 | 153 | _indicator.destroy(); |
153 | 154 | } |
6 | 6 | const Main = imports.ui.main; |
7 | 7 | const ShellMountOperation = imports.ui.shellMountOperation; |
8 | 8 | |
9 | const Me = ExtensionUtils.getCurrentExtension(); | |
10 | ||
11 | const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); | |
12 | const _ = Gettext.gettext; | |
9 | const _ = ExtensionUtils.gettext; | |
13 | 10 | const N_ = x => x; |
14 | 11 | |
15 | 12 | const BACKGROUND_SCHEMA = 'org.gnome.desktop.background'; |
27 | 27 | |
28 | 28 | let text; |
29 | 29 | |
30 | /** */ | |
30 | 31 | function hideMessage() { |
31 | 32 | text.destroy(); |
32 | 33 | text = null; |
33 | 34 | } |
34 | 35 | |
36 | /** | |
37 | * @param {string} message - the message to flash | |
38 | */ | |
35 | 39 | function flashMessage(message) { |
36 | 40 | if (!text) { |
37 | 41 | text = new St.Label({ style_class: 'screenshot-sizer-message' }); |
66 | 70 | [720, 360], // Phone landscape fullscreen |
67 | 71 | ]; |
68 | 72 | |
73 | /** | |
74 | * @param {Meta.Display} display - the display | |
75 | * @param {Meta.Window=} window - for per-window bindings, the window | |
76 | * @param {Meta.KeyBinding} binding - the key binding | |
77 | */ | |
69 | 78 | function cycleScreenshotSizes(display, window, binding) { |
70 | 79 | // Probably this isn't useful with 5 sizes, but you can decrease instead |
71 | 80 | // of increase by holding down shift. |
132 | 141 | flashMessage(message); |
133 | 142 | } |
134 | 143 | |
144 | /** */ | |
135 | 145 | function enable() { |
136 | 146 | Main.wm.addKeybinding( |
137 | 147 | 'cycle-screenshot-sizes', |
147 | 157 | cycleScreenshotSizes); |
148 | 158 | } |
149 | 159 | |
160 | /** */ | |
150 | 161 | function disable() { |
151 | 162 | Main.wm.removeKeybinding('cycle-screenshot-sizes'); |
152 | 163 | Main.wm.removeKeybinding('cycle-screenshot-sizes-backward'); |
57 | 57 | } |
58 | 58 | } |
59 | 59 | |
60 | /** | |
61 | * @returns {ThemeManager} - the extension state object | |
62 | */ | |
60 | 63 | function init() { |
61 | 64 | return new ThemeManager(); |
62 | 65 | } |
173 | 173 | } |
174 | 174 | }); |
175 | 175 | |
176 | /** */ | |
176 | 177 | function init() { |
177 | 178 | } |
178 | 179 | |
180 | /** | |
181 | * @returns {Gtk.Widget} - the prefs widget | |
182 | */ | |
179 | 183 | function buildPrefsWidget() { |
180 | 184 | return new UserThemePrefsWidget(); |
181 | 185 | } |
2 | 2 | |
3 | 3 | const fn = (...args) => GLib.build_filenamev(args); |
4 | 4 | |
5 | /** | |
6 | * @returns {string[]} - an ordered list of theme directories | |
7 | */ | |
5 | 8 | function getThemeDirs() { |
6 | 9 | return [ |
7 | 10 | fn(GLib.get_home_dir(), '.themes'), |
10 | 13 | ]; |
11 | 14 | } |
12 | 15 | |
16 | /** | |
17 | * @returns {string[]} - an ordered list of mode theme directories | |
18 | */ | |
13 | 19 | function getModeThemeDirs() { |
14 | 20 | return GLib.get_system_data_dirs() |
15 | 21 | .map(dir => fn(dir, 'gnome-shell', 'theme')); |
10 | 10 | const { WindowPicker, WindowPickerToggle } = Me.imports.windowPicker; |
11 | 11 | const { WorkspaceIndicator } = Me.imports.workspaceIndicator; |
12 | 12 | |
13 | const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); | |
14 | const _ = Gettext.gettext; | |
13 | const _ = ExtensionUtils.gettext; | |
15 | 14 | |
16 | 15 | const ICON_TEXTURE_SIZE = 24; |
17 | 16 | const DND_ACTIVATE_TIMEOUT = 500; |
22 | 21 | ALWAYS: 2, |
23 | 22 | }; |
24 | 23 | |
25 | ||
26 | function _minimizeOrActivateWindow(window) { | |
27 | let focusWindow = global.display.focus_window; | |
28 | if (focusWindow === window || | |
29 | focusWindow && focusWindow.get_transient_for() === window) | |
30 | window.minimize(); | |
31 | else | |
32 | window.activate(global.get_current_time()); | |
33 | } | |
34 | ||
35 | function _openMenu(menu) { | |
36 | menu.open(); | |
37 | ||
38 | let event = Clutter.get_current_event(); | |
39 | if (event && event.type() === Clutter.EventType.KEY_RELEASE) | |
40 | menu.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false); | |
41 | } | |
42 | ||
43 | function _onMenuStateChanged(menu, isOpen) { | |
44 | if (isOpen) | |
45 | return; | |
46 | ||
47 | let [x, y] = global.get_pointer(); | |
48 | let actor = global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, x, y); | |
49 | if (Me.stateObj.someWindowListContains(actor)) | |
50 | actor.sync_hover(); | |
51 | } | |
52 | ||
24 | /** | |
25 | * @param {Shell.App} app - an app | |
26 | * @returns {number} - the smallest stable sequence of the app's windows | |
27 | */ | |
53 | 28 | function _getAppStableSequence(app) { |
54 | 29 | let windows = app.get_windows().filter(w => !w.skip_taskbar); |
55 | 30 | return windows.reduce((prev, cur) => { |
56 | 31 | return Math.min(prev, cur.get_stable_sequence()); |
57 | 32 | }, Infinity); |
58 | 33 | } |
59 | ||
60 | 34 | |
61 | 35 | class WindowContextMenu extends PopupMenu.PopupMenu { |
62 | 36 | constructor(source, metaWindow) { |
281 | 255 | return true; |
282 | 256 | } |
283 | 257 | |
258 | _openMenu(menu) { | |
259 | menu.open(); | |
260 | ||
261 | let event = Clutter.get_current_event(); | |
262 | if (event && event.type() === Clutter.EventType.KEY_RELEASE) | |
263 | menu.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false); | |
264 | } | |
265 | ||
266 | _minimizeOrActivateWindow(window) { | |
267 | let focusWindow = global.display.focus_window; | |
268 | if (focusWindow === window || | |
269 | focusWindow && focusWindow.get_transient_for() === window) | |
270 | window.minimize(); | |
271 | else | |
272 | window.activate(global.get_current_time()); | |
273 | } | |
274 | ||
275 | _onMenuStateChanged(menu, isOpen) { | |
276 | if (isOpen) | |
277 | return; | |
278 | ||
279 | let [x, y] = global.get_pointer(); | |
280 | let actor = global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, x, y); | |
281 | if (Me.stateObj.someWindowListContains(actor)) | |
282 | actor.sync_hover(); | |
283 | } | |
284 | ||
284 | 285 | _onPopupMenu(_actor) { |
285 | 286 | if (!this._canOpenPopupMenu() || this._contextMenu.isOpen) |
286 | 287 | return; |
287 | _openMenu(this._contextMenu); | |
288 | this._openMenu(this._contextMenu); | |
288 | 289 | } |
289 | 290 | |
290 | 291 | _isFocused() { |
361 | 362 | this.label_actor = this._windowTitle.label_actor; |
362 | 363 | |
363 | 364 | this._contextMenu = new WindowContextMenu(this, this.metaWindow); |
364 | this._contextMenu.connect('open-state-changed', _onMenuStateChanged); | |
365 | this._contextMenu.connect('open-state-changed', | |
366 | this._onMenuStateChanged.bind(this)); | |
365 | 367 | this._contextMenu.actor.hide(); |
366 | 368 | this._contextMenuManager.addMenu(this._contextMenu); |
367 | 369 | Main.uiGroup.add_actor(this._contextMenu.actor); |
381 | 383 | } |
382 | 384 | |
383 | 385 | if (button === 1) |
384 | _minimizeOrActivateWindow(this.metaWindow); | |
386 | this._minimizeOrActivateWindow(this.metaWindow); | |
385 | 387 | else |
386 | _openMenu(this._contextMenu); | |
388 | this._openMenu(this._contextMenu); | |
387 | 389 | } |
388 | 390 | |
389 | 391 | _isFocused() { |
517 | 519 | |
518 | 520 | this._menuManager = new PopupMenu.PopupMenuManager(this); |
519 | 521 | this._menu = new PopupMenu.PopupMenu(this, 0.5, St.Side.BOTTOM); |
520 | this._menu.connect('open-state-changed', _onMenuStateChanged); | |
522 | this._menu.connect('open-state-changed', | |
523 | this._onMenuStateChanged.bind(this)); | |
521 | 524 | this._menu.actor.hide(); |
522 | 525 | this._menu.connect('activate', this._onMenuActivate.bind(this)); |
523 | 526 | this._menuManager.addMenu(this._menu); |
524 | 527 | Main.uiGroup.add_actor(this._menu.actor); |
525 | 528 | |
526 | 529 | this._appContextMenu = new AppContextMenu(this); |
527 | this._appContextMenu.connect('open-state-changed', _onMenuStateChanged); | |
530 | this._appContextMenu.connect('open-state-changed', | |
531 | this._onMenuStateChanged.bind(this)); | |
528 | 532 | this._appContextMenu.actor.hide(); |
529 | 533 | Main.uiGroup.add_actor(this._appContextMenu.actor); |
530 | 534 | |
591 | 595 | this._singleWindowTitle.child = this._windowTitle; |
592 | 596 | this._windowContextMenu = new WindowContextMenu(this, this.metaWindow); |
593 | 597 | this._windowContextMenu.connect( |
594 | 'open-state-changed', _onMenuStateChanged); | |
598 | 'open-state-changed', this._onMenuStateChanged.bind(this)); | |
595 | 599 | Main.uiGroup.add_actor(this._windowContextMenu.actor); |
596 | 600 | this._windowContextMenu.actor.hide(); |
597 | 601 | this._contextMenuManager.addMenu(this._windowContextMenu); |
630 | 634 | if (windows.length === 1) { |
631 | 635 | if (contextMenuWasOpen) |
632 | 636 | return; |
633 | _minimizeOrActivateWindow(windows[0]); | |
637 | this._minimizeOrActivateWindow(windows[0]); | |
634 | 638 | } else { |
635 | 639 | this._menu.removeAll(); |
636 | 640 | |
641 | 645 | item._window = windows[i]; |
642 | 646 | this._menu.addMenuItem(item); |
643 | 647 | } |
644 | _openMenu(this._menu); | |
648 | this._openMenu(this._menu); | |
645 | 649 | } |
646 | 650 | } else { |
647 | 651 | if (contextMenuWasOpen) |
648 | 652 | return; |
649 | _openMenu(this._contextMenu); | |
653 | this._openMenu(this._contextMenu); | |
650 | 654 | } |
651 | 655 | } |
652 | 656 | |
773 | 777 | this._updateKeyboardAnchor(); |
774 | 778 | }); |
775 | 779 | |
776 | this._overviewHidingId = Main.overview.connect('hiding', () => { | |
780 | this._overviewHidingId = Main.overview.connect('hidden', () => { | |
777 | 781 | this.visible = !Main.layoutManager.primaryMonitor.inFullscreen; |
778 | 782 | this._updateKeyboardAnchor(); |
779 | 783 | }); |
780 | 784 | |
781 | 785 | this._fullscreenChangedId = |
782 | 786 | global.display.connect('in-fullscreen-changed', () => { |
787 | // Work-around for initial change from unknown to !fullscreen | |
788 | if (Main.overview.visible) | |
789 | this.hide(); | |
783 | 790 | this._updateKeyboardAnchor(); |
784 | 791 | }); |
785 | 792 | |
1169 | 1176 | } |
1170 | 1177 | } |
1171 | 1178 | |
1179 | /** | |
1180 | * @returns {Extension} - the extension's state object | |
1181 | */ | |
1172 | 1182 | function init() { |
1173 | 1183 | return new Extension(); |
1174 | 1184 | } |
0 | 0 | // -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*- |
1 | 1 | /* exported init buildPrefsWidget */ |
2 | 2 | |
3 | const { Gio, GObject, Gtk } = imports.gi; | |
3 | const { Gio, GLib, GObject, Gtk } = imports.gi; | |
4 | 4 | |
5 | 5 | const ExtensionUtils = imports.misc.extensionUtils; |
6 | const Me = ExtensionUtils.getCurrentExtension(); | |
7 | 6 | |
8 | const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); | |
9 | const _ = Gettext.gettext; | |
7 | const _ = ExtensionUtils.gettext; | |
10 | 8 | |
11 | ||
9 | /** */ | |
12 | 10 | function init() { |
13 | 11 | ExtensionUtils.initTranslations(); |
14 | 12 | } |
25 | 23 | margin_end: 36, |
26 | 24 | halign: Gtk.Align.CENTER, |
27 | 25 | }); |
26 | ||
27 | this._actionGroup = new Gio.SimpleActionGroup(); | |
28 | this.insert_action_group('window-list', this._actionGroup); | |
29 | ||
30 | this._settings = ExtensionUtils.getSettings(); | |
31 | this._actionGroup.add_action( | |
32 | this._settings.create_action('grouping-mode')); | |
33 | this._actionGroup.add_action( | |
34 | this._settings.create_action('show-on-all-monitors')); | |
35 | this._actionGroup.add_action( | |
36 | this._settings.create_action('display-all-workspaces')); | |
28 | 37 | |
29 | 38 | let groupingLabel = '<b>%s</b>'.format(_('Window Grouping')); |
30 | 39 | this.append(new Gtk.Label({ |
49 | 58 | context.add_class('frame'); |
50 | 59 | context.add_class('view'); |
51 | 60 | |
52 | this._settings = ExtensionUtils.getSettings(); | |
53 | let currentMode = this._settings.get_string('grouping-mode'); | |
54 | let range = this._settings.get_range('grouping-mode'); | |
55 | let modes = range.deep_unpack()[1].deep_unpack(); | |
56 | ||
57 | let modeLabels = { | |
58 | 'never': _('Never group windows'), | |
59 | 'auto': _('Group windows when space is limited'), | |
60 | 'always': _('Always group windows'), | |
61 | }; | |
62 | ||
63 | let radio = null; | |
64 | let currentRadio = null; | |
65 | for (let i = 0; i < modes.length; i++) { | |
66 | let mode = modes[i]; | |
67 | let label = modeLabels[mode]; | |
68 | if (!label) { | |
69 | log('Unhandled option "%s" for grouping-mode'.format(mode)); | |
70 | continue; | |
71 | } | |
72 | ||
73 | radio = new Gtk.CheckButton({ | |
74 | active: !i, | |
61 | const modes = [ | |
62 | { mode: 'never', label: _('Never group windows') }, | |
63 | { mode: 'auto', label: _('Group windows when space is limited') }, | |
64 | { mode: 'always', label: _('Always group windows') }, | |
65 | ]; | |
66 | let group = null; | |
67 | for (const { mode, label } of modes) { | |
68 | const check = new Gtk.CheckButton({ | |
69 | action_name: 'window-list.grouping-mode', | |
70 | action_target: new GLib.Variant('s', mode), | |
75 | 71 | label, |
76 | group: radio, | |
72 | group, | |
77 | 73 | margin_end: 12, |
78 | 74 | }); |
79 | box.append(radio); | |
80 | ||
81 | if (currentMode === mode) | |
82 | currentRadio = radio; | |
83 | ||
84 | radio.connect('toggled', button => { | |
85 | if (button.active) | |
86 | this._settings.set_string('grouping-mode', mode); | |
87 | }); | |
75 | group = check; | |
76 | box.append(check); | |
88 | 77 | } |
89 | 78 | |
90 | if (currentRadio) | |
91 | currentRadio.active = true; | |
79 | this.append(new Gtk.CheckButton({ | |
80 | label: _('Show on all monitors'), | |
81 | action_name: 'window-list.show-on-all-monitors', | |
82 | })); | |
92 | 83 | |
93 | let check = new Gtk.CheckButton({ | |
94 | label: _('Show on all monitors'), | |
95 | }); | |
96 | this._settings.bind('show-on-all-monitors', check, 'active', Gio.SettingsBindFlags.DEFAULT); | |
97 | this.append(check); | |
98 | ||
99 | check = new Gtk.CheckButton({ | |
84 | this.append(new Gtk.CheckButton({ | |
100 | 85 | label: _('Show windows from all workspaces'), |
101 | }); | |
102 | this._settings.bind('display-all-workspaces', check, 'active', Gio.SettingsBindFlags.DEFAULT); | |
103 | this.append(check); | |
86 | action_name: 'window-list.display-all-workspaces', | |
87 | })); | |
104 | 88 | } |
105 | 89 | }); |
106 | 90 | |
91 | /** | |
92 | * @returns {Gtk.Widget} - the prefs widget | |
93 | */ | |
107 | 94 | function buildPrefsWidget() { |
108 | 95 | return new WindowListPrefsWidget(); |
109 | 96 | } |
6 | 6 | const PanelMenu = imports.ui.panelMenu; |
7 | 7 | const PopupMenu = imports.ui.popupMenu; |
8 | 8 | |
9 | const Me = ExtensionUtils.getCurrentExtension(); | |
10 | ||
11 | const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); | |
12 | const _ = Gettext.gettext; | |
9 | const _ = ExtensionUtils.gettext; | |
13 | 10 | |
14 | 11 | const TOOLTIP_OFFSET = 6; |
15 | 12 | const TOOLTIP_ANIMATION_TIME = 150; |
261 | 261 | } |
262 | 262 | } |
263 | 263 | |
264 | /** | |
265 | * @returns {Extension} - the extension's state object | |
266 | */ | |
264 | 267 | function init() { |
265 | 268 | return new Extension(); |
266 | 269 | } |
8 | 8 | const PanelMenu = imports.ui.panelMenu; |
9 | 9 | const PopupMenu = imports.ui.popupMenu; |
10 | 10 | |
11 | const Me = ExtensionUtils.getCurrentExtension(); | |
12 | ||
13 | const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); | |
14 | const _ = Gettext.gettext; | |
11 | const _ = ExtensionUtils.gettext; | |
15 | 12 | |
16 | 13 | const WORKSPACE_SCHEMA = 'org.gnome.desktop.wm.preferences'; |
17 | 14 | const WORKSPACE_KEY = 'workspace-names'; |
444 | 441 | } |
445 | 442 | }); |
446 | 443 | |
444 | /** */ | |
447 | 445 | function init() { |
448 | 446 | ExtensionUtils.initTranslations(); |
449 | 447 | } |
450 | 448 | |
451 | 449 | let _indicator; |
452 | 450 | |
451 | /** */ | |
453 | 452 | function enable() { |
454 | 453 | _indicator = new WorkspaceIndicator(); |
455 | 454 | Main.panel.addToStatusArea('workspace-indicator', _indicator); |
456 | 455 | } |
457 | 456 | |
457 | /** */ | |
458 | 458 | function disable() { |
459 | 459 | _indicator.destroy(); |
460 | 460 | } |
3 | 3 | const { Gio, GLib, GObject, Gtk, Pango } = imports.gi; |
4 | 4 | |
5 | 5 | const ExtensionUtils = imports.misc.extensionUtils; |
6 | const Me = ExtensionUtils.getCurrentExtension(); | |
7 | ||
8 | const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); | |
9 | const _ = Gettext.gettext; | |
6 | ||
7 | const _ = ExtensionUtils.gettext; | |
10 | 8 | const N_ = e => e; |
11 | 9 | |
12 | 10 | const WORKSPACE_SCHEMA = 'org.gnome.desktop.wm.preferences'; |
209 | 207 | } |
210 | 208 | }); |
211 | 209 | |
210 | /** */ | |
212 | 211 | function init() { |
213 | 212 | ExtensionUtils.initTranslations(); |
214 | 213 | } |
215 | 214 | |
215 | /** | |
216 | * @returns {Gtk.Widget} - the prefs widget | |
217 | */ | |
216 | 218 | function buildPrefsWidget() { |
217 | 219 | return new WorkspaceSettingsWidget(); |
218 | 220 | } |
0 | 0 | --- |
1 | 1 | # SPDX-License-Identifier: MIT OR LGPL-2.0-or-later |
2 | # SPDX-FileCopyrightText: 2018 Claudio André <[email protected]> | |
2 | 3 | env: |
3 | 4 | es6: true |
5 | es2020: true | |
4 | 6 | extends: 'eslint:recommended' |
7 | plugins: | |
8 | - jsdoc | |
5 | 9 | rules: |
6 | 10 | array-bracket-newline: |
7 | 11 | - error |
59 | 63 | - 'CallExpression[callee.object.name=GObject][callee.property.name=registerClass] > ClassExpression:first-child' |
60 | 64 | # Allow dedenting chained member expressions |
61 | 65 | MemberExpression: 'off' |
66 | jsdoc/check-alignment: error | |
67 | jsdoc/check-param-names: error | |
68 | jsdoc/check-tag-names: error | |
69 | jsdoc/check-types: error | |
70 | jsdoc/implements-on-classes: error | |
71 | jsdoc/newline-after-description: error | |
72 | jsdoc/require-jsdoc: error | |
73 | jsdoc/require-param: error | |
74 | jsdoc/require-param-description: error | |
75 | jsdoc/require-param-name: error | |
76 | jsdoc/require-param-type: error | |
62 | 77 | key-spacing: |
63 | 78 | - error |
64 | 79 | - beforeColon: false |
106 | 121 | no-octal-escape: error |
107 | 122 | no-proto: error |
108 | 123 | no-prototype-builtins: 'off' |
124 | no-restricted-globals: [error, window] | |
109 | 125 | no-restricted-properties: |
110 | 126 | - error |
127 | - object: imports | |
128 | property: format | |
129 | message: Use template strings | |
130 | - object: pkg | |
131 | property: initFormat | |
132 | message: Use template strings | |
111 | 133 | - object: Lang |
112 | 134 | property: copyProperties |
113 | 135 | message: Use Object.assign() |
166 | 188 | object-curly-newline: |
167 | 189 | - error |
168 | 190 | - consistent: true |
191 | multiline: true | |
169 | 192 | object-curly-spacing: error |
170 | 193 | object-shorthand: error |
171 | 194 | operator-assignment: error |
213 | 236 | template-curly-spacing: error |
214 | 237 | template-tag-spacing: error |
215 | 238 | unicode-bom: error |
216 | valid-jsdoc: | |
217 | - error | |
218 | - requireReturn: false | |
219 | 239 | wrap-iife: |
220 | 240 | - error |
221 | 241 | - inside |
222 | 242 | yield-star-spacing: error |
223 | 243 | yoda: error |
244 | settings: | |
245 | jsdoc: | |
246 | mode: typescript | |
224 | 247 | globals: |
225 | 248 | ARGV: readonly |
226 | 249 | Debugger: readonly |
232 | 255 | logError: readonly |
233 | 256 | print: readonly |
234 | 257 | printerr: readonly |
258 | window: readonly | |
259 | TextEncoder: readonly | |
260 | TextDecoder: readonly | |
235 | 261 | parserOptions: |
236 | 262 | ecmaVersion: 2020 |
0 | #!/usr/bin/env python3 | |
1 | ||
2 | import os, sys | |
3 | from pathlib import Path | |
4 | import argparse, subprocess | |
5 | ||
6 | def check_version(version, file, type='news'): | |
7 | if type == 'news': | |
8 | line = file.open().readline() | |
9 | ok = line.startswith(version) | |
10 | print("{}: {}".format(file, "OK" if ok else "FAILED")) | |
11 | if not ok: | |
12 | raise Exception("{} does not start with {}".format(file, version)) | |
13 | elif type == 'metainfo': | |
14 | subprocess.run(['appstream-util', 'validate-version', file, version], | |
15 | check=True) | |
16 | else: | |
17 | raise Exception('Not implemented') | |
18 | ||
19 | parser = argparse.ArgumentParser(description='Check release version information.') | |
20 | parser.add_argument('--type', choices=['metainfo','news'], default='news') | |
21 | parser.add_argument('version', help='the version to check for') | |
22 | parser.add_argument('files', nargs='+', help='files to check') | |
23 | args = parser.parse_args() | |
24 | ||
25 | distroot = os.environ.get('MESON_DIST_ROOT', './') | |
26 | ||
27 | try: | |
28 | for file in args.files: | |
29 | check_version(args.version, Path(distroot, file), args.type) | |
30 | except: | |
31 | sys.exit(1) |
9 | 9 | stylesheet_path = PurePath('data/gnome-classic.css') |
10 | 10 | src = PurePath(sourceroot, stylesheet_path.with_suffix('.scss')) |
11 | 11 | dst = PurePath(distroot, stylesheet_path) |
12 | subprocess.call(['sassc', '-a', src, dst]) | |
12 | subprocess.run(['sassc', '-a', src, dst], check=True) |
0 | 0 | project('gnome-shell-extensions', |
1 | version: '40.4', | |
2 | meson_version: '>= 0.44.0', | |
1 | version: '41.0', | |
2 | meson_version: '>= 0.53.0', | |
3 | 3 | license: 'GPL2+' |
4 | 4 | ) |
5 | 5 | |
88 | 88 | subdir('po') |
89 | 89 | |
90 | 90 | meson.add_dist_script('meson/generate-stylesheets.py') |
91 | meson.add_dist_script('meson/check-version.py', | |
92 | meson.project_version(), | |
93 | 'NEWS') |
0 | # Bulgarian translation for gnome-shell-extensions po-file. | |
1 | # Copyright (C) 2014, 2015, 2017 Free Software Foundation, Inc. | |
2 | # This file is distributed under the same license as the gnome-shell-extensions package. | |
3 | # Ivaylo Valkov <[email protected]>, 2014. | |
4 | # Alexander Shopov <[email protected]>, 2014, 2015. | |
5 | # Lyubomir Vasilev <[email protected]>, 2017. | |
6 | msgid "" | |
7 | msgstr "" | |
8 | "Project-Id-Version: gnome-shell-extensions master\n" | |
9 | "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" | |
10 | "shell&keywords=I18N+L10N&component=extensions\n" | |
11 | "POT-Creation-Date: 2017-09-09 15:20+0000\n" | |
12 | "PO-Revision-Date: 2017-09-08 08:47+0300\n" | |
13 | "Last-Translator: Lyubomir Vasilev <[email protected]>\n" | |
14 | "Language-Team: Bulgarian <[email protected]>\n" | |
15 | "Language: bg\n" | |
16 | "MIME-Version: 1.0\n" | |
17 | "Content-Type: text/plain; charset=UTF-8\n" | |
18 | "Content-Transfer-Encoding: 8bit\n" | |
19 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" | |
20 | ||
21 | #: data/gnome-classic.desktop.in:3 data/gnome-classic.session.desktop.in:3 | |
22 | msgid "GNOME Classic" | |
23 | msgstr "Класически GNOME" | |
24 | ||
25 | #: data/gnome-classic.desktop.in:4 | |
26 | msgid "This session logs you into GNOME Classic" | |
27 | msgstr "Работната среда изглежда като класическия GNOME (2.x)" | |
28 | ||
29 | #: data/org.gnome.shell.extensions.classic-overrides.gschema.xml:7 | |
30 | msgid "Attach modal dialog to the parent window" | |
31 | msgstr "Прикрепяне на модалните прозорци към родителските им прозорци" | |
32 | ||
33 | #: data/org.gnome.shell.extensions.classic-overrides.gschema.xml:8 | |
34 | #: data/org.gnome.shell.extensions.classic-overrides.gschema.xml:25 | |
35 | #: data/org.gnome.shell.extensions.classic-overrides.gschema.xml:33 | |
36 | #: data/org.gnome.shell.extensions.classic-overrides.gschema.xml:41 | |
37 | msgid "" | |
38 | "This key overrides the key in org.gnome.mutter when running GNOME Shell." | |
39 | msgstr "" | |
40 | "Този ключ при е с по-голям приоритет от „org.gnome.mutter“ при изпълнението " | |
41 | "на обвивката на GNOME." | |
42 | ||
43 | #: data/org.gnome.shell.extensions.classic-overrides.gschema.xml:16 | |
44 | msgid "Arrangement of buttons on the titlebar" | |
45 | msgstr "Подредба на бутоните на заглавната лента" | |
46 | ||
47 | #: data/org.gnome.shell.extensions.classic-overrides.gschema.xml:17 | |
48 | msgid "" | |
49 | "This key overrides the key in org.gnome.desktop.wm.preferences when running " | |
50 | "GNOME Shell." | |
51 | msgstr "" | |
52 | "Този ключ при е с по-голям приоритет от „org.gnome.desktop.wm.preferences“ " | |
53 | "при изпълнението на обвивката на GNOME." | |
54 | ||
55 | #: data/org.gnome.shell.extensions.classic-overrides.gschema.xml:24 | |
56 | msgid "Enable edge tiling when dropping windows on screen edges" | |
57 | msgstr "" | |
58 | "Включване на специална подредба при приближаване на прозорец до ръбовете на " | |
59 | "екрана" | |
60 | ||
61 | #: data/org.gnome.shell.extensions.classic-overrides.gschema.xml:32 | |
62 | msgid "Workspaces only on primary monitor" | |
63 | msgstr "Работни плотове само на основния екран" | |
64 | ||
65 | #: data/org.gnome.shell.extensions.classic-overrides.gschema.xml:40 | |
66 | msgid "Delay focus changes in mouse mode until the pointer stops moving" | |
67 | msgstr "Забавяне на смяната на фокуса до спирането на движението на показалеца" | |
68 | ||
69 | #: extensions/alternate-tab/prefs.js:20 | |
70 | msgid "Thumbnail only" | |
71 | msgstr "Само миниатюри" | |
72 | ||
73 | #: extensions/alternate-tab/prefs.js:21 | |
74 | msgid "Application icon only" | |
75 | msgstr "Само икони на приложенията" | |
76 | ||
77 | #: extensions/alternate-tab/prefs.js:22 | |
78 | msgid "Thumbnail and application icon" | |
79 | msgstr "Миниатюри и икони на приложенията" | |
80 | ||
81 | #: extensions/alternate-tab/prefs.js:38 | |
82 | msgid "Present windows as" | |
83 | msgstr "Показване на прозорците като" | |
84 | ||
85 | #: extensions/alternate-tab/prefs.js:69 | |
86 | msgid "Show only windows in the current workspace" | |
87 | msgstr "Да се показват само прозорците на текущия работен плот" | |
88 | ||
89 | #: extensions/apps-menu/extension.js:41 | |
90 | msgid "Activities Overview" | |
91 | msgstr "Показване на програмите" | |
92 | ||
93 | #: extensions/apps-menu/extension.js:141 | |
94 | msgid "Favorites" | |
95 | msgstr "Любими" | |
96 | ||
97 | #: extensions/apps-menu/extension.js:436 | |
98 | msgid "Applications" | |
99 | msgstr "Програми" | |
100 | ||
101 | #: extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml:6 | |
102 | msgid "Application and workspace list" | |
103 | msgstr "Списък с програмите и работните плотове" | |
104 | ||
105 | #: extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml:7 | |
106 | msgid "" | |
107 | "A list of strings, each containing an application id (desktop file name), " | |
108 | "followed by a colon and the workspace number" | |
109 | msgstr "" | |
110 | "Списък от низове. Всеки съдържа идентификатор на програма (име на файл „." | |
111 | "desktop“ file name), следван от знака „:“ и номер на работен плот" | |
112 | ||
113 | #: extensions/auto-move-windows/prefs.js:60 | |
114 | msgid "Application" | |
115 | msgstr "Програма" | |
116 | ||
117 | #: extensions/auto-move-windows/prefs.js:69 | |
118 | #: extensions/auto-move-windows/prefs.js:127 | |
119 | msgid "Workspace" | |
120 | msgstr "Работен плот" | |
121 | ||
122 | #: extensions/auto-move-windows/prefs.js:85 | |
123 | msgid "Add Rule" | |
124 | msgstr "Добавяне на правило" | |
125 | ||
126 | #: extensions/auto-move-windows/prefs.js:106 | |
127 | msgid "Create new matching rule" | |
128 | msgstr "Създаване на правило за съвпадение" | |
129 | ||
130 | #: extensions/auto-move-windows/prefs.js:111 | |
131 | msgid "Add" | |
132 | msgstr "Добавяне" | |
133 | ||
134 | #. TRANSLATORS: %s is the filesystem name | |
135 | #: extensions/drive-menu/extension.js:107 | |
136 | #, javascript-format | |
137 | msgid "Ejecting drive “%s” failed:" | |
138 | msgstr "Неуспешно изваждане на устройство „%s“:" | |
139 | ||
140 | #: extensions/drive-menu/extension.js:125 | |
141 | msgid "Removable devices" | |
142 | msgstr "Преносими медии" | |
143 | ||
144 | #: extensions/drive-menu/extension.js:150 | |
145 | msgid "Open Files" | |
146 | msgstr "Отваряне на файлове" | |
147 | ||
148 | #: extensions/example/extension.js:17 | |
149 | msgid "Hello, world!" | |
150 | msgstr "Здравей, свят!" | |
151 | ||
152 | #: extensions/example/org.gnome.shell.extensions.example.gschema.xml:5 | |
153 | msgid "Alternative greeting text." | |
154 | msgstr "Друго приветстващо съобщение." | |
155 | ||
156 | #: extensions/example/org.gnome.shell.extensions.example.gschema.xml:6 | |
157 | msgid "" | |
158 | "If not empty, it contains the text that will be shown when clicking on the " | |
159 | "panel." | |
160 | msgstr "" | |
161 | "Ако ключът не е празен, съдържанието му се извежда при натискането на панела." | |
162 | ||
163 | #: extensions/example/prefs.js:30 | |
164 | msgid "Message" | |
165 | msgstr "Съобщение" | |
166 | ||
167 | #. TRANSLATORS: Example is the name of the extension, should not be | |
168 | #. translated | |
169 | #: extensions/example/prefs.js:43 | |
170 | msgid "" | |
171 | "Example aims to show how to build well behaved extensions for the Shell and " | |
172 | "as such it has little functionality on its own.\n" | |
173 | "Nevertheless it’s possible to customize the greeting message." | |
174 | msgstr "" | |
175 | "Това е пример за добре работещо разширение на обвивката на GNOME и има " | |
176 | "минимална функционалност.\n" | |
177 | "С него можете да промените приветстващото съобщение на панела." | |
178 | ||
179 | #: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:5 | |
180 | msgid "Use more screen for windows" | |
181 | msgstr "Повече пространство за прозорците" | |
182 | ||
183 | #: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:6 | |
184 | msgid "" | |
185 | "Try to use more screen for placing window thumbnails by adapting to screen " | |
186 | "aspect ratio, and consolidating them further to reduce the bounding box. " | |
187 | "This setting applies only with the natural placement strategy." | |
188 | msgstr "" | |
189 | "Използване на по-голяма част от екрана за поставянето на мини изображения " | |
190 | "чрез промяна на съотношението на страните и допълнително обединяване за " | |
191 | "смаляване на обхващащия ги правоъгълник. Тази настройка се прилага само при " | |
192 | "естествената стратегия за поставяне на прозорците." | |
193 | ||
194 | #: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:11 | |
195 | msgid "Place window captions on top" | |
196 | msgstr "Заглавия на прозорците отгоре" | |
197 | ||
198 | #: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:12 | |
199 | msgid "" | |
200 | "If true, place window captions on top the respective thumbnail, overriding " | |
201 | "shell default of placing it at the bottom. Changing this setting requires " | |
202 | "restarting the shell to have any effect." | |
203 | msgstr "" | |
204 | "Ако е истина, заглавията на прозорците се поставят над мини изображенията " | |
205 | "им, а не както е стандартно — отдолу. За прилагане на промяната на " | |
206 | "настройката трябва да рестартирате обвивката на GNOME." | |
207 | ||
208 | #: extensions/places-menu/extension.js:78 | |
209 | #: extensions/places-menu/extension.js:81 | |
210 | msgid "Places" | |
211 | msgstr "Места" | |
212 | ||
213 | #: extensions/places-menu/placeDisplay.js:65 | |
214 | #, javascript-format | |
215 | msgid "Failed to mount volume for “%s”" | |
216 | msgstr "Неуспешно монтиране на тома „%s“" | |
217 | ||
218 | #: extensions/places-menu/placeDisplay.js:78 | |
219 | #, javascript-format | |
220 | msgid "Failed to launch “%s”" | |
221 | msgstr "Неуспешно стартиране на „%s“" | |
222 | ||
223 | #: extensions/places-menu/placeDisplay.js:137 | |
224 | #: extensions/places-menu/placeDisplay.js:160 | |
225 | msgid "Computer" | |
226 | msgstr "Компютър" | |
227 | ||
228 | #: extensions/places-menu/placeDisplay.js:303 | |
229 | msgid "Home" | |
230 | msgstr "Домашна папка" | |
231 | ||
232 | #: extensions/places-menu/placeDisplay.js:347 | |
233 | msgid "Browse Network" | |
234 | msgstr "Мрежа" | |
235 | ||
236 | #: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:7 | |
237 | msgid "Cycle Screenshot Sizes" | |
238 | msgstr "Смяна на размерите на снимката на екрана" | |
239 | ||
240 | #: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:11 | |
241 | msgid "Cycle Screenshot Sizes Backward" | |
242 | msgstr "Смяна на размерите на снимката на екрана наобратно" | |
243 | ||
244 | #: extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml:5 | |
245 | msgid "Theme name" | |
246 | msgstr "Име на темата" | |
247 | ||
248 | #: extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml:6 | |
249 | msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell" | |
250 | msgstr "" | |
251 | "Името на темата, която да бъде заредена от „~/.themes/name/gnome-shell“" | |
252 | ||
253 | #: extensions/window-list/extension.js:110 | |
254 | msgid "Close" | |
255 | msgstr "Затваряне" | |
256 | ||
257 | #: extensions/window-list/extension.js:129 | |
258 | msgid "Unminimize" | |
259 | msgstr "Деминимизиране" | |
260 | ||
261 | #: extensions/window-list/extension.js:130 | |
262 | msgid "Minimize" | |
263 | msgstr "Минимизиране" | |
264 | ||
265 | #: extensions/window-list/extension.js:136 | |
266 | msgid "Unmaximize" | |
267 | msgstr "Демаксимизиране" | |
268 | ||
269 | #: extensions/window-list/extension.js:137 | |
270 | msgid "Maximize" | |
271 | msgstr "Максимизиране" | |
272 | ||
273 | #: extensions/window-list/extension.js:420 | |
274 | msgid "Minimize all" | |
275 | msgstr "Минимизиране на всички" | |
276 | ||
277 | #: extensions/window-list/extension.js:428 | |
278 | msgid "Unminimize all" | |
279 | msgstr "Деминимизиране на всички" | |
280 | ||
281 | #: extensions/window-list/extension.js:436 | |
282 | msgid "Maximize all" | |
283 | msgstr "Максимизиране на всички" | |
284 | ||
285 | #: extensions/window-list/extension.js:445 | |
286 | msgid "Unmaximize all" | |
287 | msgstr "Демаксимизиране на всички" | |
288 | ||
289 | #: extensions/window-list/extension.js:454 | |
290 | msgid "Close all" | |
291 | msgstr "Затваряне на всички" | |
292 | ||
293 | #: extensions/window-list/extension.js:678 | |
294 | #: extensions/workspace-indicator/extension.js:30 | |
295 | msgid "Workspace Indicator" | |
296 | msgstr "Индикатор на работните плотове" | |
297 | ||
298 | #: extensions/window-list/extension.js:842 | |
299 | msgid "Window List" | |
300 | msgstr "Списък на прозорците" | |
301 | ||
302 | #: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:12 | |
303 | msgid "When to group windows" | |
304 | msgstr "Кога да се групират прозорците" | |
305 | ||
306 | #: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:13 | |
307 | msgid "" | |
308 | "Decides when to group windows from the same application on the window list. " | |
309 | "Possible values are “never”, “auto” and “always”." | |
310 | msgstr "" | |
311 | "Кога да се групират прозорците на една програма в списъка с прозорците. " | |
312 | "Възможните стойности са „never“ (никога), „auto“ (автоматично) и " | |
313 | "„always“ (винаги)." | |
314 | ||
315 | #: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20 | |
316 | msgid "Show the window list on all monitors" | |
317 | msgstr "Извеждане на списъка с прозорци на всички монитори" | |
318 | ||
319 | #: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:21 | |
320 | msgid "" | |
321 | "Whether to show the window list on all connected monitors or only on the " | |
322 | "primary one." | |
323 | msgstr "" | |
324 | "Дали списъкът с прозорци да се извежда на всички монитори или само на " | |
325 | "основния" | |
326 | ||
327 | #: extensions/window-list/prefs.js:32 | |
328 | msgid "Window Grouping" | |
329 | msgstr "Групиране на прозорци" | |
330 | ||
331 | #: extensions/window-list/prefs.js:50 | |
332 | msgid "Never group windows" | |
333 | msgstr "Никога да не се групират" | |
334 | ||
335 | #: extensions/window-list/prefs.js:51 | |
336 | msgid "Group windows when space is limited" | |
337 | msgstr "Групиране при ограничено място" | |
338 | ||
339 | #: extensions/window-list/prefs.js:52 | |
340 | msgid "Always group windows" | |
341 | msgstr "Винаги да се групират" | |
342 | ||
343 | #: extensions/window-list/prefs.js:75 | |
344 | msgid "Show on all monitors" | |
345 | msgstr "На всички монитори" | |
346 | ||
347 | #: extensions/workspace-indicator/prefs.js:141 | |
348 | msgid "Workspace Names" | |
349 | msgstr "Имена на работните плотове" | |
350 | ||
351 | #: extensions/workspace-indicator/prefs.js:157 | |
352 | msgid "Name" | |
353 | msgstr "Име" | |
354 | ||
355 | #: extensions/workspace-indicator/prefs.js:198 | |
356 | #, javascript-format | |
357 | msgid "Workspace %d" | |
358 | msgstr "Работен плот %d" | |
0 | # Bulgarian translation for gnome-shell-extensions po-file. | |
1 | # Copyright (C) 2014, 2015, 2017 Free Software Foundation, Inc. | |
2 | # Copyright (C) 2021 Alexander Shopov <[email protected]>. | |
3 | # This file is distributed under the same license as the gnome-shell-extensions package. | |
4 | # Ivaylo Valkov <[email protected]>, 2014. | |
5 | # Alexander Shopov <[email protected]>, 2014, 2015, 2021. | |
6 | # Lyubomir Vasilev <[email protected]>, 2017. | |
7 | msgid "" | |
8 | msgstr "" | |
9 | "Project-Id-Version: gnome-shell-extensions master\n" | |
10 | "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/" | |
11 | "issues\n" | |
12 | "POT-Creation-Date: 2021-07-05 17:13+0000\n" | |
13 | "PO-Revision-Date: 2021-07-11 10:19+0200\n" | |
14 | "Last-Translator: Alexander Shopov <[email protected]>\n" | |
15 | "Language-Team: Bulgarian <[email protected]>\n" | |
16 | "Language: bg\n" | |
17 | "MIME-Version: 1.0\n" | |
18 | "Content-Type: text/plain; charset=UTF-8\n" | |
19 | "Content-Transfer-Encoding: 8bit\n" | |
20 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" | |
21 | ||
22 | #: data/gnome-classic.desktop.in:3 | |
23 | msgid "GNOME Classic" | |
24 | msgstr "Класически GNOME" | |
25 | ||
26 | #: data/gnome-classic.desktop.in:4 | |
27 | msgid "This session logs you into GNOME Classic" | |
28 | msgstr "Работната среда изглежда като класическия GNOME (2.x)" | |
29 | ||
30 | #: extensions/apps-menu/extension.js:113 | |
31 | msgid "Favorites" | |
32 | msgstr "Любими" | |
33 | ||
34 | #: extensions/apps-menu/extension.js:367 | |
35 | msgid "Applications" | |
36 | msgstr "Програми" | |
37 | ||
38 | #: extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml:6 | |
39 | msgid "Application and workspace list" | |
40 | msgstr "Списък с програмите и работните плотове" | |
41 | ||
42 | #: extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml:7 | |
43 | msgid "" | |
44 | "A list of strings, each containing an application id (desktop file name), " | |
45 | "followed by a colon and the workspace number" | |
46 | msgstr "" | |
47 | "Списък от низове. Всеки съдържа идентификатор на програма (име на файл „." | |
48 | "desktop“), следван от знака „:“ и номер на работен плот" | |
49 | ||
50 | #: extensions/auto-move-windows/prefs.js:35 | |
51 | msgid "Workspace Rules" | |
52 | msgstr "Правила за работните плотове" | |
53 | ||
54 | #: extensions/auto-move-windows/prefs.js:237 | |
55 | msgid "Add Rule" | |
56 | msgstr "Добавяне на правило" | |
57 | ||
58 | #. TRANSLATORS: %s is the filesystem name | |
59 | #: extensions/drive-menu/extension.js:132 | |
60 | #: extensions/places-menu/placeDisplay.js:233 | |
61 | #, javascript-format | |
62 | msgid "Ejecting drive “%s” failed:" | |
63 | msgstr "Неуспешно изваждане на устройство „%s“:" | |
64 | ||
65 | #: extensions/drive-menu/extension.js:148 | |
66 | msgid "Removable devices" | |
67 | msgstr "Преносими медии" | |
68 | ||
69 | #: extensions/drive-menu/extension.js:172 | |
70 | msgid "Open Files" | |
71 | msgstr "Отваряне на файлове" | |
72 | ||
73 | #: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:5 | |
74 | msgid "Use more screen for windows" | |
75 | msgstr "Повече пространство за прозорците" | |
76 | ||
77 | #: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:6 | |
78 | msgid "" | |
79 | "Try to use more screen for placing window thumbnails by adapting to screen " | |
80 | "aspect ratio, and consolidating them further to reduce the bounding box. " | |
81 | "This setting applies only with the natural placement strategy." | |
82 | msgstr "" | |
83 | "Използване на по-голяма част от екрана за поставянето на мини изображения " | |
84 | "чрез промяна на съотношението на страните и допълнително обединяване за " | |
85 | "смаляване на обхващащия ги правоъгълник. Тази настройка се прилага само при " | |
86 | "естествената стратегия за поставяне на прозорците." | |
87 | ||
88 | #: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:11 | |
89 | msgid "Place window captions on top" | |
90 | msgstr "Заглавия на прозорците отгоре" | |
91 | ||
92 | #: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:12 | |
93 | msgid "" | |
94 | "If true, place window captions on top the respective thumbnail, overriding " | |
95 | "shell default of placing it at the bottom. Changing this setting requires " | |
96 | "restarting the shell to have any effect." | |
97 | msgstr "" | |
98 | "Ако е истина, заглавията на прозорците се поставят над мини изображенията " | |
99 | "им, а не както е стандартно — отдолу. За прилагане на промяната на " | |
100 | "настройката трябва да рестартирате обвивката на GNOME." | |
101 | ||
102 | #: extensions/places-menu/extension.js:89 | |
103 | #: extensions/places-menu/extension.js:92 | |
104 | msgid "Places" | |
105 | msgstr "Места" | |
106 | ||
107 | #: extensions/places-menu/placeDisplay.js:46 | |
108 | #, javascript-format | |
109 | msgid "Failed to launch “%s”" | |
110 | msgstr "Неуспешно стартиране на „%s“" | |
111 | ||
112 | #: extensions/places-menu/placeDisplay.js:61 | |
113 | #, javascript-format | |
114 | msgid "Failed to mount volume for “%s”" | |
115 | msgstr "Неуспешно монтиране на тома „%s“" | |
116 | ||
117 | #: extensions/places-menu/placeDisplay.js:148 | |
118 | #: extensions/places-menu/placeDisplay.js:171 | |
119 | msgid "Computer" | |
120 | msgstr "Компютър" | |
121 | ||
122 | #: extensions/places-menu/placeDisplay.js:359 | |
123 | msgid "Home" | |
124 | msgstr "Домашна папка" | |
125 | ||
126 | #: extensions/places-menu/placeDisplay.js:404 | |
127 | msgid "Browse Network" | |
128 | msgstr "Мрежа" | |
129 | ||
130 | #: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:7 | |
131 | msgid "Cycle Screenshot Sizes" | |
132 | msgstr "Смяна на размерите на снимката на екрана" | |
133 | ||
134 | #: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:11 | |
135 | msgid "Cycle Screenshot Sizes Backward" | |
136 | msgstr "Смяна на размерите на снимката на екрана наобратно" | |
137 | ||
138 | #: extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml:5 | |
139 | msgid "Theme name" | |
140 | msgstr "Име на темата" | |
141 | ||
142 | #: extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml:6 | |
143 | msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell" | |
144 | msgstr "" | |
145 | "Името на темата, която да бъде заредена от „~/.themes/name/gnome-shell“" | |
146 | ||
147 | #: extensions/window-list/extension.js:98 | |
148 | msgid "Close" | |
149 | msgstr "Затваряне" | |
150 | ||
151 | #: extensions/window-list/extension.js:118 | |
152 | msgid "Unminimize" | |
153 | msgstr "Деминимизиране" | |
154 | ||
155 | #: extensions/window-list/extension.js:118 | |
156 | msgid "Minimize" | |
157 | msgstr "Минимизиране" | |
158 | ||
159 | #: extensions/window-list/extension.js:125 | |
160 | msgid "Unmaximize" | |
161 | msgstr "Демаксимизиране" | |
162 | ||
163 | #: extensions/window-list/extension.js:125 | |
164 | msgid "Maximize" | |
165 | msgstr "Максимизиране" | |
166 | ||
167 | #: extensions/window-list/extension.js:432 | |
168 | msgid "Minimize all" | |
169 | msgstr "Минимизиране на всички" | |
170 | ||
171 | #: extensions/window-list/extension.js:438 | |
172 | msgid "Unminimize all" | |
173 | msgstr "Деминимизиране на всички" | |
174 | ||
175 | #: extensions/window-list/extension.js:444 | |
176 | msgid "Maximize all" | |
177 | msgstr "Максимизиране на всички" | |
178 | ||
179 | #: extensions/window-list/extension.js:452 | |
180 | msgid "Unmaximize all" | |
181 | msgstr "Демаксимизиране на всички" | |
182 | ||
183 | #: extensions/window-list/extension.js:460 | |
184 | msgid "Close all" | |
185 | msgstr "Затваряне на всички" | |
186 | ||
187 | #: extensions/window-list/extension.js:737 | |
188 | msgid "Window List" | |
189 | msgstr "Списък на прозорците" | |
190 | ||
191 | #: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:12 | |
192 | msgid "When to group windows" | |
193 | msgstr "Кога прозорците да се групират" | |
194 | ||
195 | #: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:13 | |
196 | msgid "" | |
197 | "Decides when to group windows from the same application on the window list. " | |
198 | "Possible values are “never”, “auto” and “always”." | |
199 | msgstr "" | |
200 | "Кога прозорците на една програма да се групират в списъка с прозорците. " | |
201 | "Възможните стойности са „never“ (никога), „auto“ (автоматично) и " | |
202 | "„always“ (винаги)." | |
203 | ||
204 | #: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20 | |
205 | #: extensions/window-list/prefs.js:100 | |
206 | msgid "Show windows from all workspaces" | |
207 | msgstr "Да се показват прозорците от всички работни плотове" | |
208 | ||
209 | #: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:21 | |
210 | msgid "Whether to show windows from all workspaces or only the current one." | |
211 | msgstr "" | |
212 | "Дали да се показват прозорците от всички работни плотове или само от текущия." | |
213 | ||
214 | #: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:27 | |
215 | msgid "Show the window list on all monitors" | |
216 | msgstr "Извеждане на списъка с прозорци на всички монитори" | |
217 | ||
218 | #: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:28 | |
219 | msgid "" | |
220 | "Whether to show the window list on all connected monitors or only on the " | |
221 | "primary one." | |
222 | msgstr "" | |
223 | "Дали списъкът с прозорци да се извежда на всички монитори или само на " | |
224 | "основния" | |
225 | ||
226 | #: extensions/window-list/prefs.js:29 | |
227 | msgid "Window Grouping" | |
228 | msgstr "Групиране на прозорци" | |
229 | ||
230 | #: extensions/window-list/prefs.js:58 | |
231 | msgid "Never group windows" | |
232 | msgstr "Никога да не се групират" | |
233 | ||
234 | #: extensions/window-list/prefs.js:59 | |
235 | msgid "Group windows when space is limited" | |
236 | msgstr "Групиране при ограничено място" | |
237 | ||
238 | #: extensions/window-list/prefs.js:60 | |
239 | msgid "Always group windows" | |
240 | msgstr "Винаги да се групират" | |
241 | ||
242 | #: extensions/window-list/prefs.js:94 | |
243 | msgid "Show on all monitors" | |
244 | msgstr "На всички монитори" | |
245 | ||
246 | #: extensions/window-list/workspaceIndicator.js:249 | |
247 | #: extensions/workspace-indicator/extension.js:255 | |
248 | msgid "Workspace Indicator" | |
249 | msgstr "Индикатор на работните плотове" | |
250 | ||
251 | #: extensions/workspace-indicator/prefs.js:34 | |
252 | msgid "Workspace Names" | |
253 | msgstr "Имена на работните плотове" | |
254 | ||
255 | #: extensions/workspace-indicator/prefs.js:67 | |
256 | #, javascript-format | |
257 | msgid "Workspace %d" | |
258 | msgstr "Работен плот %d" | |
259 | ||
260 | #: extensions/workspace-indicator/prefs.js:208 | |
261 | msgid "Add Workspace" | |
262 | msgstr "Добавяне на работен плот" |