Compare commits

..

44 Commits

Author SHA1 Message Date
Florian Müllner
fa5c4bade1 Bump version to 47.4
Update NEWS.
2025-02-05 00:40:33 +01:00
Florian Müllner
a7d4d8df80 window-list: Use correct params when re-tracking chrome
Since commit 981e8e42, we temporarily untrack the window-list actor
while in the overview.

However as we don't pass pass the chrome parameters when re-tracking
chrome, the window-list no longer contributes to struts or tracks
fullscreen changes, whoops.

Make sure to pass the original parameters when re-tracking chrome
to restore the expected behavior.

Fixes: 981e8e42 ("window-list: Untrack chrome while in overview")
Closes: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/issues/550
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/379>
(cherry picked from commit 01f7df1e8a)
2025-01-16 12:09:05 +01:00
Florian Müllner
791682e836 ci: Switch ci-templates to master
The alternative is to monitor the upstream repository and update
the references when necessary. I don't have the resources to do
that, so trust upstream to not mess up their development branch.

(cherry picked from commit 4e50e9f8dc)

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/376>
2025-01-13 16:29:57 +01:00
Florian Müllner
c815e506dd Bump version to 47.3
Update NEWS.
2025-01-12 21:59:15 +01:00
Florian Müllner
176206a38c places-menu: Remove left-over modeline
This one slipped through commit 253ddb864 ...

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/370>
(cherry picked from commit 83c41bad30)
2025-01-12 20:53:59 +00:00
Bartłomiej Piotrowski
72b2534790 ci: Switch to GNOME GitLab mirror of ci-templates
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/368>
(cherry picked from commit 0f69d7663b)
2025-01-12 20:53:59 +00:00
Florian Müllner
28ac6906c2 ci: Adapt to updated release module template
The release module moved into production now. The process changed
slightly with regard to the testing period, so we will have to
adapt the existing job a bit.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/367>
(cherry picked from commit 5d8d3601b4)
2025-01-12 20:53:59 +00:00
Florian Müllner
e30f634d08 ci: Move LINT_LOG variable out of global section
It is only used by the eslint job, so better define it there.

While at it, make sure the variable is quoted as that's considered
good practice (even when safe to use unquoted as in this case).

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/367>
(cherry picked from commit ea77b557e5)
2025-01-12 20:53:59 +00:00
Florian Müllner
aed90a3f6c ci: Use variable for meson build directory
This ensures that the value is consistent between jobs.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/367>
(cherry picked from commit 9f48149346)
2025-01-12 20:53:59 +00:00
Florian Müllner
7054010520 Revert "ci: Use meson introspect to generate artifact path"
The new release service that now moved into production expects
the tag to match the release version.

Instead of using the $VERSION-real pattern in case of error,
switch to a pre-push hook to hopefully prevent those errors
in the first place:

  https://gitlab.gnome.org/-/snippets/6710

This reverts commit 8c014a6b1d.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/367>
(cherry picked from commit 0d1b279a64)
2025-01-12 20:53:59 +00:00
Florian Müllner
cc3e2842a8 ci: Bump js image
gnome-shell switched to F41 for its JS image, follow suit.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/365>
(cherry picked from commit b30871d105)
2025-01-12 20:53:59 +00:00
Florian Müllner
f6d4e44ee4 workspace-indicator: Do not only exclude DESKTOP windows
There are other window types that should be excluded from workspace
previews, including more common ones like menus. Instead of checking
for a variety of window types, delegate the decision to mutter by
checking for the `skip-taskbar` property.

