Compare commits

..

23 Commits

Author SHA1 Message Date
Florian Müllner
29c5131ee1 Bump version to 40.7
There weren't any code changes, but the pre-generated classic
stylesheet in the last tarball was incorrect because "someone"
didn't call `git submodule update` before distcheck 😊
2022-03-20 16:09:07 +01:00
Florian Müllner
8ba229f0bb Bump version to 40.6
Update NEWS.
2022-02-15 20:41:34 +01:00
Florian Müllner
2e932eb688 window-list: Track window-created/unmanaged
Shell's WindowTracker switched to those signals instead of tracking
windows through MetaWorkspace's window-added/removed signals.

As ::window-created is only emitted after a window has been added to
its workspace, looking up its app on ::window-added now fails because
the window isn't tracked yet.

Address this by switching to the same signals for window tracking
(which is simpler anyway).

https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/issues/372
2022-01-21 02:21:51 +01:00
Florian Müllner
c08aff38d2 Bump version to 40.5
Update NEWS.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/201>
2021-12-11 14:11:42 +01:00
Florian Müllner
721d7b271a window-list: Fix OSK
The reveal animation moved from Main.layoutManager.keyboardBox to
the keyboard itself, so instead of applying an additional translation
for the bottom panel, we override the translation that would reveal
the keyboard (and thus prevent it from showing altogether).

Fix this by moving our translation to the keyboardBox instead.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/199>
(cherry picked from commit 02e5029eb6)
2021-12-11 14:10:17 +01:00
Sebastian Keller
5049ccdc99 native-window-placement: Remove custom styling
The window-picker padding was causing it to become smaller in the
overview resulting in a jump when opening it and caused sizing issues
with the workspace view in the app picker. However it is not needed
anymore with the new overview, so this can be fixed by simply removing
it.

The horizontal- and vertical-spacing properties got replaced with a
spacing property a while ago. However this is only used in
WorkspaceLayout::_createBestLayout() which gets overridden by this
extension which does not use it. So they can simply be removed.

The shell-caption-spacing property got removed when the window captions
got changed to always use the full length and has not been doing
anything since.

Fixes: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/issues/301
Fixes: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/issues/309
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/189>
(cherry picked from commit 4a26cecd7d)
2021-12-11 14:10:17 +01:00
Neal Gompa
0857b041ee classic: Add X-GNOME-SessionRegisters
GDM has supported sessions registering with it for a few years now so
it can know when to shut down the greeter. Having the GNOME Classic
session declare that it will register itself allows GDM to avoid
executing a fallback codepath.

This has been supported with the regular GNOME session for a while,
and this session was likely forgotten about when it was added there.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/195>
(cherry picked from commit a79d2afb2d)
2021-12-11 14:10:17 +01:00
Florian Müllner
a5a3523df8 Bump version to 40.4
Update NEWS.
2021-08-18 01:18:19 +02:00
Florian Müllner
06acd9ff25 build: Rewrite gettext domain when exporting zips
Now that every extension picks up its gettext domain from
its metadata, we can easily change it when exporting the
zips.

That ensures that every extension only binds its own domain
instead of messing up other extension's translations.

https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/issues/335

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/179>
2021-08-12 04:17:46 +02:00
Florian Müllner
1a1d45d9e4 build: Remove unused variable
https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/issues/335

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/179>
2021-08-12 04:17:46 +02:00
Florian Müllner
1d3775b3d1 extensions: Pick up gettext domain from metadata
Since commit a6ee142f21, the extension archives that are uploaded
to extensions.gnome.org only contain strings that are relevant for
the extension, not all translations from all extensions.

Unfortunately all extensions still share a common gettext domain,
so the extension with the last bind_textdomain() call wins and
leaves the others without translations.

We'll address this by using distinct domains when not installed
system-wide. That becomes easier if there is a canonical place
for the text domain, with the existing metadata key being the
natural choice.

https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/issues/335

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/179>
2021-08-12 04:17:46 +02:00
Florian Müllner
15c83db793 drive-menu: Hide items initially
Now that the check for network mounts is non-blocking, the initial
sync doesn't take effect immediately. We don't want hidden items
to briefly flash the indicator, so create them initially hidden.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/176>
2021-07-19 16:44:37 +02:00
Florian Müllner
cc021589b8 drive-menu: Fix indicator visibility
Commit 519269be9d made the check for network mounts non-blocking, and
we now update the indicator's visibility before a newly-added network
mount is hidden.

Address this by monitoring the item itself for visibility changes.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/176>
2021-07-19 16:44:37 +02:00
Florian Müllner
5e316d37cb Bump version to 40.3
Update NEWS.
2021-07-12 18:18:45 +02:00
Florian Müllner
28dbb47937 window-list: Init translations
Whoops, we are missing the bindtextdomain() call, which means translations
won't work when no other extension that shares the same domain is used
(like in GNOME Classic for instance).

https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/issues/340
(cherry picked from commit c9d7f99d50f96d29c38380d9f0e3c9ddc660db9f)
2021-07-12 18:06:31 +02:00
Florian Müllner
619de9d5ee drive-menu: Avoid blocking I/O when querying filesystem
The last commit improved the heuristics for detecting network mounts,
but at the price of potentially blocking the shell. Avoid that drawback
by making the code in question async.

https://gitlab.gnome.org/GNOME/gnome-shell-extensions/issues/53

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/27>
(cherry picked from commit 519269be9d)
2021-07-12 18:06:31 +02:00
Florian Müllner
561b8aeb03 drive-menu: Don't assume mounts without volume are local
The intention of the code is to only expose actually plugged in
devices rather than network mounts, but the existing heuristics are
based on GVolume and simply assume a local mount where there's no
associated volume. Fill that gap by querying the ::remote filesystem
attribute in that case.

https://gitlab.gnome.org/GNOME/gnome-shell-extensions/issues/53

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/27>
(cherry picked from commit 7d6670ce3c)
2021-07-12 18:06:31 +02:00
Florian Müllner
4286fd1bcc Tag release 40.2
Update NEWS.
2021-06-10 13:41:34 +02:00
Adam Goode
3bb0897bc1 window-list: Don't use panel-button class for the workspace indicator
The panel-button introduces some horizontal padding which is insensitive
to scroll events. Without this change, there is a small dead zone in the
corner that cannot be used to switch workspaces with the mouse wheel.

For useMenu mode, this has the effect of removing all of the horizontal
space to the edge of the screen, so I add some back with the
status-label-bin margin.

This a is similar change to 8bad8a3b63.

Fixes #315.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/171>
(cherry picked from commit d6648b0b5c)
2021-06-10 13:38:47 +02:00
Juliano de Souza Camargo
12eedcf6f7 Update Portuguese translation 2021-06-07 10:22:02 +00:00
Hugo Carvalho
08d382facc Update Portuguese translation 2021-06-02 16:09:54 +00:00
Florian Müllner
96a1de92db build: Only use major version in shell-versions
The website changed its version handling again, and now takes "40.0"
to mean "40.0, and only 40.0".

Not complaining though, as "40" is more correct in my opinion anyway ...

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/172>
2021-05-25 19:26:08 +02:00
Florian Müllner
cc2f46b837 Post-release version bump 2021-05-14 17:00:35 +02:00
30 changed files with 554 additions and 535 deletions

View File

@@ -1,7 +1,7 @@
include: include:
- remote: "https://gitlab.freedesktop.org/freedesktop/ci-templates/-/raw/6f86b8bcb0cd5168c32779c4fea9a893c4a0c046/templates/ci-fairy.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/33:2020-11-17.0
stages: stages:
- pre_review - pre_review
@@ -21,7 +21,6 @@ default:
- 'api_failure' - 'api_failure'
variables: variables:
FDO_UPSTREAM_REPO: GNOME/gnome-shell-extensions
LINT_LOG: "eslint-report.xml" LINT_LOG: "eslint-report.xml"
JS_LOG: "js-report.txt" JS_LOG: "js-report.txt"
@@ -90,7 +89,7 @@ js_check:
eslint: eslint:
stage: review stage: review
script: script:
- eslint -o $LINT_LOG -f junit --resolve-plugins-relative-to $(npm root -g) extensions - eslint -o $LINT_LOG -f junit extensions
artifacts: artifacts:
paths: paths:
- ${LINT_LOG} - ${LINT_LOG}

View File

@@ -28,4 +28,4 @@ imports (like imports.lang or imports.dbus) and introspection,
the other for Shell API. Within the same group, put everything the other for Shell API. Within the same group, put everything
in alphabetic order. in alphabetic order.
[coding-style]: https://gitlab.gnome.org/GNOME/gjs/blob/HEAD/doc/Style_Guide.md [coding-style]: https://gitlab.gnome.org/GNOME/gjs/blob/master/doc/Style_Guide.md

52
NEWS
View File

@@ -1,16 +1,50 @@
41.beta 40.7
======= ====
* window-list: Extend reactive area of minimap to screen edges [Adam; !171] * Bump version
* drive-menu: Improve detection of network mounts [Florian; !27, !176]
* Use distinct gettext domain for e.g.o uploads [Florian; #335] 40.6
* Misc. bug fixes and cleanups [Florian; !172, !174, !177, !167, !178, !180, ====
!181, !182, !183] * window-list: Update window tracking to avoid missing icons [Florian; #372]
Contributors: Contributors:
Marco Trevisan (Treviño), Adam Goode, Florian Müllner Florian Müllner
40.5
====
* native-window-placement: Fix distorted layout in app grid [Sebastian; !189]
* window-list: Fix on-screen keyboard [Florian; !199]
* Misc. bug fixes [Neal; !195]
Contributors:
Neal Gompa, Sebastian Keller, Florian Müllner
40.4
====
* drive-menu: Fix indicator visibility [Florian; !176]
* Use distinct gettext domain for e.g.o uploads [Florian; #335]
Contributors:
Florian Müllner
40.3
====
* drive-menu: Improve detection of network mounts [Florian; !27]
* Misc. bug fixes [Florian; #340]
Contributors:
Florian Müllner
40.2
====
* window-list: Extend reactive area of minimap to screen edges [Adam; !171]
* Misc. bug fixes [Florian; !172]
Contributors:
Adam Goode, Florian Müllner
Translators: Translators:
Hugo Carvalho [pt], Juliano de Souza Camargo [pt], Alexander Shopov [bg] Hugo Carvalho [pt], Juliano de Souza Camargo [pt]
40.1 40.1
==== ====

View File

@@ -69,19 +69,6 @@ GSettings key.
Adds a simple workspace switcher to the top bar. Adds a simple workspace switcher to the top bar.
## Default branch
The default development branch is `main`. If you still have a local
checkout under the old name, use:
```sh
git checkout master
git branch -m master main
git fetch
git branch --unset-upstream
git branch -u origin/master
git symbolic-ref refs/remotes/origin/HEAD refs/remotes/origin/main
```
## License ## License
GNOME Shell Extensions are distributed under the terms of the GNU General GNOME Shell Extensions are distributed under the terms of the GNU General

View File

@@ -5,3 +5,4 @@ Exec=env GNOME_SHELL_SESSION_MODE=classic gnome-session
TryExec=gnome-session TryExec=gnome-session
Type=Application Type=Application
DesktopNames=GNOME-Classic;GNOME; DesktopNames=GNOME-Classic;GNOME;
X-GDM-SessionRegisters=true

View File

@@ -84,8 +84,8 @@ $variant: 'light';
} }
#appMenu { #appMenu {
padding: 0 8px 0 8px;
spinner-image: url("classic-process-working.svg"); spinner-image: url("classic-process-working.svg");
.panel-status-menu-box { padding: 0; }
} }
.tile-preview-left.on-primary, .tile-preview-left.on-primary,
.tile-preview-right.on-primary, .tile-preview-right.on-primary,

View File

@@ -7,7 +7,7 @@ builddir=`mktemp -p $srcdir -d _build.XXXXXX` || exit 1
installdir=`mktemp -p $srcdir -d _install.XXXXXX` || exit 1 installdir=`mktemp -p $srcdir -d _install.XXXXXX` || exit 1
meson setup --prefix=$installdir -Dextension_set=all $srcdir $builddir meson setup --prefix=$installdir -Dextension_set=all $srcdir $builddir
meson install -C $builddir ninja -C$builddir install
rm -rf $srcdir/zip-files rm -rf $srcdir/zip-files
mkdir $srcdir/zip-files mkdir $srcdir/zip-files

View File

@@ -12,7 +12,9 @@ const Main = imports.ui.main;
const PanelMenu = imports.ui.panelMenu; const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu; const PopupMenu = imports.ui.popupMenu;
const _ = ExtensionUtils.gettext; const Me = ExtensionUtils.getCurrentExtension();
const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']);
const _ = Gettext.gettext;
const appSys = Shell.AppSystem.get_default(); const appSys = Shell.AppSystem.get_default();
@@ -672,20 +674,17 @@ class ApplicationsButton extends PanelMenu.Button {
let appsMenuButton; let appsMenuButton;
/** */
function enable() { function enable() {
appsMenuButton = new ApplicationsButton(); appsMenuButton = new ApplicationsButton();
let index = Main.sessionMode.panel.left.indexOf('activities') + 1; let index = Main.sessionMode.panel.left.indexOf('activities') + 1;
Main.panel.addToStatusArea('apps-menu', appsMenuButton, index, 'left'); Main.panel.addToStatusArea('apps-menu', appsMenuButton, index, 'left');
} }
/** */
function disable() { function disable() {
Main.panel.menuManager.removeMenu(appsMenuButton.menu); Main.panel.menuManager.removeMenu(appsMenuButton.menu);
appsMenuButton.destroy(); appsMenuButton.destroy();
} }
/** */
function init() { function init() {
ExtensionUtils.initTranslations(); ExtensionUtils.initTranslations();
} }

View File

@@ -108,14 +108,10 @@ class WindowMover {
let prevCheckWorkspaces; let prevCheckWorkspaces;
let winMover; let winMover;
/** */
function init() { function init() {
ExtensionUtils.initTranslations(); ExtensionUtils.initTranslations();
} }
/**
* @returns {bool} - false (used as MetaLater handler)
*/
function myCheckWorkspaces() { function myCheckWorkspaces() {
let keepAliveWorkspaces = []; let keepAliveWorkspaces = [];
let foundNonEmpty = false; let foundNonEmpty = false;
@@ -136,7 +132,6 @@ function myCheckWorkspaces() {
return false; return false;
} }
/** */
function enable() { function enable() {
prevCheckWorkspaces = Main.wm._workspaceTracker._checkWorkspaces; prevCheckWorkspaces = Main.wm._workspaceTracker._checkWorkspaces;
Main.wm._workspaceTracker._checkWorkspaces = myCheckWorkspaces; Main.wm._workspaceTracker._checkWorkspaces = myCheckWorkspaces;
@@ -144,7 +139,6 @@ function enable() {
winMover = new WindowMover(); winMover = new WindowMover();
} }
/** */
function disable() { function disable() {
Main.wm._workspaceTracker._checkWorkspaces = prevCheckWorkspaces; Main.wm._workspaceTracker._checkWorkspaces = prevCheckWorkspaces;
winMover.destroy(); winMover.destroy();

View File

@@ -5,8 +5,10 @@
const { Gio, GLib, GObject, Gtk, Pango } = imports.gi; const { Gio, GLib, GObject, Gtk, Pango } = imports.gi;
const ExtensionUtils = imports.misc.extensionUtils; const ExtensionUtils = imports.misc.extensionUtils;
const Me = ExtensionUtils.getCurrentExtension();
const _ = ExtensionUtils.gettext; const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']);
const _ = Gettext.gettext;
const SETTINGS_KEY = 'application-list'; const SETTINGS_KEY = 'application-list';
@@ -265,14 +267,10 @@ class NewRuleDialog extends Gtk.AppChooserDialog {
} }
}); });
/** */
function init() { function init() {
ExtensionUtils.initTranslations(); ExtensionUtils.initTranslations();
} }
/**
* @returns {Gtk.Widget} - the prefs widget
*/
function buildPrefsWidget() { function buildPrefsWidget() {
return new AutoMoveSettingsWidget(); return new AutoMoveSettingsWidget();
} }

View File

@@ -8,7 +8,9 @@ const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu; const PopupMenu = imports.ui.popupMenu;
const ShellMountOperation = imports.ui.shellMountOperation; const ShellMountOperation = imports.ui.shellMountOperation;
const _ = ExtensionUtils.gettext; const Me = ExtensionUtils.getCurrentExtension();
const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']);
const _ = Gettext.gettext;
var MountMenuItem = GObject.registerClass( var MountMenuItem = GObject.registerClass(
class MountMenuItem extends PopupMenu.PopupBaseMenuItem { class MountMenuItem extends PopupMenu.PopupBaseMenuItem {
@@ -216,20 +218,17 @@ class DriveMenu extends PanelMenu.Button {
} }
}); });
/** */
function init() { function init() {
ExtensionUtils.initTranslations(); ExtensionUtils.initTranslations();
} }
let _indicator; let _indicator;
/** */
function enable() { function enable() {
_indicator = new DriveMenu(); _indicator = new DriveMenu();
Main.panel.addToStatusArea('drive-menu', _indicator); Main.panel.addToStatusArea('drive-menu', _indicator);
} }
/** */
function disable() { function disable() {
_indicator.destroy(); _indicator.destroy();
} }

View File