(The internal `skip-pager` property would be more apt in this case,
but as it only differs from `skip-taskbar` for X11 clients that
explicitly set one and not the other, it shouldn't matter in practice)

Closes: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/issues/537
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/363>
(cherry picked from commit 77a11fd9cd)
2025-01-12 20:53:59 +00:00
Florian Müllner
bcf0be86af window-list: Untrack chrome while in overview
The window list is set up to track the monitor's fullscreen state.
Monitors are never considered in fullscreen while showing the overview,
so if shell's layout manager updates the fullscreen visibility after
we hid the bottom bar, it ends up being visible in the overview.

To avoid this, untrack the actor while the overview is visible.

Closes: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/issues/509
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/364>
(cherry picked from commit 981e8e42e2)
2025-01-12 20:53:59 +00:00
Florian Müllner
fb86b18cf1 window-list: Fix disconnecting window signals in context menu
Menus are not actors themselves, so they are not "destroyables" in
terms of automatic signal disconnection, with the result that we
currently leak window signals.

Fix this by using the menu's actor as tracked object, so the signals
are disconnected automatically when the actor is destroyed.

Closes: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/issues/474
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/362>
(cherry picked from commit 4a841dfd49)
2025-01-12 20:53:59 +00:00
Florian Müllner
6400be4a6c places-menu: Update fake mount operation source
gnome-shell now checks for an associated drive to automatically
cancel the operation on disconnect, so fake the corresponding
method. While at it, drop the `get_icon()` method that hasn't
been used for quite a while now.

Closes: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/issues/508
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/361>
(cherry picked from commit 8957f488dc)
2025-01-12 20:53:59 +00:00
Florian Müllner
b1f727fa34 places-menu: Catch errors during async operation
Uncaught errors in async functions don't provide a good stack, because
the unhandled promise rejection masks the error that triggered it.

While we already handle *expected* errors inside the function, make
sure we catch all errors to get useful stack information for unexpected
errors as well.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/361>
(cherry picked from commit e0b68a319e)
2025-01-12 20:53:59 +00:00
Yi-Jyun Pan
97d0a0e514 Update Chinese (Taiwan) translation 2025-01-12 15:59:38 +00:00
Florian Müllner
70e2a02e69 Bump version to 47.2
Update NEWS.
2024-11-25 16:14:41 +01:00
Florian Müllner
079daac9bb screenshot-window-sizer: Mention shortcut in description
Loosely based on the README entry, so users know how to actually use the
extension.

Closes: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/issues/541
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/358>
2024-11-25 15:43:54 +01:00
Florian Müllner
99d49c1800 places-menu: Inherit from PopupImageMenuItem
PopupImageMenuItems used to position the icon after the label,
so we ended up with our own icon+label items.

However the icon position was changed years ago in the shell, so
inherit from PopupImageMenuItem instead.

This does not only simplify the code a bit, but also pulls in
features we are currently missing, like a11y labelling.

Closes: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/issues/542
(cherry picked from commit 568826e489)
2024-11-25 14:19:07 +01:00
Florian Müllner
95c4bc5d87 build: Sync check-version script with gnome-shell
The script was updated to not require appstream-util to check for
a corresponding release element in metainfo.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/354>
(cherry picked from commit 1218aee87f)
2024-11-25 14:18:56 +01:00
Florian Müllner
451a12d1fd cleanup: Use consistent line break style in meson.build
Either have all arguments on the same line, or have a separate
line for every argument (that is, don't special-case the first
arg).

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/353>
(cherry picked from commit 265935e14b)
2024-11-25 14:18:35 +01:00
Florian Müllner
48b917ab86 cleanup: Fix indent errors in meson.build
We are supposed to use a 2-space indent, but some inconsistencies
sneaked in over time.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/353>
(cherry picked from commit b903618050)
2024-11-25 14:18:00 +01:00
Florian Müllner
d273dc4e59 cleanup: Always use dangling commas in meson.build
This is meson's default formatting, and matches what we already
do in JS.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/353>
(cherry picked from commit 720933b08e)
2024-11-25 14:17:53 +01:00
Florian Müllner
683080441f cleanup: Use format strings in meson.build
Those are a bit more concise than ''.format(), and have been
in meson for a long time.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/353>
(cherry picked from commit 85ee8829bf)
2024-11-25 14:17:45 +01:00
Florian Müllner
5bbf7f5c6c build: Use SPDX identifier for license
Meson strongly recommends to use SPDX identifiers for the license
string, and there's no reason for us to not do so.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/353>
(cherry picked from commit 6df4905286)
2024-11-25 14:17:35 +01:00
Florian Müllner
f30990535f extensions: Remove modelines
We already include an .editorconfig that is supported by many
editors, including emacs, so no need to repeat an emacs-specific
modeline in every source file.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/353>
(cherry picked from commit 253ddb8642)
2024-11-25 14:17:25 +01:00
Florian Müllner
d14885f96d Add .editorconfig
This should ensure that all editors which support
https://editorconfig.org/ use the correct indentation
with spaces (not tabs) by default.

This is hardly a full specification of our coding style,
but it's a correct subset and better than nothing.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/353>
(cherry picked from commit 0ca156a2b6)
2024-11-25 14:15:52 +01:00
Марко Костић
0a153b78f9 Update Serbian translation 2024-11-04 07:15:02 +00:00
Nathan Follens
598007f994 Update Dutch translation 2024-10-27 22:37:35 +00:00
Fabio Tomat
06caed8c0c Update Friulian translation 2024-10-20 20:01:51 +00:00
Florian Müllner
9991f90804 Bump version to 47.1
Update NEWS.
2024-10-18 21:54:13 +02:00
Florian Müllner
0bc77ef7c9 build: Rename meson_options.txt to meson.options
The name is a bit cleaner, and has been the preferred option(!)
since meson 1.1.

Mutter recently updated the name, so follow suite.

The meson version bump shouldn't be an issue, given that several
hard dependencies like mutter and glib already require higher
versions.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/349>
(cherry picked from commit 1088435120)
2024-10-18 19:15:44 +02:00
Florian Müllner
099b2eeb49 cleanup: Use null for nick/blurb in ParamSpecs
As they are only used by gstreamer for gst-inspect & other tools.
Projects like mutter and gtk have already completely dropped them,
so follow their lead.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/347>
(cherry picked from commit 46a4fa0976)
2024-10-18 19:15:02 +02:00
Florian Müllner
b13984a752 export-zips: Use --destdir instead of custom prefix
meson skips some steps like schema compilation when DESTDIR is
set, so this is slightly more efficient.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/345>
(cherry picked from commit 8f75ccae34)
2024-10-17 20:59:07 +02:00
Florian Müllner
67cdd0bea2 window-list: Remove outdated style
A long time ago, the window list used to embed the bottom message
tray, which caused notifications to inherit the window-list's
font style.

Since that's no longer the case, we have no business in messing
with notification styling, so stop doing that.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/338>
(cherry picked from commit f1671bc206)
2024-10-17 20:56:38 +02:00
Florian Müllner
87a849c5af window-list: Switch to Adw.SwitchRow
libadwaita fixed the actionable implementation of Adw.SwitchRow,
so can use the convenience widget instead of composing our own.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/341>
(cherry picked from commit 548d7659e1)
2024-10-17 20:56:26 +02:00
Florian Müllner
f0bff952be window-list: Remove superfluous bindings
The setting is already bound to the switch via the corresponding action,
no need to also set up a binding.

In fact, the second binding is actively harmful, as it keeps the
connection alive until dispose, so the setting is reset on
garbage collection.

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

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/341>
(cherry picked from commit 0162644041)
2024-10-17 20:56:18 +02:00
Florian Müllner
b3ff771a1d window-list: Add missing action
Commit 24ba03fe9 added a new setting, but forgot to create the
corresponding action.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/341>
(cherry picked from commit 062a3d21ab)
2024-10-17 20:56:09 +02:00
Florian Müllner
3ef718d34c window-list: Fix active state
Commit c72b8b21 fixed the styling of the active window's button,
but missed that the `active` property uses the style information
as well.

Adjust it to use the correct actor when checking for the style class.

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

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/342>
(cherry picked from commit a5a92026ac)
2024-10-17 20:55:59 +02:00
Florian Müllner
fb2d87c1da window-list: Fix minimized styling
Commit 039c66e7b7 wrapped the button in a container to
animate transitions, but didn't adjust the `.minimized`
styling to still apply to the button (where it is
expected) rather than the wrapper.

Fix this just like commit c72b8b21 did for the
`.focused` styling.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/342>
(cherry picked from commit 28fd210f28)
2024-10-17 20:55:52 +02:00
Florian Müllner
6d3fbceec9 classic: Add missing top bar indicators
The only intended difference from the regular session is that the
date menu moves to the right. However in the meantime, gnome-shell
added a couple more (usually hidden) indicators, but we never
updated the session mode definition.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/339>
(cherry picked from commit 81aade6659)
2024-10-17 20:55:43 +02:00
Florian Müllner
4da312040b window-list: Don't recreate icons on theme changes
All icons use `StIcon`, which already updates itself correctly
on icon theme changes.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/337>
(cherry picked from commit d43abe0869)
2024-10-17 20:55:22 +02:00
Florian Müllner
89276cc184 window-list: Small stylesheet cleanup
The light stylesheet duplicates some declarations, and the
last occurrence matches what we already inherit from the
dark stylesheet.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/337>
(cherry picked from commit 860c56f83e)
2024-10-17 20:55:07 +02:00
29 changed files with 954 additions and 1725 deletions

View File

@@ -1,72 +0,0 @@
<!--
Please read https://handbook.gnome.org/issues/reporting.html
first to ensure that you create a clear and specific issue.
-->
### Which extension
<!--
Which extension is the issue about?
See the project README for a complete list of extensions:
https://gitlab.gnome.org/GNOME/gnome-shell-extensions#extensions
Do not report issues for any other extensions here.
Report general issues about gnome-shell's extension support to
https://gitlab.gnome.org/GNOME/gnome-shell.
Report issues with the extensions.gnome.org website to
https://gitlab.gnome.org/Infrastructure/extensions-web/
-->
### Affected version
<!--
Provide at least the following information:
* Your OS and version
* Extension version
* Affected GNOME Shell version
-->
### Bug summary
<!--
Provide a short summary of the bug you encountered.
-->
### Steps to reproduce
<!--
1. Step one
2. Step two
3. ...
-->
### What happened
<!--
What did the extension do that was unexpected?
-->
### What did you expect to happen
<!--
What did you expect the extension to do?
-->
### Relevant logs, screenshots, screencasts etc.
<!--
If you have further information, such as technical documentation, logs,
screenshots or screencasts related, please provide them here.
If the bug is a crash, please obtain a stack trace with installed debug
symbols (at least for GNOME Shell and Mutter) and attach it to
this issue following the instructions on
https://handbook.gnome.org/issues/stack-traces.html.
-->
<!-- Do not remove the following line. -->
/label ~"1. Bug"

View File

@@ -1,2 +0,0 @@
SPDX-FileCopyrightText: 2024 Florian Müllner <fmuellner@gnome.org>
SPDX-License-Identifier: CC-BY-SA-4.0

View File

@@ -1,47 +0,0 @@
<!--
Please read https://handbook.gnome.org/issues/reporting.html
first to ensure that you create a clear and specific issue.
-->
### Which extension
<!--
Which extension is the issue about?
See the project README for a complete list of extensions:
https://gitlab.gnome.org/GNOME/gnome-shell-extensions#extensions
Do not report issues for any other extensions here.
Report general issues about gnome-shell's extension support to
https://gitlab.gnome.org/GNOME/gnome-shell.
Report issues with the extensions.gnome.org website to
https://gitlab.gnome.org/Infrastructure/extensions-web/
-->
### Feature summary
<!--
Describe what you would like to be able to do with the extension
that you currently cannot do.
-->
### How would you like it to work
<!--
If you can think of a way the extension might be able to do this,
let us know here.
-->
### Relevant links, screenshots, screencasts etc.
<!--
If you have further information, such as technical documentation,
code, mockups or a similar feature in another desktop environments,
please provide them here.
-->
<!-- Do not remove the following line. -->
/label ~"1. Feature"

View File

@@ -1,3 +0,0 @@
SPDX-FileCopyrightText: 2024 Florian Müllner <fmuellner@gnome.org>
SPDX-License-Identifier: CC-BY-SA-4.0

22
.reuse/dep5 Normal file
View File

@@ -0,0 +1,22 @@
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: gnome-shell-extensions
Upstream-Contact: Florian Müllner <fmuellner@gnome.org>
Source: https://gitlab.gnome.org/GNOME/gnome-shell-extensions
Files: NEWS README.md HACKING.md data/HACKING
Copyright: No rights reserved
License: CC0-1.0
Files: *.json.in *.desktop.in *.gschema.override
Copyright: Florian Müllner <fmuellner@gnome.org>
License: GPL-2.0-or-later
# managed by translation teams
Files: po/*.po
Copyright: GNOME Translation Teams <i18n@gnome.org>
License: GPL-2.0-or-later
# managed by translation teams
Files: po/LINGUAS po/POTFILES.in
Copyright: No rights reserved
License: CC0-1.0

View File

@@ -1,9 +1,3 @@
<!--
SPDX-FileCopyrightText: 2011 Giovanni Campagna <gcampagna@src.gnome.org>
SPDX-FileCopyrightText: 2017 Florian Müllner <fmuellner@gnome.org>"""
SPDX-License-Identifier: CC-BY-SA-4.0
-->
## Creating a New Extension
To create a new extension, add a subdirectory in extensions. Then create

View File

@@ -1,170 +0,0 @@
Creative Commons Attribution-ShareAlike 4.0 International
Creative Commons Corporation (“Creative Commons”) is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an “as-is” basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible.
Using Creative Commons Public Licenses
Creative Commons public licenses provide a standard set of terms and conditions that creators and other rights holders may use to share original works of authorship and other material subject to copyright and certain other rights specified in the public license below. The following considerations are for informational purposes only, are not exhaustive, and do not form part of our licenses.
Considerations for licensors: Our public licenses are intended for use by those authorized to give the public permission to use material in ways otherwise restricted by copyright and certain other rights. Our licenses are irrevocable. Licensors should read and understand the terms and conditions of the license they choose before applying it. Licensors should also secure all rights necessary before applying our licenses so that the public can reuse the material as expected. Licensors should clearly mark any material not subject to the license. This includes other CC-licensed material, or material used under an exception or limitation to copyright. More considerations for licensors.
Considerations for the public: By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensors permission is not necessary for any reasonfor example, because of any applicable exception or limitation to copyrightthen that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described.
Although not required by our licenses, you are encouraged to respect those requests where reasonable. More considerations for the public.
Creative Commons Attribution-ShareAlike 4.0 International Public License
By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-ShareAlike 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions.
Section 1 Definitions.
a. Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image.
b. Adapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License.
c. BY-SA Compatible License means a license listed at creativecommons.org/compatiblelicenses, approved by Creative Commons as essentially the equivalent of this Public License.
d. Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights.
e. Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements.
f. Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material.
g. License Elements means the license attributes listed in the name of a Creative Commons Public License. The License Elements of this Public License are Attribution and ShareAlike.
h. Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License.
i. Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license.
j. Licensor means the individual(s) or entity(ies) granting rights under this Public License.
k. Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them.
l. Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world.
m. You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning.
Section 2 Scope.
a. License grant.
1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to:
A. reproduce and Share the Licensed Material, in whole or in part; and
B. produce, reproduce, and Share Adapted Material.
2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions.
3. Term. The term of this Public License is specified in Section 6(a).
4. Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material.
5. Downstream recipients.
A. Offer from the Licensor Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License.
B. Additional offer from the Licensor Adapted Material. Every recipient of Adapted Material from You automatically receives an offer from the Licensor to exercise the Licensed Rights in the Adapted Material under the conditions of the Adapters License You apply.
C. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material.
6. No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i).
b. Other rights.
1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise.
2. Patent and trademark rights are not licensed under this Public License.
3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties.
Section 3 License Conditions.
Your exercise of the Licensed Rights is expressly made subject to the following conditions.
a. Attribution.
1. If You Share the Licensed Material (including in modified form), You must:
A. retain the following if it is supplied by the Licensor with the Licensed Material:
i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated);
ii. a copyright notice;
iii. a notice that refers to this Public License;
iv. a notice that refers to the disclaimer of warranties;
v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable;
B. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and
C. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License.
2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information.
3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable.
b. ShareAlike.In addition to the conditions in Section 3(a), if You Share Adapted Material You produce, the following conditions also apply.
1. The Adapters License You apply must be a Creative Commons license with the same License Elements, this version or later, or a BY-SA Compatible License.
2. You must include the text of, or the URI or hyperlink to, the Adapter's License You apply. You may satisfy this condition in any reasonable manner based on the medium, means, and context in which You Share Adapted Material.
3. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, Adapted Material that restrict exercise of the rights granted under the Adapter's License You apply.
Section 4 Sui Generis Database Rights.
Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material:
a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database;
b. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material, including for purposes of Section 3(b); and
c. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database.
For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights.
Section 5 Disclaimer of Warranties and Limitation of Liability.
a. Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You.
b. To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You.
c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability.
Section 6 Term and Termination.
a. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically.
b. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates:
1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or
2. upon express reinstatement by the Licensor.
c. For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License.
d. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License.
e. Sections 1, 5, 6, 7, and 8 survive termination of this Public License.
Section 7 Other Terms and Conditions.
a. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed.
b. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License.
Section 8 Interpretation.
a. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License.
b. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions.
c. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor.
d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority.
Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the “Licensor.” Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at creativecommons.org/policies, Creative Commons does not authorize the use of the trademark “Creative Commons” or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses.
Creative Commons may be contacted at creativecommons.org.

52
NEWS
View File

@@ -1,26 +1,46 @@
48.alpha
========
* classic: Add missing top-bar indicators [Florian; !339]
* window-list: Fix window state styling [Florian; !342]
* window-list: Fix "ignore-workspace" setting getting reset [Florian; !341]
* window-list: Allow rearranging window buttons [Florian, Jakub; !338]
* window-list: Add workspaces page to preference dialog [Florian; !344]
* places-menu: Sync list of places with nautilus [Florian; !340]
* places-menu: Fix a11y labelling [Florian; #542]
47.4
====
* window-list: Fix regression in chrome tracking [Florian; !379]
* Misc. bug fixes and cleanups [Florian; !376]
Contributors:
Florian Müllner
47.3
====
* places-menu: Fix opening drives with mount operations [Florian; !361]
* window-list: Fix hiding when entering overview with gestures [Florian; !364]
* workspace-indicator: Only show previews of regular windows [Florian; !363]
* window-list: Add attention indicator [Florian; !366]
* Misc. bug fixes and cleanups [Florian, Bartłomiej; !337, !343, !345, !347,
!348, !349, !351, !352, !353, !354, !358, !362, !365, !367, !368, !370, !375]
* Misc. bug fixes and cleanups [Florian, Bartłomiej; !362, !365, !367,
!368, !370]
Contributors:
Florian Müllner, Bartłomiej Piotrowski, Jakub Steiner
Florian Müllner, Bartłomiej Piotrowski
Translators:
Fabio Tomat [fur], Martin [sl], Jordi Mas i Hernandez [ca], Vasil Pupkin [be],
Nathan Follens [nl], Artur S0 [ru], Марко Костић [sr],
Yaron Shahrabani [he], Sabri Ünal [tr], Yi-Jyun Pan [zh_TW]
Yi-Jyun Pan [zh_TW]
47.2
====
* places-menu: Fix a11y labelling [Florian; #542]
* screenshot-window-sizer: Mention shortcut in description [Florian; !358]
* Misc. bug fixes and cleanups [Florian; !353, !354]
Contributors:
Florian Müllner
Translators:
Fabio Tomat [fur], Nathan Follens [nl], Марко Костић [sr]
47.1
====
* classic: Add missing top-bar indicators [Florian; !339]
* window-list: Fix window state styling [Florian; !342]
* window-list: Fix "ignore-workspace" setting getting reset [Florian; !341]
* Misc. bug fixes and cleanups [Florian; !337, !338, !345, !347, !349]
Contributors:
Florian Müllner
47.0
====

108
README.md
View File

@@ -1,34 +1,25 @@
<!--
SPDX-FileCopyrightText: 2011 Giovanni Campagna <gcampagna@src.gnome.org>
SPDX-FileCopyrightText: 2011 Adam Dingle <adam@yorba.org>
SPDX-FileCopyrightText: 2011 Vamsi Krishna Brahmajosyula <vamsikrishna.brahmajosyula@gmail.com>
SPDX-FileCopyrightText: 2014 Michael Catanzaro <mcatanzaro@gnome.org>
SPDX-FileCopyrightText: 2015 Florian Müllner <fmuellner@gnome.org>
SPDX-FileCopyrightText: 2019 Fabian P. Schmidt <kerel-fs@gmx.de>
SPDX-FileCopyrightText: 2024 Aral Balkan <aral@aralbalkan.com>"""
SPDX-License-Identifier: CC-BY-SA-4.0
-->
# GNOME Shell Extensions
GNOME Shell Extensions is a collection of extensions providing additional
and optional functionality to GNOME Shell.
The extensions in this package are supported by GNOME and will be updated
to reflect future API changes in GNOME Shell.
Since GNOME Shell is not API stable, extensions work only against a very
specific version of the shell, usually the same as this package (see
"configure --version"). The extensions in this package are supported by GNOME
and will be updated to reflect future API changes in GNOME Shell.
Both the most recent stable release and the previous stable release of
GNOME Shell are actively supported, as well as the current development
branch.
The GNOME wiki has more information about [GNOME Shell Extensions][project-page],
as well as some general information about [GNOME Shell][shell-page].
Please refer to the [schedule] to see when a new version will be released.
[schedule]: https://release.gnome.org/calendar
Bugs should be reported to the GNOME [bug tracking system][bug-tracker].
## Extensions
The following is a complete list of extensions that are provided by this
project.
* alternate-tab (**OBSOLETE**)
Lets you use classic Alt+Tab (window-based instead of app-based) in GNOME Shell.
This extension is obsolete since GNOME 3.30, see [this blogpost][alternatetab-post]
for further details.
* apps-menu
@@ -37,7 +28,8 @@ project.
* auto-move-windows
Lets you manage your workspaces more easily, assigning a specific workspace to
each application as soon as it creates a window.
each application as soon as it creates a window, in a manner configurable with a
GSettings key.
* drive-menu
@@ -48,11 +40,6 @@ project.
Changes application icons to always launch a new instance when activated.
* light-style
Changes the default shell style to "light", while still following the
system-wide "dark" preference.
* native-window-placement
An alternative algorithm for layouting the thumbnails in the windows overview, that
@@ -66,17 +53,9 @@ project.
Adds a shortcut for resizing the focus window to a size that is suitable for GNOME Software screenshots. Ctrl + Alt + s cycles forwards through the available sizes and Ctrl + Alt + Shift + s cycles backwards.
* status-icons
Show (XEmbed) status icons in the top bar.
* system-monitor
Shows system usage information in the top bar.
* user-theme
Loads a shell theme from `$XDG_DATA_HOME/themes/<name>/gnome-shell`.
Loads a shell theme from ~/.themes/<name>/gnome-shell.
* window-list
@@ -90,49 +69,18 @@ project.
Adds a simple workspace switcher to the top bar.
### Ex-Extensions
## Default branch
Occasionally over the years, some extensions were removed.
The following list is not complete, but limited to cases that
are notable for some reason; either the removal happened
relatively recently, or the extension used to be particularly
popular in the past.
* alternate-tab
Lets you use classic Alt+Tab (window-based instead of app-based) in GNOME Shell.
This extension is obsolete since GNOME 3.30, see [this blogpost][alternatetab-post]
for further details.
[alternatetab-post]: https://blogs.gnome.org/fmuellner/2018/10/11/the-future-of-alternatetab-and-why-you-need-not-worry/
## Reporting bugs
Bugs should be reported to the [issue tracking system][bug-tracker].
The [GNOME handbook][bug-handbook] has useful information for creating
effective issue reports.
Please note that the issue tracker is meant to be used for
actionable issues only.
For support questions, feedback on changes or general discussions,
you can use:
- the [#gnome-shell matrix room][matrix-room]
- the `Desktop` category or `extensions` and `shell` tags on [GNOME Discourse][discourse]
[bug-tracker]: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/issues
[bug-handbook]: https://handbook.gnome.org/issues/reporting.html
[matrix-room]: https://matrix.to/#/#gnome-shell:gnome.org
[discourse]: https://discourse.gnome.org
## Code of Conduct
All interactions with the project should follow the [Code of Conduct][conduct].
[conduct]: https://conduct.gnome.org/
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
@@ -141,4 +89,8 @@ Public License, version 2 or later. See the [COPYING file][license] for details.
Individual extensions may be licensed under different terms, see each source
file for details.
[project-page]: https://wiki.gnome.org/Projects/GnomeShell/Extensions
[shell-page]: https://wiki.gnome.org/Projects/GnomeShell
[bug-tracker]: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/issues
[license]: COPYING
[alternatetab-post]: https://blogs.gnome.org/fmuellner/2018/10/11/the-future-of-alternatetab-and-why-you-need-not-worry/

View File

@@ -1,31 +0,0 @@
# SPDX-FileCopyrightText: 2024 Florian Müllner <fmuellner@gnome.org>
# SPDX-License-Identifier: CC0-1.0
version = 1
SPDX-PackageName = "gnome-shell-extensions"
SPDX-PackageSupplier = "Florian Müllner <fmuellner@gnome.org>"
SPDX-PackageDownloadLocation = "https://gitlab.gnome.org/GNOME/gnome-shell-extensions"
[[annotations]]
path = "NEWS"
SPDX-FileCopyrightText = """
2011 Giovanni Campagna <gcampagna@src.gnome.org>
2013 Florian Müllner <fmuellner@gnome.org>"""
SPDX-License-Identifier = "CC-BY-SA-4.0"
[[annotations]]
path = ["**.json.in", "**.desktop.in", "**.gschema.override"]
SPDX-FileCopyrightText = "Florian Müllner <fmuellner@gnome.org>"
SPDX-License-Identifier = "GPL-2.0-or-later"
[[annotations]]
# managed by translation teams
path = "po/**.po"
SPDX-FileCopyrightText = "GNOME Translation Teams <i18n@gnome.org>"
SPDX-License-Identifier = "GPL-2.0-or-later"
[[annotations]]
# managed by translation teams
path = ["po/LINGUAS", "po/POTFILES.in"]
SPDX-FileCopyrightText = "No rights reserved"
SPDX-License-Identifier = "CC0-1.0"

2
data/HACKING Normal file
View File

@@ -0,0 +1,2 @@
To update the gnome-shell-sass submodule to latest upstream commit:
git submodule update --rebase

View File

@@ -23,6 +23,13 @@ Gio._promisify(Gio.File.prototype, 'mount_enclosing_volume');
const BACKGROUND_SCHEMA = 'org.gnome.desktop.background';
const Hostname1Iface = '<node> \
<interface name="org.freedesktop.hostname1"> \
<property name="PrettyHostname" type="s" access="read" /> \
</interface> \
</node>';
const Hostname1 = Gio.DBusProxy.makeProxyWrapper(Hostname1Iface);
class PlaceInfo extends EventEmitter {
constructor(...params) {
super();
@@ -122,20 +129,44 @@ class PlaceInfo extends EventEmitter {
}
}
class NautilusSpecialInfo extends PlaceInfo {
constructor(file, name, icon) {
super('special', file, name, icon);
class RootInfo extends PlaceInfo {
_init() {
super._init('devices', Gio.File.new_for_path('/'), _('Computer'));
const appSystem = Shell.AppSystem.get_default();
this._app = appSystem.lookup_app('org.gnome.Nautilus.desktop');
let busName = 'org.freedesktop.hostname1';
let objPath = '/org/freedesktop/hostname1';
new Hostname1(Gio.DBus.system, busName, objPath, (obj, error) => {
if (error)
return;
this._proxy = obj;
this._proxy.connectObject('g-properties-changed',
this._propertiesChanged.bind(this), this);
this._propertiesChanged(obj);
});
}
launch(timestamp) {
const launchContext = global.create_app_launch_context(timestamp, -1);
this._app.appInfo.launch([this.file], launchContext);
getIcon() {
return new Gio.ThemedIcon({name: 'drive-harddisk-symbolic'});
}
_propertiesChanged(proxy) {
// GDBusProxy will emit a g-properties-changed when hostname1 goes down
// ignore it
if (proxy.g_name_owner) {
this.name = proxy.PrettyHostname || _('Computer');
this.emit('changed');
}
}
destroy() {
this._proxy?.disconnectObject(this);
this._proxy = null;
super.destroy();
}
}
class PlaceDeviceInfo extends PlaceInfo {
_init(kind, mount) {
this._mount = mount;
@@ -214,6 +245,14 @@ class PlaceVolumeInfo extends PlaceInfo {
}
}
const DEFAULT_DIRECTORIES = [
GLib.UserDirectory.DIRECTORY_DOCUMENTS,
GLib.UserDirectory.DIRECTORY_PICTURES,
GLib.UserDirectory.DIRECTORY_MUSIC,
GLib.UserDirectory.DIRECTORY_DOWNLOAD,
GLib.UserDirectory.DIRECTORY_VIDEOS,
];
export class PlacesManager extends EventEmitter {
constructor() {
super();
@@ -228,12 +267,6 @@ export class PlacesManager extends EventEmitter {
this._settings = new Gio.Settings({schema_id: BACKGROUND_SCHEMA});
this._settings.connectObject('changed::show-desktop-icons',
() => this._updateSpecials(), this);
this._privacySettings = new Gio.Settings({
schema_id: 'org.gnome.desktop.privacy',
});
this._privacySettings.connectObject('changed::remember-recent-files',
() => this._updateSpecials(), this);
this._updateSpecials();
/*
@@ -279,9 +312,6 @@ export class PlacesManager extends EventEmitter {
this._settings?.disconnectObject(this);
this._settings = null;
this._privacySettings.disconnectObject(this);
this._privacySettings = null;
this._volumeMonitor.disconnectObject(this);
if (this._monitor)
@@ -290,68 +320,42 @@ export class PlacesManager extends EventEmitter {
GLib.source_remove(this._bookmarkTimeoutId);
}
_shouldShowRecent() {
const vfs = Gio.Vfs.get_default();
const schemes = vfs.get_supported_uri_schemes();
return this._privacySettings.get_boolean('remember-recent-files') &&
schemes.includes('recent');
}
_updateSpecials() {
this._places.special.forEach(p => p.destroy());
this._places.special = [];
const appSystem = Shell.AppSystem.get_default();
const nautilusApp = appSystem.lookup_app('org.gnome.Nautilus.desktop');
const defaultFm = Gio.AppInfo.get_default_for_type('inode/directory', true);
const showNautilusSpecials =
nautilusApp && defaultFm && nautilusApp.appInfo.equal(defaultFm);
const homeFile = Gio.File.new_for_path(GLib.get_home_dir());
let homePath = GLib.get_home_dir();
this._places.special.push(new PlaceInfo(
'special',
homeFile,
Gio.File.new_for_path(homePath),
_('Home')));
if (this._shouldShowRecent()) {
this._places.special.push(new PlaceInfo(
'special',
Gio.File.new_for_uri('recent:///'),
_('Recent')));
}
let specials = [];
let dirs = DEFAULT_DIRECTORIES.slice();
if (showNautilusSpecials) {
this._places.special.push(new NautilusSpecialInfo(
Gio.File.new_for_uri('starred:///'),
_('Starred'),
'starred-symbolic'));
}
if (this._settings.get_boolean('show-desktop-icons'))
dirs.push(GLib.UserDirectory.DIRECTORY_DESKTOP);
if (this._settings.get_boolean('show-desktop-icons')) {
const desktopPath = GLib.get_user_special_dir(
GLib.UserDirectory.DIRECTORY_DESKTOP);
const desktopFile = desktopPath
? Gio.File.new_for_path(desktopPath)
: null;
for (let i = 0; i < dirs.length; i++) {
let specialPath = GLib.get_user_special_dir(dirs[i]);
if (!specialPath || specialPath === homePath)
continue;
if (desktopFile && !desktopFile.equal(homeFile)) {
this._places.special.push(
new PlaceInfo('special', desktopFile));
let file = Gio.File.new_for_path(specialPath), info;
try {
info = new PlaceInfo('special', file);
} catch (e) {
if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND))
continue;
throw e;
}
specials.push(info);
}
if (showNautilusSpecials) {
this._places.special.push(new NautilusSpecialInfo(
Gio.File.new_for_uri('x-network-view:///'),
_('Network'),
'network-workgroup-symbolic'));
}
this._places.special.push(new PlaceInfo(
'special',
Gio.File.new_for_uri('trash:///'),
_('Trash')));
specials.sort((a, b) => GLib.utf8_collate(a.name, b.name));
this._places.special = this._places.special.concat(specials);
this.emit('special-updated');
}
@@ -365,6 +369,14 @@ export class PlacesManager extends EventEmitter {
this._places.network.forEach(p => p.destroy());
this._places.network = [];
/* Add standard places */
this._places.devices.push(new RootInfo());
this._places.network.push(new PlaceInfo(
'network',
Gio.File.new_for_uri('network:///'),
_('Browse Network'),
'network-workgroup-symbolic'));
/* first go through all connected drives */
let drives = this._volumeMonitor.get_connected_drives();
for (let i = 0; i < drives.length; i++) {
@@ -496,12 +508,30 @@ export class PlacesManager extends EventEmitter {
}
_addMount(kind, mount) {
const devItem = new PlaceDeviceInfo(kind, mount);
let devItem;
try {
devItem = new PlaceDeviceInfo(kind, mount);
} catch (e) {
if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND))
return;
throw e;
}
this._places[kind].push(devItem);
}
_addVolume(kind, volume) {
const volItem = new PlaceVolumeInfo(kind, volume);
let volItem;
try {
volItem = new PlaceVolumeInfo(kind, volume);
} catch (e) {
if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND))
return;
throw e;
}
this._places[kind].push(volItem);
}