@@ -3,7 +3,6 @@ const AppDisplay = imports.ui.appDisplay;
let _activateOriginal = null; let _activateOriginal = null;
/** */
function enable() { function enable() {
_activateOriginal = AppDisplay.AppIcon.prototype.activate; _activateOriginal = AppDisplay.AppIcon.prototype.activate;
AppDisplay.AppIcon.prototype.activate = function () { AppDisplay.AppIcon.prototype.activate = function () {
@@ -11,7 +10,6 @@ function enable() {
}; };
} }
/** */
function disable() { function disable() {
AppDisplay.AppIcon.prototype.activate = _activateOriginal; AppDisplay.AppIcon.prototype.activate = _activateOriginal;
} }

View File

@@ -238,13 +238,11 @@ class NaturalLayoutStrategy extends Workspace.LayoutStrategy {
let winInjections, workspaceInjections; let winInjections, workspaceInjections;
/** */
function resetState() { function resetState() {
winInjections = { }; winInjections = { };
workspaceInjections = { }; workspaceInjections = { };
} }
/** */
function enable() { function enable() {
resetState(); resetState();
@@ -284,11 +282,6 @@ function enable() {
}; };
} }
/**
* @param {Object} object - object that was modified
* @param {Object} injection - the map of previous injections
* @param {string} name - the @injection key that should be removed
*/
function removeInjection(object, injection, name) { function removeInjection(object, injection, name) {
if (injection[name] === undefined) if (injection[name] === undefined)
delete object[name]; delete object[name];
@@ -296,7 +289,6 @@ function removeInjection(object, injection, name) {
object[name] = injection[name]; object[name] = injection[name];
} }
/** */
function disable() { function disable() {
var i; var i;

View File

@@ -1,9 +1 @@
.window-caption { /* This extensions requires no special styling */
-shell-caption-spacing: 13px; /* current caption height is 26px => set it to half of it. TODO: better solution needed */
}
.window-picker {
-horizontal-spacing: 32px;
-vertical-spacing: 32px;
padding: 64px 32px;
}

View File

@@ -9,11 +9,13 @@ const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu; const PopupMenu = imports.ui.popupMenu;
const Me = ExtensionUtils.getCurrentExtension(); const Me = ExtensionUtils.getCurrentExtension();
const PlaceDisplay = Me.imports.placeDisplay;
const _ = ExtensionUtils.gettext; const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']);
const _ = Gettext.gettext;
const N_ = x => x; const N_ = x => x;
const PlaceDisplay = Me.imports.placeDisplay;
const PLACE_ICON_SIZE = 16; const PLACE_ICON_SIZE = 16;
var PlaceMenuItem = GObject.registerClass( var PlaceMenuItem = GObject.registerClass(
@@ -132,14 +134,12 @@ class PlacesMenu extends PanelMenu.Button {
} }
}); });
/** */
function init() { function init() {
ExtensionUtils.initTranslations(); ExtensionUtils.initTranslations();
} }
let _indicator; let _indicator;
/** */
function enable() { function enable() {
_indicator = new PlacesMenu(); _indicator = new PlacesMenu();
@@ -149,7 +149,6 @@ function enable() {
Main.panel.addToStatusArea('places-menu', _indicator, pos, 'left'); Main.panel.addToStatusArea('places-menu', _indicator, pos, 'left');
} }
/** */
function disable() { function disable() {
_indicator.destroy(); _indicator.destroy();
} }

View File

@@ -7,7 +7,10 @@ const ExtensionUtils = imports.misc.extensionUtils;
const Main = imports.ui.main; const Main = imports.ui.main;
const ShellMountOperation = imports.ui.shellMountOperation; const ShellMountOperation = imports.ui.shellMountOperation;
const _ = ExtensionUtils.gettext; const Me = ExtensionUtils.getCurrentExtension();
const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']);
const _ = Gettext.gettext;
const N_ = x => x; const N_ = x => x;
const BACKGROUND_SCHEMA = 'org.gnome.desktop.background'; const BACKGROUND_SCHEMA = 'org.gnome.desktop.background';

View File

@@ -28,15 +28,11 @@ const MESSAGE_FADE_TIME = 2000;
let text; let text;
/** */
function hideMessage() { function hideMessage() {
text.destroy(); text.destroy();
text = null; text = null;
} }
/**
* @param {string} message - the message to flash
*/
function flashMessage(message) { function flashMessage(message) {
if (!text) { if (!text) {
text = new St.Label({ style_class: 'screenshot-sizer-message' }); text = new St.Label({ style_class: 'screenshot-sizer-message' });
@@ -71,11 +67,6 @@ let SIZES = [
[720, 360], // Phone landscape fullscreen [720, 360], // Phone landscape fullscreen
]; ];
/**
* @param {Meta.Display} display - the display
* @param {Meta.Window=} window - for per-window bindings, the window
* @param {Meta.KeyBinding} binding - the key binding
*/
function cycleScreenshotSizes(display, window, binding) { function cycleScreenshotSizes(display, window, binding) {
// Probably this isn't useful with 5 sizes, but you can decrease instead // Probably this isn't useful with 5 sizes, but you can decrease instead
// of increase by holding down shift. // of increase by holding down shift.
@@ -142,7 +133,6 @@ function cycleScreenshotSizes(display, window, binding) {
flashMessage(message); flashMessage(message);
} }
/** */
function enable() { function enable() {
Main.wm.addKeybinding( Main.wm.addKeybinding(
'cycle-screenshot-sizes', 'cycle-screenshot-sizes',
@@ -158,7 +148,6 @@ function enable() {
cycleScreenshotSizes); cycleScreenshotSizes);
} }
/** */
function disable() { function disable() {
Main.wm.removeKeybinding('cycle-screenshot-sizes'); Main.wm.removeKeybinding('cycle-screenshot-sizes');
Main.wm.removeKeybinding('cycle-screenshot-sizes-backward'); Main.wm.removeKeybinding('cycle-screenshot-sizes-backward');

View File

@@ -58,9 +58,6 @@ class ThemeManager {
} }
} }
/**
* @returns {ThemeManager} - the extension state object
*/
function init() { function init() {
return new ThemeManager(); return new ThemeManager();
} }

View File

@@ -174,13 +174,9 @@ class ThemeRow extends Gtk.ListBoxRow {
} }
}); });
/** */
function init() { function init() {
} }
/**
* @returns {Gtk.Widget} - the prefs widget
*/
function buildPrefsWidget() { function buildPrefsWidget() {
return new UserThemePrefsWidget(); return new UserThemePrefsWidget();
} }

View File

@@ -3,9 +3,6 @@ const { GLib } = imports.gi;
const fn = (...args) => GLib.build_filenamev(args); const fn = (...args) => GLib.build_filenamev(args);
/**
* @returns {string[]} - an ordered list of theme directories
*/
function getThemeDirs() { function getThemeDirs() {
return [ return [
fn(GLib.get_home_dir(), '.themes'), fn(GLib.get_home_dir(), '.themes'),
@@ -14,9 +11,6 @@ function getThemeDirs() {
]; ];
} }
/**
* @returns {string[]} - an ordered list of mode theme directories
*/
function getModeThemeDirs() { function getModeThemeDirs() {
return GLib.get_system_data_dirs() return GLib.get_system_data_dirs()
.map(dir => fn(dir, 'gnome-shell', 'theme')); .map(dir => fn(dir, 'gnome-shell', 'theme'));

View File

@@ -11,7 +11,8 @@ const Me = ExtensionUtils.getCurrentExtension();
const { WindowPicker, WindowPickerToggle } = Me.imports.windowPicker; const { WindowPicker, WindowPickerToggle } = Me.imports.windowPicker;
const { WorkspaceIndicator } = Me.imports.workspaceIndicator; const { WorkspaceIndicator } = Me.imports.workspaceIndicator;
const _ = ExtensionUtils.gettext; const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']);
const _ = Gettext.gettext;
const ICON_TEXTURE_SIZE = 24; const ICON_TEXTURE_SIZE = 24;
const DND_ACTIVATE_TIMEOUT = 500; const DND_ACTIVATE_TIMEOUT = 500;
@@ -22,10 +23,34 @@ const GroupingMode = {
ALWAYS: 2, ALWAYS: 2,
}; };
/**
* @param {Shell.App} app - an app function _minimizeOrActivateWindow(window) {
* @returns {number} - the smallest stable sequence of the app's windows let focusWindow = global.display.focus_window;
*/ if (focusWindow === window ||
focusWindow && focusWindow.get_transient_for() === window)
window.minimize();
else
window.activate(global.get_current_time());
}
function _openMenu(menu) {
menu.open();
let event = Clutter.get_current_event();
if (event && event.type() === Clutter.EventType.KEY_RELEASE)
menu.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
}
function _onMenuStateChanged(menu, isOpen) {
if (isOpen)
return;
let [x, y] = global.get_pointer();
let actor = global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, x, y);
if (Me.stateObj.someWindowListContains(actor))
actor.sync_hover();
}
function _getAppStableSequence(app) { function _getAppStableSequence(app) {
let windows = app.get_windows().filter(w => !w.skip_taskbar); let windows = app.get_windows().filter(w => !w.skip_taskbar);
return windows.reduce((prev, cur) => { return windows.reduce((prev, cur) => {
@@ -33,6 +58,7 @@ function _getAppStableSequence(app) {
}, Infinity); }, Infinity);
} }
class WindowContextMenu extends PopupMenu.PopupMenu { class WindowContextMenu extends PopupMenu.PopupMenu {
constructor(source, metaWindow) { constructor(source, metaWindow) {
super(source, 0.5, St.Side.BOTTOM); super(source, 0.5, St.Side.BOTTOM);
@@ -256,37 +282,10 @@ const BaseButton = GObject.registerClass({
return true; return true;
} }
_openMenu(menu) {
menu.open();
let event = Clutter.get_current_event();
if (event && event.type() === Clutter.EventType.KEY_RELEASE)
menu.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
}
_minimizeOrActivateWindow(window) {
let focusWindow = global.display.focus_window;
if (focusWindow === window ||
focusWindow && focusWindow.get_transient_for() === window)
window.minimize();
else
window.activate(global.get_current_time());
}
_onMenuStateChanged(menu, isOpen) {
if (isOpen)
return;
let [x, y] = global.get_pointer();
let actor = global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, x, y);
if (Me.stateObj.someWindowListContains(actor))
actor.sync_hover();
}
_onPopupMenu(_actor) { _onPopupMenu(_actor) {
if (!this._canOpenPopupMenu() || this._contextMenu.isOpen) if (!this._canOpenPopupMenu() || this._contextMenu.isOpen)
return; return;
this._openMenu(this._contextMenu); _openMenu(this._contextMenu);
} }
_isFocused() { _isFocused() {
@@ -363,8 +362,7 @@ class WindowButton extends BaseButton {
this.label_actor = this._windowTitle.label_actor; this.label_actor = this._windowTitle.label_actor;
this._contextMenu = new WindowContextMenu(this, this.metaWindow); this._contextMenu = new WindowContextMenu(this, this.metaWindow);
this._contextMenu.connect('open-state-changed', this._contextMenu.connect('open-state-changed', _onMenuStateChanged);
this._onMenuStateChanged.bind(this));
this._contextMenu.actor.hide(); this._contextMenu.actor.hide();
this._contextMenuManager.addMenu(this._contextMenu); this._contextMenuManager.addMenu(this._contextMenu);
Main.uiGroup.add_actor(this._contextMenu.actor); Main.uiGroup.add_actor(this._contextMenu.actor);
@@ -384,9 +382,9 @@ class WindowButton extends BaseButton {
} }
if (button === 1) if (button === 1)
this._minimizeOrActivateWindow(this.metaWindow); _minimizeOrActivateWindow(this.metaWindow);
else else
this._openMenu(this._contextMenu); _openMenu(this._contextMenu);
} }
_isFocused() { _isFocused() {
@@ -520,16 +518,14 @@ class AppButton extends BaseButton {
this._menuManager = new PopupMenu.PopupMenuManager(this); this._menuManager = new PopupMenu.PopupMenuManager(this);
this._menu = new PopupMenu.PopupMenu(this, 0.5, St.Side.BOTTOM); this._menu = new PopupMenu.PopupMenu(this, 0.5, St.Side.BOTTOM);
this._menu.connect('open-state-changed', this._menu.connect('open-state-changed', _onMenuStateChanged);
this._onMenuStateChanged.bind(this));
this._menu.actor.hide(); this._menu.actor.hide();
this._menu.connect('activate', this._onMenuActivate.bind(this)); this._menu.connect('activate', this._onMenuActivate.bind(this));
this._menuManager.addMenu(this._menu); this._menuManager.addMenu(this._menu);
Main.uiGroup.add_actor(this._menu.actor); Main.uiGroup.add_actor(this._menu.actor);
this._appContextMenu = new AppContextMenu(this); this._appContextMenu = new AppContextMenu(this);
this._appContextMenu.connect('open-state-changed', this._appContextMenu.connect('open-state-changed', _onMenuStateChanged);
this._onMenuStateChanged.bind(this));
this._appContextMenu.actor.hide(); this._appContextMenu.actor.hide();
Main.uiGroup.add_actor(this._appContextMenu.actor); Main.uiGroup.add_actor(this._appContextMenu.actor);
@@ -596,7 +592,7 @@ class AppButton extends BaseButton {
this._singleWindowTitle.child = this._windowTitle; this._singleWindowTitle.child = this._windowTitle;
this._windowContextMenu = new WindowContextMenu(this, this.metaWindow); this._windowContextMenu = new WindowContextMenu(this, this.metaWindow);
this._windowContextMenu.connect( this._windowContextMenu.connect(
'open-state-changed', this._onMenuStateChanged.bind(this)); 'open-state-changed', _onMenuStateChanged);
Main.uiGroup.add_actor(this._windowContextMenu.actor); Main.uiGroup.add_actor(this._windowContextMenu.actor);
this._windowContextMenu.actor.hide(); this._windowContextMenu.actor.hide();
this._contextMenuManager.addMenu(this._windowContextMenu); this._contextMenuManager.addMenu(this._windowContextMenu);
@@ -635,7 +631,7 @@ class AppButton extends BaseButton {
if (windows.length === 1) { if (windows.length === 1) {
if (contextMenuWasOpen) if (contextMenuWasOpen)
return; return;
this._minimizeOrActivateWindow(windows[0]); _minimizeOrActivateWindow(windows[0]);
} else { } else {
this._menu.removeAll(); this._menu.removeAll();
@@ -646,12 +642,12 @@ class AppButton extends BaseButton {
item._window = windows[i]; item._window = windows[i];
this._menu.addMenuItem(item); this._menu.addMenuItem(item);
} }
this._openMenu(this._menu); _openMenu(this._menu);
} }
} else { } else {
if (contextMenuWasOpen) if (contextMenuWasOpen)
return; return;
this._openMenu(this._contextMenu); _openMenu(this._contextMenu);
} }
} }
@@ -765,10 +761,9 @@ class WindowList extends St.Widget {
let workspaceManager = global.workspace_manager; let workspaceManager = global.workspace_manager;
this._workspaceSignals = new Map();
this._nWorkspacesChangedId = workspaceManager.connect( this._nWorkspacesChangedId = workspaceManager.connect(
'notify::n-workspaces', this._onWorkspacesChanged.bind(this)); 'notify::n-workspaces', this._updateWorkspaceIndicatorVisibility.bind(this));
this._onWorkspacesChanged(); this._updateWorkspaceIndicatorVisibility();
this._switchWorkspaceId = global.window_manager.connect( this._switchWorkspaceId = global.window_manager.connect(
'switch-workspace', this._checkGrouping.bind(this)); 'switch-workspace', this._checkGrouping.bind(this));
@@ -788,6 +783,10 @@ class WindowList extends St.Widget {
this._updateKeyboardAnchor(); this._updateKeyboardAnchor();
}); });
this._windowSignals = new Map();
this._windowCreatedId = global.display.connect(
'window-created', (dsp, win) => this._addWindow(win));
this._dragBeginId = Main.xdndHandler.connect('drag-begin', this._dragBeginId = Main.xdndHandler.connect('drag-begin',
this._monitorDrag.bind(this)); this._monitorDrag.bind(this));
this._dragEndId = Main.xdndHandler.connect('drag-end', this._dragEndId = Main.xdndHandler.connect('drag-end',
@@ -910,7 +909,7 @@ class WindowList extends St.Widget {
w2.metaWindow.get_stable_sequence(); w2.metaWindow.get_stable_sequence();
}); });
for (let i = 0; i < windows.length; i++) for (let i = 0; i < windows.length; i++)
this._onWindowAdded(null, windows[i].metaWindow); this._addWindow(windows[i].metaWindow);
} else { } else {
let apps = this._appSystem.get_running().sort((a1, a2) => { let apps = this._appSystem.get_running().sort((a1, a2) => {
return _getAppStableSequence(a1) - return _getAppStableSequence(a1) -
@@ -922,11 +921,8 @@ class WindowList extends St.Widget {
} }
_updateKeyboardAnchor() { _updateKeyboardAnchor() {
if (!Main.keyboard.keyboardActor) const translationY = Main.overview.visible ? 0 : this.height;
return; Main.layoutManager.keyboardBox.translation_y = -translationY;
let translationY = Main.overview.visible ? 0 : this.height;
Main.keyboard.keyboardActor.translation_y = -translationY;
} }
_onAppStateChanged(appSys, app) { _onAppStateChanged(appSys, app) {
@@ -953,7 +949,7 @@ class WindowList extends St.Widget {
child.destroy(); child.destroy();
} }
_onWindowAdded(ws, win) { _addWindow(win) {
if (!this._grouped) if (!this._grouped)
this._checkGrouping(); this._checkGrouping();
@@ -964,21 +960,26 @@ class WindowList extends St.Widget {
if (children.find(c => c.metaWindow === win)) if (children.find(c => c.metaWindow === win))
return; return;
this._windowSignals.set(
win, win.connect('unmanaged', () => this._removeWindow(win)));
let button = new WindowButton(win, this._perMonitor, this._monitor.index); let button = new WindowButton(win, this._perMonitor, this._monitor.index);
this._settings.bind('display-all-workspaces', this._settings.bind('display-all-workspaces',
button, 'ignore-workspace', Gio.SettingsBindFlags.GET); button, 'ignore-workspace', Gio.SettingsBindFlags.GET);
this._windowList.add_child(button); this._windowList.add_child(button);
} }
_onWindowRemoved(ws, win) { _removeWindow(win) {
if (this._grouped) if (this._grouped)
this._checkGrouping(); this._checkGrouping();
if (this._grouped) if (this._grouped)
return; return;
if (win.get_compositor_private()) const id = this._windowSignals.get(win);
return; // not actually removed, just moved to another workspace if (id)
win.disconnect(id);
this._windowSignals.delete(id);
let children = this._windowList.get_children(); let children = this._windowList.get_children();
let child = children.find(c => c.metaWindow === win); let child = children.find(c => c.metaWindow === win);
@@ -986,39 +987,6 @@ class WindowList extends St.Widget {
child.destroy(); child.destroy();
} }
_onWorkspacesChanged() {
let workspaceManager = global.workspace_manager;
let numWorkspaces = workspaceManager.n_workspaces;
for (let i = 0; i < numWorkspaces; i++) {
let workspace = workspaceManager.get_workspace_by_index(i);
if (this._workspaceSignals.has(workspace))
continue;
let signals = { windowAddedId: 0, windowRemovedId: 0 };
signals._windowAddedId = workspace.connect_after(
'window-added', this._onWindowAdded.bind(this));
signals._windowRemovedId = workspace.connect(
'window-removed', this._onWindowRemoved.bind(this));
this._workspaceSignals.set(workspace, signals);
}
this._updateWorkspaceIndicatorVisibility();
}
_disconnectWorkspaceSignals() {
let workspaceManager = global.workspace_manager;
let numWorkspaces = workspaceManager.n_workspaces;
for (let i = 0; i < numWorkspaces; i++) {
let workspace = workspaceManager.get_workspace_by_index(i);
let signals = this._workspaceSignals.get(workspace);
this._workspaceSignals.delete(workspace);
workspace.disconnect(signals._windowAddedId);
workspace.disconnect(signals._windowRemovedId);
}
}
_monitorDrag() { _monitorDrag() {
DND.addDragMonitor(this._dragMonitor); DND.addDragMonitor(this._dragMonitor);
} }
@@ -1082,18 +1050,20 @@ class WindowList extends St.Widget {
Main.keyboard._bottomDragAction.disconnect(this._keyboardVisiblechangedId); Main.keyboard._bottomDragAction.disconnect(this._keyboardVisiblechangedId);
this._keyboardVisiblechangedId = 0; this._keyboardVisiblechangedId = 0;
this._disconnectWorkspaceSignals();
global.workspace_manager.disconnect(this._nWorkspacesChangedId); global.workspace_manager.disconnect(this._nWorkspacesChangedId);
this._nWorkspacesChangedId = 0; this._nWorkspacesChangedId = 0;
global.window_manager.disconnect(this._switchWorkspaceId); global.window_manager.disconnect(this._switchWorkspaceId);
this._switchWorkspaceId = 0; this._switchWorkspaceId = 0;
this._windowSignals.forEach((id, win) => win.disconnect(id));
this._windowSignals.clear();
Main.overview.disconnect(this._overviewShowingId); Main.overview.disconnect(this._overviewShowingId);
Main.overview.disconnect(this._overviewHidingId); Main.overview.disconnect(this._overviewHidingId);
global.display.disconnect(this._fullscreenChangedId); global.display.disconnect(this._fullscreenChangedId);
global.display.disconnect(this._windowCreatedId);
this._stopMonitoringDrag(); this._stopMonitoringDrag();
Main.xdndHandler.disconnect(this._dragBeginId); Main.xdndHandler.disconnect(this._dragBeginId);
@@ -1174,9 +1144,6 @@ class Extension {
} }
} }
/**
* @returns {Extension} - the extension's state object
*/
function init() { function init() {
return new Extension(); return new Extension();
} }

View File

@@ -1,13 +1,15 @@
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*- // -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
/* exported init buildPrefsWidget */ /* exported init buildPrefsWidget */
const { Gio, GLib, GObject, Gtk } = imports.gi; const { Gio, GObject, Gtk } = imports.gi;
const ExtensionUtils = imports.misc.extensionUtils; const ExtensionUtils = imports.misc.extensionUtils;
const Me = ExtensionUtils.getCurrentExtension();
const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']);
const _ = Gettext.gettext;
const _ = ExtensionUtils.gettext;
/** */
function init() { function init() {
ExtensionUtils.initTranslations(); ExtensionUtils.initTranslations();
} }
@@ -25,17 +27,6 @@ class WindowListPrefsWidget extends Gtk.Box {
halign: Gtk.Align.CENTER, halign: Gtk.Align.CENTER,
}); });
this._actionGroup = new Gio.SimpleActionGroup();
this.insert_action_group('window-list', this._actionGroup);
this._settings = ExtensionUtils.getSettings();
this._actionGroup.add_action(
this._settings.create_action('grouping-mode'));
this._actionGroup.add_action(
this._settings.create_action('show-on-all-monitors'));
this._actionGroup.add_action(
this._settings.create_action('display-all-workspaces'));
let groupingLabel = '<b>%s</b>'.format(_('Window Grouping')); let groupingLabel = '<b>%s</b>'.format(_('Window Grouping'));
this.append(new Gtk.Label({ this.append(new Gtk.Label({
label: groupingLabel, use_markup: true, label: groupingLabel, use_markup: true,
@@ -59,39 +50,61 @@ class WindowListPrefsWidget extends Gtk.Box {
context.add_class('frame'); context.add_class('frame');
context.add_class('view'); context.add_class('view');
const modes = [ this._settings = ExtensionUtils.getSettings();
{ mode: 'never', label: _('Never group windows') }, let currentMode = this._settings.get_string('grouping-mode');
{ mode: 'auto', label: _('Group windows when space is limited') }, let range = this._settings.get_range('grouping-mode');
{ mode: 'always', label: _('Always group windows') }, let modes = range.deep_unpack()[1].deep_unpack();
];
let group = null; let modeLabels = {
for (const { mode, label } of modes) { 'never': _('Never group windows'),
const check = new Gtk.CheckButton({ 'auto': _('Group windows when space is limited'),
action_name: 'window-list.grouping-mode', 'always': _('Always group windows'),
action_target: new GLib.Variant('s', mode), };
let radio = null;
let currentRadio = null;
for (let i = 0; i < modes.length; i++) {
let mode = modes[i];
let label = modeLabels[mode];
if (!label) {
log('Unhandled option "%s" for grouping-mode'.format(mode));
continue;
}
radio = new Gtk.CheckButton({
active: !i,
label, label,
group, group: radio,
margin_end: 12, margin_end: 12,
}); });
group = check; box.append(radio);
box.append(check);
if (currentMode === mode)
currentRadio = radio;
radio.connect('toggled', button => {
if (button.active)
this._settings.set_string('grouping-mode', mode);
});
} }
this.append(new Gtk.CheckButton({ if (currentRadio)
label: _('Show on all monitors'), currentRadio.active = true;
action_name: 'window-list.show-on-all-monitors',
}));
this.append(new Gtk.CheckButton({ let check = new Gtk.CheckButton({
label: _('Show on all monitors'),
});
this._settings.bind('show-on-all-monitors', check, 'active', Gio.SettingsBindFlags.DEFAULT);
this.append(check);
check = new Gtk.CheckButton({
label: _('Show windows from all workspaces'), label: _('Show windows from all workspaces'),
action_name: 'window-list.display-all-workspaces', });
})); this._settings.bind('display-all-workspaces', check, 'active', Gio.SettingsBindFlags.DEFAULT);
this.append(check);
} }
}); });
/**
* @returns {Gtk.Widget} - the prefs widget
*/
function buildPrefsWidget() { function buildPrefsWidget() {
return new WindowListPrefsWidget(); return new WindowListPrefsWidget();
} }

View File

@@ -7,7 +7,10 @@ const Main = imports.ui.main;
const PanelMenu = imports.ui.panelMenu; const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu; const PopupMenu = imports.ui.popupMenu;
const _ = ExtensionUtils.gettext; const Me = ExtensionUtils.getCurrentExtension();
const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']);
const _ = Gettext.gettext;
const TOOLTIP_OFFSET = 6; const TOOLTIP_OFFSET = 6;
const TOOLTIP_ANIMATION_TIME = 150; const TOOLTIP_ANIMATION_TIME = 150;

View File

@@ -262,9 +262,6 @@ class Extension {
} }
} }
/**
* @returns {Extension} - the extension's state object
*/
function init() { function init() {
return new Extension(); return new Extension();
} }

View File

@@ -9,7 +9,10 @@ const Main = imports.ui.main;
const PanelMenu = imports.ui.panelMenu; const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu; const PopupMenu = imports.ui.popupMenu;
const _ = ExtensionUtils.gettext; const Me = ExtensionUtils.getCurrentExtension();
const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']);
const _ = Gettext.gettext;
const WORKSPACE_SCHEMA = 'org.gnome.desktop.wm.preferences'; const WORKSPACE_SCHEMA = 'org.gnome.desktop.wm.preferences';
const WORKSPACE_KEY = 'workspace-names'; const WORKSPACE_KEY = 'workspace-names';
@@ -442,20 +445,17 @@ class WorkspaceIndicator extends PanelMenu.Button {
} }
}); });
/** */
function init() { function init() {
ExtensionUtils.initTranslations(); ExtensionUtils.initTranslations();
} }
let _indicator; let _indicator;
/** */
function enable() { function enable() {
_indicator = new WorkspaceIndicator(); _indicator = new WorkspaceIndicator();
Main.panel.addToStatusArea('workspace-indicator', _indicator); Main.panel.addToStatusArea('workspace-indicator', _indicator);
} }
/** */
function disable() { function disable() {
_indicator.destroy(); _indicator.destroy();
} }

View File

@@ -4,8 +4,10 @@
const { Gio, GLib, GObject, Gtk, Pango } = imports.gi; const { Gio, GLib, GObject, Gtk, Pango } = imports.gi;
const ExtensionUtils = imports.misc.extensionUtils; const ExtensionUtils = imports.misc.extensionUtils;
const Me = ExtensionUtils.getCurrentExtension();
const _ = ExtensionUtils.gettext; const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']);
const _ = Gettext.gettext;
const N_ = e => e; const N_ = e => e;
const WORKSPACE_SCHEMA = 'org.gnome.desktop.wm.preferences'; const WORKSPACE_SCHEMA = 'org.gnome.desktop.wm.preferences';
@@ -208,14 +210,10 @@ class NewWorkspaceRow extends Gtk.ListBoxRow {
} }
}); });
/** */
function init() { function init() {
ExtensionUtils.initTranslations(); ExtensionUtils.initTranslations();
} }
/**
* @returns {Gtk.Widget} - the prefs widget
*/
function buildPrefsWidget() { function buildPrefsWidget() {
return new WorkspaceSettingsWidget(); return new WorkspaceSettingsWidget();
} }

View File

@@ -1,12 +1,8 @@
--- ---
# SPDX-License-Identifier: MIT OR LGPL-2.0-or-later # SPDX-License-Identifier: MIT OR LGPL-2.0-or-later
# SPDX-FileCopyrightText: 2018 Claudio André <claudioandre.br@gmail.com>
env: env:
es6: true es6: true
es2020: true
extends: 'eslint:recommended' extends: 'eslint:recommended'
plugins:
- jsdoc
rules: rules:
array-bracket-newline: array-bracket-newline:
- error - error
@@ -64,17 +60,6 @@ rules:
- 'CallExpression[callee.object.name=GObject][callee.property.name=registerClass] > ClassExpression:first-child' - 'CallExpression[callee.object.name=GObject][callee.property.name=registerClass] > ClassExpression:first-child'
# Allow dedenting chained member expressions # Allow dedenting chained member expressions
MemberExpression: 'off' MemberExpression: 'off'
jsdoc/check-alignment: error
jsdoc/check-param-names: error
jsdoc/check-tag-names: error
jsdoc/check-types: error
jsdoc/implements-on-classes: error
jsdoc/newline-after-description: error
jsdoc/require-jsdoc: error
jsdoc/require-param: error
jsdoc/require-param-description: error
jsdoc/require-param-name: error
jsdoc/require-param-type: error
key-spacing: key-spacing:
- error - error
- beforeColon: false - beforeColon: false
@@ -122,15 +107,8 @@ rules:
no-octal-escape: error no-octal-escape: error
no-proto: error no-proto: error
no-prototype-builtins: 'off' no-prototype-builtins: 'off'
no-restricted-globals: [error, window]
no-restricted-properties: no-restricted-properties:
- error - error
- object: imports
property: format
message: Use template strings
- object: pkg
property: initFormat
message: Use template strings
- object: Lang - object: Lang
property: copyProperties property: copyProperties
message: Use Object.assign() message: Use Object.assign()
@@ -189,7 +167,6 @@ rules:
object-curly-newline: object-curly-newline:
- error - error
- consistent: true - consistent: true
multiline: true
object-curly-spacing: error object-curly-spacing: error
object-shorthand: error object-shorthand: error
operator-assignment: error operator-assignment: error
@@ -237,14 +214,14 @@ rules:
template-curly-spacing: error template-curly-spacing: error
template-tag-spacing: error template-tag-spacing: error
unicode-bom: error unicode-bom: error
valid-jsdoc:
- error
- requireReturn: false
wrap-iife: wrap-iife:
- error - error
- inside - inside
yield-star-spacing: error yield-star-spacing: error
yoda: error yoda: error
settings:
jsdoc:
mode: typescript
globals: globals:
ARGV: readonly ARGV: readonly
Debugger: readonly Debugger: readonly
@@ -256,8 +233,5 @@ globals:
logError: readonly logError: readonly
print: readonly print: readonly
printerr: readonly printerr: readonly
window: readonly
TextEncoder: readonly
TextDecoder: readonly
parserOptions: parserOptions:
ecmaVersion: 2020 ecmaVersion: 2020