View File

@@ -26,37 +26,12 @@ import {WorkspaceIndicator} from './workspaceIndicator.js';
const ICON_TEXTURE_SIZE = 24;
const DND_ACTIVATE_TIMEOUT = 500;
const MIN_DRAG_UPDATE_INTERVAL = 500 * GLib.TIME_SPAN_MILLISECOND;
const DRAG_OPACITY = 0.3;
const DRAG_FADE_DURATION = 200;
const DRAG_RESIZE_DURATION = 400;
const DRAG_PROXIMITY_THRESHOLD = 30;
const SAVED_POSITIONS_KEY = 'window-list-positions';
const ATTENTION_INDICATOR_MAX_SCALE = 0.4;
const ATTENTION_INDICATOR_TRANSITION_DURATION = 300;
const GroupingMode = {
NEVER: 0,
AUTO: 1,
ALWAYS: 2,
};
class DragPlaceholderItem extends DashItemContainer {
static {
GObject.registerClass(this);
}
constructor() {
super();
this.setChild(new St.Bin({style_class: 'placeholder'}));
}
}
/**
* @param {Shell.App} app - an app
* @returns {number} - the smallest stable sequence of the app's windows
@@ -130,89 +105,26 @@ class WindowContextMenu extends PopupMenu.PopupMenu {
}
}
class TitleWidget extends St.Widget {
static {
GObject.registerClass({
GTypeFlags: GObject.TypeFlags.ABSTRACT,
Properties: {
'abstract-label': GObject.ParamSpec.boolean(
'abstract-label', null, null,
GObject.ParamFlags.READWRITE,
false),
},
}, this);
}
constructor() {
super({
layout_manager: new Clutter.BinLayout(),
x_expand: true,
y_expand: true,
});
const hbox = new St.BoxLayout({
style_class: 'window-button-box',
x_expand: true,
y_expand: true,
});
this.add_child(hbox);
this._icon = new St.Bin({
style_class: 'window-button-icon',
});
hbox.add_child(this._icon);
this._label = new St.Label({
y_align: Clutter.ActorAlign.CENTER,
});
hbox.add_child(this._label);
this.label_actor = this._label;
this.bind_property('abstract-label',
this._label, 'visible',
GObject.BindingFlags.SYNC_CREATE |
GObject.BindingFlags.INVERT_BOOLEAN);
this._abstractLabel = new St.Widget({
style_class: 'window-button-abstract-label',
x_expand: true,
y_expand: true,
});
hbox.add_child(this._abstractLabel);
this.bind_property('abstract-label',
this._abstractLabel, 'visible',
GObject.BindingFlags.SYNC_CREATE);
this._attentionIndicator = new St.Widget({
style_class: 'window-button-attention-indicator',
x_expand: true,
y_expand: true,
y_align: Clutter.ActorAlign.END,
scale_x: 0,
});
this._attentionIndicator.set_pivot_point(0.5, 0.5);
this.add_child(this._attentionIndicator);
}
setNeedsAttention(enable) {
this._attentionIndicator.ease({
scaleX: enable ? ATTENTION_INDICATOR_MAX_SCALE : 0,
duration: ATTENTION_INDICATOR_TRANSITION_DURATION,
});
}
}
class WindowTitle extends TitleWidget {
class WindowTitle extends St.BoxLayout {
static {
GObject.registerClass(this);
}
constructor(metaWindow) {
super();
super({
style_class: 'window-button-box',
x_expand: true,
y_expand: true,
});
this._metaWindow = metaWindow;
this._icon = new St.Bin({style_class: 'window-button-icon'});
this.add_child(this._icon);
this.label_actor = new St.Label({y_align: Clutter.ActorAlign.CENTER});
this.label_actor.clutter_text.single_line_mode = true;
this.add_child(this.label_actor);
this._metaWindow.connectObject(
'notify::wm-class',
() => this._updateIcon(), GObject.ConnectFlags.AFTER,
@@ -220,13 +132,10 @@ class WindowTitle extends TitleWidget {
() => this._updateIcon(), GObject.ConnectFlags.AFTER,
'notify::title', () => this._updateTitle(),
'notify::minimized', () => this._minimizedChanged(),
'notify::demands-attention', () => this._updateNeedsAttention(),
'notify::urgent', () => this._updateNeedsAttention(),
this);
this._updateIcon();
this._minimizedChanged();
this._updateNeedsAttention();
}
_minimizedChanged() {
@@ -234,19 +143,14 @@ class WindowTitle extends TitleWidget {
this._updateTitle();
}
_updateNeedsAttention() {
const {urgent, demandsAttention} = this._metaWindow;
this.setNeedsAttention(urgent || demandsAttention);
}
_updateTitle() {
if (!this._metaWindow.title)
return;
if (this._metaWindow.minimized)
this._label.text = '[%s]'.format(this._metaWindow.title);
this.label_actor.text = '[%s]'.format(this._metaWindow.title);
else
this._label.text = this._metaWindow.title;
this.label_actor.text = this._metaWindow.title;
}
_updateIcon() {
@@ -262,100 +166,6 @@ class WindowTitle extends TitleWidget {
}
}
class AppTitle extends TitleWidget {
static {
GObject.registerClass(this);
}
constructor(app) {
super();
this._app = app;
this._windows = new Set();
this._icon.child = app.create_icon_texture(ICON_TEXTURE_SIZE);
this._label.text = app.get_name();
this._app.connectObject(
'windows-changed', () => this._onWindowsChanged(),
this);
this._onWindowsChanged();
this.connect('destroy', () => {
console.debug(`Clearing windows of app ${this._app.id}`);
this._windows.clear();
});
}
_onWindowsChanged() {
const windows = this._app.get_windows();
const removed = [...this._windows].filter(w => !windows.includes(w));
removed.forEach(w => this._untrackWindow(w));
windows.forEach(w => this._trackWindow(w));
this._updateNeedsAttention();
}
_trackWindow(window) {
if (this._windows.has(window))
return;
console.debug(`Tracking window ${window} for app ${this._app.id}`);
window.connectObject(
'notify::urgent', () => this._updateNeedsAttention(),
'notify::demands-attention', () => this._updateNeedsAttention(),
this);
this._windows.add(window);
}
_untrackWindow(window) {
if (!this._windows.delete(window))
return;
console.debug(`Untracking window ${window} for app ${this._app.id}`);
window.disconnectObject(this);
}
_updateNeedsAttention() {
const needsAttention =
[...this._windows].some(w => w.urgent || w.demandsAttention);
this.setNeedsAttention(needsAttention);
}
}
class DragActor extends St.Bin {
static {
GObject.registerClass(this);
}
constructor(source, titleActor) {
super({
style_class: 'window-button-drag-actor',
child: titleActor,
width: source.width,
});
this.source = source;
}
setTargetWidth(width) {
const currentWidth = this.width;
// set width immediately so shell's DND code uses correct values
this.set({width});
// then transition from the original to the new width
const laters = global.compositor.get_laters();
laters.add(Meta.LaterType.BEFORE_REDRAW, () => {
this.set({width: currentWidth});
this.ease({
width,
duration: DRAG_RESIZE_DURATION,
});
return GLib.SOURCE_REMOVE;
});
}
}
class BaseButton extends DashItemContainer {
static {
GObject.registerClass({
@@ -366,10 +176,6 @@ class BaseButton extends DashItemContainer {
GObject.ParamFlags.READWRITE,
false),
},
Signals: {
'drag-begin': {},
'drag-end': {},
},
}, this);
}
@@ -414,18 +220,6 @@ class BaseButton extends DashItemContainer {
this._windowEnteredOrLeftMonitor.bind(this),
this);
}
this._button._delegate = this;
this._draggable = DND.makeDraggable(this._button);
this._draggable.connect('drag-begin', () => {
this._removeLongPressTimeout();
this.emit('drag-begin');
});
this._draggable.connect('drag-cancelled', () => {
this._draggable._dragActor?.setTargetWidth(this.width);
this.emit('drag-end');
});
this._draggable.connect('drag-end', () => this.emit('drag-end'));
}
get active() {
@@ -509,28 +303,6 @@ class BaseButton extends DashItemContainer {
this._onClicked(this, 1);
}
getDragActor() {
const titleActor = this._createTitleActor();
titleActor.set({abstractLabel: true});
const dragActor = new DragActor(this, titleActor);
const [, natWidth] = this.get_preferred_width(-1);
const targetWidth = Math.min(natWidth / 2, this.width);
dragActor.setTargetWidth(targetWidth);
return dragActor;
}
getDragActorSource() {
return this;
}
_createTitleActor() {
throw new GObject.NotImplementedError(
`_createTitleActor in ${this.constructor.name}`);
}
_onClicked(_actor, _button) {
throw new GObject.NotImplementedError(
`_onClicked in ${this.constructor.name}`);
@@ -641,7 +413,7 @@ class WindowButton extends BaseButton {
this._updateVisibility();
this._windowTitle = this._createTitleActor();
this._windowTitle = new WindowTitle(this.metaWindow);
this._button.set_child(this._windowTitle);
this.label_actor = this._windowTitle.label_actor;
@@ -657,14 +429,6 @@ class WindowButton extends BaseButton {
this._updateStyle();
}
get id() {
return `window:${this.metaWindow.get_id()}`;
}
_createTitleActor() {
return new WindowTitle(this.metaWindow);
}
_onClicked(actor, button) {
if (this._contextMenu.isOpen) {
this._contextMenu.close();
@@ -781,6 +545,33 @@ class AppButton extends BaseButton {
this.app = app;
this._updateVisibility();
let stack = new St.Widget({layout_manager: new Clutter.BinLayout()});
this._button.set_child(stack);
this._singleWindowTitle = new St.Bin({
x_expand: true,
});
stack.add_child(this._singleWindowTitle);
this._multiWindowTitle = new St.BoxLayout({
style_class: 'window-button-box',
x_expand: true,
});
stack.add_child(this._multiWindowTitle);
this._icon = new St.Bin({
style_class: 'window-button-icon',
child: app.create_icon_texture(ICON_TEXTURE_SIZE),
});
this._multiWindowTitle.add_child(this._icon);
let label = new St.Label({
text: app.get_name(),
y_align: Clutter.ActorAlign.CENTER,
});
this._multiWindowTitle.add_child(label);
this._multiWindowTitle.label_actor = label;
this._menuManager = new PopupMenu.PopupMenuManager(this);
this._menu = new PopupMenu.PopupMenu(this, 0.5, St.Side.BOTTOM);
this._menu.connect('open-state-changed',
@@ -790,6 +581,12 @@ class AppButton extends BaseButton {
this._menuManager.addMenu(this._menu);
Main.uiGroup.add_child(this._menu.actor);
this._appContextMenu = new AppContextMenu(this);
this._appContextMenu.connect('open-state-changed',
this._onMenuStateChanged.bind(this));
this._appContextMenu.actor.hide();
Main.uiGroup.add_child(this._appContextMenu.actor);
this.app.connectObject('windows-changed',
() => this._windowsChanged(), this);
this._windowsChanged();
@@ -800,10 +597,6 @@ class AppButton extends BaseButton {
this._updateStyle();
}
get id() {
return `app:${this.app.get_id()}`;
}
_windowEnteredOrLeftMonitor(metaDisplay, monitorIndex, metaWindow) {
if (this._windowTracker.get_window_app(metaWindow) === this.app &&
monitorIndex === this._monitorIndex) {
@@ -840,40 +633,36 @@ class AppButton extends BaseButton {
}
_windowsChanged() {
const windows = this.getWindowList();
const singleWindowMode = windows.length === 1;
let windows = this.getWindowList();
this._singleWindowTitle.visible = windows.length === 1;
this._multiWindowTitle.visible = !this._singleWindowTitle.visible;
if (this._singleWindowMode === singleWindowMode)
return;
this._singleWindowMode = singleWindowMode;
this._button.child?.destroy();
this._contextMenu?.destroy();
if (this._singleWindowMode) {
const [window] = windows;
this._contextMenu = new WindowContextMenu(this, window);
if (this._singleWindowTitle.visible) {
if (!this._windowTitle) {
this.metaWindow = windows[0];
this._windowTitle = new WindowTitle(this.metaWindow);
this._singleWindowTitle.child = this._windowTitle;
this._windowContextMenu = new WindowContextMenu(this, this.metaWindow);
this._windowContextMenu.connect(
'open-state-changed', this._onMenuStateChanged.bind(this));
Main.uiGroup.add_child(this._windowContextMenu.actor);
this._windowContextMenu.actor.hide();
this._contextMenuManager.addMenu(this._windowContextMenu);
}
this._contextMenuManager.removeMenu(this._appContextMenu);
this._contextMenu = this._windowContextMenu;
this.label_actor = this._windowTitle.label_actor;
} else {
this._contextMenu = new AppContextMenu(this);
}
this._button.child = this._createTitleActor();
this.label_actor = this._button.child.label_actor;
this._contextMenu.connect(
'open-state-changed', this._onMenuStateChanged.bind(this));
Main.uiGroup.add_child(this._contextMenu.actor);
this._contextMenu.actor.hide();
this._contextMenuManager.addMenu(this._contextMenu);
}
_createTitleActor() {
if (this._singleWindowMode) {
const [window] = this.getWindowList();
return new WindowTitle(window);
} else {
return new AppTitle(this.app);
if (this._windowTitle) {
this.metaWindow = null;
this._singleWindowTitle.child = null;
this._windowTitle = null;
this._windowContextMenu.destroy();
this._windowContextMenu = null;
}
this._contextMenu = this._appContextMenu;
this._contextMenuManager.addMenu(this._appContextMenu);
this.label_actor = this._multiWindowTitle.label_actor;
}
}
@@ -1029,7 +818,7 @@ class WindowList extends St.Widget {
this._updateKeyboardAnchor();
},
'hidden', () => {
Main.layoutManager.trackChrome(this);
Main.layoutManager.trackChrome(this, chromeOptions);
this.visible = !this._monitor.inFullscreen;
this._updateKeyboardAnchor();
}, this);
@@ -1046,28 +835,17 @@ class WindowList extends St.Widget {
'window-created', (dsp, win) => this._addWindow(win, true), this);
Main.xdndHandler.connectObject(
'drag-begin', () => this._monitorXdndDrag(),
'drag-end', () => this._stopMonitoringXdndDrag(),
'drag-begin', () => this._monitorDrag(),
'drag-end', () => this._stopMonitoringDrag(),
this);
this._xdndDragMonitor = {
dragMotion: this._onXdndDragMotion.bind(this),
};
this._itemDragMonitor = {
dragMotion: this._onItemDragMotion.bind(this),
dragDrop: this._onItemDragDrop.bind(this),
this._dragMonitor = {
dragMotion: this._onDragMotion.bind(this),
};
this._dndTimeoutId = 0;
this._dndWindow = null;
this._dragPlaceholder = null;
this._dragPlaceholderPos = -1;
this._lastPlaceholderUpdate = 0;
this._delegate = this;
this._settings = settings;
this._settings.connectObject('changed::grouping-mode',
() => this._groupingModeChanged(), this);
@@ -1180,8 +958,6 @@ class WindowList extends St.Widget {
for (let i = 0; i < apps.length; i++)
this._addApp(apps[i], false);
}
this._restorePositions();
}
_updateKeyboardAnchor() {
@@ -1199,37 +975,14 @@ class WindowList extends St.Widget {
this._removeApp(app);
}
_addButton(button, animate) {
_addApp(app, animate) {
let button = new AppButton(app, this._perMonitor, this._monitor.index);
this._settings.bind('display-all-workspaces',
button, 'ignore-workspace', Gio.SettingsBindFlags.GET);
button.connect('drag-begin', () => {
button.ease({
opacity: 255 * DRAG_OPACITY,
duration: DRAG_FADE_DURATION,
});
this._monitorItemDrag();
});
button.connect('drag-end', () => {
button.ease({
opacity: 255,
duration: DRAG_FADE_DURATION,
});
this._stopMonitoringItemDrag();
this._clearDragPlaceholder();
});
this._windowList.add_child(button);
button.show(animate);
}
_addApp(app, animate) {
const button = new AppButton(app, this._perMonitor, this._monitor.index);
this._addButton(button, animate);
}
_removeApp(app) {
let children = this._windowList.get_children();
let child = children.find(c => c.app === app);
@@ -1250,8 +1003,11 @@ class WindowList extends St.Widget {
this._windowSignals.set(
win, win.connect('unmanaged', () => this._removeWindow(win)));
const button = new WindowButton(win, this._perMonitor, this._monitor.index);
this._addButton(button, animate);
let button = new WindowButton(win, this._perMonitor, this._monitor.index);
this._settings.bind('display-all-workspaces',
button, 'ignore-workspace', Gio.SettingsBindFlags.GET);
this._windowList.add_child(button);
button.show(animate);
}
_removeWindow(win) {
@@ -1271,135 +1027,16 @@ class WindowList extends St.Widget {
child?.animateOutAndDestroy();
}
_clearDragPlaceholder() {
this._dragPlaceholder?.animateOutAndDestroy();
this._dragPlaceholder = null;
this._dragPlaceholderPos = -1;
_monitorDrag() {
DND.addDragMonitor(this._dragMonitor);
}
handleDragOver(source, _actor, x, _y, _time) {
if (!(source instanceof BaseButton))
return DND.DragMotionResult.NO_DROP;
const buttons = this._windowList.get_children().filter(c => c instanceof BaseButton);
const buttonPos = buttons.indexOf(source);
const numButtons = buttons.length;
let boxWidth = this._windowList.width;
// Transform to window list coordinates for index calculation
// (mostly relevant for RTL to discard workspace indicator etc.)
x -= this._windowList.x;
const rtl = this.text_direction === Clutter.TextDirection.RTL;
let pos = rtl
? numButtons - Math.round(x * numButtons / boxWidth)
: Math.round(x * numButtons / boxWidth);
pos = Math.clamp(pos, 0, numButtons);
const timeDelta =
GLib.get_monotonic_time() - this._lastPlaceholderUpdate;
if (pos !== this._dragPlaceholderPos && timeDelta >= MIN_DRAG_UPDATE_INTERVAL) {
this._clearDragPlaceholder();
this._dragPlaceholderPos = pos;
this._lastPlaceholderUpdate = GLib.get_monotonic_time();
// Don't allow positioning before or after self
if (pos === buttonPos || pos === buttonPos + 1)
return DND.DragMotionResult.CONTINUE;
this._dragPlaceholder = new DragPlaceholderItem();
const sibling = buttons[pos] ?? null;
if (sibling)
this._windowList.insert_child_below(this._dragPlaceholder, sibling);
else
this._windowList.insert_child_above(this._dragPlaceholder, null);
this._dragPlaceholder.show(true);
}
return this._dragPlaceholder
? DND.DragMotionResult.MOVE_DROP
: DND.DragMotionResult.NO_DROP;
}
acceptDrop(source, _actor, _x, _y, _time) {
if (this._dragPlaceholderPos >= 0)
this._windowList.set_child_at_index(source, this._dragPlaceholderPos);
this._clearDragPlaceholder();
this._savePositions();
return true;
}
_getPositionStateKey() {
return `${SAVED_POSITIONS_KEY}:${this._monitor.index}`;
}
_savePositions() {
const buttons = this._windowList.get_children()
.filter(b => b instanceof BaseButton);
global.set_runtime_state(this._getPositionStateKey(),
new GLib.Variant('as', buttons.map(b => b.id)));
}
_restorePositions() {
const positions = global.get_runtime_state('as',
this._getPositionStateKey())?.deepUnpack() ?? [];
for (const button of this._windowList.get_children()) {
const pos = positions.indexOf(button.id);
if (pos > -1)
this._windowList.set_child_at_index(button, pos);
}
}
_monitorItemDrag() {
DND.addDragMonitor(this._itemDragMonitor);
}
_stopMonitoringItemDrag() {
DND.removeDragMonitor(this._itemDragMonitor);
}
_onItemDragMotion(dragEvent) {
const {source, targetActor, dragActor, x, y} = dragEvent;
const hasTarget = this._windowList.contains(targetActor);
const isNear = Math.abs(y - this.y) < DRAG_PROXIMITY_THRESHOLD;
if (hasTarget || isNear)
return this.handleDragOver(source, dragActor, x, y);
this._clearDragPlaceholder();
return DND.DragMotionResult.CONTINUE;
}
_onItemDragDrop(dropEvent) {
if (this._dragPlaceholderPos < 0)
return DND.DragDropResult.CONTINUE;
const {source} = dropEvent.dropActor;
this.acceptDrop(source);
dropEvent.dropActor.destroy();
// HACK: SUCESS would make more sense, but results in gnome-shell
// skipping all drag-end code
return DND.DragDropResult.CONTINUE;
}
_monitorXdndDrag() {
DND.addDragMonitor(this._xdndDragMonitor);
}
_stopMonitoringXdndDrag() {
DND.removeDragMonitor(this._xdndDragMonitor);
_stopMonitoringDrag() {
DND.removeDragMonitor(this._dragMonitor);
this._removeActivateTimeout();
}
_onXdndDragMotion(dragEvent) {
_onDragMotion(dragEvent) {
if (Main.overview.visible ||
!this.contains(dragEvent.targetActor)) {
this._removeActivateTimeout();
@@ -1447,7 +1084,7 @@ class WindowList extends St.Widget {
this._windowSignals.forEach((id, win) => win.disconnect(id));
this._windowSignals.clear();
this._stopMonitoringXdndDrag();
this._stopMonitoringDrag();
this._settings.disconnectObject();
this._settings = null;

View File

@@ -37,7 +37,6 @@ workspaceIndicatorSources = [
command: transform_stylesheet,
capture: true,
),
files('../workspace-indicator/workspacePrefs.js'),
]
extension_sources += files('prefs.js') + workspaceIndicatorSources

View File

@@ -11,18 +11,13 @@ import Gtk from 'gi://Gtk';
import {ExtensionPreferences, gettext as _} from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js';
import {WorkspacesPage} from './workspacePrefs.js';
class WindowListPage extends Adw.PreferencesPage {
class WindowListPrefsWidget extends Adw.PreferencesPage {
static {
GObject.registerClass(this);
}
constructor(settings) {
super({
title: _('Window List'),
icon_name: 'focus-windows-symbolic',
});
super();
this._actionGroup = new Gio.SimpleActionGroup();
this.insert_action_group('window-list', this._actionGroup);
@@ -75,13 +70,17 @@ class WindowListPage extends Adw.PreferencesPage {
action_name: 'window-list.display-all-workspaces',
});
miscGroup.add(row);
row = new Adw.SwitchRow({
title: _('Show workspace previews'),
action_name: 'window-list.embed-previews',
});
miscGroup.add(row);
}
}
export default class WindowListPrefs extends ExtensionPreferences {
fillPreferencesWindow(window) {
const settings = this.getSettings();
window.add(new WindowListPage(settings));
window.add(new WorkspacesPage(settings));
getPreferencesWidget() {
return new WindowListPrefsWidget(this.getSettings());
}
}

View File

@@ -17,19 +17,10 @@
height: 2.45em;
}
.window-button,
.window-button-drag-actor {
.window-button {
padding: 4px, 3px;
}
.window-button-drag-actor {
background-color: #444;
border-radius: 7px;
border-width: 2px;
border-color: #fff;
box-shadow: 0 1px 2px rgba(0,0,0,0.1);
}
.window-button:first-child:ltr {
padding-left: 2px;
}
@@ -50,18 +41,11 @@
transition: 100ms ease;
}
.window-button > StWidget,
.window-list .placeholder {
.window-button > StWidget {
-st-natural-width: 18.75em;
max-width: 18.75em;
}
.window-list .placeholder {
border: 1px solid rgba(255,255,255,0.4);
border-radius: 7px;
margin: 4px;
}
.window-button:hover > StWidget {
background-color: #303030;
}
@@ -97,18 +81,3 @@
width: 24px;
height: 24px;
}
.window-button-abstract-label {
background-color: #888;
border-radius: 99px;
margin: 6px;
}
.window-button-attention-indicator {
background-color: -st-accent-color;
height: 2px;
}
.window-button.minimized .window-button-attention-indicator {
background-color: st-transparentize(-st-accent-color, 0.4);
}

View File

@@ -23,6 +23,7 @@
.window-button > StWidget {
color: #000;
background-color: transparent;
}
.window-button:hover > StWidget {
@@ -55,12 +56,3 @@
color: #aaa;
background-color: #f9f9f9;
}
.window-button-drag-actor {
background-color: #ddd;
border-color: #888;
}
.window-list .placeholder {
border-color: rgba(0,0,0,0.5);
}

View File

@@ -13,4 +13,4 @@ extension_data += files(
)
extension_schemas += files('schemas/' + metadata_conf.get('gschemaname') + '.gschema.xml')
extension_sources += files('prefs.js', 'workspaceIndicator.js', 'workspacePrefs.js')
extension_sources += files('prefs.js', 'workspaceIndicator.js')

View File

@@ -3,12 +3,289 @@
//
// SPDX-License-Identifier: GPL-2.0-or-later
import {ExtensionPreferences} from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js';
import Adw from 'gi://Adw';
import Gio from 'gi://Gio';
import GLib from 'gi://GLib';
import GObject from 'gi://GObject';
import Gtk from 'gi://Gtk';
import Pango from 'gi://Pango';
import {WorkspacesPage} from './workspacePrefs.js';
import {ExtensionPreferences, gettext as _} from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js';
const N_ = e => e;
const WORKSPACE_SCHEMA = 'org.gnome.desktop.wm.preferences';
const WORKSPACE_KEY = 'workspace-names';
class GeneralGroup extends Adw.PreferencesGroup {
static {
GObject.registerClass(this);
}
constructor(settings) {
super();
const row = new Adw.SwitchRow({
title: _('Show Previews In Top Bar'),
});
this.add(row);
settings.bind('embed-previews',
row, 'active',
Gio.SettingsBindFlags.DEFAULT);
}
}
class NewItem extends GObject.Object {}
GObject.registerClass(NewItem);
class NewItemModel extends GObject.Object {
static [GObject.interfaces] = [Gio.ListModel];
static {
GObject.registerClass(this);
}
#item = new NewItem();
vfunc_get_item_type() {
return NewItem;
}
vfunc_get_n_items() {
return 1;
}
vfunc_get_item(_pos) {
return this.#item;
}
}
class WorkspacesList extends GObject.Object {
static [GObject.interfaces] = [Gio.ListModel];
static {
GObject.registerClass(this);
}
#settings = new Gio.Settings({schema_id: WORKSPACE_SCHEMA});
#names = this.#settings.get_strv(WORKSPACE_KEY);
#items = Gtk.StringList.new(this.#names);
#changedId;
constructor() {
super();
this.#changedId =
this.#settings.connect(`changed::${WORKSPACE_KEY}`, () => {
const removed = this.#names.length;
this.#names = this.#settings.get_strv(WORKSPACE_KEY);
this.#items.splice(0, removed, this.#names);
this.items_changed(0, removed, this.#names.length);
});
}
append() {
const name = _('Workspace %d').format(this.#names.length + 1);
this.#names.push(name);
this.#settings.block_signal_handler(this.#changedId);
this.#settings.set_strv(WORKSPACE_KEY, this.#names);
this.#settings.unblock_signal_handler(this.#changedId);
const pos = this.#items.get_n_items();
this.#items.append(name);
this.items_changed(pos, 0, 1);
}
remove(name) {
const pos = this.#names.indexOf(name);
if (pos < 0)
return;
this.#names.splice(pos, 1);
this.#settings.block_signal_handler(this.#changedId);
this.#settings.set_strv(WORKSPACE_KEY, this.#names);
this.#settings.unblock_signal_handler(this.#changedId);
this.#items.remove(pos);
this.items_changed(pos, 1, 0);
}
rename(oldName, newName) {
const pos = this.#names.indexOf(oldName);
if (pos < 0)
return;
this.#names.splice(pos, 1, newName);
this.#items.splice(pos, 1, [newName]);
this.#settings.block_signal_handler(this.#changedId);
this.#settings.set_strv(WORKSPACE_KEY, this.#names);
this.#settings.unblock_signal_handler(this.#changedId);
}
vfunc_get_item_type() {
return Gtk.StringObject;
}
vfunc_get_n_items() {
return this.#items.get_n_items();
}
vfunc_get_item(pos) {
return this.#items.get_item(pos);
}
}
class WorkspacesGroup extends Adw.PreferencesGroup {
static {
GObject.registerClass(this);
this.install_action('workspaces.add', null,
self => self._workspaces.append());
this.install_action('workspaces.remove', 's',
(self, name, param) => self._workspaces.remove(param.unpack()));
this.install_action('workspaces.rename', '(ss)',
(self, name, param) => self._workspaces.rename(...param.deepUnpack()));
}
constructor() {
super({
title: _('Workspace Names'),
});
this._workspaces = new WorkspacesList();
const store = new Gio.ListStore({item_type: Gio.ListModel});
const listModel = new Gtk.FlattenListModel({model: store});
store.append(this._workspaces);
store.append(new NewItemModel());
this._list = new Gtk.ListBox({
selection_mode: Gtk.SelectionMode.NONE,
css_classes: ['boxed-list'],
});
this._list.connect('row-activated', (l, row) => row.edit());
this.add(this._list);
this._list.bind_model(listModel, item => {
return item instanceof NewItem
? new NewWorkspaceRow()
: new WorkspaceRow(item.string);
});
}
}
class WorkspaceRow extends Adw.PreferencesRow {
static {
GObject.registerClass(this);
}
constructor(name) {
super({name});
const box = new Gtk.Box({
spacing: 12,
margin_top: 6,
margin_bottom: 6,
margin_start: 6,
margin_end: 6,
});
const label = new Gtk.Label({
hexpand: true,
xalign: 0,
max_width_chars: 25,
ellipsize: Pango.EllipsizeMode.END,
});
this.bind_property('name', label, 'label',
GObject.BindingFlags.SYNC_CREATE);
box.append(label);
const button = new Gtk.Button({
action_name: 'workspaces.remove',
icon_name: 'edit-delete-symbolic',
has_frame: false,
});
box.append(button);
this.bind_property_full('name',
button, 'action-target',
GObject.BindingFlags.SYNC_CREATE,
(bind, target) => [true, new GLib.Variant('s', target)],
null);
this._entry = new Gtk.Entry({
max_width_chars: 25,
});
const controller = new Gtk.ShortcutController();
controller.add_shortcut(new Gtk.Shortcut({
trigger: Gtk.ShortcutTrigger.parse_string('Escape'),
action: Gtk.CallbackAction.new(() => {
this._stopEdit();
return true;
}),
}));
this._entry.add_controller(controller);
this._stack = new Gtk.Stack();
this._stack.add_named(box, 'display');
this._stack.add_named(this._entry, 'edit');
this.child = this._stack;
this._entry.connect('activate', () => {
this.activate_action('workspaces.rename',
new GLib.Variant('(ss)', [this.name, this._entry.text]));
this.name = this._entry.text;
this._stopEdit();
});
this._entry.connect('notify::has-focus', () => {
if (this._entry.has_focus)
return;
this._stopEdit();
});
}
edit() {
this._entry.text = this.name;
this._entry.grab_focus();
this._stack.visible_child_name = 'edit';
}
_stopEdit() {
this.grab_focus();
this._stack.visible_child_name = 'display';
}
}
class NewWorkspaceRow extends Adw.PreferencesRow {
static {
GObject.registerClass(this);
}
constructor() {
super({
action_name: 'workspaces.add',
child: new Gtk.Image({
icon_name: 'list-add-symbolic',
pixel_size: 16,
margin_top: 12,
margin_bottom: 12,
margin_start: 12,
margin_end: 12,
}),
});
this.update_property(
[Gtk.AccessibleProperty.LABEL], [_('Add Workspace')]);
}
}
export default class WorkspaceIndicatorPrefs extends ExtensionPreferences {
getPreferencesWidget() {
return new WorkspacesPage(this.getSettings());
const page = new Adw.PreferencesPage();
page.add(new GeneralGroup(this.getSettings()));
page.add(new WorkspacesGroup());
return page;
}
}

View File

@@ -1,232 +0,0 @@
// SPDX-FileCopyrightText: 2012 Giovanni Campagna <gcampagna@src.gnome.org>
// SPDX-FileCopyrightText: 2014 Florian Müllner <fmuellner@gnome.org>
//
// SPDX-License-Identifier: GPL-2.0-or-later
import Adw from 'gi://Adw';
import Gio from 'gi://Gio';
import GLib from 'gi://GLib';
import GObject from 'gi://GObject';
import Gtk from 'gi://Gtk';
import {gettext as _} from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js';
const N_ = e => e;
const WORKSPACE_SCHEMA = 'org.gnome.desktop.wm.preferences';
const WORKSPACE_KEY = 'workspace-names';
class GeneralGroup extends Adw.PreferencesGroup {
static {
GObject.registerClass(this);
}
constructor(settings) {
super();
const row = new Adw.SwitchRow({
title: _('Show Previews'),
});
this.add(row);
settings.bind('embed-previews',
row, 'active',
Gio.SettingsBindFlags.DEFAULT);
}
}
class NewItem extends GObject.Object {}
GObject.registerClass(NewItem);
class NewItemModel extends GObject.Object {
static [GObject.interfaces] = [Gio.ListModel];
static {
GObject.registerClass(this);
}
#item = new NewItem();
vfunc_get_item_type() {
return NewItem;
}
vfunc_get_n_items() {
return 1;
}
vfunc_get_item(_pos) {
return this.#item;
}
}
class WorkspacesList extends GObject.Object {
static [GObject.interfaces] = [Gio.ListModel];
static {
GObject.registerClass(this);
}
#settings = new Gio.Settings({schema_id: WORKSPACE_SCHEMA});
#names = this.#settings.get_strv(WORKSPACE_KEY);
#items = Gtk.StringList.new(this.#names);
#changedId;
constructor() {
super();
this.#changedId =
this.#settings.connect(`changed::${WORKSPACE_KEY}`, () => {
const removed = this.#names.length;
this.#names = this.#settings.get_strv(WORKSPACE_KEY);
this.#items.splice(0, removed, this.#names);
this.items_changed(0, removed, this.#names.length);
});
}
append() {
const name = _('Workspace %d').format(this.#names.length + 1);
this.#names.push(name);
this.#settings.block_signal_handler(this.#changedId);
this.#settings.set_strv(WORKSPACE_KEY, this.#names);
this.#settings.unblock_signal_handler(this.#changedId);
const pos = this.#items.get_n_items();
this.#items.append(name);
this.items_changed(pos, 0, 1);
}
remove(name) {
const pos = this.#names.indexOf(name);
if (pos < 0)
return;
this.#names.splice(pos, 1);
this.#settings.block_signal_handler(this.#changedId);
this.#settings.set_strv(WORKSPACE_KEY, this.#names);
this.#settings.unblock_signal_handler(this.#changedId);
this.#items.remove(pos);
this.items_changed(pos, 1, 0);
}
rename(oldName, newName) {
const pos = this.#names.indexOf(oldName);
if (pos < 0)
return;
this.#names.splice(pos, 1, newName);
this.#items.splice(pos, 1, [newName]);
this.#settings.block_signal_handler(this.#changedId);
this.#settings.set_strv(WORKSPACE_KEY, this.#names);
this.#settings.unblock_signal_handler(this.#changedId);
}
vfunc_get_item_type() {
return Gtk.StringObject;
}
vfunc_get_n_items() {
return this.#items.get_n_items();
}
vfunc_get_item(pos) {
return this.#items.get_item(pos);
}
}
class WorkspacesGroup extends Adw.PreferencesGroup {
static {
GObject.registerClass(this);
this.install_action('workspaces.add', null,
self => self._workspaces.append());
this.install_action('workspaces.remove', 's',
(self, name, param) => self._workspaces.remove(param.unpack()));
this.install_action('workspaces.rename', '(ss)',
(self, name, param) => self._workspaces.rename(...param.deepUnpack()));
}
constructor() {
super({
title: _('Workspace Names'),
});
this._workspaces = new WorkspacesList();
const store = new Gio.ListStore({item_type: Gio.ListModel});
const listModel = new Gtk.FlattenListModel({model: store});
store.append(this._workspaces);
store.append(new NewItemModel());
this._list = new Gtk.ListBox({
selection_mode: Gtk.SelectionMode.NONE,
css_classes: ['boxed-list'],
});
this.add(this._list);
const newRowProps = {
title: _('Add Workspace'),
action_name: 'workspaces.add',
start_icon_name: 'list-add-symbolic',
};
this._list.bind_model(listModel, item => {
return item instanceof NewItem
? new Adw.ButtonRow({...newRowProps})
: new WorkspaceRow(item.string);
});
}
}
class WorkspaceRow extends Adw.EntryRow {
static {
GObject.registerClass(this);
}
constructor(name) {
super({
name,
text: name,
});
const button = new Gtk.Button({
tooltip_text: _('Remove'),
action_name: 'workspaces.remove',
icon_name: 'edit-delete-symbolic',
has_frame: false,
halign: Gtk.Align.CENTER,
valign: Gtk.Align.CENTER,
});
this.add_suffix(button);
this.bind_property_full('name',
button, 'action-target',
GObject.BindingFlags.SYNC_CREATE,
(bind, target) => [true, new GLib.Variant('s', target)],
null);
this.connect('changed', () => {
this.activate_action('workspaces.rename',
new GLib.Variant('(ss)', [this.name, this.text]));
this.name = this.text;
});
}
}
export class WorkspacesPage extends Adw.PreferencesPage {
static {
GObject.registerClass(this);
}
constructor(settings) {
super({
title: _('Workspaces'),
icon_name: 'view-grid-symbolic',
});
this.add(new GeneralGroup(settings));
this.add(new WorkspacesGroup());
}
}

View File

@@ -4,7 +4,7 @@
project(
'gnome-shell-extensions',
version: '48.alpha',
version: '47.4',
meson_version: '>= 1.1.0',
license: 'GPL-2.0-or-later',
)

View File

@@ -18,6 +18,6 @@ extensions/window-list/extension.js
extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml
extensions/window-list/prefs.js
extensions/windowsNavigator/extension.js
extensions/workspace-indicator/prefs.js
extensions/workspace-indicator/schemas/org.gnome.shell.extensions.workspace-indicator.gschema.xml
extensions/workspace-indicator/workspaceIndicator.js
extensions/workspace-indicator/workspacePrefs.js

123
po/be.po
View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: gnome-shell-extensions master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/"
"issues\n"
"POT-Creation-Date: 2024-10-16 14:41+0000\n"
"PO-Revision-Date: 2024-10-22 16:27+0300\n"
"POT-Creation-Date: 2024-04-29 15:27+0000\n"
"PO-Revision-Date: 2024-08-23 16:00+0300\n"
"Last-Translator: Yuras Shumovich <shumovichy@gmail.com>\n"
"Language-Team: Belarusian <i18n-bel-gnome@googlegroups.com>\n"
"Language: be\n"
@@ -18,7 +18,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Poedit 3.5\n"
"X-Generator: Poedit 3.4.4\n"
#: data/gnome-classic.desktop.in:3
msgid "GNOME Classic"
@@ -67,7 +67,7 @@ msgstr "Дадаць правіла"
#. TRANSLATORS: %s is the filesystem name
#: extensions/drive-menu/extension.js:123
#: extensions/places-menu/placeDisplay.js:187
#: extensions/places-menu/placeDisplay.js:218
#, javascript-format
msgid "Ejecting drive “%s” failed:"
msgstr "Не ўдалося выняць дыск «%s»:"
@@ -114,35 +114,28 @@ msgstr ""
msgid "Places"
msgstr "Месцы"
#: extensions/places-menu/placeDisplay.js:53
#: extensions/places-menu/placeDisplay.js:60
#, javascript-format
msgid "Failed to launch “%s”"
msgstr "Не ўдалося запусціць «%s»"
#: extensions/places-menu/placeDisplay.js:68
#: extensions/places-menu/placeDisplay.js:75
#, javascript-format
msgid "Failed to mount volume for “%s”"
msgstr "Не ўдалося прымацаваць том для «%s»."
#: extensions/places-menu/placeDisplay.js:316
#: extensions/places-menu/placeDisplay.js:135
#: extensions/places-menu/placeDisplay.js:158
msgid "Computer"
msgstr "Камп'ютар"
#: extensions/places-menu/placeDisplay.js:333
msgid "Home"
msgstr "Хатняя папка"
#: extensions/places-menu/placeDisplay.js:322
msgid "Recent"
msgstr "Нядаўнія"
#: extensions/places-menu/placeDisplay.js:328
msgid "Starred"
msgstr "Абраныя"
#: extensions/places-menu/placeDisplay.js:348
msgid "Network"
msgstr "Сетка"
#: extensions/places-menu/placeDisplay.js:355
msgid "Trash"
msgstr "Сметніца"
#: extensions/places-menu/placeDisplay.js:378
msgid "Browse Network"
msgstr "Агляд сеткі"
#: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:14
msgid "Cycle Screenshot Sizes"
@@ -232,47 +225,47 @@ msgstr "Назва тэмы"
msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell"
msgstr "Назва тэмы, што загрузіцца з ~/.themes/name/gnome-shell"
#: extensions/window-list/extension.js:92
#: extensions/window-list/extension.js:72
msgid "Close"
msgstr "Закрыць"
#: extensions/window-list/extension.js:119
#: extensions/window-list/extension.js:99
msgid "Unminimize"
msgstr "Скасаваць згортванне"
#: extensions/window-list/extension.js:119
#: extensions/window-list/extension.js:99
msgid "Minimize"
msgstr "Згарнуць"
#: extensions/window-list/extension.js:126
#: extensions/window-list/extension.js:106
msgid "Unmaximize"
msgstr "Скасаваць разгортванне"
#: extensions/window-list/extension.js:126
#: extensions/window-list/extension.js:106
msgid "Maximize"
msgstr "Разгарнуць"
#: extensions/window-list/extension.js:641
#: extensions/window-list/extension.js:471
msgid "Minimize all"
msgstr "Згарнуць усе"
#: extensions/window-list/extension.js:647
#: extensions/window-list/extension.js:477
msgid "Unminimize all"
msgstr "Скасаваць згортванне для ўсіх"
#: extensions/window-list/extension.js:653
#: extensions/window-list/extension.js:483
msgid "Maximize all"
msgstr "Разгарнуць усе"
#: extensions/window-list/extension.js:661
#: extensions/window-list/extension.js:491
msgid "Unmaximize all"
msgstr "Скасаваць разгортванне для ўсіх"
#: extensions/window-list/extension.js:669
#: extensions/window-list/extension.js:499
msgid "Close all"
msgstr "Закрыць усе"
#: extensions/window-list/extension.js:911 extensions/window-list/prefs.js:24
#: extensions/window-list/extension.js:778
msgid "Window List"
msgstr "Спіс вокнаў"
@@ -289,7 +282,7 @@ msgstr ""
"значэнні: «never» (ніколі), «auto» (аўтаматычна), «always» (заўсёды)."
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:26
#: extensions/window-list/prefs.js:75
#: extensions/window-list/prefs.js:79
msgid "Show windows from all workspaces"
msgstr "Паказваць вокны з усіх працоўных прастор"
@@ -312,26 +305,47 @@ msgstr ""
msgid "Show workspace previews in window list"
msgstr "Паказваць папярэдні прагляд працоўных прастор у спісе акон"
#: extensions/window-list/prefs.js:42
#: extensions/window-list/prefs.js:35
msgid "Window Grouping"
msgstr "Групаванне вокнаў"
#: extensions/window-list/prefs.js:47
#: extensions/window-list/prefs.js:40
msgid "Never group windows"
msgstr "Ніколі не групаваць вокны"
#: extensions/window-list/prefs.js:48
#: extensions/window-list/prefs.js:41
msgid "Group windows when space is limited"
msgstr "Групаваць вокны калі не хапае месца"
#: extensions/window-list/prefs.js:49
#: extensions/window-list/prefs.js:42
msgid "Always group windows"
msgstr "Заўсёды групаваць вокны"
#: extensions/window-list/prefs.js:69
#: extensions/window-list/prefs.js:66
msgid "Show on all monitors"
msgstr "Паказваць на ўсіх маніторах"
#: extensions/window-list/prefs.js:92
msgid "Show workspace previews"
msgstr "Паказваць папярэдні прагляд працоўных прастор"
#: extensions/workspace-indicator/prefs.js:30
msgid "Show Previews In Top Bar"
msgstr "Паказваць папярэдні прагляд у верхняй панэлі"
#: extensions/workspace-indicator/prefs.js:88
#, javascript-format
msgid "Workspace %d"
msgstr "Працоўная прастора %d"
#: extensions/workspace-indicator/prefs.js:155
msgid "Workspace Names"
msgstr "Назвы працоўных прастор"
#: extensions/workspace-indicator/prefs.js:281
msgid "Add Workspace"
msgstr "Дадаць працоўную прастору"
#: extensions/workspace-indicator/schemas/org.gnome.shell.extensions.workspace-indicator.gschema.xml:12
msgid "Show workspace previews in top bar"
msgstr "Паказваць папярэдні прагляд працоўных прастор у верхняй панэлі"
@@ -340,37 +354,6 @@ msgstr "Паказваць папярэдні прагляд працоўных
msgid "Workspace Indicator"
msgstr "Індыкатар працоўнай прасторы"
#: extensions/workspace-indicator/workspacePrefs.js:29
msgid "Show Previews"
msgstr "Паказваць папярэдні прагляд"
#: extensions/workspace-indicator/workspacePrefs.js:87
#, javascript-format
msgid "Workspace %d"
msgstr "Працоўная прастора %d"
#: extensions/workspace-indicator/workspacePrefs.js:154
msgid "Workspace Names"
msgstr "Назвы працоўных прастор"
#: extensions/workspace-indicator/workspacePrefs.js:171
msgid "Add Workspace"
msgstr "Дадаць працоўную прастору"
#: extensions/workspace-indicator/workspacePrefs.js:196
msgid "Remove"
msgstr "Выдаліць"
#: extensions/workspace-indicator/workspacePrefs.js:226
msgid "Workspaces"
msgstr "Працоўныя прасторы"
#~ msgid "Computer"
#~ msgstr "Камп'ютар"
#~ msgid "Show workspace previews"
#~ msgstr "Паказваць папярэдні прагляд працоўных прастор"
#~ msgid "Applications"
#~ msgstr "Праграмы"

121
po/ca.po
View File

@@ -9,8 +9,8 @@ msgstr ""
"Project-Id-Version: gnome-shell-extensions\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/"
"issues\n"
"POT-Creation-Date: 2024-10-16 14:41+0000\n"
"PO-Revision-Date: 2024-10-20 21:54+0200\n"
"POT-Creation-Date: 2024-08-12 20:31+0000\n"
"PO-Revision-Date: 2024-08-19 23:26+0200\n"
"Last-Translator: Jordi Mas <jmas@softcatala.org>\n"
"Language-Team: Catalan <tradgnome@softcatala.org>\n"
"Language: ca\n"
@@ -69,7 +69,7 @@ msgstr "Afegeix una regla"
#. TRANSLATORS: %s is the filesystem name
#: extensions/drive-menu/extension.js:123
#: extensions/places-menu/placeDisplay.js:187
#: extensions/places-menu/placeDisplay.js:218
#, javascript-format
msgid "Ejecting drive “%s” failed:"
msgstr "Ha fallat l'expulsió de la unitat «%s»:"
@@ -118,35 +118,28 @@ msgstr ""
msgid "Places"
msgstr "Llocs"
#: extensions/places-menu/placeDisplay.js:53
#: extensions/places-menu/placeDisplay.js:60
#, javascript-format
msgid "Failed to launch “%s”"
msgstr "No s'ha pogut iniciar «%s»"
#: extensions/places-menu/placeDisplay.js:68
#: extensions/places-menu/placeDisplay.js:75
#, javascript-format
msgid "Failed to mount volume for “%s”"
msgstr "No s'ha pogut muntar el volum «%s»"
#: extensions/places-menu/placeDisplay.js:316
#: extensions/places-menu/placeDisplay.js:135
#: extensions/places-menu/placeDisplay.js:158
msgid "Computer"
msgstr "Ordinador"
#: extensions/places-menu/placeDisplay.js:333
msgid "Home"
msgstr "Inici"
#: extensions/places-menu/placeDisplay.js:322
msgid "Recent"
msgstr "Recent"
#: extensions/places-menu/placeDisplay.js:328
msgid "Starred"
msgstr "Destacat"
#: extensions/places-menu/placeDisplay.js:348
msgid "Network"
msgstr "Xarxa"
#: extensions/places-menu/placeDisplay.js:355
msgid "Trash"
msgstr "Paperera"
#: extensions/places-menu/placeDisplay.js:378
msgid "Browse Network"
msgstr "Navega per la xarxa"
#: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:14
msgid "Cycle Screenshot Sizes"
@@ -236,47 +229,47 @@ msgstr "Nom del tema"
msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell"
msgstr "El nom del tema que es carregarà des de ~/.themes/name/gnome-shell"
#: extensions/window-list/extension.js:92
#: extensions/window-list/extension.js:70
msgid "Close"
msgstr "Tanca"
#: extensions/window-list/extension.js:119
#: extensions/window-list/extension.js:97
msgid "Unminimize"
msgstr "Desminimitza"
#: extensions/window-list/extension.js:119
#: extensions/window-list/extension.js:97
msgid "Minimize"
msgstr "Minimitza"
#: extensions/window-list/extension.js:126
#: extensions/window-list/extension.js:104
msgid "Unmaximize"
msgstr "Desmaximitza"
#: extensions/window-list/extension.js:126
#: extensions/window-list/extension.js:104
msgid "Maximize"
msgstr "Maximitza"
#: extensions/window-list/extension.js:641
#: extensions/window-list/extension.js:489
msgid "Minimize all"
msgstr "Minimitza-ho tot"
#: extensions/window-list/extension.js:647
#: extensions/window-list/extension.js:495
msgid "Unminimize all"
msgstr "Desminimitza-ho tot"
#: extensions/window-list/extension.js:653
#: extensions/window-list/extension.js:501
msgid "Maximize all"
msgstr "Maximitza-ho tot"
#: extensions/window-list/extension.js:661
#: extensions/window-list/extension.js:509
msgid "Unmaximize all"
msgstr "Desmaximitza-ho tot"
#: extensions/window-list/extension.js:669
#: extensions/window-list/extension.js:517
msgid "Close all"
msgstr "Tanca-ho tot"
#: extensions/window-list/extension.js:911 extensions/window-list/prefs.js:24
#: extensions/window-list/extension.js:789
msgid "Window List"
msgstr "Llista de finestres"
@@ -294,7 +287,7 @@ msgstr ""
"«auto» (automàticament) i «always» (sempre)."
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:26
#: extensions/window-list/prefs.js:75
#: extensions/window-list/prefs.js:79
msgid "Show windows from all workspaces"
msgstr "Mostra les finestres de tots els espais de treball"
@@ -321,26 +314,47 @@ msgid "Show workspace previews in window list"
msgstr ""
"Mostra les previsualitzacions dels espais de treball a la llista de finestres"
#: extensions/window-list/prefs.js:42
#: extensions/window-list/prefs.js:35
msgid "Window Grouping"
msgstr "Agrupació de finestres"
#: extensions/window-list/prefs.js:47
#: extensions/window-list/prefs.js:40
msgid "Never group windows"
msgstr "Mai agrupis les finestres"
#: extensions/window-list/prefs.js:48
#: extensions/window-list/prefs.js:41
msgid "Group windows when space is limited"
msgstr "Agrupa les finestres quan l'espai estigui limitat"
#: extensions/window-list/prefs.js:49
#: extensions/window-list/prefs.js:42
msgid "Always group windows"
msgstr "Agrupa les finestres sempre"
#: extensions/window-list/prefs.js:69
#: extensions/window-list/prefs.js:66
msgid "Show on all monitors"
msgstr "Mostra a tots els monitors"
#: extensions/window-list/prefs.js:92
msgid "Show workspace previews"
msgstr "Mostra les previsualitzacions dels espais de treball"
#: extensions/workspace-indicator/prefs.js:30
msgid "Show Previews In Top Bar"
msgstr "Mostra previsualitzacions a la barra superior"
#: extensions/workspace-indicator/prefs.js:88
#, javascript-format
msgid "Workspace %d"
msgstr "Espai de treball %d"
#: extensions/workspace-indicator/prefs.js:155
msgid "Workspace Names"
msgstr "Noms dels espais de treball"
#: extensions/workspace-indicator/prefs.js:281
msgid "Add Workspace"
msgstr "Afegeix un espai de treball"
#: extensions/workspace-indicator/schemas/org.gnome.shell.extensions.workspace-indicator.gschema.xml:12
msgid "Show workspace previews in top bar"
msgstr ""
@@ -350,36 +364,5 @@ msgstr ""
msgid "Workspace Indicator"
msgstr "Indicador de l'espai de treball"
#: extensions/workspace-indicator/workspacePrefs.js:29
msgid "Show Previews"
msgstr "Mostra previsualitzacions"
#: extensions/workspace-indicator/workspacePrefs.js:87
#, javascript-format
msgid "Workspace %d"
msgstr "Espai de treball %d"
#: extensions/workspace-indicator/workspacePrefs.js:154
msgid "Workspace Names"
msgstr "Noms dels espais de treball"
#: extensions/workspace-indicator/workspacePrefs.js:171
msgid "Add Workspace"
msgstr "Afegeix un espai de treball"
#: extensions/workspace-indicator/workspacePrefs.js:196
msgid "Remove"
msgstr "Suprimeix"
#: extensions/workspace-indicator/workspacePrefs.js:226
msgid "Workspaces"
msgstr "Espais de treball"
#~ msgid "Computer"
#~ msgstr "Ordinador"
#~ msgid "Show workspace previews"
#~ msgstr "Mostra les previsualitzacions dels espais de treball"
#~ msgid "Applications"
#~ msgstr "Aplicacions"

121
po/fur.po
View File

@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell-extensions master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/issues\n"
"POT-Creation-Date: 2024-10-19 02:53+0000\n"
"PO-Revision-Date: 2024-10-20 20:04+0000\n"
"POT-Creation-Date: 2024-10-18 19:45+0000\n"
"PO-Revision-Date: 2024-10-20 20:01+0000\n"
"Last-Translator: Fabio Tomat <f.t.public@gmail.com>\n"
"Language-Team: Friulian <f.t.public@gmail.com>\n"
"Language: fur\n"
@@ -65,7 +65,7 @@ msgstr "Zonte regule"
#. TRANSLATORS: %s is the filesystem name
#: extensions/drive-menu/extension.js:123
#: extensions/places-menu/placeDisplay.js:187
#: extensions/places-menu/placeDisplay.js:218
#, javascript-format
msgid "Ejecting drive “%s” failed:"
msgstr "No si è rivâts a parâ fûr la unitât “%s”»:"
@@ -112,35 +112,28 @@ msgstr ""
msgid "Places"
msgstr "Puescj"
#: extensions/places-menu/placeDisplay.js:53
#: extensions/places-menu/placeDisplay.js:60
#, javascript-format
msgid "Failed to launch “%s”"
msgstr "No si è rivâts a inviâ “%s”"
#: extensions/places-menu/placeDisplay.js:68
#: extensions/places-menu/placeDisplay.js:75
#, javascript-format
msgid "Failed to mount volume for “%s”"
msgstr "No si è rivâts a montâ il volum par “%s”"
#: extensions/places-menu/placeDisplay.js:316
#: extensions/places-menu/placeDisplay.js:135
#: extensions/places-menu/placeDisplay.js:158
msgid "Computer"
msgstr "Computer"
#: extensions/places-menu/placeDisplay.js:333
msgid "Home"
msgstr "Home"
#: extensions/places-menu/placeDisplay.js:322
msgid "Recent"
msgstr "Resint"
#: extensions/places-menu/placeDisplay.js:328
msgid "Starred"
msgstr "Preferît"
#: extensions/places-menu/placeDisplay.js:348
msgid "Network"
msgstr "Rêt"
#: extensions/places-menu/placeDisplay.js:355
msgid "Trash"
msgstr "Scovacere"
#: extensions/places-menu/placeDisplay.js:378
msgid "Browse Network"
msgstr "Esplore rêt"
#: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:14
msgid "Cycle Screenshot Sizes"
@@ -230,47 +223,47 @@ msgstr "Non dal teme"
msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell"
msgstr "Il non dal teme, che si cjame da ~/.themes/name/gnome-shell"
#: extensions/window-list/extension.js:92
#: extensions/window-list/extension.js:70
msgid "Close"
msgstr "Siere"
#: extensions/window-list/extension.js:119
#: extensions/window-list/extension.js:97
msgid "Unminimize"
msgstr "Gjave minimizazion"
#: extensions/window-list/extension.js:119
#: extensions/window-list/extension.js:97
msgid "Minimize"
msgstr "Minimize"
#: extensions/window-list/extension.js:126
#: extensions/window-list/extension.js:104
msgid "Unmaximize"
msgstr "Gjave massimizazion"
#: extensions/window-list/extension.js:126
#: extensions/window-list/extension.js:104
msgid "Maximize"
msgstr "Massimize"
#: extensions/window-list/extension.js:641
#: extensions/window-list/extension.js:485
msgid "Minimize all"
msgstr "Minimize ducj"
#: extensions/window-list/extension.js:647
#: extensions/window-list/extension.js:491
msgid "Unminimize all"
msgstr "Gjave a ducj la minimizazion"
#: extensions/window-list/extension.js:653
#: extensions/window-list/extension.js:497
msgid "Maximize all"
msgstr "Massimize ducj"
#: extensions/window-list/extension.js:661
#: extensions/window-list/extension.js:505
msgid "Unmaximize all"
msgstr "Gjave a ducj la massimizazion"
#: extensions/window-list/extension.js:669
#: extensions/window-list/extension.js:513
msgid "Close all"
msgstr "Siere ducj"
#: extensions/window-list/extension.js:911 extensions/window-list/prefs.js:24
#: extensions/window-list/extension.js:780
msgid "Window List"
msgstr "Liste barcons"
@@ -287,7 +280,7 @@ msgstr ""
"barcons. I valôrs pussibii a son “never”, “auto” e “always”."
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:26
#: extensions/window-list/prefs.js:75
#: extensions/window-list/prefs.js:70
msgid "Show windows from all workspaces"
msgstr "Mostre i barcons di ducj i spazis di lavôr"
@@ -312,26 +305,47 @@ msgstr ""
msgid "Show workspace previews in window list"
msgstr "Mostre lis anteprimis dai spazis di lavôr te liste dai barcons"
#: extensions/window-list/prefs.js:42
#: extensions/window-list/prefs.js:37
msgid "Window Grouping"
msgstr "Intropament di barcons"
#: extensions/window-list/prefs.js:47
#: extensions/window-list/prefs.js:42
msgid "Never group windows"
msgstr "No sta meti mai in grup i barcons"
#: extensions/window-list/prefs.js:48
#: extensions/window-list/prefs.js:43
msgid "Group windows when space is limited"
msgstr "Met dongje i barcons cuant che il spazi al è limitât"
#: extensions/window-list/prefs.js:49
#: extensions/window-list/prefs.js:44
msgid "Always group windows"
msgstr "Met simpri in grup i barcons"
#: extensions/window-list/prefs.js:69
#: extensions/window-list/prefs.js:64
msgid "Show on all monitors"
msgstr "Mostre su ducj i visôrs"
#: extensions/window-list/prefs.js:76
msgid "Show workspace previews"
msgstr "Mostre anteprimis dai spazis di lavôr"
#: extensions/workspace-indicator/prefs.js:30
msgid "Show Previews In Top Bar"
msgstr "Mostre anteprimis te sbare superiôr"
#: extensions/workspace-indicator/prefs.js:88
#, javascript-format
msgid "Workspace %d"
msgstr "Spazi di lavôr %d"
#: extensions/workspace-indicator/prefs.js:155
msgid "Workspace Names"
msgstr "Nons dai spazis di lavôr"
#: extensions/workspace-indicator/prefs.js:281
msgid "Add Workspace"
msgstr "Zonte spazi di lavôr"
#: extensions/workspace-indicator/schemas/org.gnome.shell.extensions.workspace-indicator.gschema.xml:12
msgid "Show workspace previews in top bar"
msgstr "Mostre anteprimis dai spazis di lavôr te sbare superiôr"
@@ -340,37 +354,6 @@ msgstr "Mostre anteprimis dai spazis di lavôr te sbare superiôr"
msgid "Workspace Indicator"
msgstr "Indicadôr spazi di lavôr"
#: extensions/workspace-indicator/workspacePrefs.js:29
msgid "Show Previews"
msgstr "Mostre anteprimis"
#: extensions/workspace-indicator/workspacePrefs.js:87
#, javascript-format
msgid "Workspace %d"
msgstr "Spazi di lavôr %d"
#: extensions/workspace-indicator/workspacePrefs.js:154
msgid "Workspace Names"
msgstr "Nons dai spazis di lavôr"
#: extensions/workspace-indicator/workspacePrefs.js:171
msgid "Add Workspace"
msgstr "Zonte spazi di lavôr"
#: extensions/workspace-indicator/workspacePrefs.js:196
msgid "Remove"
msgstr "Gjave"
#: extensions/workspace-indicator/workspacePrefs.js:226
msgid "Workspaces"
msgstr "Spazis di lavôr"
#~ msgid "Computer"
#~ msgstr "Computer"
#~ msgid "Show workspace previews"
#~ msgstr "Mostre anteprimis dai spazis di lavôr"
#~ msgid "Applications"
#~ msgstr "Aplicazions"

127
po/he.po
View File

@@ -9,17 +9,17 @@ msgstr ""
"Project-Id-Version: gnome-shell-extensions\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/"
"issues\n"
"POT-Creation-Date: 2024-10-16 14:41+0000\n"
"PO-Revision-Date: 2024-11-25 10:45+0200\n"
"Last-Translator: Yaron Shahrabani <sh.yaron@gmail.com>\n"
"POT-Creation-Date: 2024-04-29 15:27+0000\n"
"PO-Revision-Date: 2024-06-28 10:34+0300\n"
"Last-Translator: Yosef Or Boczko <yoseforb@gmail.com>\n"
"Language-Team: Hebrew <yoseforb@gmail.com>\n"
"Language: he\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n>2||n==0) ? 1 : 2;\n"
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n>2||n==0) ? 1 : 2\n"
"X-Poedit-SourceCharset: UTF-8\n"
"X-Generator: Poedit 3.4.2\n"
"X-Generator: Gtranslator 46.1\n"
#: data/gnome-classic.desktop.in:3
msgid "GNOME Classic"
@@ -68,7 +68,7 @@ msgstr "הוספת כלל"
#. TRANSLATORS: %s is the filesystem name
#: extensions/drive-menu/extension.js:123
#: extensions/places-menu/placeDisplay.js:187
#: extensions/places-menu/placeDisplay.js:218
#, javascript-format
msgid "Ejecting drive “%s” failed:"
msgstr "שליפת הכונן „%s” נכשלה:"
@@ -114,35 +114,28 @@ msgstr ""
msgid "Places"
msgstr "מקומות"
#: extensions/places-menu/placeDisplay.js:53
#: extensions/places-menu/placeDisplay.js:60
#, javascript-format
msgid "Failed to launch “%s”"
msgstr "הרצת „%s” נכשלה"
#: extensions/places-menu/placeDisplay.js:68
#: extensions/places-menu/placeDisplay.js:75
#, javascript-format
msgid "Failed to mount volume for “%s”"
msgstr "עיגון הכרך „%s” נכשל"
#: extensions/places-menu/placeDisplay.js:316
#: extensions/places-menu/placeDisplay.js:135
#: extensions/places-menu/placeDisplay.js:158
msgid "Computer"
msgstr "מחשב"
#: extensions/places-menu/placeDisplay.js:333
msgid "Home"
msgstr "בית"
#: extensions/places-menu/placeDisplay.js:322
msgid "Recent"
msgstr "אחרונים"
#: extensions/places-menu/placeDisplay.js:328
msgid "Starred"
msgstr "מסומנים בכוכב"
#: extensions/places-menu/placeDisplay.js:348
msgid "Network"
msgstr "רשת"
#: extensions/places-menu/placeDisplay.js:355
msgid "Trash"
msgstr "אשפה"
#: extensions/places-menu/placeDisplay.js:378
msgid "Browse Network"
msgstr "עיון ברשת"
#: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:14
msgid "Cycle Screenshot Sizes"
@@ -232,47 +225,47 @@ msgstr "Theme name"
msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell"
msgstr "The name of the theme, to be loaded from ~/.themes/name/gnome-shell"
#: extensions/window-list/extension.js:92
#: extensions/window-list/extension.js:72
msgid "Close"
msgstr "סגירה"
#: extensions/window-list/extension.js:119
#: extensions/window-list/extension.js:99
msgid "Unminimize"
msgstr "ביטול המזעור"
#: extensions/window-list/extension.js:119
#: extensions/window-list/extension.js:99
msgid "Minimize"
msgstr "מזעור"
#: extensions/window-list/extension.js:126
#: extensions/window-list/extension.js:106
msgid "Unmaximize"
msgstr "ביטול ההגדלה"
#: extensions/window-list/extension.js:126
#: extensions/window-list/extension.js:106
msgid "Maximize"
msgstr "הגדלה"
#: extensions/window-list/extension.js:641
#: extensions/window-list/extension.js:471
msgid "Minimize all"
msgstr "מזעור הכל"
#: extensions/window-list/extension.js:647
#: extensions/window-list/extension.js:477
msgid "Unminimize all"
msgstr "ביטול מזעור הכל"
#: extensions/window-list/extension.js:653
#: extensions/window-list/extension.js:483
msgid "Maximize all"
msgstr "הגדלת הכל"
#: extensions/window-list/extension.js:661
#: extensions/window-list/extension.js:491
msgid "Unmaximize all"
msgstr "ביטול הגדלת הכל"
#: extensions/window-list/extension.js:669
#: extensions/window-list/extension.js:499
msgid "Close all"
msgstr "סגירת הכל"
#: extensions/window-list/extension.js:911 extensions/window-list/prefs.js:24
#: extensions/window-list/extension.js:778
msgid "Window List"
msgstr "רשימת חלונות"
@@ -289,7 +282,7 @@ msgstr ""
"Possible values are “never”, “auto” and “always”."
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:26
#: extensions/window-list/prefs.js:75
#: extensions/window-list/prefs.js:79
msgid "Show windows from all workspaces"
msgstr "הצגת חלונות מכל מרחבי העבודה"
@@ -313,26 +306,47 @@ msgstr ""
msgid "Show workspace previews in window list"
msgstr "הצגת תצוגה מקדימה של מרחבי העבודה ברשימת החלונות"
#: extensions/window-list/prefs.js:42
#: extensions/window-list/prefs.js:35
msgid "Window Grouping"
msgstr "קיבוץ חלונות"
#: extensions/window-list/prefs.js:47
#: extensions/window-list/prefs.js:40
msgid "Never group windows"
msgstr "לעולם לא לקבץ חלונות"
#: extensions/window-list/prefs.js:48
#: extensions/window-list/prefs.js:41
msgid "Group windows when space is limited"
msgstr "קיבוץ חלונות כאשר המקום מוגבל"
#: extensions/window-list/prefs.js:49
#: extensions/window-list/prefs.js:42
msgid "Always group windows"
msgstr "תמיד לקבץ חלונות"
#: extensions/window-list/prefs.js:69
#: extensions/window-list/prefs.js:66
msgid "Show on all monitors"
msgstr "הצגה בכל הצגים"
#: extensions/window-list/prefs.js:92
msgid "Show workspace previews"
msgstr "הצגת תצוגה מקדימה של מרחבי העבודה"
#: extensions/workspace-indicator/prefs.js:30
msgid "Show Previews In Top Bar"
msgstr "הצגת תצוגה מקדימה בלוח העליון"
#: extensions/workspace-indicator/prefs.js:88
#, javascript-format
msgid "Workspace %d"
msgstr "מרחב עבודה %d"
#: extensions/workspace-indicator/prefs.js:155
msgid "Workspace Names"
msgstr "שם מרחב העבודה"
#: extensions/workspace-indicator/prefs.js:281
msgid "Add Workspace"
msgstr "הוספת מרחב עבודה"
#: extensions/workspace-indicator/schemas/org.gnome.shell.extensions.workspace-indicator.gschema.xml:12
msgid "Show workspace previews in top bar"
msgstr "הצגת תצוגה מקדימה של מרחבי העבודה בלוח העליון"
@@ -341,37 +355,6 @@ msgstr "הצגת תצוגה מקדימה של מרחבי העבודה בלוח
msgid "Workspace Indicator"
msgstr "מחוון מרחבי עבודה"
#: extensions/workspace-indicator/workspacePrefs.js:29
msgid "Show Previews"
msgstr "הצגת תצוגות מקדימות"
#: extensions/workspace-indicator/workspacePrefs.js:87
#, javascript-format
msgid "Workspace %d"
msgstr "מרחב עבודה %d"
#: extensions/workspace-indicator/workspacePrefs.js:154
msgid "Workspace Names"
msgstr "שם מרחב העבודה"
#: extensions/workspace-indicator/workspacePrefs.js:171
msgid "Add Workspace"
msgstr "הוספת מרחב עבודה"
#: extensions/workspace-indicator/workspacePrefs.js:196
msgid "Remove"
msgstr "הסרה"
#: extensions/workspace-indicator/workspacePrefs.js:226
msgid "Workspaces"
msgstr "מרחבי עבודה"
#~ msgid "Computer"
#~ msgstr "מחשב"
#~ msgid "Show workspace previews"
#~ msgstr "הצגת תצוגה מקדימה של מרחבי העבודה"
#~ msgid "Applications"
#~ msgstr "יישומים"

123
po/ru.po
View File

@@ -9,8 +9,8 @@ msgstr ""
"Project-Id-Version: gnome-shell-extensions\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/"
"issues\n"
"POT-Creation-Date: 2024-10-16 14:41+0000\n"
"PO-Revision-Date: 2024-10-27 14:01+0300\n"
"POT-Creation-Date: 2024-04-29 15:27+0000\n"
"PO-Revision-Date: 2024-05-25 14:46+0300\n"
"Last-Translator: Artur So <arturios2005@mail.ru>\n"
"Language-Team: Русский <gnome-cyr@gnome.org>\n"
"Language: ru\n"
@@ -19,7 +19,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Poedit 3.5\n"
"X-Generator: Poedit 3.4.4\n"
#: data/gnome-classic.desktop.in:3
msgid "GNOME Classic"
@@ -68,7 +68,7 @@ msgstr "Добавить правило"
#. TRANSLATORS: %s is the filesystem name
#: extensions/drive-menu/extension.js:123
#: extensions/places-menu/placeDisplay.js:187
#: extensions/places-menu/placeDisplay.js:218
#, javascript-format
msgid "Ejecting drive “%s” failed:"
msgstr "Не удалось извлечь диск «%s»:"
@@ -115,35 +115,28 @@ msgstr ""
msgid "Places"
msgstr "Места"
#: extensions/places-menu/placeDisplay.js:53
#: extensions/places-menu/placeDisplay.js:60
#, javascript-format
msgid "Failed to launch “%s”"
msgstr "Не удалось запустить «%s»"
#: extensions/places-menu/placeDisplay.js:68
#: extensions/places-menu/placeDisplay.js:75
#, javascript-format
msgid "Failed to mount volume for “%s”"
msgstr "Не удалось смонтировать том для «%s»"
#: extensions/places-menu/placeDisplay.js:316
#: extensions/places-menu/placeDisplay.js:135
#: extensions/places-menu/placeDisplay.js:158
msgid "Computer"
msgstr "Компьютер"
#: extensions/places-menu/placeDisplay.js:333
msgid "Home"
msgstr "Домашняя папка"
#: extensions/places-menu/placeDisplay.js:322
msgid "Recent"
msgstr "Недавние"
#: extensions/places-menu/placeDisplay.js:328
msgid "Starred"
msgstr "Избранные"
#: extensions/places-menu/placeDisplay.js:348
msgid "Network"
msgstr "Сеть"
#: extensions/places-menu/placeDisplay.js:355
msgid "Trash"
msgstr "Корзина"
#: extensions/places-menu/placeDisplay.js:378
msgid "Browse Network"
msgstr "Обзор сети"
#: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:14
msgid "Cycle Screenshot Sizes"
@@ -233,49 +226,49 @@ msgstr "Название темы"
msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell"
msgstr "Название темы, загружаемой из ~/.themes/name/gnome-shell"
#: extensions/window-list/extension.js:92
#: extensions/window-list/extension.js:72
msgid "Close"
msgstr "Закрыть"
# ну или "восстановить", правда тогда появляется неоднозначный повтор (unmaximize)
#: extensions/window-list/extension.js:119
#: extensions/window-list/extension.js:99
msgid "Unminimize"
msgstr "Вернуть"
#: extensions/window-list/extension.js:119
#: extensions/window-list/extension.js:99
msgid "Minimize"
msgstr "Свернуть"
#: extensions/window-list/extension.js:126
#: extensions/window-list/extension.js:106
msgid "Unmaximize"
msgstr "Восстановить"
#: extensions/window-list/extension.js:126
#: extensions/window-list/extension.js:106
msgid "Maximize"
msgstr "Развернуть"
#: extensions/window-list/extension.js:641
#: extensions/window-list/extension.js:471
msgid "Minimize all"
msgstr "Свернуть все"
# ну или "восстановить", правда тогда появляется неоднозначный повтор (unmaximize)
#: extensions/window-list/extension.js:647
#: extensions/window-list/extension.js:477
msgid "Unminimize all"
msgstr "Вернуть все"
#: extensions/window-list/extension.js:653
#: extensions/window-list/extension.js:483
msgid "Maximize all"
msgstr "Развернуть все"
#: extensions/window-list/extension.js:661
#: extensions/window-list/extension.js:491
msgid "Unmaximize all"
msgstr "Восстановить все"
#: extensions/window-list/extension.js:669
#: extensions/window-list/extension.js:499
msgid "Close all"
msgstr "Закрыть все"
#: extensions/window-list/extension.js:911 extensions/window-list/prefs.js:24
#: extensions/window-list/extension.js:778
msgid "Window List"
msgstr "Список окон"
@@ -293,7 +286,7 @@ msgstr ""
"«always» — всегда."
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:26
#: extensions/window-list/prefs.js:75
#: extensions/window-list/prefs.js:79
msgid "Show windows from all workspaces"
msgstr "Показывать окна со всех рабочих столов"
@@ -318,26 +311,47 @@ msgstr ""
msgid "Show workspace previews in window list"
msgstr "Показывать предпросмотры рабочих столов в списке окон"
#: extensions/window-list/prefs.js:42
#: extensions/window-list/prefs.js:35
msgid "Window Grouping"
msgstr "Группировка окон"
#: extensions/window-list/prefs.js:47
#: extensions/window-list/prefs.js:40
msgid "Never group windows"
msgstr "Никогда не группировать окна"
#: extensions/window-list/prefs.js:48
#: extensions/window-list/prefs.js:41
msgid "Group windows when space is limited"
msgstr "Группировать окна, если место ограничено"
#: extensions/window-list/prefs.js:49
#: extensions/window-list/prefs.js:42
msgid "Always group windows"
msgstr "Всегда группировать окна"
#: extensions/window-list/prefs.js:69
#: extensions/window-list/prefs.js:66
msgid "Show on all monitors"
msgstr "Показывать на всех мониторах"
#: extensions/window-list/prefs.js:92
msgid "Show workspace previews"
msgstr "Показывать предпросмотры рабочих столов"
#: extensions/workspace-indicator/prefs.js:30
msgid "Show Previews In Top Bar"
msgstr "Показывать предпросмотры в верхней панели"
#: extensions/workspace-indicator/prefs.js:88
#, javascript-format
msgid "Workspace %d"
msgstr "Рабочий стол %d"
#: extensions/workspace-indicator/prefs.js:155
msgid "Workspace Names"
msgstr "Названия рабочих столов"
#: extensions/workspace-indicator/prefs.js:281
msgid "Add Workspace"
msgstr "Добавить рабочий стол"
#: extensions/workspace-indicator/schemas/org.gnome.shell.extensions.workspace-indicator.gschema.xml:12
msgid "Show workspace previews in top bar"
msgstr "Показывать предпросмотры рабочих столов в верхней панели"
@@ -346,36 +360,5 @@ msgstr "Показывать предпросмотры рабочих стол
msgid "Workspace Indicator"
msgstr "Индикатор рабочих столов"
#: extensions/workspace-indicator/workspacePrefs.js:29
msgid "Show Previews"
msgstr "Показывать предпросмотры"
#: extensions/workspace-indicator/workspacePrefs.js:87
#, javascript-format
msgid "Workspace %d"
msgstr "Рабочий стол %d"
#: extensions/workspace-indicator/workspacePrefs.js:154
msgid "Workspace Names"
msgstr "Названия рабочих столов"
#: extensions/workspace-indicator/workspacePrefs.js:171
msgid "Add Workspace"
msgstr "Добавить рабочий стол"
#: extensions/workspace-indicator/workspacePrefs.js:196
msgid "Remove"
msgstr "Удалить"
#: extensions/workspace-indicator/workspacePrefs.js:226
msgid "Workspaces"
msgstr "Рабочие столы"
#~ msgid "Computer"
#~ msgstr "Компьютер"
#~ msgid "Show workspace previews"
#~ msgstr "Показывать предпросмотры рабочих столов"
#~ msgid "Applications"
#~ msgstr "Приложения"

115
po/sl.po
View File

@@ -9,8 +9,8 @@ msgstr ""
"Project-Id-Version: gnome-shell-extensions\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/"
"issues\n"
"POT-Creation-Date: 2024-10-16 14:41+0000\n"
"PO-Revision-Date: 2024-10-16 23:41+0200\n"
"POT-Creation-Date: 2024-04-29 15:27+0000\n"
"PO-Revision-Date: 2024-05-02 00:11+0200\n"
"Last-Translator: Martin Srebotnjak <miles@filmsi.net>\n"
"Language-Team: Slovenian GNOME Translation Team <gnome-si@googlegroups.com>\n"
"Language: sl_SI\n"
@@ -69,7 +69,7 @@ msgstr "Dodaj pravilo"
#. TRANSLATORS: %s is the filesystem name
#: extensions/drive-menu/extension.js:123
#: extensions/places-menu/placeDisplay.js:187
#: extensions/places-menu/placeDisplay.js:218
#, javascript-format
msgid "Ejecting drive “%s” failed:"
msgstr "Izmetavanje pogona »%s« je spodletelo:"
@@ -115,35 +115,28 @@ msgstr ""
msgid "Places"
msgstr "Mesta"
#: extensions/places-menu/placeDisplay.js:53
#: extensions/places-menu/placeDisplay.js:60
#, javascript-format
msgid "Failed to launch “%s”"
msgstr "Zaganjanje »%s« je spodletelo."
#: extensions/places-menu/placeDisplay.js:68
#: extensions/places-menu/placeDisplay.js:75
#, javascript-format
msgid "Failed to mount volume for “%s”"
msgstr "Priklapljanje nosilca za »%s« je spodletelo"
#: extensions/places-menu/placeDisplay.js:316
#: extensions/places-menu/placeDisplay.js:135
#: extensions/places-menu/placeDisplay.js:158
msgid "Computer"
msgstr "Računalnik"
#: extensions/places-menu/placeDisplay.js:333
msgid "Home"
msgstr "Osebna mapa"
#: extensions/places-menu/placeDisplay.js:322
msgid "Recent"
msgstr "Nedavno"
#: extensions/places-menu/placeDisplay.js:328
msgid "Starred"
msgstr "Z zvezdico"
#: extensions/places-menu/placeDisplay.js:348
msgid "Network"
msgstr "Omrežje"
#: extensions/places-menu/placeDisplay.js:355
msgid "Trash"
msgstr "Koš"
#: extensions/places-menu/placeDisplay.js:378
msgid "Browse Network"
msgstr "Prebrskaj omrežje"
#: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:14
msgid "Cycle Screenshot Sizes"
@@ -233,47 +226,47 @@ msgstr "Ime teme"
msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell"
msgstr "Ime teme, ki bo naložena iz ~/.themes/name/gnome-shell"
#: extensions/window-list/extension.js:92
#: extensions/window-list/extension.js:72
msgid "Close"
msgstr "Zapri"
#: extensions/window-list/extension.js:119
#: extensions/window-list/extension.js:99
msgid "Unminimize"
msgstr "Povečaj"
#: extensions/window-list/extension.js:119
#: extensions/window-list/extension.js:99
msgid "Minimize"
msgstr "Skrči"
#: extensions/window-list/extension.js:126
#: extensions/window-list/extension.js:106
msgid "Unmaximize"
msgstr "Pomanjšaj"
#: extensions/window-list/extension.js:126
#: extensions/window-list/extension.js:106
msgid "Maximize"
msgstr "Razpni"
#: extensions/window-list/extension.js:641
#: extensions/window-list/extension.js:471
msgid "Minimize all"
msgstr "Skrči vse"
#: extensions/window-list/extension.js:647
#: extensions/window-list/extension.js:477
msgid "Unminimize all"
msgstr "Pomanjšaj vse"
#: extensions/window-list/extension.js:653
#: extensions/window-list/extension.js:483
msgid "Maximize all"
msgstr "Razpni vse"
#: extensions/window-list/extension.js:661
#: extensions/window-list/extension.js:491
msgid "Unmaximize all"
msgstr "Pomanjšaj vse"
#: extensions/window-list/extension.js:669
#: extensions/window-list/extension.js:499
msgid "Close all"
msgstr "Zapri vse"
#: extensions/window-list/extension.js:911 extensions/window-list/prefs.js:24
#: extensions/window-list/extension.js:778
msgid "Window List"
msgstr "Seznam oken"
@@ -290,7 +283,7 @@ msgstr ""
"Veljavne vrednosti so »nikoli«, »samodejno« in »vedno«."
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:26
#: extensions/window-list/prefs.js:75
#: extensions/window-list/prefs.js:79
msgid "Show windows from all workspaces"
msgstr "Pokaži okna vseh delovnih površin"
@@ -314,26 +307,47 @@ msgstr ""
msgid "Show workspace previews in window list"
msgstr "Pokaži predoglede delovne površine na seznamu oken"
#: extensions/window-list/prefs.js:42
#: extensions/window-list/prefs.js:35
msgid "Window Grouping"
msgstr "Združevanje oken"
#: extensions/window-list/prefs.js:47
#: extensions/window-list/prefs.js:40
msgid "Never group windows"
msgstr "Nikoli ne združuj oken"
#: extensions/window-list/prefs.js:48
#: extensions/window-list/prefs.js:41
msgid "Group windows when space is limited"
msgstr "Združi okna, ko je prostor omejen"
#: extensions/window-list/prefs.js:49
#: extensions/window-list/prefs.js:42
msgid "Always group windows"
msgstr "Okna vedno združuj"
#: extensions/window-list/prefs.js:69
#: extensions/window-list/prefs.js:66
msgid "Show on all monitors"
msgstr "Pokaži na vseh zaslonih"
#: extensions/window-list/prefs.js:92
msgid "Show workspace previews"
msgstr "Pokaži predoglede delovne površine"
#: extensions/workspace-indicator/prefs.js:30
msgid "Show Previews In Top Bar"
msgstr "Pokaži predoglede v zgornji vrstici"
#: extensions/workspace-indicator/prefs.js:88
#, javascript-format
msgid "Workspace %d"
msgstr "Delovna površina %d"
#: extensions/workspace-indicator/prefs.js:155
msgid "Workspace Names"
msgstr "Imena delovnih površin"
#: extensions/workspace-indicator/prefs.js:281
msgid "Add Workspace"
msgstr "Dodaj delovno površino"
#: extensions/workspace-indicator/schemas/org.gnome.shell.extensions.workspace-indicator.gschema.xml:12
msgid "Show workspace previews in top bar"
msgstr "Pokaži predoglede delovne površine v zgornji vrstici"
@@ -341,28 +355,3 @@ msgstr "Pokaži predoglede delovne površine v zgornji vrstici"
#: extensions/workspace-indicator/workspaceIndicator.js:430
msgid "Workspace Indicator"
msgstr "Kazalnik delovnih površin"
#: extensions/workspace-indicator/workspacePrefs.js:29
msgid "Show Previews"
msgstr "Pokaži predoglede"
#: extensions/workspace-indicator/workspacePrefs.js:87
#, javascript-format
msgid "Workspace %d"
msgstr "Delovna površina %d"
#: extensions/workspace-indicator/workspacePrefs.js:154
msgid "Workspace Names"
msgstr "Imena delovnih površin"
#: extensions/workspace-indicator/workspacePrefs.js:171
msgid "Add Workspace"
msgstr "Dodaj delovno površino"
#: extensions/workspace-indicator/workspacePrefs.js:196
msgid "Remove"
msgstr "Odstrani"
#: extensions/workspace-indicator/workspacePrefs.js:226
msgid "Workspaces"
msgstr "Delovne površine"

133
po/tr.po
View File

@@ -14,8 +14,8 @@ msgstr ""
"Project-Id-Version: gnome-shell-extensions master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/"
"issues\n"
"POT-Creation-Date: 2024-11-25 08:47+0000\n"
"PO-Revision-Date: 2024-11-30 23:58+0300\n"
"POT-Creation-Date: 2024-08-12 20:31+0000\n"
"PO-Revision-Date: 2024-05-06 05:17+0300\n"
"Last-Translator: Sabri Ünal <yakushabb@gmail.com>\n"
"Language-Team: Turkish <takim@gnome.org.tr>\n"
"Language: tr\n"
@@ -23,7 +23,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Poedit 3.5\n"
"X-Generator: Poedit 3.4.2\n"
#: data/gnome-classic.desktop.in:3
msgid "GNOME Classic"
@@ -42,11 +42,11 @@ msgstr "Wayland üstünde GNOME Klasik"
msgid "GNOME Classic on Xorg"
msgstr "Xorg üstünde GNOME Klasik"
#: extensions/apps-menu/extension.js:125
#: extensions/apps-menu/extension.js:126
msgid "Favorites"
msgstr "Gözdeler"
#: extensions/apps-menu/extension.js:399
#: extensions/apps-menu/extension.js:400
msgid "Apps"
msgstr "Uygulamalar"
@@ -62,17 +62,17 @@ msgstr ""
"Her biri, bir uygulama kimliği (masaüstü dosya adı) ardından gelen iki nokta "
"üst üste ve çalışma alanı numarasını içeren dizgeler listesi"
#: extensions/auto-move-windows/prefs.js:156
#: extensions/auto-move-windows/prefs.js:159
msgid "Workspace Rules"
msgstr "Çalışma Alanı Kuralları"
#: extensions/auto-move-windows/prefs.js:311
#: extensions/auto-move-windows/prefs.js:314
msgid "Add Rule"
msgstr "Kural Ekle"
#. TRANSLATORS: %s is the filesystem name
#: extensions/drive-menu/extension.js:123
#: extensions/places-menu/placeDisplay.js:187
#: extensions/places-menu/placeDisplay.js:218
#, javascript-format
msgid "Ejecting drive “%s” failed:"
msgstr "“%s” sürücüsü çıkarılamadı:"
@@ -115,40 +115,33 @@ msgstr ""
"Yapılan değişikliklerin etkili olması için kabuğun yeniden başlatılması "
"gerekir."
#: extensions/places-menu/extension.js:75
#: extensions/places-menu/extension.js:78
#: extensions/places-menu/extension.js:91
#: extensions/places-menu/extension.js:94
msgid "Places"
msgstr "Yerler"
#: extensions/places-menu/placeDisplay.js:53
#: extensions/places-menu/placeDisplay.js:60
#, javascript-format
msgid "Failed to launch “%s”"
msgstr "“%s” başlatılamadı"
#: extensions/places-menu/placeDisplay.js:68
#: extensions/places-menu/placeDisplay.js:75
#, javascript-format
msgid "Failed to mount volume for “%s”"
msgstr "“%s” için birim bağlanamadı"
#: extensions/places-menu/placeDisplay.js:316
#: extensions/places-menu/placeDisplay.js:135
#: extensions/places-menu/placeDisplay.js:158
msgid "Computer"
msgstr "Bilgisayar"
#: extensions/places-menu/placeDisplay.js:333
msgid "Home"
msgstr "Ev"
#: extensions/places-menu/placeDisplay.js:322
msgid "Recent"
msgstr "Son"
#: extensions/places-menu/placeDisplay.js:328
msgid "Starred"
msgstr "Yıldızlı"
#: extensions/places-menu/placeDisplay.js:348
msgid "Network"
msgstr "Ağ"
#: extensions/places-menu/placeDisplay.js:355
msgid "Trash"
msgstr "Çöp"
#: extensions/places-menu/placeDisplay.js:378
msgid "Browse Network"
msgstr "Ağa Gözat"
#: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:14
msgid "Cycle Screenshot Sizes"
@@ -238,47 +231,47 @@ msgstr "Tema adı"
msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell"
msgstr "~/.themes/name/gnome-shell konumundan edinilen tema adı"
#: extensions/window-list/extension.js:92
#: extensions/window-list/extension.js:70
msgid "Close"
msgstr "Kapat"
#: extensions/window-list/extension.js:119
#: extensions/window-list/extension.js:97
msgid "Unminimize"
msgstr "Önceki duruma getir"
#: extensions/window-list/extension.js:119
#: extensions/window-list/extension.js:97
msgid "Minimize"
msgstr "Simge durumuna küçült"
#: extensions/window-list/extension.js:126
#: extensions/window-list/extension.js:104
msgid "Unmaximize"
msgstr "Önceki duruma getir"
#: extensions/window-list/extension.js:126
#: extensions/window-list/extension.js:104
msgid "Maximize"
msgstr "En büyük duruma getir"
#: extensions/window-list/extension.js:641
#: extensions/window-list/extension.js:489
msgid "Minimize all"
msgstr "Tümünü simge durumuna küçült"
#: extensions/window-list/extension.js:647
#: extensions/window-list/extension.js:495
msgid "Unminimize all"
msgstr "Tümünü önceki duruma getir"
#: extensions/window-list/extension.js:653
#: extensions/window-list/extension.js:501
msgid "Maximize all"
msgstr "Tümünü en büyük duruma getir"
#: extensions/window-list/extension.js:661
#: extensions/window-list/extension.js:509
msgid "Unmaximize all"
msgstr "Tümünü önceki duruma getir"
#: extensions/window-list/extension.js:669
#: extensions/window-list/extension.js:517
msgid "Close all"
msgstr "Tümünü kapat"
#: extensions/window-list/extension.js:911 extensions/window-list/prefs.js:23
#: extensions/window-list/extension.js:789
msgid "Window List"
msgstr "Pencere Listesi"
@@ -292,11 +285,11 @@ msgid ""
"Possible values are “never”, “auto” and “always”."
msgstr ""
"Pencere listesinde aynı uygulamaların ne zaman kümeleneceğine karar verir. "
"Olası değerler: “never” (hiçbir zaman), “auto” (kendiliğinden) ve "
"“always” (her zaman)."
"Olası değerler: “never” (hiçbir zaman), “auto” (kendiliğinden) ve “always” "
"(her zaman)."
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:26
#: extensions/window-list/prefs.js:74
#: extensions/window-list/prefs.js:79
msgid "Show windows from all workspaces"
msgstr "Tüm çalışma alanlarındaki pencereleri göster"
@@ -322,26 +315,47 @@ msgstr ""
msgid "Show workspace previews in window list"
msgstr "Pencere listesinde çalışma alanı ön izlemelerini göster"
#: extensions/window-list/prefs.js:41
#: extensions/window-list/prefs.js:35
msgid "Window Grouping"
msgstr "Pencere Kümeleme"
#: extensions/window-list/prefs.js:46
#: extensions/window-list/prefs.js:40
msgid "Never group windows"
msgstr "Pencereleri asla kümeleme"
#: extensions/window-list/prefs.js:47
#: extensions/window-list/prefs.js:41
msgid "Group windows when space is limited"
msgstr "Yer kısıtlıyken pencereleri kümele"
#: extensions/window-list/prefs.js:48
#: extensions/window-list/prefs.js:42
msgid "Always group windows"
msgstr "Pencereleri her zaman kümele"
#: extensions/window-list/prefs.js:68
#: extensions/window-list/prefs.js:66
msgid "Show on all monitors"
msgstr "Tüm monitörlerde göster"
#: extensions/window-list/prefs.js:92
msgid "Show workspace previews"
msgstr "Çalışma alanı ön izlemelerini göster"
#: extensions/workspace-indicator/prefs.js:30
msgid "Show Previews In Top Bar"
msgstr "Ön İzlemeleri Üst Çubukta Göster"
#: extensions/workspace-indicator/prefs.js:88
#, javascript-format
msgid "Workspace %d"
msgstr "Çalışma Alanı %d"
#: extensions/workspace-indicator/prefs.js:155
msgid "Workspace Names"
msgstr "Çalışma Alanı Adları"
#: extensions/workspace-indicator/prefs.js:281
msgid "Add Workspace"
msgstr "Çalışma Alanı Ekle"
#: extensions/workspace-indicator/schemas/org.gnome.shell.extensions.workspace-indicator.gschema.xml:12
msgid "Show workspace previews in top bar"
msgstr "Çalışma alanı ön izlemelerini üst çubukta göster"
@@ -349,28 +363,3 @@ msgstr "Çalışma alanı ön izlemelerini üst çubukta göster"
#: extensions/workspace-indicator/workspaceIndicator.js:430
msgid "Workspace Indicator"
msgstr "Çalışma Alanı Belirteci"
#: extensions/workspace-indicator/workspacePrefs.js:28
msgid "Show Previews"
msgstr "Ön İzlemeleri Göster"
#: extensions/workspace-indicator/workspacePrefs.js:86
#, javascript-format
msgid "Workspace %d"
msgstr "Çalışma Alanı %d"
#: extensions/workspace-indicator/workspacePrefs.js:153
msgid "Workspace Names"
msgstr "Çalışma Alanı Adları"
#: extensions/workspace-indicator/workspacePrefs.js:170
msgid "Add Workspace"
msgstr "Çalışma Alanı Ekle"
#: extensions/workspace-indicator/workspacePrefs.js:195
msgid "Remove"
msgstr "Kaldır"
#: extensions/workspace-indicator/workspacePrefs.js:225
msgid "Workspaces"
msgstr "Çalışma Alanları"