View File

@@ -1,5 +1,5 @@
project('gnome-shell-extensions', project('gnome-shell-extensions',
version: '41.beta', version: '40.7',
meson_version: '>= 0.44.0', meson_version: '>= 0.44.0',
license: 'GPL2+' license: 'GPL2+'
) )

622
po/bg.po
View File

@@ -1,263 +1,359 @@
# Bulgarian translation for gnome-shell-extensions po-file. # Bulgarian translation for gnome-shell-extensions po-file.
# Copyright (C) 2014, 2015, 2017 Free Software Foundation, Inc. # Copyright (C) 2014, 2015, 2017 Free Software Foundation, Inc.
# Copyright (C) 2021 Alexander Shopov <ash@kambanaria.org>. # This file is distributed under the same license as the gnome-shell-extensions package.
# This file is distributed under the same license as the gnome-shell-extensions package. # Ivaylo Valkov <ivaylo@e-valkov.org>, 2014.
# Ivaylo Valkov <ivaylo@e-valkov.org>, 2014. # Alexander Shopov <ash@kambanaria.org>, 2014, 2015.
# Alexander Shopov <ash@kambanaria.org>, 2014, 2015, 2021. # Lyubomir Vasilev <lyubomirv@abv.bg>, 2017.
# Lyubomir Vasilev <lyubomirv@abv.bg>, 2017. msgid ""
msgid "" msgstr ""
msgstr "" "Project-Id-Version: gnome-shell-extensions master\n"
"Project-Id-Version: gnome-shell-extensions master\n" "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/" "shell&keywords=I18N+L10N&component=extensions\n"
"issues\n" "POT-Creation-Date: 2017-09-09 15:20+0000\n"
"POT-Creation-Date: 2021-07-05 17:13+0000\n" "PO-Revision-Date: 2017-09-08 08:47+0300\n"
"PO-Revision-Date: 2021-07-11 10:19+0200\n" "Last-Translator: Lyubomir Vasilev <lyubomirv@abv.bg>\n"
"Last-Translator: Alexander Shopov <ash@kambanaria.org>\n" "Language-Team: Bulgarian <dict@fsa-bg.org>\n"
"Language-Team: Bulgarian <dict@fsa-bg.org>\n" "Language: bg\n"
"Language: bg\n" "MIME-Version: 1.0\n"
"MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n"
"Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: data/gnome-classic.desktop.in:3 data/gnome-classic.session.desktop.in:3
#: data/gnome-classic.desktop.in:3 msgid "GNOME Classic"
msgid "GNOME Classic" msgstr "Класически GNOME"
msgstr "Класически GNOME"
#: data/gnome-classic.desktop.in:4
#: data/gnome-classic.desktop.in:4 msgid "This session logs you into GNOME Classic"
msgid "This session logs you into GNOME Classic" msgstr "Работната среда изглежда като класическия GNOME (2.x)"
msgstr "Работната среда изглежда като класическия GNOME (2.x)"
#: data/org.gnome.shell.extensions.classic-overrides.gschema.xml:7
#: extensions/apps-menu/extension.js:113 msgid "Attach modal dialog to the parent window"
msgid "Favorites" msgstr "Прикрепяне на модалните прозорци към родителските им прозорци"
msgstr "Любими"
#: data/org.gnome.shell.extensions.classic-overrides.gschema.xml:8
#: extensions/apps-menu/extension.js:367 #: data/org.gnome.shell.extensions.classic-overrides.gschema.xml:25
msgid "Applications" #: data/org.gnome.shell.extensions.classic-overrides.gschema.xml:33
msgstr "Програми" #: data/org.gnome.shell.extensions.classic-overrides.gschema.xml:41
msgid ""
#: extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml:6 "This key overrides the key in org.gnome.mutter when running GNOME Shell."
msgid "Application and workspace list" msgstr ""
msgstr "Списък с програмите и работните плотове" "Този ключ при е с по-голям приоритет от „org.gnome.mutter“ при изпълнението "
"на обвивката на GNOME."
#: extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml:7
msgid "" #: data/org.gnome.shell.extensions.classic-overrides.gschema.xml:16
"A list of strings, each containing an application id (desktop file name), " msgid "Arrangement of buttons on the titlebar"
"followed by a colon and the workspace number" msgstr "Подредба на бутоните на заглавната лента"
msgstr ""
"Списък от низове. Всеки съдържа идентификатор на програма (име на файл „." #: data/org.gnome.shell.extensions.classic-overrides.gschema.xml:17
"desktop“), следван от знака „:“ и номер на работен плот" msgid ""
"This key overrides the key in org.gnome.desktop.wm.preferences when running "
#: extensions/auto-move-windows/prefs.js:35 "GNOME Shell."
msgid "Workspace Rules" msgstr ""
msgstr "Правила за работните плотове" "Този ключ при е с по-голям приоритет от „org.gnome.desktop.wm.preferences“ "
"при изпълнението на обвивката на GNOME."
#: extensions/auto-move-windows/prefs.js:237
msgid "Add Rule" #: data/org.gnome.shell.extensions.classic-overrides.gschema.xml:24
msgstr "Добавяне на правило" msgid "Enable edge tiling when dropping windows on screen edges"
msgstr ""
#. TRANSLATORS: %s is the filesystem name "Включване на специална подредба при приближаване на прозорец до ръбовете на "
#: extensions/drive-menu/extension.js:132 "екрана"
#: extensions/places-menu/placeDisplay.js:233
#, javascript-format #: data/org.gnome.shell.extensions.classic-overrides.gschema.xml:32
msgid "Ejecting drive “%s” failed:" msgid "Workspaces only on primary monitor"
msgstr "Неуспешно изваждане на устройство „%s“:" msgstr "Работни плотове само на основния екран"
#: extensions/drive-menu/extension.js:148 #: data/org.gnome.shell.extensions.classic-overrides.gschema.xml:40
msgid "Removable devices" msgid "Delay focus changes in mouse mode until the pointer stops moving"
msgstr "Преносими медии" msgstr "Забавяне на смяната на фокуса до спирането на движението на показалеца"
#: extensions/drive-menu/extension.js:172 #: extensions/alternate-tab/prefs.js:20
msgid "Open Files" msgid "Thumbnail only"
msgstr "Отваряне на файлове" msgstr "Само миниатюри"
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:5 #: extensions/alternate-tab/prefs.js:21
msgid "Use more screen for windows" msgid "Application icon only"
msgstr "Повече пространство за прозорците" msgstr "Само икони на приложенията"
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:6 #: extensions/alternate-tab/prefs.js:22
msgid "" msgid "Thumbnail and application icon"
"Try to use more screen for placing window thumbnails by adapting to screen " msgstr "Миниатюри и икони на приложенията"
"aspect ratio, and consolidating them further to reduce the bounding box. "
"This setting applies only with the natural placement strategy." #: extensions/alternate-tab/prefs.js:38
msgstr "" msgid "Present windows as"
"Използване на по-голяма част от екрана за поставянето на мини изображения " msgstr "Показване на прозорците като"
"чрез промяна на съотношението на страните и допълнително обединяване за "
"смаляване на обхващащия ги правоъгълник. Тази настройка се прилага само при " #: extensions/alternate-tab/prefs.js:69
"естествената стратегия за поставяне на прозорците." msgid "Show only windows in the current workspace"
msgstr "Да се показват само прозорците на текущия работен плот"
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:11
msgid "Place window captions on top" #: extensions/apps-menu/extension.js:41
msgstr "Заглавия на прозорците отгоре" msgid "Activities Overview"
msgstr "Показване на програмите"
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:12
msgid "" #: extensions/apps-menu/extension.js:141
"If true, place window captions on top the respective thumbnail, overriding " msgid "Favorites"
"shell default of placing it at the bottom. Changing this setting requires " msgstr "Любими"
"restarting the shell to have any effect."
msgstr "" #: extensions/apps-menu/extension.js:436
"Ако е истина, заглавията на прозорците се поставят над мини изображенията " msgid "Applications"
"им, а не както е стандартно — отдолу. За прилагане на промяната на " msgstr "Програми"
"настройката трябва да рестартирате обвивката на GNOME."
#: extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml:6
#: extensions/places-menu/extension.js:89 msgid "Application and workspace list"
#: extensions/places-menu/extension.js:92 msgstr "Списък с програмите и работните плотове"
msgid "Places"
msgstr "Места" #: extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml:7
msgid ""
#: extensions/places-menu/placeDisplay.js:46 "A list of strings, each containing an application id (desktop file name), "
#, javascript-format "followed by a colon and the workspace number"
msgid "Failed to launch “%s”" msgstr ""
msgstr "Неуспешно стартиране на „%s“" "Списък от низове. Всеки съдържа идентификатор на програма (име на файл „."
"desktop“ file name), следван от знака „:“ и номер на работен плот"
#: extensions/places-menu/placeDisplay.js:61
#, javascript-format #: extensions/auto-move-windows/prefs.js:60
msgid "Failed to mount volume for “%s”" msgid "Application"
msgstr "Неуспешно монтиране на тома „%s“" msgstr "Програма"
#: extensions/places-menu/placeDisplay.js:148 #: extensions/auto-move-windows/prefs.js:69
#: extensions/places-menu/placeDisplay.js:171 #: extensions/auto-move-windows/prefs.js:127
msgid "Computer" msgid "Workspace"
msgstr "Компютър" msgstr "Работен плот"
#: extensions/places-menu/placeDisplay.js:359 #: extensions/auto-move-windows/prefs.js:85
msgid "Home" msgid "Add Rule"
msgstr "Домашна папка" msgstr "Добавяне на правило"
#: extensions/places-menu/placeDisplay.js:404 #: extensions/auto-move-windows/prefs.js:106
msgid "Browse Network" msgid "Create new matching rule"
msgstr "Мрежа" msgstr "Създаване на правило за съвпадение"
#: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:7 #: extensions/auto-move-windows/prefs.js:111
msgid "Cycle Screenshot Sizes" msgid "Add"
msgstr "Смяна на размерите на снимката на екрана" msgstr "Добавяне"
#: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:11 #. TRANSLATORS: %s is the filesystem name
msgid "Cycle Screenshot Sizes Backward" #: extensions/drive-menu/extension.js:107
msgstr "Смяна на размерите на снимката на екрана наобратно" #, javascript-format
msgid "Ejecting drive “%s” failed:"
#: extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml:5 msgstr "Неуспешно изваждане на устройство „%s“:"
msgid "Theme name"
msgstr "Име на темата" #: extensions/drive-menu/extension.js:125
msgid "Removable devices"
#: extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml:6 msgstr "Преносими медии"
msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell"
msgstr "" #: extensions/drive-menu/extension.js:150
"Името на темата, която да бъде заредена от „~/.themes/name/gnome-shell“" msgid "Open Files"
msgstr "Отваряне на файлове"
#: extensions/window-list/extension.js:98
msgid "Close" #: extensions/example/extension.js:17
msgstr "Затваряне" msgid "Hello, world!"
msgstr "Здравей, свят!"
#: extensions/window-list/extension.js:118
msgid "Unminimize" #: extensions/example/org.gnome.shell.extensions.example.gschema.xml:5
msgstr "Деминимизиране" msgid "Alternative greeting text."
msgstr "Друго приветстващо съобщение."
#: extensions/window-list/extension.js:118
msgid "Minimize" #: extensions/example/org.gnome.shell.extensions.example.gschema.xml:6
msgstr "Минимизиране" msgid ""
"If not empty, it contains the text that will be shown when clicking on the "
#: extensions/window-list/extension.js:125 "panel."
msgid "Unmaximize" msgstr ""
msgstr "Демаксимизиране" "Ако ключът не е празен, съдържанието му се извежда при натискането на панела."
#: extensions/window-list/extension.js:125 #: extensions/example/prefs.js:30
msgid "Maximize" msgid "Message"
msgstr "Максимизиране" msgstr "Съобщение"
#: extensions/window-list/extension.js:432 #. TRANSLATORS: Example is the name of the extension, should not be
msgid "Minimize all" #. translated
msgstr "Минимизиране на всички" #: extensions/example/prefs.js:43
msgid ""
#: extensions/window-list/extension.js:438 "Example aims to show how to build well behaved extensions for the Shell and "
msgid "Unminimize all" "as such it has little functionality on its own.\n"
msgstr "Деминимизиране на всички" "Nevertheless its possible to customize the greeting message."
msgstr ""
#: extensions/window-list/extension.js:444 "Това е пример за добре работещо разширение на обвивката на GNOME и има "
msgid "Maximize all" "минимална функционалност.\n"
msgstr "Максимизиране на всички" "С него можете да промените приветстващото съобщение на панела."
#: extensions/window-list/extension.js:452 #: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:5
msgid "Unmaximize all" msgid "Use more screen for windows"
msgstr "Демаксимизиране на всички" msgstr "Повече пространство за прозорците"
#: extensions/window-list/extension.js:460 #: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:6
msgid "Close all" msgid ""
msgstr "Затваряне на всички" "Try to use more screen for placing window thumbnails by adapting to screen "
"aspect ratio, and consolidating them further to reduce the bounding box. "
#: extensions/window-list/extension.js:737 "This setting applies only with the natural placement strategy."
msgid "Window List" msgstr ""
msgstr "Списък на прозорците" "Използване на по-голяма част от екрана за поставянето на мини изображения "
"чрез промяна на съотношението на страните и допълнително обединяване за "
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:12 "смаляване на обхващащия ги правоъгълник. Тази настройка се прилага само при "
msgid "When to group windows" "естествената стратегия за поставяне на прозорците."
msgstr "Кога прозорците да се групират"
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:11
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:13 msgid "Place window captions on top"
msgid "" msgstr "Заглавия на прозорците отгоре"
"Decides when to group windows from the same application on the window list. "
"Possible values are “never”, “auto” and “always”." #: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:12
msgstr "" msgid ""
"Кога прозорците на една програма да се групират в списъка с прозорците. " "If true, place window captions on top the respective thumbnail, overriding "
"Възможните стойности са „never“ (никога), „auto“ (автоматично) и " "shell default of placing it at the bottom. Changing this setting requires "
"„always“ (винаги)." "restarting the shell to have any effect."
msgstr ""
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20 "Ако е истина, заглавията на прозорците се поставят над мини изображенията "
#: extensions/window-list/prefs.js:100 "им, а не както е стандартно — отдолу. За прилагане на промяната на "
msgid "Show windows from all workspaces" "настройката трябва да рестартирате обвивката на GNOME."
msgstr "Да се показват прозорците от всички работни плотове"
#: extensions/places-menu/extension.js:78
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:21 #: extensions/places-menu/extension.js:81
msgid "Whether to show windows from all workspaces or only the current one." msgid "Places"
msgstr "" msgstr "Места"
"Дали да се показват прозорците от всички работни плотове или само от текущия."
#: extensions/places-menu/placeDisplay.js:65
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:27 #, javascript-format
msgid "Show the window list on all monitors" msgid "Failed to mount volume for “%s”"
msgstr "Извеждане на списъка с прозорци на всички монитори" msgstr "Неуспешно монтиране на тома „%s“"
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:28 #: extensions/places-menu/placeDisplay.js:78
msgid "" #, javascript-format
"Whether to show the window list on all connected monitors or only on the " msgid "Failed to launch “%s”"
"primary one." msgstr "Неуспешно стартиране на „%s“"
msgstr ""
"Дали списъкът с прозорци да се извежда на всички монитори или само на " #: extensions/places-menu/placeDisplay.js:137
"основния" #: extensions/places-menu/placeDisplay.js:160
msgid "Computer"
#: extensions/window-list/prefs.js:29 msgstr "Компютър"
msgid "Window Grouping"
msgstr "Групиране на прозорци" #: extensions/places-menu/placeDisplay.js:303
msgid "Home"
#: extensions/window-list/prefs.js:58 msgstr "Домашна папка"
msgid "Never group windows"
msgstr "Никога да не се групират" #: extensions/places-menu/placeDisplay.js:347
msgid "Browse Network"
#: extensions/window-list/prefs.js:59 msgstr "Мрежа"
msgid "Group windows when space is limited"
msgstr "Групиране при ограничено място" #: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:7
msgid "Cycle Screenshot Sizes"
#: extensions/window-list/prefs.js:60 msgstr "Смяна на размерите на снимката на екрана"
msgid "Always group windows"
msgstr "Винаги да се групират" #: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:11
msgid "Cycle Screenshot Sizes Backward"
#: extensions/window-list/prefs.js:94 msgstr "Смяна на размерите на снимката на екрана наобратно"
msgid "Show on all monitors"
msgstr "На всички монитори" #: extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml:5
msgid "Theme name"
#: extensions/window-list/workspaceIndicator.js:249 msgstr "Име на темата"
#: extensions/workspace-indicator/extension.js:255
msgid "Workspace Indicator" #: extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml:6
msgstr "Индикатор на работните плотове" msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell"
msgstr ""
#: extensions/workspace-indicator/prefs.js:34 "Името на темата, която да бъде заредена от „~/.themes/name/gnome-shell“"
msgid "Workspace Names"
msgstr "Имена на работните плотове" #: extensions/window-list/extension.js:110
msgid "Close"
#: extensions/workspace-indicator/prefs.js:67 msgstr "Затваряне"
#, javascript-format
msgid "Workspace %d" #: extensions/window-list/extension.js:129
msgstr "Работен плот %d" msgid "Unminimize"
msgstr "Деминимизиране"
#: extensions/workspace-indicator/prefs.js:208
msgid "Add Workspace" #: extensions/window-list/extension.js:130
msgstr "Добавяне на работен плот" msgid "Minimize"
msgstr "Минимизиране"
#: extensions/window-list/extension.js:136
msgid "Unmaximize"
msgstr "Демаксимизиране"
#: extensions/window-list/extension.js:137
msgid "Maximize"
msgstr "Максимизиране"
#: extensions/window-list/extension.js:420
msgid "Minimize all"
msgstr "Минимизиране на всички"
#: extensions/window-list/extension.js:428
msgid "Unminimize all"
msgstr "Деминимизиране на всички"
#: extensions/window-list/extension.js:436
msgid "Maximize all"
msgstr "Максимизиране на всички"
#: extensions/window-list/extension.js:445
msgid "Unmaximize all"
msgstr "Демаксимизиране на всички"
#: extensions/window-list/extension.js:454
msgid "Close all"
msgstr "Затваряне на всички"
#: extensions/window-list/extension.js:678
#: extensions/workspace-indicator/extension.js:30
msgid "Workspace Indicator"
msgstr "Индикатор на работните плотове"
#: extensions/window-list/extension.js:842
msgid "Window List"
msgstr "Списък на прозорците"
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:12
msgid "When to group windows"
msgstr "Кога да се групират прозорците"
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:13
msgid ""
"Decides when to group windows from the same application on the window list. "
"Possible values are “never”, “auto” and “always”."
msgstr ""
"Кога да се групират прозорците на една програма в списъка с прозорците. "
"Възможните стойности са „never“ (никога), „auto“ (автоматично) и "
"„always“ (винаги)."
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20
msgid "Show the window list on all monitors"
msgstr "Извеждане на списъка с прозорци на всички монитори"
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:21
msgid ""
"Whether to show the window list on all connected monitors or only on the "
"primary one."
msgstr ""
"Дали списъкът с прозорци да се извежда на всички монитори или само на "
"основния"
#: extensions/window-list/prefs.js:32
msgid "Window Grouping"
msgstr "Групиране на прозорци"
#: extensions/window-list/prefs.js:50
msgid "Never group windows"
msgstr "Никога да не се групират"
#: extensions/window-list/prefs.js:51
msgid "Group windows when space is limited"
msgstr "Групиране при ограничено място"
#: extensions/window-list/prefs.js:52
msgid "Always group windows"
msgstr "Винаги да се групират"
#: extensions/window-list/prefs.js:75
msgid "Show on all monitors"
msgstr "На всички монитори"
#: extensions/workspace-indicator/prefs.js:141
msgid "Workspace Names"
msgstr "Имена на работните плотове"
#: extensions/workspace-indicator/prefs.js:157
msgid "Name"
msgstr "Име"
#: extensions/workspace-indicator/prefs.js:198
#, javascript-format
msgid "Workspace %d"
msgstr "Работен плот %d"