Compare commits

...

169 Commits

Author SHA1 Message Date
Jeremy Bícha e864d0d1cc New upstream version 45~beta 2023-08-16 22:55:57 -04:00
Florian Müllner 4345703c2e Bump version to 45.beta
Update NEWS.
2023-08-07 16:41:23 +02:00
Florian Müllner a911447375 js: Port to ESM
The shell pulled the trigger and switched to ESM for all its
imports, follow suit.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/269>
2023-08-06 15:59:35 +02:00
Florian Müllner 2d3307c657 window-list: Use InjectionManager instead of custom classes
Once the shell is ported to ESM, it will no longer be possible
to replace entire classes (even when imported). Prepare for that
by overriding methods of the regular WorkspaceBackground class
instead.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/268>
2023-08-06 13:45:56 +02:00
Florian Müllner d59bc0b7f0 window-list: Do not inject WindowPicker into Main
This will become impossible once Main is converted to ESM. Instead,
use the Extension class itself to hold the window picker.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/268>
2023-08-06 13:45:56 +02:00
Florian Müllner cb8c2eb27f windowsNavigator: Use InjectionManager instead of custom classes
Once the shell is ported to ESM, it will no longer be possible
to replace entire classes (even when exported). Prepare for that
by overriding methods of the regular classes, instead of creating
custom subclasses.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/268>
2023-08-06 13:45:56 +02:00
Florian Müllner 0544729bba launch-new-instance: Use InjectionManager
The extension uses a straight-forward override that doesn't
benefit a lot from the new InjectionManager class, but let's
use the provided convenience API anyway.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/268>
2023-08-05 21:32:27 +02:00
Florian Müllner 017c410a6a native-window-placement: Use InjectionManager
The new convenience class was modelled after the code in the
extension, so it's a drop-in replacement.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/268>
2023-08-05 18:53:41 +02:00
Florian Müllner f2c73329be extensions: Use new convenience classes
Convenience APIs for extensions are now provided as Extension/Prefs
base classes.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/268>
2023-08-05 18:53:41 +02:00
Efstathios Iosifidis ce644be96f Update Greek translation 2023-08-01 20:41:56 +00:00
Florian Müllner e75a1a15ac extensions: Import ExtensionUtils as module
ExtensionUtils has been converted to ESM and split into two modules,
for extensions and prefs respectively.

Adjust to those changes.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/266>
2023-07-15 14:13:25 +02:00
Florian Müllner 1155170c7c window-list: Stop using getCurrentExtension()
The method is no longer exported. There will be a nicer alternative
soon, in the meantime we can just keep track of our main Extension
object ourselves.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/266>
2023-07-15 14:10:27 +02:00
Florian Müllner 6d8f54a20b js: Really use connectObject()
I forgot in two places to change the actual connect() function
to connectObject() 🤦️

Fixes commit 3bfaf6f88a.
2023-07-10 07:22:25 +02:00
Florian Müllner 93a2e7bdba extensions: Stop using global.log()
It has been deprecated since 3.6(!) in favor of the actually
global log().

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/264>
2023-07-10 06:51:45 +02:00
Florian Müllner 3bfaf6f88a js: Use connectObject()
gnome-shell added (dis)connectObject() methods to partially automate
signal handling. It doesn't only save a significant amount of code,
but also makes it harder to miss cleaning up on destroy.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/263>
2023-07-09 18:45:07 +02:00
Florian Müllner 37baccd9fc window-list: Remove some dead code
The code that connected the signal was removed in 9fa522c29a.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/263>
2023-07-09 18:33:52 +02:00
Florian Müllner 9365725246 ci: Use wrapper to run eslint
The eslint job report its results as artifacts in junit format,
so that gitlab can present them in its UI.

However many psople miss that, and unsuccessfully check the logs
instead.

Address this by using a simplified version of gnome-shell's eslint
wrapper, so we can report results both on stdout and in a file
without re-running the linter.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/262>
2023-07-09 16:21:03 +02:00
Florian Müllner f1257c4523 Ignore some common patterns
Ignore patches, vim session files and project configuration
of GNOME Builder and VSCode.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/261>
2023-07-09 15:59:34 +02:00
Florian Müllner f0865f039e Clean up .gitignore
Meson enforces a separate build dir, so we no longer have to
care about build artifacts in the source tree. Same applies for
all the generated crap autotools like to spread around.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/261>
2023-07-09 15:59:34 +02:00
Florian Müllner 4955c20669 data: Remove left-over file
We no longer have a separate classic theme that could(*) use
custom assets, so the file is now very officially a left-over.

(*) spoiler alert: The made-up property where the image was
used has been ignored by gnome-shell for years

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/260>
2023-07-09 14:27:44 +02:00
Florian Müllner cf007dd472 extensions: Turn extensions into modules
As gnome-shell is moving to ESM, it will now load extensions as
standard modules instead of using legacy imports. The change boils
down to exporting the Extension class as default, but we can also
start using standard imports for introspected modules now, so do
that at the same time.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/259>
2023-07-07 00:35:08 +02:00
Florian Müllner 701b14ecbf extensions: Use extension class for all extensions
This will be the only supported entry point when extension loading
switches to dynamic imports, so prepare for that by wrapping the
remaining standalone enable()/disable() methods in Extension classes.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/259>
2023-07-07 00:12:41 +02:00
Florian Müllner 18674b2e35 lint: Migrate eslint-plugin-jsdoc rule
Migrate a removed jsdoc, copied from the corresponding gnome-shell
change.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/259>
2023-07-07 00:11:57 +02:00
Florian Müllner 278d0afc79 Bump version to 45.alpha
Update NEWS.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/258>
2023-07-03 00:25:31 +02:00
Florian Müllner 90031432da build: Remove left-over variable
We no longer install a separate mode style, so the variable is
now unused.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/258>
2023-07-03 00:25:03 +02:00
Florian Müllner b11f0f16f4 light-style: Always save scheme preference on enable()
Disable() should restore the scheme preference that was used when
the extension was enabled, not when it was first initialized.

Even if it's unlikely to be relevant in practice, let's make sure
we save the correct state.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/257>
2023-07-02 23:24:33 +02:00
Florian Müllner b7895ad956 extensions: Add new light-style extension
Now that gnome-shell supports a light style, people may want to
use it without forcing all apps to be light.

Add a small extension that switches the default to light, so the
shell follows the regular "dark style" preference.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/256>
2023-06-23 14:36:09 +00:00
Arik W 22b9f888fb window-list: Add tooltip for long window titles
Adds a tooltip feature to the window buttons.
If a button’s label is too long to fit, a tooltip will show the complete content when the user hovers over the button.

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

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/251>
2023-06-18 19:08:53 +00:00
Florian Müllner 61a260bc94 places-menu: Account for app menu removal
The app menu has been removed from the top bar, so we can no longer
base our own indicator position on it.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/255>
2023-05-27 00:44:26 +02:00
Florian Müllner ced3c94dfa classic: Account for removal of app menu
We no longer include the app menu in the regular GNOME session,
we shouldn't bring it back in Classic (not least because there
never was a similar menu in GNOME 2).

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/255>
2023-05-26 21:00:14 +02:00
Florian Müllner 904ead1fb1 window-list: Replace classic- with light style
Now that classic styling is based on color scheme instead of
a dedicated "classic" stylesheet, we should do the same for
extension styling, with the bonus that it also works with the
regular appearance setting outside the classic session.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/254>
2023-05-26 20:26:43 +02:00
Florian Müllner f6b6049bc5 classic: Use light color scheme instead of classic styling
gnome-shell now includes a light variant, and supports switching
between dark- and light styling at runtime.

That means we no longer have to build our own stylesheet, and can
instead just instruct gnome-shell to always use the light style
in the classic session.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/254>
2023-05-26 20:26:43 +02:00
Alexander Weichart ca1c4b0f9e window-list: Improve default stylesheet
Adjust colors to be more consistent with the current shell look.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/253>
2023-05-26 18:25:35 +02:00
Jeremy Bicha 930595003d New upstream version 44.0 2023-03-27 08:47:18 -04:00
Florian Müllner 58b4b3c8d6 Bump version to 44.0
Update NEWS.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/249>
2023-03-19 05:14:23 +01:00
Florian Müllner 25cc126ebc build: Add configuration summary
Meson now has a summary() function to easily summarize the build
configuration after the project was configured, use that for some
fancy output when the feature is available.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/249>
2023-03-19 04:52:56 +01:00
Florian Müllner 30bac19c5a build: Compile gschemas if necessary
It is good practice to recompile schemas after installing a new
schema, but for some reason we never did.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/249>
2023-03-19 04:30:45 +01:00
Florian Müllner 7689d660dc build: Bump meson requirement
Using the same minimum version as gnome-shell should be
uncontroversial, and allows us to use some new features.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/249>
2023-03-19 04:14:01 +01:00
Jeremy Bicha 51df22adcf New upstream version 44~rc 2023-03-07 12:19:33 -05:00
Florian Müllner e0d5ede296 Bump version to 44.rc
Update NEWS.
2023-03-06 04:35:46 +01:00
Florian Müllner 2c25e22145 Update sass submodule 2023-03-06 04:34:45 +01:00
Jeremy Bicha 6ff6eb2c22 New upstream version 44~beta 2023-02-15 10:59:26 -05:00
Florian Müllner ffa9806d40 Bump version to 44.beta
Update NEWS.
2023-02-14 18:01:27 +01:00
Florian Müllner 5ff41b9151 Update sass submodule 2023-02-14 17:59:37 +01:00
robxnano 7e8ba59304 Center-align all menus
Make popup menus center-aligned on their parent buttons, to
match the default GNOME Shell panel menus. Affects:
- Places menu
- Drive menu
- Workspace indicator
- Window menu workspace indicator

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/246>
2023-01-13 16:12:03 +00:00
Vasil Pupkin 497d175ae9 Update Belarusian translation 2022-11-27 18:57:09 +00:00
Jeremy Bicha 6bee46bf1a New upstream version 43.1 2022-11-22 14:13:08 -05:00
Florian Müllner de48d02c62 Bump version to 43.1
Update NEWS.
2022-10-22 18:11:14 +02:00
Florian Müllner ac3e095e27 Update sass submodule 2022-10-22 18:09:45 +02:00
mowemcfc 95a58358f8 build: Change zip export script shebang to use bash
The use of () array syntax and $() (which are not available in Bourne
shell) command substitution implies that this script is meant to be
executed using bash.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/244>
2022-10-22 15:02:56 +02:00
Florian Müllner cc72a34973 window-list: Explicitly dispose settings on destroy
This will not only disconnect the signal handler, but also remove
any bindings. This works around a crash that happens if a setting
that triggers the binding changes at the same time as a setting
that rebuilds the window list; in that case, the binding handler
runs after gjs has dropped its wrapper object, but before the
binding is removed automaticalled when the object is finalized.

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

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/243>
2022-09-30 19:55:44 +02:00
Jeremy Bicha f4347d240a New upstream version 43.0 2022-09-19 10:57:25 -04:00
Sabri Ünal 77b35dcda3 Update Turkish translation 2022-09-18 08:11:02 +00:00
Florian Müllner 6ebb41b1e8 Bump version to 43.0
Update NEWS.
2022-09-17 18:41:49 +02:00
Florian Müllner 11cb22bd24 Update sass submodule 2022-09-17 18:40:47 +02:00
Aleksandr Melman 6fc3f5cea2 Update Russian translation 2022-09-17 16:18:03 +00:00
Zurab Kargareteli c8484e77d3 Update Georgian translation 2022-09-14 14:37:50 +00:00
Pawan Chitrakar 98c5d4a739 Update Nepali translation 2022-09-07 21:15:50 +00:00
Jeremy Bicha 81b8ad4499 New upstream version 43~rc 2022-09-06 14:38:13 -04:00
Florian Müllner 01d3d8fd6d Bump version to 43.rc
Update NEWS.
2022-09-04 15:25:43 +02:00
Florian Müllner 47c2834ffa Update sass submodule 2022-09-04 15:24:50 +02:00
Jeremy Bicha aeee81a82c New upstream version 43~beta 2022-08-21 10:59:16 -04:00
Florian Müllner 9f88e98d1b extensions: Stop monkey-patching signal methods
gnome-shell added an EventEmitter class that can be used as base
for any non-GObject class that needs to emit signals.

Use that instead of the old monkey-patching.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/240>
2022-08-20 19:03:36 +02:00
Florian Müllner 4b7055d0da places-menu: Mark PlacesManager as exported
For some reason eslint failed to complain about this.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/240>
2022-08-20 19:03:36 +02:00
Florian Müllner 563d7770d3 lint: Sync with gnome-shell
gnome-shell started transitioning to gjs' object spacing rule,
i.e. `{foo: 42}` instead of `{ foo: 42 }`.

We have a much smaller code base than the shell and aren't using
a secondary "allowed-but-deprecated" configuration that allows a
gradual transition, so just pull the switch and update to the new
style.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/240>
2022-08-20 19:00:32 +02:00
Florian Müllner d62b58b1d9 Bump version to 43.beta
Update NEWS.
2022-08-10 20:03:20 +02:00
Florian Müllner 4f78bb96a7 Update sass submodule 2022-08-10 20:03:20 +02:00
Florian Müllner c94678e2be classic: Adjust to quick settings
The aggregate menu has been replaced with quick settings. Adjust
the session mode definition accordingly.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/238>
2022-08-10 16:21:13 +02:00
Nart Tlisha 3c515d42f2 Update Abkhazian translation 2022-07-26 10:45:41 +00:00
Jeremy Bicha fcefdc3271 New upstream version 42.3 2022-07-13 17:46:10 +02:00
Florian Müllner bb5869f8df ci: Instruct gitlab to checkout submodules
... instead of doing it in the script.

This will become important when we switch to a CI image with an
updated meson version that no longer checks out submodules as
part of the dist command.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/237>
2022-07-11 00:33:47 +02:00
Florian Müllner faaa66eb3f ci: Don't define image globally
This has been deprecated in favor of defining the default image
in the default section.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/237>
2022-07-11 00:33:47 +02:00
Florian Müllner 14c60eb954 Bump version to 43.alpha
Update NEWS.
2022-07-10 14:36:37 +02:00
Florian Müllner 0234cd74f7 Update sass submodule 2022-07-10 14:36:37 +02:00
Florian Müllner f637e81c8c native-window-placement: Minor style fix
JSDoc prefer "object" over "Object", so update the doc comment
accordingly.
2022-07-10 14:20:25 +02:00
Marco Ciampa ea82830a9f Update it.po, corrected the file-manager name File. 2022-07-06 12:51:16 +00:00
Florian Müllner 8b62c38e20 Bump version to 42.3
Update NEWS.
2022-07-02 18:41:28 +02:00
Florian Müllner 4667b4704d window-list: Open menu on long press
Right-click isn't available on touch, so implement long-press as
an alternative.

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

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/233>
2022-06-20 14:45:58 +02:00
Florian Müllner fe60614b41 window-list: Fix primary button action on touch
If a click event was triggered via touch rather than a pointer
device, the button parameter is 0 rather than a mouse button
number.

Account for that to make sure that touch events are not misinterpreted
as right clicks.

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

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/233>
2022-06-20 14:45:58 +02:00
Florian Müllner 1e833f542f screenshot-window-sizer: Delay size popup
We use the actual frame size for the popup rather than the target
size. That means (on wayland), we have to wait for the size to
actually change.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/232>
2022-06-09 19:20:44 +02:00
Florian Müllner faabfa11c2 screenshot-window-sizer: Remove superfluous check
We already filter out sizes that don't fit the screen when
building the scaledSizes array, no need to check again.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/232>
2022-06-09 19:06:24 +02:00
Jeremy Bicha 7a017c1e76 New upstream version 42.2 2022-06-03 09:19:21 -04:00
Jeremy Bicha b2455f0ecd New upstream version 42.1 2022-05-09 08:02:09 -04:00
Jeremy Bicha 573aba17d7 New upstream version 42.0 2022-03-14 11:29:53 -04:00
Jeremy Bicha 2117c42d74 New upstream version 42~rc 2022-03-08 09:32:26 -05:00
Marco Trevisan (Treviño) 5edffcd859 New upstream version 42~beta 2022-02-23 02:57:09 +01:00
Jeremy Bicha d8b526a715 New upstream version 41.1 2021-12-12 20:28:55 -05:00
Florian Müllner a5b6871562 Bump version to 41.1
Update NEWS.

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

Fix this by moving our translation to the keyboardBox instead.

(cherry picked from commit 02e5029eb6)

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/202>
2021-12-11 14:04:21 +01:00
Sebastian Keller 486cb59aff native-window-placement: Remove custom styling
The window-picker padding was causing it to become smaller in the
overview resulting in a jump when opening it and caused sizing issues
with the workspace view in the app picker. However it is not needed
anymore with the new overview, so this can be fixed by simply removing
it.

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

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

Fixes: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/issues/301
Fixes: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/issues/309
(cherry picked from commit 4a26cecd7d)

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/202>
2021-12-11 14:04:07 +01:00
Neal Gompa de9a3df7bd classic: Add X-GNOME-SessionRegisters
GDM has supported sessions registering with it for a few years now so
it can know when to shut down the greeter. Having the GNOME Classic
session declare that it will register itself allows GDM to avoid
executing a fallback codepath.

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

(cherry picked from commit a79d2afb2d)

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/202>
2021-12-11 14:03:33 +01:00
Jeremy Bicha db131fc7da New upstream version 41.0 2021-10-03 20:42:40 -04:00
Jeremy Bicha 80c6656c4f New upstream version 40.4 2021-08-29 08:50:41 -04:00
Florian Müllner a5a3523df8 Bump version to 40.4
Update NEWS.
2021-08-18 01:18:19 +02:00
Florian Müllner 06acd9ff25 build: Rewrite gettext domain when exporting zips
Now that every extension picks up its gettext domain from
its metadata, we can easily change it when exporting the
zips.

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

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

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

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

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

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

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

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

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

Address this by monitoring the item itself for visibility changes.

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

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

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

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

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

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

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

This a is similar change to 8bad8a3b63.

Fixes #315.

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

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

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/172>
2021-05-25 19:26:08 +02:00
Florian Müllner cc2f46b837 Post-release version bump 2021-05-14 17:00:35 +02:00
Simon McVittie 9f25047e24 New upstream version 3.38.2 2020-12-03 10:11:14 +00:00
Florian Müllner fb66afbf71 Bump version to 3.38.2
Update NEWS.
2020-12-03 00:14:49 +01:00
Florian Müllner 365fa6abc9 Update sass submodule 2020-12-03 00:14:49 +01:00
Florian Müllner d7a824f35f workspace-indicator: Use overlap to determine preview visibility
In order to better reflect the actual workspace, show any preview
that is at least partially located on the monitor, not only those
that have the major part on that monitor.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/142>

(cherry picked from commit 50d3ee5703)
2020-12-03 00:09:21 +01:00
Florian Müllner 0d8e412220 window-list: Use overlap to determine preview visibility
In order to better reflect the actual workspace, show any preview
that is at least partially located on the monitor, not only those
that have the major part on that monitor.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/142>

(cherry picked from commit 08dfb78815)
2020-12-03 00:09:19 +01:00
Florian Müllner 991f6ef508 workspace-indicator: Account for monitor offset in window previews
Windows' frame rects are in screen coordinates, while the workspace
thumbnails are based on the monitor work area. Unless we account
for the difference, previews end up mispositioned in multi-monitor
setups.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/142>

(cherry picked from commit 6949a5d075)
2020-12-03 00:09:16 +01:00
Florian Müllner 37f03f5e2e window-list: Account for monitor offset in window previews
Windows' frame rects are in screen coordinates, while the workspace
thumbnails are based on the monitor work area. Unless we account
for the difference, previews end up mispositioned in multi-monitor
setups.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/142>

(cherry picked from commit 893d3b0473)
2020-12-03 00:09:12 +01:00
Florian Müllner b4a4ff0a06 workspace-indicator: Round calculated preview sizes
While not strictly necessary, there's no reason to differ from the
copy in the window-list extension ...

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/142>

(cherry picked from commit f5128e13f2)
2020-12-03 00:09:09 +01:00
Ray Strode de8876bd5e window-list: Stop monitoring drag operation if window list is destroyed
If a user is in the middle of a drag in the window list and the
window list associated with the drag gets destroyed, the drag
monitor gets leaked.

Later when the drag motion is processed, spew goes to the log:

clutter_actor_contains: assertion 'CLUTTER_IS_ACTOR (self)' failed

Examples of triggers for this bug:

- The monitor topology changes
- The screen gets locked during the drag

This commit fixes the spew and the leak by ensuring any pending
drag monitoring is disabled when the window lists are destroyed.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/145>

(cherry picked from commit 8318ea919f)
2020-12-03 00:08:57 +01:00
Thun Pin 5ad272e628 window-navigator: Adjust to 3.38 overview changes
gnome-shell's overview code changed significantly in 3.38,
adjust the extension to work without the separate overlay.

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

(cherry picked from commit 737c897624)
2020-12-03 00:08:30 +01:00
Florian Müllner 3b22582752 auto-move-windows: Exclude sticky windows from empty-check
We modify gnome-shell's workspace tracker to only remove empty
workspaces from the end. However we currently don't take into
account that sticky windows appear on all workspaces, so those
are preventing any workspace from getting removed at the moment.

Exclude them when determining whether a workspace is empty to
get the expected behavior.

https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/135

(cherry picked from commit 61cf679b8c)
2020-12-03 00:08:07 +01:00
Florian Müllner e734fcbd21 window-list: Adjust to overview changes
Window DND in the overview is now based on the metaWindow,
not the window actor (misnamed as "real window").

https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/133
2020-11-19 04:54:07 +01:00
Florian Müllner 435879c121 workspace-indicator: Adjust to overview changes
Window DND in the overview is now based on the metaWindow,
not the window actor (misnamed as "real window").

https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/133
2020-11-19 04:54:07 +01:00
Florian Müllner ed81650f55 window-list: Use custom layout manager for thumbnails
The current code positions window previews explicitly using a fixed
layout manager. For that it relies on a valid parent allocation,
which is error-prone and frequently results in warnings.

Address this by moving the positioning code into a custom layout
manager, and only update the visibility from the window preview.

https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/issues/260
2020-10-21 13:44:44 +02:00
Florian Müllner 1276a880de workspace-indicator: Use custom layout manager for thumbnails
The current code positions window previews explicitly using a fixed
layout manager. For that it relies on a valid parent allocation,
which is error-prone and frequently results in warnings.

Address this by moving the positioning code into a custom layout
manager, and only update the visibility from the window preview.

https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/issues/260
2020-10-21 13:44:44 +02:00
Sergio Costas 584016c291 window-list: Honor changes in skip-taskbar property
Although window-list checks the 'skip-taskbar' property when a
window is added to the desktop to decide wether it should be
shown in the bar or not, it doesn't honor that when the property
is changed after a window has already been added. Since the new
WaylandClient API allows to change this property for already
mapped windows, supporting this is a good idea.

This patch fixes this.

Fix https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/130


(cherry picked from commit b65f362f0d)
2020-10-08 21:50:07 +00:00
Jeremy Bicha 41664b152c New upstream version 3.38.1 2020-10-06 17:36:33 -04:00
Simon McVittie 8957c277a1 New upstream version 3.38.0 2020-09-22 09:16:27 +01:00
Marco Trevisan (Treviño) 8b9be8f120 New upstream version 3.37.91 2020-08-27 08:18:07 +02:00
Laurent Bigonville d3b687df8b New upstream version 3.36.2 2020-05-03 10:01:14 +02:00
Florian Müllner df463177e7 Bump version to 3.36.2
Update NEWS.
2020-04-29 22:45:40 +02:00
Florian Müllner 62af36ebfa Update sass submodule 2020-04-29 22:44:25 +02:00
Kristjan SCHMIDT c5246b7415 Update Esperanto translation 2020-04-18 09:00:46 +00:00
Xiaoguang Wang d39c1fd685 windowPicker: Wrong signal ID _nWorkspacesNotifyId
https://gitlab.gnome.org/GNOME/gnome-shell-extensions/merge_requests/106


(cherry picked from commit f9aaa732b2)
2020-04-10 14:31:24 +00:00
Florian Müllner 665a7fbbcb ci: Update URL check
Gitlab started inserting a /-/ in its URLs, account for that.

https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/113


(cherry picked from commit 7b82c5e12b)
2020-04-10 14:30:49 +00:00
Simon McVittie a4987d03b8 New upstream version 3.36.1 2020-04-02 10:14:07 +01:00
Yosef Or Boczko c477f10bfb Update Hebrew translation 2020-04-01 15:22:37 +00:00
Florian Müllner 2ae0f368b9 Bump version to 3.36.1
Update NEWS.
2020-03-31 00:58:41 +02:00
Iain Lane ac33058086 New upstream version 3.36.0 2020-03-16 12:13:26 +00:00
Marco Trevisan (Treviño) c7a08aaf74 New upstream version 3.35.91 2020-02-24 14:48:45 +01:00
Laurent Bigonville 8c1d6d88cf New upstream version 3.34.2 2019-12-30 00:41:31 +01:00
Florian Müllner 33b16681c6 Bump version to 3.34.2
Update NEWS.
2019-12-11 22:56:08 +01:00
Umarzuki Bin Mochlis Moktar 3c51716268 Update Malay translation 2019-12-09 11:59:58 +00:00
Willy Stadnick e5421b6cc6 screenshot-window-sizer: Fix cycling through all valid sizes
When cycling through window sizes, we should skip any sizes that are
bigger than the available area. We do that, but the current code
assumes that the possible sizes are sorted, which is no longer the
case since the addition of "phone" sizes in commit 5b43d4733c.

As a result, we may now skip sizes that would fit perfectly fine.
Address this by filtering out invalid sizes beforehand instead of
assuming a certain order (wich no longer work due to the addition
of a portrait format).

https://gitlab.gnome.org/GNOME/gnome-shell-extensions/merge_requests/97
2019-11-27 20:56:55 +01:00
Florian Müllner f1e7ae1010 workspace-indicator: Exclude DESKTOP windows from window previews
While nautilus removed its desktop support a while ago in favor of an
extension, it's still possible that some external X11 desktop icon app
is used. As DESKTOP windows cannot be moved between workspaces or stacked,
and aren't perceived as regular windows, it doesn't make sense to show
them as previews in the workspace switcher.

https://gitlab.gnome.org/GNOME/gnome-shell-extensions/merge_requests/93
2019-11-21 22:47:01 +01:00
Florian Müllner 10fe907c83 window-list: Exclude DESKTOP windows from window previews
While nautilus removed its desktop support a while ago in favor of an
extension, it's still possible that some external X11 desktop icon app
is used. As DESKTOP windows cannot be moved between workspaces or stacked,
and aren't perceived as regular windows, it doesn't make sense to show
them as previews in the workspace switcher.

https://gitlab.gnome.org/GNOME/gnome-shell-extensions/merge_requests/93
2019-11-21 22:47:01 +01:00
Stas Solovey ae9809caba Update Russian translation 2019-11-13 18:42:24 +00:00
Jeremy Bicha c95d197c5c New upstream version 3.34.1 2019-10-08 22:45:42 -04:00
Iain Lane ae8749b7e1 New upstream version 3.34.0 2019-09-10 10:53:04 +01:00
Iain Lane 84a548c0b9 New upstream version 3.33.92 2019-09-05 18:21:22 +01:00
Marco Trevisan (Treviño) f047cb0baf New upstream version 3.33.90 2019-08-13 04:25:54 +02:00
Iain Lane 28494941e1 New upstream version 3.32.0 2019-03-12 16:33:30 +00:00
Iain Lane b70059ac4d New upstream version 3.31.92 2019-03-06 15:39:47 +00:00
Iain Lane eb567c1120 New upstream version 3.31.90 2019-02-21 10:08:46 +00:00
Simon McVittie b1eb9b9080 New upstream version 3.30.1 2018-11-02 09:22:09 +00:00
Jeremy Bicha a0b6535210 New upstream version 3.30.0 2018-09-05 12:32:25 -04:00
Simon McVittie 9a9b3afa31 New upstream version 3.29.91 2018-08-20 19:55:42 +01:00
Simon McVittie 59bc054ef6 New upstream version 3.29.90 2018-08-02 10:32:10 +01:00
Simon McVittie 57e9dfe722 Merge remote-tracking branch 'origin/upstream/latest' into upstream/latest 2018-07-27 09:14:56 +01:00
Simon McVittie f17a519c38 New upstream version 3.29.3 2018-07-27 08:43:26 +01:00
Jeremy Bicha 8223ca9739 New upstream version 3.28.1 2018-05-14 21:50:46 -04:00
Jeremy Bicha fe20c27b60 New upstream version 3.28.0 2018-03-15 21:28:20 -04:00
Jeremy Bicha 5ba59d1096 New upstream version 3.27.92 2018-03-05 20:55:43 -05:00
Jeremy Bicha 0ad1e9bbc1 New upstream version 3.27.91 2018-02-23 19:30:14 -05:00
Jeremy Bicha 5ea14f063f New upstream version 3.26.2 2017-12-15 15:11:42 -05:00
Jeremy Bicha 3cc3d03f0b Initial upstream branch 2017-12-15 15:11:26 -05:00
Florian Müllner 057e5bb0c1 Bump version to 3.26.2
Update NEWS.
2017-11-02 19:51:10 +01:00
Florian Müllner 07fc66765d auto-move: Remove unused imports 2017-10-27 14:45:09 +02:00
Xavi Ivars daa7b9b6ab [l10n] Updated Catalan (Valencian) translation 2017-10-05 14:02:06 +02:00
50 changed files with 1885 additions and 5230 deletions
-29
View File
@@ -1,29 +0,0 @@
ABOUT-NLS
Makefile
Makefile.in
Makefile.in.in
aclocal.m4
autom4te.cache/
config/
configure
config.log
config.status
data/*.json
m4/
po/*.header
po/*.sed
po/*.sin
po/Makevars.template
po/POTFILES
po/Rules-quot
po/gnome-shell-extensions.pot
po/stamp-it
staging/
zip-files/
*~
*.gmo
metadata.json
*.desktop
*.gschema.valid
*.session
+5 -7
View File
@@ -2,8 +2,6 @@ include:
- remote: 'https://gitlab.freedesktop.org/freedesktop/ci-templates/-/raw/bbe5232986c9b98eb1efe62484e07216f7d1a4df/templates/fedora.yml' - remote: 'https://gitlab.freedesktop.org/freedesktop/ci-templates/-/raw/bbe5232986c9b98eb1efe62484e07216f7d1a4df/templates/fedora.yml'
- remote: "https://gitlab.freedesktop.org/freedesktop/ci-templates/-/raw/6f86b8bcb0cd5168c32779c4fea9a893c4a0c046/templates/ci-fairy.yml" - remote: "https://gitlab.freedesktop.org/freedesktop/ci-templates/-/raw/6f86b8bcb0cd5168c32779c4fea9a893c4a0c046/templates/ci-fairy.yml"
image: registry.gitlab.gnome.org/gnome/gnome-shell/fedora/35:2022-02-18.0
stages: stages:
- pre_review - pre_review
- prepare - prepare
@@ -12,6 +10,7 @@ stages:
- deploy - deploy
default: default:
image: registry.gitlab.gnome.org/gnome/gnome-shell/fedora/35:2022-02-18.0
# Cancel jobs if newer commits are pushed to the branch # Cancel jobs if newer commits are pushed to the branch
interruptible: true interruptible: true
# Auto-retry jobs in case of infra failures # Auto-retry jobs in case of infra failures
@@ -108,7 +107,8 @@ eslint:
stage: review stage: review
<<: *prereview_req <<: *prereview_req
script: script:
- eslint -o $LINT_LOG -f junit --resolve-plugins-relative-to $(npm root -g) extensions - export NODE_PATH=$(npm root -g)
- ./.gitlab-ci/run-eslint --output-file ${LINT_LOG} --format junit --stdout
artifacts: artifacts:
paths: paths:
- ${LINT_LOG} - ${LINT_LOG}
@@ -133,8 +133,6 @@ fedora-build:
stage: build stage: build
needs: needs:
- build-fedora-container - build-fedora-container
before_script:
- git submodule update --init
script: script:
- meson setup build --werror -Dextension_set=all -Dclassic_mode=true - meson setup build --werror -Dextension_set=all -Dclassic_mode=true
- meson compile -C build - meson compile -C build
@@ -151,8 +149,8 @@ fedora-dist:
stage: deploy stage: deploy
needs: needs:
- fedora-build - fedora-build
before_script: variables:
- git submodule update --init GIT_SUBMODULE_STRATEGY: normal
script: script:
- meson dist -C build - meson dist -C build
rules: rules:
+54
View File
@@ -0,0 +1,54 @@
#!/usr/bin/env node
const {ESLint} = require('eslint');
console.log(`Running ESLint version ${ESLint.version}...`);
const fs = require('fs');
const path = require('path');
function hasOption(...names) {
return process.argv.some(arg => names.includes(arg));
}
function getOption(...names) {
const optIndex =
process.argv.findIndex(arg => names.includes(arg)) + 1;
if (optIndex === 0)
return undefined;
return process.argv[optIndex];
}
(async function main() {
const outputOption = getOption('--output-file', '-o');
const outputPath = outputOption ? path.resolve(outputOption) : null;
const sourceDir = path.dirname(process.argv[1]);
process.chdir(path.resolve(sourceDir, '..'));
const sources = ['extensions'];
const eslint = new ESLint();
const results = await eslint.lintFiles(sources);
const formatter = await eslint.loadFormatter(getOption('--format', '-f'));
const resultText = formatter.format(results);
if (outputPath) {
fs.mkdirSync(path.dirname(outputPath), {recursive: true});
fs.writeFileSync(outputPath, resultText);
if (hasOption('--stdout')) {
const consoleFormatter = await eslint.loadFormatter();
console.log(consoleFormatter.format(results));
}
} else {
console.log(resultText);
}
process.exitCode = results.some(r => r.errorCount > 0) ? 1 : 0;
})().catch((error) => {
process.exitCode = 1;
console.error(error);
});
-3
View File
@@ -1,3 +0,0 @@
[submodule "data/gnome-shell-sass"]
path = data/gnome-shell-sass
url = https://gitlab.gnome.org/GNOME/gnome-shell-sass.git
+94
View File
@@ -1,3 +1,97 @@
45.beta
=======
* Port extensions to ESM [Florian; !259, !266, !268, !269]
* Misc. bug fixes and cleanups [Florian; !260, !261, !262, !263, !264]
Contributors:
Florian Müllner
Translators:
Efstathios Iosifidis [el]
45.alpha
========
* window-list: Modernize default styling [Alexander; !253]
* Replace classic styling with built-in light style [Florian; !254]
* window-list: Add tooltip for long window titles [Arik; !251]
* light-style: New extension [Florian; !256]
* Misc. bug fixes and cleanups [Florian; !255, !257]
Contributors:
Florian Müllner, Arik W, Alexander Weichart
44.0
====
* Bump version
44.rc
=====
* Bump version
44.beta
=======
* Tweak menu alignment [robxnano; !246]
Contributors:
Florian Müllner, robxnano
Translators:
Vasil Pupkin [be]
43.1
====
* Fixed crash [Florian; !243]
* Misc. bug fixes and cleanups [mowemcfc; !244]
Contributors:
Florian Müllner, mowemcfc
Translators:
Sabri Ünal [tr]
43.0
====
Contributors:
Florian Müllner
Translators:
Pawan Chitrakar [ne], Zurab Kargareteli [ka], Aleksandr Melman [ru]
43.rc
=====
* Misc. bug fixes and cleanups [Florian; !240]
Contributors:
Florian Müllner
43.beta
=======
* Misc. bug fixes and cleanups [Florian; !237, !238]
Contributors:
Florian Müllner
Translators:
Nart Tlisha [ab]
43.alpha
========
Contributors:
Florian Müllner
Translators:
Marco Ciampa [it]
42.3
====
* screenshot-window-sizer: Fix reported sizes on wayland [Florian; !232]
* window-list: Improve touch support [Florian; !233]
Contributors:
Florian Müllner
42.2 42.2
==== ====
* native-window-placement: Adjust to gnome-shell 42 changes [Florian; !229] * native-window-placement: Adjust to gnome-shell 42 changes [Florian; !229]
File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 100 KiB

+3 -3
View File
@@ -1,11 +1,11 @@
{ {
"parentMode": "user", "parentMode": "user",
"stylesheetName": "gnome-classic.css", "colorScheme": "force-light",
"hasOverview": false, "hasOverview": false,
"showWelcomeDialog": false, "showWelcomeDialog": false,
"enabledExtensions": [@CLASSIC_EXTENSIONS@], "enabledExtensions": [@CLASSIC_EXTENSIONS@],
"panel": { "left": ["appMenu"], "panel": { "left": [],
"center": [], "center": [],
"right": ["a11y", "keyboard", "dateMenu", "aggregateMenu"] "right": ["a11y", "keyboard", "dateMenu", "quickSettings"]
} }
} }
-5
View File
@@ -1,5 +0,0 @@
@import url("gnome-classic.css");
stage {
-st-icon-style: symbolic;
}
-95
View File
@@ -1,95 +0,0 @@
/* Use the gnome-shell theme, but with light colors */
$variant: 'light';
@import "gnome-shell-sass/_colors"; //use gtk colors
@import "gnome-shell-sass/_drawing";
@import "gnome-shell-sass/_common";
@import "gnome-shell-sass/_widgets";
/* Overrides */
#panel, #panel.solid {
font-weight: normal;
background-color: $bg_color;
background-gradient-direction: vertical;
background-gradient-end: darken($bg_color,5%);
border-top-color: #666; /* we don't support non-uniform border-colors and
use the top border color for any border, so we
need to set it even if all we want is a bottom
border */
border-bottom: 1px solid #666;
app-icon-bottom-clip: 0px;
&:overview {
background-color: #000;
background-gradient-end: #000;
border-top-color: #000;
border-bottom: 1px solid #000;
.panel-button { color: #fff; }
}
.panel-button {
-natural-hpadding: 8px;
-minimum-hpadding: 4px;
font-weight: normal;
color: $fg_color;
text-shadow: none;
transition-duration: 0ms;
border: 0;
border-radius: 0px;
&.clock-display {
.clock {
transition-duration: 0ms;
border: 0;
border-radius: 0px;
}
}
&:hover {
color: lighten($fg_color,10%);
text-shadow: none;
& .system-status-icon { icon-shadow: none; }
}
&:active, &:overview, &:focus, &:checked {
// Trick due to St limitations. It needs a background to draw
// a box-shadow
background-color: $selected_bg_color;
color: $selected_fg_color;
box-shadow: none;
& > .system-status-icon { icon-shadow: none; }
}
.app-menu-icon { width: 0; height: 0; margin: 0; } // shell's display:none; :D
.system-status-icon {
icon-shadow: none;
}
}
.panel-corner,
.panel-corner:active,
.panel-corner:overview,
.panel-corner:focus {
-panel-corner-radius: 0;
}
&.lock-screen,
&.unlock-screen,
&.login-screen {
background-color: transparentize($bg_color, 0.5);
background-gradient-start: transparentize($bg_color, 0.5);
background-gradient-end: transparentize($bg_color, 0.5);
border-bottom: none;
.panel-button { color: $osd_fg_color; }
}
}
#appMenu {
spinner-image: url("classic-process-working.svg");
.panel-status-menu-box { padding: 0; }
}
.tile-preview-left.on-primary,
.tile-preview-right.on-primary,
.tile-preview-left.tile-preview-right.on-primary {
/* keep in sync with -panel-corner-radius */
border-radius: 0;
}
-63
View File
@@ -46,68 +46,5 @@ configure_file(
install_dir: modedir install_dir: modedir
) )
theme_sources = files(
'gnome-shell-sass/_colors.scss',
'gnome-shell-sass/_common.scss',
'gnome-shell-sass/_drawing.scss',
'gnome-shell-sass/_high-contrast-colors.scss',
'gnome-shell-sass/_widgets.scss',
'gnome-shell-sass/widgets/_a11y.scss',
'gnome-shell-sass/widgets/_app-grid.scss',
'gnome-shell-sass/widgets/_base.scss',
'gnome-shell-sass/widgets/_buttons.scss',
'gnome-shell-sass/widgets/_calendar.scss',
'gnome-shell-sass/widgets/_check-box.scss',
'gnome-shell-sass/widgets/_corner-ripple.scss',
'gnome-shell-sass/widgets/_dash.scss',
'gnome-shell-sass/widgets/_dialogs.scss',
'gnome-shell-sass/widgets/_entries.scss',
'gnome-shell-sass/widgets/_hotplug.scss',
'gnome-shell-sass/widgets/_ibus-popup.scss',
'gnome-shell-sass/widgets/_keyboard.scss',
'gnome-shell-sass/widgets/_login-dialog.scss',
'gnome-shell-sass/widgets/_looking-glass.scss',
'gnome-shell-sass/widgets/_message-list.scss',
'gnome-shell-sass/widgets/_misc.scss',
'gnome-shell-sass/widgets/_network-dialog.scss',
'gnome-shell-sass/widgets/_notifications.scss',
'gnome-shell-sass/widgets/_osd.scss',
'gnome-shell-sass/widgets/_overview.scss',
'gnome-shell-sass/widgets/_panel.scss',
'gnome-shell-sass/widgets/_popovers.scss',
'gnome-shell-sass/widgets/_screen-shield.scss',
'gnome-shell-sass/widgets/_scrollbars.scss',
'gnome-shell-sass/widgets/_search-entry.scss',
'gnome-shell-sass/widgets/_search-results.scss',
'gnome-shell-sass/widgets/_slider.scss',
'gnome-shell-sass/widgets/_switcher-popup.scss',
'gnome-shell-sass/widgets/_switches.scss',
'gnome-shell-sass/widgets/_window-picker.scss',
'gnome-shell-sass/widgets/_workspace-switcher.scss',
'gnome-shell-sass/widgets/_workspace-thumbnails.scss'
)
theme_data = [
'classic-process-working.svg',
'gnome-classic-high-contrast.css'
]
stylesheet = 'gnome-classic.css'
if fs.exists(stylesheet)
install_data(stylesheet, install_dir: themedir)
else
sassc = find_program('sassc', required: true)
custom_target(stylesheet,
input: fs.replace_suffix(stylesheet, '.scss'),
output: stylesheet,
depend_files: theme_sources,
command: [sassc, '-a', '@INPUT@', '@OUTPUT@'],
install: true,
install_dir: themedir
)
endif
install_data(theme_data, install_dir: themedir)
classic_override = '00_org.gnome.shell.extensions.classic.gschema.override' classic_override = '00_org.gnome.shell.extensions.classic.gschema.override'
install_data(classic_override, install_dir: schemadir) install_data(classic_override, install_dir: schemadir)
+1 -1
View File
@@ -1,4 +1,4 @@
#!/bin/sh #!/bin/bash
srcdir=`dirname $0` srcdir=`dirname $0`
srcdir=`(cd $srcdir && pwd)` srcdir=`(cd $srcdir && pwd)`
+55 -68
View File
@@ -1,18 +1,22 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */ /* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
/* exported init enable disable */ import Atk from 'gi://Atk';
import Clutter from 'gi://Clutter';
import Gio from 'gi://Gio';
import GLib from 'gi://GLib';
import GMenu from 'gi://GMenu';
import GObject from 'gi://GObject';
import Gtk from 'gi://Gtk';
import Meta from 'gi://Meta';
import Shell from 'gi://Shell';
import St from 'gi://St';
import {EventEmitter} from 'resource:///org/gnome/shell/misc/signals.js';
const { import {Extension, gettext as _} from 'resource:///org/gnome/shell/extensions/extension.js';
Atk, Clutter, Gio, GLib, GMenu, GObject, Gtk, Meta, Shell, St,
} = imports.gi;
const Signals = imports.signals;
const DND = imports.ui.dnd; import * as DND from 'resource:///org/gnome/shell/ui/dnd.js';
const ExtensionUtils = imports.misc.extensionUtils; import * as Main from 'resource:///org/gnome/shell/ui/main.js';
const Main = imports.ui.main; import * as PanelMenu from 'resource:///org/gnome/shell/ui/panelMenu.js';
const PanelMenu = imports.ui.panelMenu; import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js';
const PopupMenu = imports.ui.popupMenu;
const _ = ExtensionUtils.gettext;
const appSys = Shell.AppSystem.get_default(); const appSys = Shell.AppSystem.get_default();
@@ -46,11 +50,8 @@ class ApplicationMenuItem extends PopupMenu.PopupBaseMenuItem {
this.label_actor = appLabel; this.label_actor = appLabel;
let textureCache = St.TextureCache.get_default(); let textureCache = St.TextureCache.get_default();
let iconThemeChangedId = textureCache.connect('icon-theme-changed', textureCache.connectObject('icon-theme-changed',
this._updateIcon.bind(this)); () => this._updateIcon(), this);
this.connect('destroy', () => {
textureCache.disconnect(iconThemeChangedId);
});
this._updateIcon(); this._updateIcon();
this._delegate = this; this._delegate = this;
@@ -117,7 +118,7 @@ class CategoryMenuItem extends PopupMenu.PopupBaseMenuItem {
else else
name = _('Favorites'); name = _('Favorites');
this.add_child(new St.Label({ text: name })); this.add_child(new St.Label({text: name}));
this.connect('motion-event', this._onMotionEvent.bind(this)); this.connect('motion-event', this._onMotionEvent.bind(this));
this.connect('notify::active', this._onActiveChanged.bind(this)); this.connect('notify::active', this._onActiveChanged.bind(this));
} }
@@ -239,8 +240,10 @@ class ApplicationsMenu extends PopupMenu.PopupMenu {
} }
} }
class DesktopTarget { class DesktopTarget extends EventEmitter {
constructor() { constructor() {
super();
this._desktop = null; this._desktop = null;
this._desktopDestroyedId = 0; this._desktopDestroyedId = 0;
@@ -267,9 +270,7 @@ class DesktopTarget {
_setDesktop(desktop) { _setDesktop(desktop) {
if (this._desktop) { if (this._desktop) {
this._desktop.disconnect(this._desktopDestroyedId); this._desktop.disconnectObject(this);
this._desktopDestroyedId = 0;
delete this._desktop._delegate; delete this._desktop._delegate;
} }
@@ -277,9 +278,9 @@ class DesktopTarget {
this.emit('desktop-changed'); this.emit('desktop-changed');
if (this._desktop) { if (this._desktop) {
this._desktopDestroyedId = this._desktop.connect('destroy', () => { this._desktop.connectObject('destroy', () => {
this._setDesktop(null); this._setDesktop(null);
}); }, this);
this._desktop._delegate = this; this._desktop._delegate = this;
} }
} }
@@ -319,10 +320,7 @@ class DesktopTarget {
} }
destroy() { destroy() {
if (this._windowAddedId) global.window_group.disconnectObject(this);
global.window_group.disconnect(this._windowAddedId);
this._windowAddedId = 0;
this._setDesktop(null); this._setDesktop(null);
} }
@@ -357,7 +355,6 @@ class DesktopTarget {
return true; return true;
} }
} }
Signals.addSignalMethods(DesktopTarget.prototype);
class ApplicationsButton extends PanelMenu.Button { class ApplicationsButton extends PanelMenu.Button {
static { static {
@@ -385,15 +382,14 @@ class ApplicationsButton extends PanelMenu.Button {
this.name = 'panelApplications'; this.name = 'panelApplications';
this.label_actor = this._label; this.label_actor = this._label;
this._showingId = Main.overview.connect('showing', () => { Main.overview.connectObject(
this.add_accessible_state(Atk.StateType.CHECKED); 'showing', () => this.add_accessible_state(Atk.StateType.CHECKED),
}); 'hiding', () => this.remove_accessible_state(Atk.StateType.CHECKED),
this._hidingId = Main.overview.connect('hiding', () => { this);
this.remove_accessible_state(Atk.StateType.CHECKED);
});
Main.wm.addKeybinding( Main.wm.addKeybinding(
'apps-menu-toggle-menu', 'apps-menu-toggle-menu',
ExtensionUtils.getSettings(), Extension.lookupByURL(import.meta.url).getSettings(),
Meta.KeyBindingFlags.IGNORE_AUTOREPEAT, Meta.KeyBindingFlags.IGNORE_AUTOREPEAT,
Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW, Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW,
() => this.menu.toggle()); () => this.menu.toggle());
@@ -408,16 +404,16 @@ class ApplicationsButton extends PanelMenu.Button {
}); });
}); });
this._tree = new GMenu.Tree({ menu_basename: 'applications.menu' }); this._tree = new GMenu.Tree({menu_basename: 'applications.menu'});
this._treeChangedId = this._tree.connect('changed', this._tree.connectObject('changed',
this._onTreeChanged.bind(this)); () => this._onTreeChanged(), this);
this._applicationsButtons = new Map(); this._applicationsButtons = new Map();
this.reloadFlag = false; this.reloadFlag = false;
this._createLayout(); this._createLayout();
this._display(); this._display();
this._installedChangedId = appSys.connect('installed-changed', appSys.connectObject('installed-changed',
this._onTreeChanged.bind(this)); () => this._onTreeChanged(), this);
} }
_onTreeChanged() { _onTreeChanged() {
@@ -441,11 +437,7 @@ class ApplicationsButton extends PanelMenu.Button {
_onDestroy() { _onDestroy() {
super._onDestroy(); super._onDestroy();
Main.overview.disconnect(this._showingId); delete this._tree;
Main.overview.disconnect(this._hidingId);
appSys.disconnect(this._installedChangedId);
this._tree.disconnect(this._treeChangedId);
this._tree = null;
Main.wm.removeKeybinding('apps-menu-toggle-menu'); Main.wm.removeKeybinding('apps-menu-toggle-menu');
@@ -509,7 +501,7 @@ class ApplicationsButton extends PanelMenu.Button {
} }
let app = appSys.lookup_app(id); let app = appSys.lookup_app(id);
if (!app) if (!app)
app = new Shell.App({ app_info: entry.get_app_info() }); app = new Shell.App({app_info: entry.get_app_info()});
if (app.get_app_info().should_show()) if (app.get_app_info().should_show())
this.applicationsByCategory[categoryId].push(app); this.applicationsByCategory[categoryId].push(app);
} else if (nextType === GMenu.TreeItemType.SEPARATOR) { } else if (nextType === GMenu.TreeItemType.SEPARATOR) {
@@ -555,8 +547,8 @@ class ApplicationsButton extends PanelMenu.Button {
_createLayout() { _createLayout() {
let section = new PopupMenu.PopupMenuSection(); let section = new PopupMenu.PopupMenuSection();
this.menu.addMenuItem(section); this.menu.addMenuItem(section);
this.mainBox = new St.BoxLayout({ vertical: false }); this.mainBox = new St.BoxLayout({vertical: false});
this.leftBox = new St.BoxLayout({ vertical: true }); this.leftBox = new St.BoxLayout({vertical: true});
this.applicationsScrollBox = new St.ScrollView({ this.applicationsScrollBox = new St.ScrollView({
style_class: 'apps-menu vfade', style_class: 'apps-menu vfade',
x_expand: true, x_expand: true,
@@ -578,9 +570,9 @@ class ApplicationsButton extends PanelMenu.Button {
vscroll.connect('scroll-stop', () => (this.menu.passEvents = false)); vscroll.connect('scroll-stop', () => (this.menu.passEvents = false));
this.leftBox.add_child(this.categoriesScrollBox); this.leftBox.add_child(this.categoriesScrollBox);
this.applicationsBox = new St.BoxLayout({ vertical: true }); this.applicationsBox = new St.BoxLayout({vertical: true});
this.applicationsScrollBox.add_actor(this.applicationsBox); this.applicationsScrollBox.add_actor(this.applicationsBox);
this.categoriesBox = new St.BoxLayout({ vertical: true }); this.categoriesBox = new St.BoxLayout({vertical: true});
this.categoriesScrollBox.add_actor(this.categoriesBox); this.categoriesScrollBox.add_actor(this.categoriesBox);
this.mainBox.add(this.leftBox); this.mainBox.add(this.leftBox);
@@ -676,22 +668,17 @@ class ApplicationsButton extends PanelMenu.Button {
} }
} }
let appsMenuButton; export default class AppsMenuExtension extends Extension {
enable() {
this._appsMenuButton = new ApplicationsButton();
const index = Main.sessionMode.panel.left.indexOf('activities') + 1;
Main.panel.addToStatusArea(
'apps-menu', this._appsMenuButton, index, 'left');
}
/** */ disable() {
function enable() { Main.panel.menuManager.removeMenu(this._appsMenuButton.menu);
appsMenuButton = new ApplicationsButton(); this._appsMenuButton.destroy();
let index = Main.sessionMode.panel.left.indexOf('activities') + 1; delete this._appsMenuButton;
Main.panel.addToStatusArea('apps-menu', appsMenuButton, index, 'left'); }
}
/** */
function disable() {
Main.panel.menuManager.removeMenu(appsMenuButton.menu);
appsMenuButton.destroy();
}
/** */
function init() {
ExtensionUtils.initTranslations();
} }
+46 -61
View File
@@ -1,22 +1,20 @@
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*- // -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
// Start apps on custom workspaces // Start apps on custom workspaces
/* exported init enable disable */
const { Shell } = imports.gi; import Shell from 'gi://Shell';
const ExtensionUtils = imports.misc.extensionUtils; import {Extension} from 'resource:///org/gnome/shell/extensions/extension.js';
const Main = imports.ui.main; import * as Main from 'resource:///org/gnome/shell/ui/main.js';
class WindowMover { class WindowMover {
constructor() { constructor(settings) {
this._settings = ExtensionUtils.getSettings(); this._settings = settings;
this._appSystem = Shell.AppSystem.get_default(); this._appSystem = Shell.AppSystem.get_default();
this._appConfigs = new Map(); this._appConfigs = new Map();
this._appData = new Map(); this._appData = new Map();
this._appsChangedId = this._appSystem.connectObject('installed-changed',
this._appSystem.connect('installed-changed', () => this._updateAppData(), this);
this._updateAppData.bind(this));
this._settings.connect('changed', this._updateAppConfigs.bind(this)); this._settings.connect('changed', this._updateAppConfigs.bind(this));
this._updateAppConfigs(); this._updateAppConfigs();
@@ -38,7 +36,7 @@ class WindowMover {
let removedApps = [...this._appData.keys()] let removedApps = [...this._appData.keys()]
.filter(a => !ids.includes(a.id)); .filter(a => !ids.includes(a.id));
removedApps.forEach(app => { removedApps.forEach(app => {
app.disconnect(this._appData.get(app).windowsChangedId); app.disconnectObject(this);
this._appData.delete(app); this._appData.delete(app);
}); });
@@ -46,21 +44,14 @@ class WindowMover {
.map(id => this._appSystem.lookup_app(id)) .map(id => this._appSystem.lookup_app(id))
.filter(app => app && !this._appData.has(app)); .filter(app => app && !this._appData.has(app));
addedApps.forEach(app => { addedApps.forEach(app => {
let data = { app.connectObject('window-changed',
windowsChangedId: app.connect('windows-changed', this._appWindowsChanged.bind(this), this);
this._appWindowsChanged.bind(this)), this._appData.set(app, {windows: app.get_windows()});
moveWindowsId: 0,
windows: app.get_windows(),
};
this._appData.set(app, data);
}); });
} }
destroy() { destroy() {
if (this._appsChangedId) { this._appSystem.disconnectObject(this);
this._appSystem.disconnect(this._appsChangedId);
this._appsChangedId = 0;
}
if (this._settings) { if (this._settings) {
this._settings.run_dispose(); this._settings.run_dispose();
@@ -105,47 +96,41 @@ class WindowMover {
} }
} }
let prevCheckWorkspaces; export default class AutoMoveExtension extends Extension {
let winMover; enable() {
this._prevCheckWorkspaces = Main.wm._workspaceTracker._checkWorkspaces;
/** */ Main.wm._workspaceTracker._checkWorkspaces =
function init() { this._getCheckWorkspaceOverride(this._prevCheckWorkspaces);
ExtensionUtils.initTranslations(); this._windowMover = new WindowMover(this.getSettings());
}
/**
* @returns {bool} - false (used as MetaLater handler)
*/
function myCheckWorkspaces() {
let keepAliveWorkspaces = [];
let foundNonEmpty = false;
for (let i = this._workspaces.length - 1; i >= 0; i--) {
if (!foundNonEmpty) {
foundNonEmpty = this._workspaces[i].list_windows().some(
w => !w.is_on_all_workspaces());
} else if (!this._workspaces[i]._keepAliveId) {
keepAliveWorkspaces.push(this._workspaces[i]);
}
} }
// make sure the original method only removes empty workspaces at the end disable() {
keepAliveWorkspaces.forEach(ws => (ws._keepAliveId = 1)); Main.wm._workspaceTracker._checkWorkspaces = this._prevCheckWorkspaces;
prevCheckWorkspaces.call(this); this._windowMover.destroy();
keepAliveWorkspaces.forEach(ws => delete ws._keepAliveId); delete this._windowMover;
}
return false; _getCheckWorkspaceOverride(originalMethod) {
} /* eslint-disable no-invalid-this */
return function () {
/** */ const keepAliveWorkspaces = [];
function enable() { let foundNonEmpty = false;
prevCheckWorkspaces = Main.wm._workspaceTracker._checkWorkspaces; for (let i = this._workspaces.length - 1; i >= 0; i--) {
Main.wm._workspaceTracker._checkWorkspaces = myCheckWorkspaces; if (!foundNonEmpty) {
foundNonEmpty = this._workspaces[i].list_windows().some(
winMover = new WindowMover(); w => !w.is_on_all_workspaces());
} } else if (!this._workspaces[i]._keepAliveId) {
keepAliveWorkspaces.push(this._workspaces[i]);
/** */ }
function disable() { }
Main.wm._workspaceTracker._checkWorkspaces = prevCheckWorkspaces;
winMover.destroy(); // make sure the original method only removes empty workspaces at the end
keepAliveWorkspaces.forEach(ws => (ws._keepAliveId = 1));
originalMethod.call(this);
keepAliveWorkspaces.forEach(ws => delete ws._keepAliveId);
return false;
};
/* eslint-enable no-invalid-this */
}
} }
+25 -28
View File
@@ -1,12 +1,13 @@
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*- // -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
// Start apps on custom workspaces // Start apps on custom workspaces
/* exported init buildPrefsWidget */
const { Adw, Gio, GLib, GObject, Gtk } = imports.gi; 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';
const ExtensionUtils = imports.misc.extensionUtils; import {ExtensionPreferences, gettext as _} from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js';
const _ = ExtensionUtils.gettext;
const SETTINGS_KEY = 'application-list'; const SETTINGS_KEY = 'application-list';
@@ -59,13 +60,14 @@ class RulesList extends GObject.Object {
GObject.registerClass(this); GObject.registerClass(this);
} }
#settings = ExtensionUtils.getSettings(); #settings;
#rules = []; #rules = [];
#changedId; #changedId;
constructor() { constructor(settings) {
super(); super();
this.#settings = settings;
this.#changedId = this.#changedId =
this.#settings.connect(`changed::${SETTINGS_KEY}`, this.#settings.connect(`changed::${SETTINGS_KEY}`,
() => this.#sync()); () => this.#sync());
@@ -75,7 +77,7 @@ class RulesList extends GObject.Object {
append(appInfo) { append(appInfo) {
const pos = this.#rules.length; const pos = this.#rules.length;
this.#rules.push(new Rule({ appInfo })); this.#rules.push(new Rule({appInfo}));
this.#saveRules(); this.#saveRules();
this.items_changed(pos, 0, 1); this.items_changed(pos, 0, 1);
@@ -97,7 +99,7 @@ class RulesList extends GObject.Object {
if (pos < 0) if (pos < 0)
return; return;
this.#rules[pos].set({ workspace }); this.#rules[pos].set({workspace});
this.#saveRules(); this.#saveRules();
} }
@@ -116,7 +118,7 @@ class RulesList extends GObject.Object {
const [id, workspace] = stringRule.split(':'); const [id, workspace] = stringRule.split(':');
const appInfo = Gio.DesktopAppInfo.new(id); const appInfo = Gio.DesktopAppInfo.new(id);
if (appInfo) if (appInfo)
this.#rules.push(new Rule({ appInfo, workspace })); this.#rules.push(new Rule({appInfo, workspace}));
else else
log(`Invalid ID ${id}`); log(`Invalid ID ${id}`);
} }
@@ -147,15 +149,16 @@ class AutoMoveSettingsWidget extends Adw.PreferencesGroup {
(self, name, param) => self._rules.changeWorkspace(...param.deepUnpack())); (self, name, param) => self._rules.changeWorkspace(...param.deepUnpack()));
} }
constructor() { constructor(settings) {
super({ super({
title: _('Workspace Rules'), title: _('Workspace Rules'),
}); });
this._rules = new RulesList(); this._settings = settings;
this._rules = new RulesList(this._settings);
const store = new Gio.ListStore({ item_type: Gio.ListModel }); const store = new Gio.ListStore({item_type: Gio.ListModel});
const listModel = new Gtk.FlattenListModel({ model: store }); const listModel = new Gtk.FlattenListModel({model: store});
store.append(this._rules); store.append(this._rules);
store.append(new NewItemModel()); store.append(new NewItemModel());
@@ -173,7 +176,7 @@ class AutoMoveSettingsWidget extends Adw.PreferencesGroup {
} }
_addNewRule() { _addNewRule() {
const dialog = new NewRuleDialog(this.get_root()); const dialog = new NewRuleDialog(this.get_root(), this._settings);
dialog.connect('response', (dlg, id) => { dialog.connect('response', (dlg, id) => {
const appInfo = id === Gtk.ResponseType.OK const appInfo = id === Gtk.ResponseType.OK
? dialog.get_widget().get_app_info() : null; ? dialog.get_widget().get_app_info() : null;
@@ -248,7 +251,7 @@ class RuleRow extends Adw.ActionRow {
} }
constructor(rule) { constructor(rule) {
const { appInfo } = rule; const {appInfo} = rule;
const id = appInfo.get_id(); const id = appInfo.get_id();
super({ super({
@@ -312,13 +315,13 @@ class NewRuleDialog extends Gtk.AppChooserDialog {
GObject.registerClass(this); GObject.registerClass(this);
} }
constructor(parent) { constructor(parent, settings) {
super({ super({
transient_for: parent, transient_for: parent,
modal: true, modal: true,
}); });
this._settings = ExtensionUtils.getSettings(); this._settings = settings;
this.get_widget().set({ this.get_widget().set({
show_all: true, show_all: true,
@@ -338,14 +341,8 @@ class NewRuleDialog extends Gtk.AppChooserDialog {
} }
} }
/** */ export default class AutoMovePrefs extends ExtensionPreferences {
function init() { getPreferencesWidget() {
ExtensionUtils.initTranslations(); return new AutoMoveSettingsWidget(this.getSettings());
} }
/**
* @returns {Gtk.Widget} - the prefs widget
*/
function buildPrefsWidget() {
return new AutoMoveSettingsWidget();
} }
+28 -51
View File
@@ -1,14 +1,16 @@
/* exported init enable disable */
// Drive menu extension // Drive menu extension
const { Clutter, Gio, GObject, Shell, St } = imports.gi; import Clutter from 'gi://Clutter';
import Gio from 'gi://Gio';
import GObject from 'gi://GObject';
import Shell from 'gi://Shell';
import St from 'gi://St';
const ExtensionUtils = imports.misc.extensionUtils; import {Extension, gettext as _} from 'resource:///org/gnome/shell/extensions/extension.js';
const Main = imports.ui.main;
const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu;
const ShellMountOperation = imports.ui.shellMountOperation;
const _ = ExtensionUtils.gettext; import * as Main from 'resource:///org/gnome/shell/ui/main.js';
import * as PanelMenu from 'resource:///org/gnome/shell/ui/panelMenu.js';
import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js';
import * as ShellMountOperation from 'resource:///org/gnome/shell/ui/shellMountOperation.js';
Gio._promisify(Gio.File.prototype, 'query_filesystem_info_async'); Gio._promisify(Gio.File.prototype, 'query_filesystem_info_async');
@@ -47,19 +49,11 @@ class MountMenuItem extends PopupMenu.PopupBaseMenuItem {
this.hide(); this.hide();
this._changedId = mount.connect('changed', this._syncVisibility.bind(this)); mount.connectObject('changed',
() => this._syncVisibility(), this);
this._syncVisibility(); this._syncVisibility();
} }
_onDestroy() {
if (this._changedId) {
this.mount.disconnect(this._changedId);
this._changedId = 0;
}
super.destroy();
}
async _isInteresting() { async _isInteresting() {
if (!this.mount.can_eject() && !this.mount.can_unmount()) if (!this.mount.can_eject() && !this.mount.can_unmount())
return false; return false;
@@ -142,7 +136,7 @@ class DriveMenu extends PanelMenu.Button {
} }
constructor() { constructor() {
super(0.0, _('Removable devices')); super(0.5, _('Removable devices'));
let icon = new St.Icon({ let icon = new St.Icon({
icon_name: 'media-eject-symbolic', icon_name: 'media-eject-symbolic',
@@ -152,12 +146,12 @@ class DriveMenu extends PanelMenu.Button {
this.add_child(icon); this.add_child(icon);
this._monitor = Gio.VolumeMonitor.get(); this._monitor = Gio.VolumeMonitor.get();
this._addedId = this._monitor.connect('mount-added', this._monitor.connectObject(
(monitor, mount) => this._addMount(mount)); 'mount-added', (monitor, mount) => this._addMount(mount),
this._removedId = this._monitor.connect('mount-removed', (monitor, mount) => { 'mount-removed', (monitor, mount) => {
this._removeMount(mount); this._removeMount(mount);
this._updateMenuVisibility(); this._updateMenuVisibility();
}); }, this);
this._mounts = []; this._mounts = [];
@@ -199,33 +193,16 @@ class DriveMenu extends PanelMenu.Button {
} }
log('Removing a mount that was never added to the menu'); log('Removing a mount that was never added to the menu');
} }
}
_onDestroy() { export default class PlaceMenuExtension extends Extension {
if (this._addedId) { enable() {
this._monitor.disconnect(this._addedId); this._indicator = new DriveMenu();
this._monitor.disconnect(this._removedId); Main.panel.addToStatusArea('drive-menu', this._indicator);
this._addedId = 0; }
this._removedId = 0;
}
super._onDestroy(); disable() {
this._indicator.destroy();
delete this._indicator;
} }
} }
/** */
function init() {
ExtensionUtils.initTranslations();
}
let _indicator;
/** */
function enable() {
_indicator = new DriveMenu();
Main.panel.addToStatusArea('drive-menu', _indicator);
}
/** */
function disable() {
_indicator.destroy();
}
+19 -14
View File
@@ -1,17 +1,22 @@
/* exported enable disable */ import {AppIcon} from 'resource:///org/gnome/shell/ui/appDisplay.js';
const AppDisplay = imports.ui.appDisplay; import {InjectionManager} from 'resource:///org/gnome/shell/extensions/extension.js';
let _activateOriginal = null; export default class Extension {
constructor() {
this._injectionManager = new InjectionManager();
}
/** */ enable() {
function enable() { this._injectionManager.overrideMethod(AppIcon.prototype, 'activate',
_activateOriginal = AppDisplay.AppIcon.prototype.activate; originalMethod => {
AppDisplay.AppIcon.prototype.activate = function () { return function () {
_activateOriginal.call(this, 2); // eslint-disable-next-line no-invalid-this
}; originalMethod.call(this, 2);
} };
});
/** */ }
function disable() {
AppDisplay.AppIcon.prototype.activate = _activateOriginal; disable() {
this._injectionManager.clear();
}
} }
+36
View File
@@ -0,0 +1,36 @@
/*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* SPDX-License-Identifier: GPL-2.0-or-later
*/
import St from 'gi://St';
import * as Main from 'resource:///org/gnome/shell/ui/main.js';
export default class Extension {
_updateColorScheme(scheme) {
Main.sessionMode.colorScheme = scheme;
St.Settings.get().notify('color-scheme');
}
enable() {
this._savedColorScheme = Main.sessionMode.colorScheme;
this._updateColorScheme('prefer-light');
}
disable() {
this._updateColorScheme(this._savedColorScheme);
}
}
+5
View File
@@ -0,0 +1,5 @@
extension_data += configure_file(
input: metadata_name + '.in',
output: metadata_name,
configuration: metadata_conf
)
+10
View File
@@ -0,0 +1,10 @@
{
"extension-id": "@extension_id@",
"uuid": "@uuid@",
"settings-schema": "@gschemaname@",
"gettext-domain": "@gettext_domain@",
"name": "Light Style",
"description": "Switch default to light style",
"shell-version": [ "@shell_current@" ],
"url": "@url@"
}
+65 -76
View File
@@ -1,11 +1,11 @@
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*- // -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
/* exported enable disable */ import Clutter from 'gi://Clutter';
const { Clutter } = imports.gi;
const ExtensionUtils = imports.misc.extensionUtils; import {Extension, InjectionManager} from 'resource:///org/gnome/shell/extensions/extension.js';
const Main = imports.ui.main;
const { WindowPreview } = imports.ui.windowPreview; import * as Main from 'resource:///org/gnome/shell/ui/main.js';
const Workspace = imports.ui.workspace; import {WindowPreview} from 'resource:///org/gnome/shell/ui/windowPreview.js';
import * as Workspace from 'resource:///org/gnome/shell/ui/workspace.js';
// testing settings for natural window placement strategy: // testing settings for natural window placement strategy:
const WINDOW_PLACEMENT_NATURAL_ACCURACY = 20; // accuracy of window translate moves (KDE-default: 20) const WINDOW_PLACEMENT_NATURAL_ACCURACY = 20; // accuracy of window translate moves (KDE-default: 20)
@@ -236,75 +236,64 @@ class NaturalLayoutStrategy extends Workspace.LayoutStrategy {
} }
} }
let winInjections, workspaceInjections; export default class NativeWindowPlacementExtension extends Extension {
constructor(metadata) {
super(metadata);
/** */ this._injectionManager = new InjectionManager();
function resetState() { }
winInjections = { };
workspaceInjections = { }; enable() {
} const settings = this.getSettings();
/** */ const layoutProto = Workspace.WorkspaceLayout.prototype;
function enable() { const previewProto = WindowPreview.prototype;
resetState();
this._injectionManager.overrideMethod(layoutProto, '_createBestLayout', () => {
let settings = ExtensionUtils.getSettings(); /* eslint-disable no-invalid-this */
return function () {
workspaceInjections['_createBestLayout'] = Workspace.WorkspaceLayout.prototype._createBestLayout; this._layoutStrategy = new NaturalLayoutStrategy({
Workspace.WorkspaceLayout.prototype._createBestLayout = function (_area) { monitor: Main.layoutManager.monitors[this._monitorIndex],
this._layoutStrategy = new NaturalLayoutStrategy({ }, settings);
monitor: Main.layoutManager.monitors[this._monitorIndex], return this._layoutStrategy.computeLayout(this._sortedWindows);
}, settings); };
return this._layoutStrategy.computeLayout(this._sortedWindows); /* eslint-enable no-invalid-this */
}; });
// position window titles on top of windows in overlay // position window titles on top of windows in overlay
winInjections['_init'] = WindowPreview.prototype._init; this._injectionManager.overrideMethod(previewProto, '_init', originalMethod => {
WindowPreview.prototype._init = function (...args) { /* eslint-disable no-invalid-this */
winInjections['_init'].call(this, ...args); return function (...args) {
originalMethod.call(this, ...args);
if (!settings.get_boolean('window-captions-on-top'))
return; if (!settings.get_boolean('window-captions-on-top'))
return;
const alignConstraint = this._title.get_constraints().find(
c => c.align_axis && c.align_axis === Clutter.AlignAxis.Y_AXIS); const alignConstraint = this._title.get_constraints().find(
alignConstraint.factor = 0; c => c.align_axis && c.align_axis === Clutter.AlignAxis.Y_AXIS);
alignConstraint.factor = 0;
const bindConstraint = this._title.get_constraints().find(
c => c.coordinate && c.coordinate === Clutter.BindCoordinate.Y); const bindConstraint = this._title.get_constraints().find(
bindConstraint.offset = 0; c => c.coordinate && c.coordinate === Clutter.BindCoordinate.Y);
}; bindConstraint.offset = 0;
winInjections['_adjustOverlayOffsets'] = };
WindowPreview.prototype._adjustOverlayOffsets; /* eslint-enable no-invalid-this */
WindowPreview.prototype._adjustOverlayOffsets = function (...args) { });
winInjections['_adjustOverlayOffsets'].call(this, ...args);
this._injectionManager.overrideMethod(previewProto, '_adjustOverlayOffsets', originalMethod => {
if (settings.get_boolean('window-captions-on-top')) /* eslint-disable no-invalid-this */
this._title.translation_y = -this._title.translation_y; return function (...args) {
}; originalMethod.call(this, ...args);
}
if (settings.get_boolean('window-captions-on-top'))
/** this._title.translation_y = -this._title.translation_y;
* @param {Object} object - object that was modified };
* @param {Object} injection - the map of previous injections /* eslint-enable no-invalid-this */
* @param {string} name - the @injection key that should be removed });
*/ }
function removeInjection(object, injection, name) {
if (injection[name] === undefined) disable() {
delete object[name]; this._injectionManager.clear();
else global.stage.queue_relayout();
object[name] = injection[name]; }
}
/** */
function disable() {
var i;
for (i in workspaceInjections)
removeInjection(Workspace.WorkspaceLayout.prototype, workspaceInjections, i);
for (i in winInjections)
removeInjection(WindowPreview.prototype, winInjections, i);
global.stage.queue_relayout();
resetState();
} }
+26 -42
View File
@@ -1,17 +1,16 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */ /* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
/* exported init enable disable */ import Clutter from 'gi://Clutter';
import GObject from 'gi://GObject';
import St from 'gi://St';
const { Clutter, GObject, St } = imports.gi; import {Extension, gettext as _} from 'resource:///org/gnome/shell/extensions/extension.js';
const ExtensionUtils = imports.misc.extensionUtils; import * as Main from 'resource:///org/gnome/shell/ui/main.js';
const Main = imports.ui.main; import * as PanelMenu from 'resource:///org/gnome/shell/ui/panelMenu.js';
const PanelMenu = imports.ui.panelMenu; import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js';
const PopupMenu = imports.ui.popupMenu;
const Me = ExtensionUtils.getCurrentExtension(); import {PlacesManager} from './placeDisplay.js';
const PlaceDisplay = Me.imports.placeDisplay;
const _ = ExtensionUtils.gettext;
const N_ = x => x; const N_ = x => x;
const PLACE_ICON_SIZE = 16; const PLACE_ICON_SIZE = 16;
@@ -53,17 +52,8 @@ class PlaceMenuItem extends PopupMenu.PopupBaseMenuItem {
this.add_child(this._ejectButton); this.add_child(this._ejectButton);
} }
this._changedId = info.connect('changed', info.connectObject('changed',
this._propertiesChanged.bind(this)); this._propertiesChanged.bind(this), this);
}
destroy() {
if (this._changedId) {
this._info.disconnect(this._changedId);
this._changedId = 0;
}
super.destroy();
} }
activate(event) { activate(event) {
@@ -91,7 +81,7 @@ class PlacesMenu extends PanelMenu.Button {
} }
constructor() { constructor() {
super(0.0, _('Places')); super(0.5, _('Places'));
let label = new St.Label({ let label = new St.Label({
text: _('Places'), text: _('Places'),
@@ -100,7 +90,7 @@ class PlacesMenu extends PanelMenu.Button {
}); });
this.add_actor(label); this.add_actor(label);
this.placesManager = new PlaceDisplay.PlacesManager(); this.placesManager = new PlacesManager();
this._sections = { }; this._sections = { };
@@ -138,24 +128,18 @@ class PlacesMenu extends PanelMenu.Button {
} }
} }
/** */ export default class PlacesMenuExtension extends Extension {
function init() { enable() {
ExtensionUtils.initTranslations(); this._indicator = new PlacesMenu();
}
let pos = Main.sessionMode.panel.left.length;
let _indicator; if ('apps-menu' in Main.panel.statusArea)
pos++;
/** */ Main.panel.addToStatusArea('places-menu', this._indicator, pos, 'left');
function enable() { }
_indicator = new PlacesMenu();
disable() {
let pos = Main.sessionMode.panel.left.indexOf('appMenu'); this._indicator.destroy();
if ('apps-menu' in Main.panel.statusArea) delete this._indicator;
pos++; }
Main.panel.addToStatusArea('places-menu', _indicator, pos, 'left');
}
/** */
function disable() {
_indicator.destroy();
} }
+36 -46
View File
@@ -1,13 +1,14 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
import Gio from 'gi://Gio';
import GLib from 'gi://GLib';
import Shell from 'gi://Shell';
import {EventEmitter} from 'resource:///org/gnome/shell/misc/signals.js';
const { Gio, GLib, Shell } = imports.gi; import {gettext as _} from 'resource:///org/gnome/shell/extensions/extension.js';
const Signals = imports.signals;
const ExtensionUtils = imports.misc.extensionUtils; import * as Main from 'resource:///org/gnome/shell/ui/main.js';
const Main = imports.ui.main; import * as ShellMountOperation from 'resource:///org/gnome/shell/ui/shellMountOperation.js';
const ShellMountOperation = imports.ui.shellMountOperation;
const _ = ExtensionUtils.gettext;
const N_ = x => x; const N_ = x => x;
Gio._promisify(Gio.AppInfo, 'launch_default_for_uri_async'); Gio._promisify(Gio.AppInfo, 'launch_default_for_uri_async');
@@ -22,8 +23,10 @@ const Hostname1Iface = '<node> \
</node>'; </node>';
const Hostname1 = Gio.DBusProxy.makeProxyWrapper(Hostname1Iface); const Hostname1 = Gio.DBusProxy.makeProxyWrapper(Hostname1Iface);
class PlaceInfo { class PlaceInfo extends EventEmitter {
constructor(...params) { constructor(...params) {
super();
this._init(...params); this._init(...params);
} }
@@ -31,7 +34,7 @@ class PlaceInfo {
this.kind = kind; this.kind = kind;
this.file = file; this.file = file;
this.name = name || this._getFileName(); this.name = name || this._getFileName();
this.icon = icon ? new Gio.ThemedIcon({ name: icon }) : this.getIcon(); this.icon = icon ? new Gio.ThemedIcon({name: icon}) : this.getIcon();
} }
destroy() { destroy() {
@@ -94,16 +97,16 @@ class PlaceInfo {
// icon from the query info above // icon from the query info above
switch (this.kind) { switch (this.kind) {
case 'network': case 'network':
return new Gio.ThemedIcon({ name: 'folder-remote-symbolic' }); return new Gio.ThemedIcon({name: 'folder-remote-symbolic'});
case 'devices': case 'devices':
return new Gio.ThemedIcon({ name: 'drive-harddisk-symbolic' }); return new Gio.ThemedIcon({name: 'drive-harddisk-symbolic'});
case 'special': case 'special':
case 'bookmarks': case 'bookmarks':
default: default:
if (!this.file.is_native()) if (!this.file.is_native())
return new Gio.ThemedIcon({ name: 'folder-remote-symbolic' }); return new Gio.ThemedIcon({name: 'folder-remote-symbolic'});
else else
return new Gio.ThemedIcon({ name: 'folder-symbolic' }); return new Gio.ThemedIcon({name: 'folder-symbolic'});
} }
} }
@@ -118,7 +121,6 @@ class PlaceInfo {
} }
} }
} }
Signals.addSignalMethods(PlaceInfo.prototype);
class RootInfo extends PlaceInfo { class RootInfo extends PlaceInfo {
_init() { _init() {
@@ -138,7 +140,7 @@ class RootInfo extends PlaceInfo {
} }
getIcon() { getIcon() {
return new Gio.ThemedIcon({ name: 'drive-harddisk-symbolic' }); return new Gio.ThemedIcon({name: 'drive-harddisk-symbolic'});
} }
_propertiesChanged(proxy) { _propertiesChanged(proxy) {
@@ -246,8 +248,10 @@ const DEFAULT_DIRECTORIES = [
GLib.UserDirectory.DIRECTORY_VIDEOS, GLib.UserDirectory.DIRECTORY_VIDEOS,
]; ];
var PlacesManager = class { export class PlacesManager extends EventEmitter {
constructor() { constructor() {
super();
this._places = { this._places = {
special: [], special: [],
devices: [], devices: [],
@@ -255,16 +259,26 @@ var PlacesManager = class {
network: [], network: [],
}; };
this._settings = new Gio.Settings({ schema_id: BACKGROUND_SCHEMA }); this._settings = new Gio.Settings({schema_id: BACKGROUND_SCHEMA});
this._showDesktopIconsChangedId = this._settings.connect( this._settings.connectObject('changed::show-desktop-icons',
'changed::show-desktop-icons', this._updateSpecials.bind(this)); () => this._updateSpecials(), this);
this._updateSpecials(); this._updateSpecials();
/* /*
* Show devices, code more or less ported from nautilus-places-sidebar.c * Show devices, code more or less ported from nautilus-places-sidebar.c
*/ */
this._volumeMonitor = Gio.VolumeMonitor.get(); this._volumeMonitor = Gio.VolumeMonitor.get();
this._connectVolumeMonitorSignals(); this._volumeMonitor.connectObject(
'volume-added', () => this._updateMounts(),
'volume-removed', () => this._updateMounts(),
'volume-changed', () => this._updateMounts(),
'mount-added', () => this._updateMounts(),
'mount-removed', () => this._updateMounts(),
'mount-changed', () => this._updateMounts(),
'drive-connected', () => this._updateMounts(),
'drive-disconnected', () => this._updateMounts(),
'drive-changed', () => this._updateMounts(),
this);
this._updateMounts(); this._updateMounts();
this._bookmarksFile = this._findBookmarksFile(); this._bookmarksFile = this._findBookmarksFile();
@@ -289,34 +303,11 @@ var PlacesManager = class {
} }
} }
_connectVolumeMonitorSignals() {
const signals = [
'volume-added',
'volume-removed',
'volume-changed',
'mount-added',
'mount-removed',
'mount-changed',
'drive-connected',
'drive-disconnected',
'drive-changed',
];
this._volumeMonitorSignals = [];
let func = this._updateMounts.bind(this);
for (let i = 0; i < signals.length; i++) {
let id = this._volumeMonitor.connect(signals[i], func);
this._volumeMonitorSignals.push(id);
}
}
destroy() { destroy() {
if (this._settings) this._settings?.disconnectObject(this);
this._settings.disconnect(this._showDesktopIconsChangedId);
this._settings = null; this._settings = null;
for (let i = 0; i < this._volumeMonitorSignals.length; i++) this._volumeMonitor.disconnectObject(this);
this._volumeMonitor.disconnect(this._volumeMonitorSignals[i]);
if (this._monitor) if (this._monitor)
this._monitor.cancel(); this._monitor.cancel();
@@ -542,5 +533,4 @@ var PlacesManager = class {
get(kind) { get(kind) {
return this._places[kind]; return this._places[kind];
} }
}; }
Signals.addSignalMethods(PlacesManager.prototype);
+134 -131
View File
@@ -1,4 +1,3 @@
/* exported enable disable */
/* Screenshot Window Sizer for Gnome Shell /* Screenshot Window Sizer for Gnome Shell
* *
* Copyright (c) 2013 Owen Taylor <otaylor@redhat.com> * Copyright (c) 2013 Owen Taylor <otaylor@redhat.com>
@@ -19,147 +18,151 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/ */
const { Clutter, Meta, Shell, St } = imports.gi; import Clutter from 'gi://Clutter';
import Meta from 'gi://Meta';
import Shell from 'gi://Shell';
import St from 'gi://St';
const ExtensionUtils = imports.misc.extensionUtils; import {Extension} from 'resource:///org/gnome/shell/extensions/extension.js';
const Main = imports.ui.main;
import * as Main from 'resource:///org/gnome/shell/ui/main.js';
const MESSAGE_FADE_TIME = 2000; const MESSAGE_FADE_TIME = 2000;
let text; export default class ScreenshotWindowSizerExtension extends Extension {
SIZES = [
[624, 351],
[800, 450],
[1024, 576],
[1200, 675],
[1600, 900],
[360, 654], // Phone portrait maximized
[720, 360], // Phone landscape fullscreen
];
/** */ _flashMessage(message) {
function hideMessage() { if (!this._text) {
text.destroy(); this._text = new St.Label({style_class: 'screenshot-sizer-message'});
text = null; Main.uiGroup.add_actor(this._text);
}
/**
* @param {string} message - the message to flash
*/
function flashMessage(message) {
if (!text) {
text = new St.Label({ style_class: 'screenshot-sizer-message' });
Main.uiGroup.add_actor(text);
}
text.remove_all_transitions();
text.text = message;
text.opacity = 255;
let monitor = Main.layoutManager.primaryMonitor;
text.set_position(
monitor.x + Math.floor(monitor.width / 2 - text.width / 2),
monitor.y + Math.floor(monitor.height / 2 - text.height / 2));
text.ease({
opacity: 0,
duration: MESSAGE_FADE_TIME,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
onComplete: hideMessage,
});
}
let SIZES = [
[624, 351],
[800, 450],
[1024, 576],
[1200, 675],
[1600, 900],
[360, 654], // Phone portrait maximized
[720, 360], // Phone landscape fullscreen
];
/**
* @param {Meta.Display} display - the display
* @param {Meta.Window=} window - for per-window bindings, the window
* @param {Meta.KeyBinding} binding - the key binding
*/
function cycleScreenshotSizes(display, window, binding) {
// Probably this isn't useful with 5 sizes, but you can decrease instead
// of increase by holding down shift.
let modifiers = binding.get_modifiers();
let backwards = (modifiers & Meta.VirtualModifier.SHIFT_MASK) !== 0;
// Unmaximize first
if (window.get_maximized() !== 0)
window.unmaximize(Meta.MaximizeFlags.BOTH);
let workArea = window.get_work_area_current_monitor();
let outerRect = window.get_frame_rect();
// Double both axes if on a hidpi display
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
let scaledSizes = SIZES.map(size => size.map(wh => wh * scaleFactor))
.filter(([w, h]) => w <= workArea.width && h <= workArea.height);
// Find the nearest 16:9 size for the current window size
let nearestIndex;
let nearestError;
for (let i = 0; i < scaledSizes.length; i++) {
let [width, height] = scaledSizes[i];
// ignore sizes bigger than the workArea
if (width > workArea.width || height > workArea.height)
continue;
// get the best initial window size
let error = Math.abs(width - outerRect.width) + Math.abs(height - outerRect.height);
if (nearestIndex === undefined || error < nearestError) {
nearestIndex = i;
nearestError = error;
} }
this._text.remove_all_transitions();
this._text.text = message;
this._text.opacity = 255;
const monitor = Main.layoutManager.primaryMonitor;
this._text.set_position(
monitor.x + Math.floor(monitor.width / 2 - this._text.width / 2),
monitor.y + Math.floor(monitor.height / 2 - this._text.height / 2));
this._text.ease({
opacity: 0,
duration: MESSAGE_FADE_TIME,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
onComplete: () => this._hideMessage(),
});
} }
// get the next size up or down from ideal _hideMessage() {
let newIndex = (nearestIndex + (backwards ? -1 : 1)) % scaledSizes.length; this._text.destroy();
let [newWidth, newHeight] = scaledSizes[newIndex]; delete this._text;
}
// Push the window onscreen if it would be resized offscreen /**
let newX = outerRect.x; * @param {Meta.Display} display - the display
let newY = outerRect.y; * @param {Meta.Window=} window - for per-window bindings, the window
if (newX + newWidth > workArea.x + workArea.width) * @param {Meta.KeyBinding} binding - the key binding
newX = Math.max(workArea.x + workArea.width - newWidth); */
if (newY + newHeight > workArea.y + workArea.height) _cycleScreenshotSizes(display, window, binding) {
newY = Math.max(workArea.y + workArea.height - newHeight); // Probably this isn't useful with 5 sizes, but you can decrease instead
// of increase by holding down shift.
let modifiers = binding.get_modifiers();
let backwards = (modifiers & Meta.VirtualModifier.SHIFT_MASK) !== 0;
window.move_resize_frame(true, newX, newY, newWidth, newHeight); // Unmaximize first
if (window.get_maximized() !== 0)
window.unmaximize(Meta.MaximizeFlags.BOTH);
let newOuterRect = window.get_frame_rect(); let workArea = window.get_work_area_current_monitor();
let message = '%d×%d'.format( let outerRect = window.get_frame_rect();
newOuterRect.width / scaleFactor,
newOuterRect.height / scaleFactor);
// The new size might have been constrained by geometry hints (e.g. for // Double both axes if on a hidpi display
// a terminal) - in that case, include the actual ratio to the message let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
// we flash let scaledSizes = this.SIZES.map(size => size.map(wh => wh * scaleFactor))
let actualNumerator = 9 * newOuterRect.width / newOuterRect.height; .filter(([w, h]) => w <= workArea.width && h <= workArea.height);
if (Math.abs(actualNumerator - 16) > 0.01)
message += ' (%.2f:9)'.format(actualNumerator);
flashMessage(message); // Find the nearest 16:9 size for the current window size
} let nearestIndex;
let nearestError;
/** */
function enable() { for (let i = 0; i < scaledSizes.length; i++) {
Main.wm.addKeybinding( let [width, height] = scaledSizes[i];
'cycle-screenshot-sizes',
ExtensionUtils.getSettings(), // get the best initial window size
Meta.KeyBindingFlags.PER_WINDOW, let error = Math.abs(width - outerRect.width) + Math.abs(height - outerRect.height);
Shell.ActionMode.NORMAL, if (nearestIndex === undefined || error < nearestError) {
cycleScreenshotSizes); nearestIndex = i;
Main.wm.addKeybinding( nearestError = error;
'cycle-screenshot-sizes-backward', }
ExtensionUtils.getSettings(), }
Meta.KeyBindingFlags.PER_WINDOW | Meta.KeyBindingFlags.IS_REVERSED,
Shell.ActionMode.NORMAL, // get the next size up or down from ideal
cycleScreenshotSizes); let newIndex = (nearestIndex + (backwards ? -1 : 1)) % scaledSizes.length;
} let [newWidth, newHeight] = scaledSizes[newIndex];
/** */ // Push the window onscreen if it would be resized offscreen
function disable() { let newX = outerRect.x;
Main.wm.removeKeybinding('cycle-screenshot-sizes'); let newY = outerRect.y;
Main.wm.removeKeybinding('cycle-screenshot-sizes-backward'); if (newX + newWidth > workArea.x + workArea.width)
newX = Math.max(workArea.x + workArea.width - newWidth);
if (newY + newHeight > workArea.y + workArea.height)
newY = Math.max(workArea.y + workArea.height - newHeight);
const id = window.connect('size-changed', () => {
window.disconnect(id);
this._notifySizeChange(window);
});
window.move_resize_frame(true, newX, newY, newWidth, newHeight);
}
/**
* @param {Meta.Window} window - the window whose size changed
*/
_notifySizeChange(window) {
const {scaleFactor} = St.ThemeContext.get_for_stage(global.stage);
let newOuterRect = window.get_frame_rect();
let message = '%d×%d'.format(
newOuterRect.width / scaleFactor,
newOuterRect.height / scaleFactor);
// The new size might have been constrained by geometry hints (e.g. for
// a terminal) - in that case, include the actual ratio to the message
// we flash
let actualNumerator = 9 * newOuterRect.width / newOuterRect.height;
if (Math.abs(actualNumerator - 16) > 0.01)
message += ' (%.2f:9)'.format(actualNumerator);
this._flashMessage(message);
}
enable() {
Main.wm.addKeybinding(
'cycle-screenshot-sizes',
this.getSettings(),
Meta.KeyBindingFlags.PER_WINDOW,
Shell.ActionMode.NORMAL,
this._cycleScreenshotSizes.bind(this));
Main.wm.addKeybinding(
'cycle-screenshot-sizes-backward',
this.getSettings(),
Meta.KeyBindingFlags.PER_WINDOW | Meta.KeyBindingFlags.IS_REVERSED,
Shell.ActionMode.NORMAL,
this._cycleScreenshotSizes.bind(this));
}
disable() {
Main.wm.removeKeybinding('cycle-screenshot-sizes');
Main.wm.removeKeybinding('cycle-screenshot-sizes-backward');
}
} }
+11 -19
View File
@@ -1,20 +1,19 @@
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*- // -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
// Load shell theme from ~/.local/share/themes/name/gnome-shell // Load shell theme from ~/.local/share/themes/name/gnome-shell
/* exported init */
const { Gio } = imports.gi; import Gio from 'gi://Gio';
const ExtensionUtils = imports.misc.extensionUtils; import {Extension} from 'resource:///org/gnome/shell/extensions/extension.js';
const Main = imports.ui.main;
const Me = ExtensionUtils.getCurrentExtension(); import * as Main from 'resource:///org/gnome/shell/ui/main.js';
const Util = Me.imports.util;
import {getThemeDirs, getModeThemeDirs} from './util.js';
const SETTINGS_KEY = 'name'; const SETTINGS_KEY = 'name';
class ThemeManager { export default class ThemeManager extends Extension {
enable() { enable() {
this._settings = ExtensionUtils.getSettings(); this._settings = this.getSettings();
this._settings.connect(`changed::${SETTINGS_KEY}`, this._changeTheme.bind(this)); this._settings.connect(`changed::${SETTINGS_KEY}`, this._changeTheme.bind(this));
this._changeTheme(); this._changeTheme();
} }
@@ -32,10 +31,10 @@ class ThemeManager {
let themeName = this._settings.get_string(SETTINGS_KEY); let themeName = this._settings.get_string(SETTINGS_KEY);
if (themeName) { if (themeName) {
const stylesheetPaths = Util.getThemeDirs() const stylesheetPaths = getThemeDirs()
.map(dir => `${dir}/${themeName}/gnome-shell/gnome-shell.css`); .map(dir => `${dir}/${themeName}/gnome-shell/gnome-shell.css`);
stylesheetPaths.push(...Util.getModeThemeDirs() stylesheetPaths.push(...getModeThemeDirs()
.map(dir => `${dir}/${themeName}.css`)); .map(dir => `${dir}/${themeName}.css`));
stylesheet = stylesheetPaths.find(path => { stylesheet = stylesheetPaths.find(path => {
@@ -45,17 +44,10 @@ class ThemeManager {
} }
if (stylesheet) if (stylesheet)
global.log(`loading user theme: ${stylesheet}`); log(`loading user theme: ${stylesheet}`);
else else
global.log('loading default theme (Adwaita)'); log('loading default theme (Adwaita)');
Main.setThemeStylesheet(stylesheet); Main.setThemeStylesheet(stylesheet);
Main.loadTheme(); Main.loadTheme();
} }
} }
/**
* @returns {ThemeManager} - the extension state object
*/
function init() {
return new ThemeManager();
}
+16 -19
View File
@@ -1,15 +1,17 @@
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*- // -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
/* exported init buildPrefsWidget */
// we use async/await here to not block the mainloop, not to parallelize // we use async/await here to not block the mainloop, not to parallelize
/* eslint-disable no-await-in-loop */ /* eslint-disable no-await-in-loop */
const { Adw, Gio, GLib, GObject, Gtk } = imports.gi; 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';
const ExtensionUtils = imports.misc.extensionUtils; import {ExtensionPreferences} from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js';
const Me = ExtensionUtils.getCurrentExtension(); import {getThemeDirs, getModeThemeDirs} from './util.js';
const Util = Me.imports.util;
Gio._promisify(Gio.File.prototype, 'enumerate_children_async'); Gio._promisify(Gio.File.prototype, 'enumerate_children_async');
Gio._promisify(Gio.File.prototype, 'query_info_async'); Gio._promisify(Gio.File.prototype, 'query_info_async');
@@ -20,13 +22,13 @@ class UserThemePrefsWidget extends Adw.PreferencesGroup {
GObject.registerClass(this); GObject.registerClass(this);
} }
constructor() { constructor(settings) {
super({ title: 'Themes' }); super({title: 'Themes'});
this._actionGroup = new Gio.SimpleActionGroup(); this._actionGroup = new Gio.SimpleActionGroup();
this.insert_action_group('theme', this._actionGroup); this.insert_action_group('theme', this._actionGroup);
this._settings = ExtensionUtils.getSettings(); this._settings = settings;
this._actionGroup.add_action( this._actionGroup.add_action(
this._settings.create_action('name')); this._settings.create_action('name'));
@@ -39,7 +41,7 @@ class UserThemePrefsWidget extends Adw.PreferencesGroup {
} }
async _collectThemes() { async _collectThemes() {
for (const dirName of Util.getThemeDirs()) { for (const dirName of getThemeDirs()) {
const dir = Gio.File.new_for_path(dirName); const dir = Gio.File.new_for_path(dirName);
for (const name of await this._enumerateDir(dir)) { for (const name of await this._enumerateDir(dir)) {
if (this._rows.has(name)) if (this._rows.has(name))
@@ -60,7 +62,7 @@ class UserThemePrefsWidget extends Adw.PreferencesGroup {
} }
} }
for (const dirName of Util.getModeThemeDirs()) { for (const dirName of getModeThemeDirs()) {
const dir = Gio.File.new_for_path(dirName); const dir = Gio.File.new_for_path(dirName);
for (const filename of await this._enumerateDir(dir)) { for (const filename of await this._enumerateDir(dir)) {
if (!filename.endsWith('.css')) if (!filename.endsWith('.css'))
@@ -125,13 +127,8 @@ class ThemeRow extends Adw.ActionRow {
} }
} }
/** */ export default class UserThemePrefs extends ExtensionPreferences {
function init() { getPreferencesWidget() {
} return new UserThemePrefsWidget(this.getSettings());
}
/**
* @returns {Gtk.Widget} - the prefs widget
*/
function buildPrefsWidget() {
return new UserThemePrefsWidget();
} }
+3 -4
View File
@@ -1,12 +1,11 @@
/* exported getThemeDirs getModeThemeDirs */ import GLib from 'gi://GLib';
const { GLib } = imports.gi;
const fn = (...args) => GLib.build_filenamev(args); const fn = (...args) => GLib.build_filenamev(args);
/** /**
* @returns {string[]} - an ordered list of theme directories * @returns {string[]} - an ordered list of theme directories
*/ */
function getThemeDirs() { export function getThemeDirs() {
return [ return [
fn(GLib.get_home_dir(), '.themes'), fn(GLib.get_home_dir(), '.themes'),
fn(GLib.get_user_data_dir(), 'themes'), fn(GLib.get_user_data_dir(), 'themes'),
@@ -17,7 +16,7 @@ function getThemeDirs() {
/** /**
* @returns {string[]} - an ordered list of mode theme directories * @returns {string[]} - an ordered list of mode theme directories
*/ */
function getModeThemeDirs() { export function getModeThemeDirs() {
return GLib.get_system_data_dirs() return GLib.get_system_data_dirs()
.map(dir => fn(dir, 'gnome-shell', 'theme')); .map(dir => fn(dir, 'gnome-shell', 'theme'));
} }
+246 -194
View File
@@ -1,21 +1,28 @@
/* exported init */ import Clutter from 'gi://Clutter';
const { Clutter, Gio, GLib, GObject, Gtk, Meta, Shell, St } = imports.gi; import Gio from 'gi://Gio';
import GLib from 'gi://GLib';
import GObject from 'gi://GObject';
import Gtk from 'gi://Gtk';
import Meta from 'gi://Meta';
import Shell from 'gi://Shell';
import St from 'gi://St';
const DND = imports.ui.dnd; import {Extension, gettext as _} from 'resource:///org/gnome/shell/extensions/extension.js';
const ExtensionUtils = imports.misc.extensionUtils;
const Main = imports.ui.main;
const Overview = imports.ui.overview;
const PopupMenu = imports.ui.popupMenu;
const Me = ExtensionUtils.getCurrentExtension(); import * as DND from 'resource:///org/gnome/shell/ui/dnd.js';
const { WindowPicker, WindowPickerToggle } = Me.imports.windowPicker; import * as Main from 'resource:///org/gnome/shell/ui/main.js';
const { WorkspaceIndicator } = Me.imports.workspaceIndicator; import * as Overview from 'resource:///org/gnome/shell/ui/overview.js';
import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js';
const _ = ExtensionUtils.gettext; import {WindowPicker, WindowPickerToggle} from './windowPicker.js';
import {WorkspaceIndicator} from './workspaceIndicator.js';
const ICON_TEXTURE_SIZE = 24; const ICON_TEXTURE_SIZE = 24;
const DND_ACTIVATE_TIMEOUT = 500; const DND_ACTIVATE_TIMEOUT = 500;
const TOOLTIP_OFFSET = 6;
const TOOLTIP_ANIMATION_TIME = 150;
const GroupingMode = { const GroupingMode = {
NEVER: 0, NEVER: 0,
AUTO: 1, AUTO: 1,
@@ -48,10 +55,6 @@ class WindowContextMenu extends PopupMenu.PopupMenu {
}); });
this.addMenuItem(this._minimizeItem); this.addMenuItem(this._minimizeItem);
this._notifyMinimizedId = this._metaWindow.connect(
'notify::minimized', this._updateMinimizeItem.bind(this));
this._updateMinimizeItem();
this._maximizeItem = new PopupMenu.PopupMenuItem(''); this._maximizeItem = new PopupMenu.PopupMenuItem('');
this._maximizeItem.connect('activate', () => { this._maximizeItem.connect('activate', () => {
if (this._metaWindow.get_maximized() === Meta.MaximizeFlags.BOTH) if (this._metaWindow.get_maximized() === Meta.MaximizeFlags.BOTH)
@@ -61,21 +64,20 @@ class WindowContextMenu extends PopupMenu.PopupMenu {
}); });
this.addMenuItem(this._maximizeItem); this.addMenuItem(this._maximizeItem);
this._notifyMaximizedHId = this._metaWindow.connect(
'notify::maximized-horizontally',
this._updateMaximizeItem.bind(this));
this._notifyMaximizedVId = this._metaWindow.connect(
'notify::maximized-vertically',
this._updateMaximizeItem.bind(this));
this._updateMaximizeItem();
this._closeItem = new PopupMenu.PopupMenuItem(_('Close')); this._closeItem = new PopupMenu.PopupMenuItem(_('Close'));
this._closeItem.connect('activate', () => { this._closeItem.connect('activate', () => {
this._metaWindow.delete(global.get_current_time()); this._metaWindow.delete(global.get_current_time());
}); });
this.addMenuItem(this._closeItem); this.addMenuItem(this._closeItem);
this.actor.connect('destroy', this._onDestroy.bind(this)); this._metaWindow.connectObject(
'notify::minimized', this._updateMinimizeItem.bind(this),
'notify::maximized-horizontally', this._updateMaximizeItem.bind(this),
'notify::maximized-vertically', this._updateMaximizeItem.bind(this),
this);
this._updateMinimizeItem();
this._updateMaximizeItem();
this.connect('open-state-changed', () => { this.connect('open-state-changed', () => {
if (!this.isOpen) if (!this.isOpen)
@@ -98,12 +100,6 @@ class WindowContextMenu extends PopupMenu.PopupMenu {
this._maximizeItem.label.text = maximized this._maximizeItem.label.text = maximized
? _('Unmaximize') : _('Maximize'); ? _('Unmaximize') : _('Maximize');
} }
_onDestroy() {
this._metaWindow.disconnect(this._notifyMinimizedId);
this._metaWindow.disconnect(this._notifyMaximizedHId);
this._metaWindow.disconnect(this._notifyMaximizedVId);
}
} }
class WindowTitle extends St.BoxLayout { class WindowTitle extends St.BoxLayout {
@@ -120,27 +116,26 @@ class WindowTitle extends St.BoxLayout {
this._metaWindow = metaWindow; this._metaWindow = metaWindow;
this._icon = new St.Bin({ style_class: 'window-button-icon' }); this._icon = new St.Bin({style_class: 'window-button-icon'});
this.add(this._icon); this.add(this._icon);
this.label_actor = new St.Label({ y_align: Clutter.ActorAlign.CENTER }); this.label_actor = new St.Label({y_align: Clutter.ActorAlign.CENTER});
this.label_actor.clutter_text.single_line_mode = true; this.label_actor.clutter_text.single_line_mode = true;
this.add(this.label_actor); this.add(this.label_actor);
this._textureCache = St.TextureCache.get_default(); this._textureCache = St.TextureCache.get_default();
this._iconThemeChangedId = this._textureCache.connect( this._textureCache.connectObject('icon-theme-changed',
'icon-theme-changed', this._updateIcon.bind(this)); () => this._updateIcon(), this);
this._notifyWmClass = this._metaWindow.connect_after(
'notify::wm-class', this._updateIcon.bind(this)); this._metaWindow.connectObject(
this._notifyAppId = this._metaWindow.connect_after( 'notify::wm-class',
'notify::gtk-application-id', this._updateIcon.bind(this)); () => this._updateIcon(), GObject.ConnectFlags.AFTER,
'notify::gtk-application-id',
() => this._updateIcon(), GObject.ConnectFlags.AFTER,
'notify::title', () => this._updateTitle(),
'notify::minimized', () => this._minimizedChanged(),
this);
this._updateIcon(); this._updateIcon();
this.connect('destroy', this._onDestroy.bind(this));
this._notifyTitleId = this._metaWindow.connect(
'notify::title', this._updateTitle.bind(this));
this._notifyMinimizedId = this._metaWindow.connect(
'notify::minimized', this._minimizedChanged.bind(this));
this._minimizedChanged(); this._minimizedChanged();
} }
@@ -170,14 +165,6 @@ class WindowTitle extends St.BoxLayout {
}); });
} }
} }
_onDestroy() {
this._textureCache.disconnect(this._iconThemeChangedId);
this._metaWindow.disconnect(this._notifyTitleId);
this._metaWindow.disconnect(this._notifyMinimizedId);
this._metaWindow.disconnect(this._notifyWmClass);
this._metaWindow.disconnect(this._notifyAppId);
}
} }
class BaseButton extends St.Button { class BaseButton extends St.Button {
@@ -213,17 +200,23 @@ class BaseButton extends St.Button {
this._contextMenuManager = new PopupMenu.PopupMenuManager(this); this._contextMenuManager = new PopupMenu.PopupMenuManager(this);
this._switchWorkspaceId = global.window_manager.connect( global.window_manager.connectObject('switch-workspace',
'switch-workspace', this._updateVisibility.bind(this)); () => this._updateVisibility(), this);
if (this._perMonitor) { if (this._perMonitor) {
this._windowEnteredMonitorId = global.display.connect( global.display.connectObject(
'window-entered-monitor', 'window-entered-monitor',
this._windowEnteredOrLeftMonitor.bind(this)); this._windowEnteredOrLeftMonitor.bind(this),
this._windowLeftMonitorId = global.display.connect(
'window-left-monitor', 'window-left-monitor',
this._windowEnteredOrLeftMonitor.bind(this)); this._windowEnteredOrLeftMonitor.bind(this),
this);
} }
this._tooltip = new Tooltip(this, {
style_class: 'dash-label',
visible: false,
});
Main.uiGroup.add_child(this._tooltip);
} }
get active() { get active() {
@@ -246,6 +239,48 @@ class BaseButton extends St.Button {
this._updateVisibility(); this._updateVisibility();
} }
_setLongPressTimeout() {
if (this._longPressTimeoutId)
return;
const {longPressDuration} = Clutter.Settings.get_default();
this._longPressTimeoutId =
GLib.timeout_add(GLib.PRIORITY_DEFAULT, longPressDuration, () => {
delete this._longPressTimeoutId;
if (this._canOpenPopupMenu() && !this._contextMenu.isOpen)
this._openMenu(this._contextMenu);
return GLib.SOURCE_REMOVE;
});
}
_removeLongPressTimeout() {
if (!this._longPressTimeoutId)
return;
GLib.source_remove(this._longPressTimeoutId);
delete this._longPressTimeoutId;
}
vfunc_button_press_event(buttonEvent) {
if (buttonEvent.button === 1)
this._setLongPressTimeout();
return super.vfunc_button_press_event(buttonEvent);
}
vfunc_button_release_event(buttonEvent) {
this._removeLongPressTimeout();
return super.vfunc_button_release_event(buttonEvent);
}
vfunc_touch_event(touchEvent) {
if (touchEvent.type === Clutter.EventType.TOUCH_BEGIN)
this._setLongPressTimeout();
else if (touchEvent.type === Clutter.EventType.TOUCH_END)
this._removeLongPressTimeout();
return super.vfunc_touch_event(touchEvent);
}
activate() { activate() {
if (this.active) if (this.active)
return; return;
@@ -283,9 +318,11 @@ class BaseButton extends St.Button {
if (isOpen) if (isOpen)
return; return;
const extension = Extension.lookupByURL(import.meta.url);
let [x, y] = global.get_pointer(); let [x, y] = global.get_pointer();
let actor = global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, x, y); let actor = global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, x, y);
if (Me.stateObj.someWindowListContains(actor)) if (extension.someWindowListContains(actor))
actor.sync_hover(); actor.sync_hover();
} }
@@ -340,15 +377,7 @@ class BaseButton extends St.Button {
} }
_onDestroy() { _onDestroy() {
global.window_manager.disconnect(this._switchWorkspaceId); this._tooltip.destroy();
if (this._windowEnteredMonitorId)
global.display.disconnect(this._windowEnteredMonitorId);
this._windowEnteredMonitorId = 0;
if (this._windowLeftMonitorId)
global.display.disconnect(this._windowLeftMonitorId);
this._windowLeftMonitorId = 0;
} }
} }
@@ -361,9 +390,11 @@ class WindowButton extends BaseButton {
super(perMonitor, monitorIndex); super(perMonitor, monitorIndex);
this.metaWindow = metaWindow; this.metaWindow = metaWindow;
this._skipTaskbarId = metaWindow.connect('notify::skip-taskbar', () => { metaWindow.connectObject(
this._updateVisibility(); 'notify::skip-taskbar', () => this._updateVisibility(),
}); 'workspace-changed', () => this._updateVisibility(),
this);
this._updateVisibility(); this._updateVisibility();
this._windowTitle = new WindowTitle(this.metaWindow); this._windowTitle = new WindowTitle(this.metaWindow);
@@ -377,11 +408,8 @@ class WindowButton extends BaseButton {
this._contextMenuManager.addMenu(this._contextMenu); this._contextMenuManager.addMenu(this._contextMenu);
Main.uiGroup.add_actor(this._contextMenu.actor); Main.uiGroup.add_actor(this._contextMenu.actor);
this._workspaceChangedId = this.metaWindow.connect( global.display.connectObject('notify::focus-window',
'workspace-changed', this._updateVisibility.bind(this)); () => this._updateStyle(), this);
this._notifyFocusId = global.display.connect(
'notify::focus-window', this._updateStyle.bind(this));
this._updateStyle(); this._updateStyle();
} }
@@ -391,7 +419,7 @@ class WindowButton extends BaseButton {
return; return;
} }
if (button === 1) if (!button || button === 1)
this._minimizeOrActivateWindow(this.metaWindow); this._minimizeOrActivateWindow(this.metaWindow);
else else
this._openMenu(this._contextMenu); this._openMenu(this._contextMenu);
@@ -425,9 +453,6 @@ class WindowButton extends BaseButton {
_onDestroy() { _onDestroy() {
super._onDestroy(); super._onDestroy();
this.metaWindow.disconnect(this._skipTaskbarId);
this.metaWindow.disconnect(this._workspaceChangedId);
global.display.disconnect(this._notifyFocusId);
this._contextMenu.destroy(); this._contextMenu.destroy();
} }
} }
@@ -501,7 +526,7 @@ class AppButton extends BaseButton {
this.app = app; this.app = app;
this._updateVisibility(); this._updateVisibility();
let stack = new St.Widget({ layout_manager: new Clutter.BinLayout() }); let stack = new St.Widget({layout_manager: new Clutter.BinLayout()});
this.set_child(stack); this.set_child(stack);
this._singleWindowTitle = new St.Bin({ this._singleWindowTitle = new St.Bin({
@@ -544,18 +569,17 @@ class AppButton extends BaseButton {
Main.uiGroup.add_actor(this._appContextMenu.actor); Main.uiGroup.add_actor(this._appContextMenu.actor);
this._textureCache = St.TextureCache.get_default(); this._textureCache = St.TextureCache.get_default();
this._iconThemeChangedId = this._textureCache.connectObject('icon-theme-changed', () => {
this._textureCache.connect('icon-theme-changed', () => { this._icon.child = app.create_icon_texture(ICON_TEXTURE_SIZE);
this._icon.child = app.create_icon_texture(ICON_TEXTURE_SIZE); }, this);
});
this._windowsChangedId = this.app.connect( this.app.connectObject('windows-changed',
'windows-changed', this._windowsChanged.bind(this)); () => this._windowsChanged(), this);
this._windowsChanged(); this._windowsChanged();
this._windowTracker = Shell.WindowTracker.get_default(); this._windowTracker = Shell.WindowTracker.get_default();
this._notifyFocusId = this._windowTracker.connect( this._windowTracker.connectObject('notify::focus-app',
'notify::focus-app', this._updateStyle.bind(this)); () => this._updateStyle(), this);
this._updateStyle(); this._updateStyle();
} }
@@ -637,7 +661,7 @@ class AppButton extends BaseButton {
if (contextMenuWasOpen) if (contextMenuWasOpen)
this._contextMenu.close(); this._contextMenu.close();
if (button === 1) { if (!button || button === 1) {
if (menuWasOpen) if (menuWasOpen)
return; return;
@@ -675,9 +699,6 @@ class AppButton extends BaseButton {
_onDestroy() { _onDestroy() {
super._onDestroy(); super._onDestroy();
this._textureCache.disconnect(this._iconThemeChangedId);
this._windowTracker.disconnect(this._notifyFocusId);
this.app.disconnect(this._windowsChangedId);
this._menu.destroy(); this._menu.destroy();
} }
} }
@@ -687,7 +708,7 @@ class WindowList extends St.Widget {
GObject.registerClass(this); GObject.registerClass(this);
} }
constructor(perMonitor, monitor) { constructor(perMonitor, monitor, settings) {
super({ super({
name: 'panel', name: 'panel',
style_class: 'bottom-panel solid', style_class: 'bottom-panel solid',
@@ -700,7 +721,7 @@ class WindowList extends St.Widget {
this._perMonitor = perMonitor; this._perMonitor = perMonitor;
this._monitor = monitor; this._monitor = monitor;
let box = new St.BoxLayout({ x_expand: true, y_expand: true }); let box = new St.BoxLayout({x_expand: true, y_expand: true});
this.add_actor(box); this.add_actor(box);
let toggle = new WindowPickerToggle(); let toggle = new WindowPickerToggle();
@@ -709,7 +730,7 @@ class WindowList extends St.Widget {
toggle.connect('notify::checked', toggle.connect('notify::checked',
this._updateWindowListVisibility.bind(this)); this._updateWindowListVisibility.bind(this));
let layout = new Clutter.BoxLayout({ homogeneous: true }); let layout = new Clutter.BoxLayout({homogeneous: true});
this._windowList = new St.Widget({ this._windowList = new St.Widget({
style_class: 'window-list', style_class: 'window-list',
reactive: true, reactive: true,
@@ -727,19 +748,19 @@ class WindowList extends St.Widget {
}); });
this._windowList.connect('scroll-event', this._onScrollEvent.bind(this)); this._windowList.connect('scroll-event', this._onScrollEvent.bind(this));
let indicatorsBox = new St.BoxLayout({ x_align: Clutter.ActorAlign.END }); let indicatorsBox = new St.BoxLayout({x_align: Clutter.ActorAlign.END});
box.add(indicatorsBox); box.add(indicatorsBox);
this._workspaceIndicator = new WorkspaceIndicator(); this._workspaceIndicator = new WorkspaceIndicator();
indicatorsBox.add_child(this._workspaceIndicator.container); indicatorsBox.add_child(this._workspaceIndicator.container);
this._mutterSettings = new Gio.Settings({ schema_id: 'org.gnome.mutter' }); this._mutterSettings = new Gio.Settings({schema_id: 'org.gnome.mutter'});
this._workspacesOnlyOnPrimaryChangedId = this._mutterSettings.connect( this._mutterSettings.connectObject(
'changed::workspaces-only-on-primary', 'changed::workspaces-only-on-primary',
this._updateWorkspaceIndicatorVisibility.bind(this)); () => this._updateWorkspaceIndicatorVisibility(),
this._dynamicWorkspacesChangedId = this._mutterSettings.connect(
'changed::dynamic-workspaces', 'changed::dynamic-workspaces',
this._updateWorkspaceIndicatorVisibility.bind(this)); () => this._updateWorkspaceIndicatorVisibility(),
this);
this._updateWorkspaceIndicatorVisibility(); this._updateWorkspaceIndicatorVisibility();
this._menuManager = new PopupMenu.PopupMenuManager(this); this._menuManager = new PopupMenu.PopupMenuManager(this);
@@ -757,59 +778,58 @@ class WindowList extends St.Widget {
this._updatePosition(); this._updatePosition();
this._appSystem = Shell.AppSystem.get_default(); this._appSystem = Shell.AppSystem.get_default();
this._appStateChangedId = this._appSystem.connect( this._appSystem.connectObject('app-state-changed',
'app-state-changed', this._onAppStateChanged.bind(this)); this._onAppStateChanged.bind(this), this);
// Hack: OSK gesture is tied to visibility, piggy-back on that // Hack: OSK gesture is tied to visibility, piggy-back on that
this._keyboardVisiblechangedId = Main.keyboard._bottomDragAction.connectObject('notify::enabled',
Main.keyboard._bottomDragAction.connect('notify::enabled', action => {
action => { const visible = !action.enabled;
const visible = !action.enabled; if (visible) {
if (visible) { Main.uiGroup.set_child_above_sibling(
Main.uiGroup.set_child_above_sibling( this, Main.layoutManager.keyboardBox);
this, Main.layoutManager.keyboardBox); } else {
} else { Main.uiGroup.set_child_above_sibling(
Main.uiGroup.set_child_above_sibling( this, Main.layoutManager.panelBox);
this, Main.layoutManager.panelBox); }
} this._updateKeyboardAnchor();
this._updateKeyboardAnchor(); }, this);
});
let workspaceManager = global.workspace_manager; let workspaceManager = global.workspace_manager;
this._nWorkspacesChangedId = workspaceManager.connect( workspaceManager.connectObject('notify::n-workspaces',
'notify::n-workspaces', this._updateWorkspaceIndicatorVisibility.bind(this)); () => this._updateWorkspaceIndicatorVisibility(), this);
this._updateWorkspaceIndicatorVisibility(); this._updateWorkspaceIndicatorVisibility();
this._switchWorkspaceId = global.window_manager.connect( global.window_manager.connectObject('switch-workspace',
'switch-workspace', this._checkGrouping.bind(this)); () => this._checkGrouping(), this);
this._overviewShowingId = Main.overview.connect('showing', () => { Main.overview.connectObject(
this.hide(); 'showing', () => {
this._updateKeyboardAnchor(); this.hide();
});
this._overviewHidingId = Main.overview.connect('hidden', () => {
this.visible = !this._monitor.inFullscreen;
this._updateKeyboardAnchor();
});
this._fullscreenChangedId =
global.display.connect('in-fullscreen-changed', () => {
// Work-around for initial change from unknown to !fullscreen
if (Main.overview.visible)
this.hide();
this._updateKeyboardAnchor(); this._updateKeyboardAnchor();
}); },
'hidden', () => {
this.visible = !this._monitor.inFullscreen;
this._updateKeyboardAnchor();
}, this);
global.display.connectObject('in-fullscreen-changed', () => {
// Work-around for initial change from unknown to !fullscreen
if (Main.overview.visible)
this.hide();
this._updateKeyboardAnchor();
}, this);
this._windowSignals = new Map(); this._windowSignals = new Map();
this._windowCreatedId = global.display.connect( this._windowCreatedId = global.display.connect(
'window-created', (dsp, win) => this._addWindow(win)); 'window-created', (dsp, win) => this._addWindow(win));
this._dragBeginId = Main.xdndHandler.connect('drag-begin', Main.xdndHandler.connectObject(
this._monitorDrag.bind(this)); 'drag-begin', () => this._monitorDrag(),
this._dragEndId = Main.xdndHandler.connect('drag-end', 'drag-end', () => this._stopMonitoringDrag(),
this._stopMonitoringDrag.bind(this)); this);
this._dragMonitor = { this._dragMonitor = {
dragMotion: this._onDragMotion.bind(this), dragMotion: this._onDragMotion.bind(this),
}; };
@@ -817,9 +837,9 @@ class WindowList extends St.Widget {
this._dndTimeoutId = 0; this._dndTimeoutId = 0;
this._dndWindow = null; this._dndWindow = null;
this._settings = ExtensionUtils.getSettings(); this._settings = settings;
this._groupingModeChangedId = this._settings.connect( this._settings.connect('changed::grouping-mode',
'changed::grouping-mode', this._groupingModeChanged.bind(this)); () => this._groupingModeChanged());
this._grouped = undefined; this._grouped = undefined;
this._groupingModeChanged(); this._groupingModeChanged();
} }
@@ -858,7 +878,8 @@ class WindowList extends St.Widget {
} }
_updateWindowListVisibility() { _updateWindowListVisibility() {
let visible = !Main.windowPicker.visible; const {windowPicker} = Extension.lookupByURL(import.meta.url);
const visible = !windowPicker.visible;
this._windowList.ease({ this._windowList.ease({
opacity: visible ? 255 : 0, opacity: visible ? 255 : 0,
@@ -876,7 +897,7 @@ class WindowList extends St.Widget {
let children = this._windowList.get_children(); let children = this._windowList.get_children();
let [, childWidth] = children[0].get_preferred_width(-1); let [, childWidth] = children[0].get_preferred_width(-1);
let { spacing } = this._windowList.layout_manager; let {spacing} = this._windowList.layout_manager;
let workspace = global.workspace_manager.get_active_workspace(); let workspace = global.workspace_manager.get_active_workspace();
let windows = global.display.get_tab_list(Meta.TabList.NORMAL, workspace); let windows = global.display.get_tab_list(Meta.TabList.NORMAL, workspace);
@@ -1056,39 +1077,16 @@ class WindowList extends St.Widget {
} }
_onDestroy() { _onDestroy() {
this._mutterSettings.disconnect(this._workspacesOnlyOnPrimaryChangedId);
this._mutterSettings.disconnect(this._dynamicWorkspacesChangedId);
this._workspaceIndicator.destroy(); this._workspaceIndicator.destroy();
Main.ctrlAltTabManager.removeGroup(this); Main.ctrlAltTabManager.removeGroup(this);
this._appSystem.disconnect(this._appStateChangedId);
this._appStateChangedId = 0;
Main.keyboard._bottomDragAction.disconnect(this._keyboardVisiblechangedId);
this._keyboardVisiblechangedId = 0;
global.workspace_manager.disconnect(this._nWorkspacesChangedId);
this._nWorkspacesChangedId = 0;
global.window_manager.disconnect(this._switchWorkspaceId);
this._switchWorkspaceId = 0;
this._windowSignals.forEach((id, win) => win.disconnect(id)); this._windowSignals.forEach((id, win) => win.disconnect(id));
this._windowSignals.clear(); this._windowSignals.clear();
Main.overview.disconnect(this._overviewShowingId);
Main.overview.disconnect(this._overviewHidingId);
global.display.disconnect(this._fullscreenChangedId);
global.display.disconnect(this._windowCreatedId);
this._stopMonitoringDrag(); this._stopMonitoringDrag();
Main.xdndHandler.disconnect(this._dragBeginId);
Main.xdndHandler.disconnect(this._dragEndId);
this._settings.disconnect(this._groupingModeChangedId); this._settings.run_dispose();
let windows = global.get_window_actors(); let windows = global.get_window_actors();
for (let i = 0; i < windows.length; i++) for (let i = 0; i < windows.length; i++)
@@ -1096,9 +1094,9 @@ class WindowList extends St.Widget {
} }
} }
class Extension { export default class WindowListExtension extends Extension {
constructor() { constructor(metadata) {
ExtensionUtils.initTranslations(); super(metadata);
this._windowLists = null; this._windowLists = null;
this._hideOverviewOrig = Main.overview.hide; this._hideOverviewOrig = Main.overview.hide;
@@ -1107,17 +1105,17 @@ class Extension {
enable() { enable() {
this._windowLists = []; this._windowLists = [];
this._settings = ExtensionUtils.getSettings(); this._settings = this.getSettings();
this._showOnAllMonitorsChangedId = this._settings.connect( this._settings.connectObject('changed::show-on-all-monitors',
'changed::show-on-all-monitors', this._buildWindowLists.bind(this)); () => this._buildWindowLists(), this);
this._monitorsChangedId = Main.layoutManager.connect( Main.layoutManager.connectObject('monitors-changed',
'monitors-changed', this._buildWindowLists.bind(this)); () => this._buildWindowLists(), this);
Main.windowPicker = new WindowPicker(); this.windowPicker = new WindowPicker();
Main.overview.hide = () => { Main.overview.hide = () => {
Main.windowPicker.close(); this.windowPicker.close();
this._hideOverviewOrig.call(Main.overview); this._hideOverviewOrig.call(Main.overview);
}; };
@@ -1132,7 +1130,7 @@ class Extension {
Main.layoutManager.monitors.forEach(monitor => { Main.layoutManager.monitors.forEach(monitor => {
if (showOnAllMonitors || monitor === Main.layoutManager.primaryMonitor) if (showOnAllMonitors || monitor === Main.layoutManager.primaryMonitor)
this._windowLists.push(new WindowList(showOnAllMonitors, monitor)); this._windowLists.push(new WindowList(showOnAllMonitors, monitor, this.getSettings()));
}); });
} }
@@ -1140,11 +1138,8 @@ class Extension {
if (!this._windowLists) if (!this._windowLists)
return; return;
this._settings.disconnect(this._showOnAllMonitorsChangedId); this._settings.disconnectObject(this);
this._showOnAllMonitorsChangedId = 0; Main.layoutManager.disconnectObject(this);
Main.layoutManager.disconnect(this._monitorsChangedId);
this._monitorsChangedId = 0;
this._windowLists.forEach(windowList => { this._windowLists.forEach(windowList => {
windowList.hide(); windowList.hide();
@@ -1152,8 +1147,8 @@ class Extension {
}); });
this._windowLists = null; this._windowLists = null;
Main.windowPicker.destroy(); this.windowPicker.destroy();
delete Main.windowPicker; delete this.windowPicker;
Main.overview.hide = this._hideOverviewOrig; Main.overview.hide = this._hideOverviewOrig;
} }
@@ -1163,9 +1158,66 @@ class Extension {
} }
} }
/** class Tooltip extends St.Label {
* @returns {Extension} - the extension's state object static {
*/ GObject.registerClass(this);
function init() { }
return new Extension();
constructor(widget, params) {
super(params);
this._widget = widget;
this._widget.connect('notify::hover', () => {
if (this._widget.hover)
this.open();
else
this.close();
});
}
open() {
const buttonTitleWidget = this._widget.label_actor;
const [, , preferredTitleWidth] = buttonTitleWidget.get_preferred_size();
const maxTitleWidth = buttonTitleWidget.allocation.get_width();
const isTitleFullyShown = preferredTitleWidth <= maxTitleWidth;
if (isTitleFullyShown)
return;
this.set({
text: this._widget.label_actor.get_text(),
visible: true,
opacity: 0,
});
const [stageX, stageY] = this._widget.get_transformed_position();
const thumbWidth = this._widget.allocation.get_width();
const tipWidth = this.width;
const tipHeight = this.height;
const xOffset = Math.floor((thumbWidth - tipWidth) / 2);
const monitor = Main.layoutManager.findMonitorForActor(this);
const x = Math.clamp(
stageX + xOffset,
monitor.x,
monitor.x + monitor.width - tipWidth);
const y = stageY - tipHeight - TOOLTIP_OFFSET;
this.set_position(x, y);
this.ease({
opacity: 255,
duration: TOOLTIP_ANIMATION_TIME,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
onComplete: () => (this.visible = this._widget.hover),
});
}
close() {
this.ease({
opacity: 0,
duration: TOOLTIP_ANIMATION_TIME,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
onComplete: () => (this.visible = this._widget.hover),
});
}
} }
+4 -5
View File
@@ -3,11 +3,10 @@ extension_data += configure_file(
output: metadata_name, output: metadata_name,
configuration: metadata_conf configuration: metadata_conf
) )
extension_data += files('stylesheet.css') extension_data += files(
'stylesheet-dark.css',
'stylesheet-light.css'
)
extension_sources += files('prefs.js', 'windowPicker.js', 'workspaceIndicator.js') extension_sources += files('prefs.js', 'windowPicker.js', 'workspaceIndicator.js')
extension_schemas += files(metadata_conf.get('gschemaname') + '.gschema.xml') extension_schemas += files(metadata_conf.get('gschemaname') + '.gschema.xml')
if classic_mode_enabled
extension_data += files('classic.css')
endif
+16 -22
View File
@@ -1,29 +1,24 @@
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*- // -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
/* exported init buildPrefsWidget */ 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';
const { Adw, Gio, GLib, GObject, Gtk } = imports.gi; import {ExtensionPreferences, gettext as _} from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js';
const ExtensionUtils = imports.misc.extensionUtils;
const _ = ExtensionUtils.gettext;
/** */
function init() {
ExtensionUtils.initTranslations();
}
class WindowListPrefsWidget extends Adw.PreferencesPage { class WindowListPrefsWidget extends Adw.PreferencesPage {
static { static {
GObject.registerClass(this); GObject.registerClass(this);
} }
constructor() { constructor(settings) {
super(); super();
this._actionGroup = new Gio.SimpleActionGroup(); this._actionGroup = new Gio.SimpleActionGroup();
this.insert_action_group('window-list', this._actionGroup); this.insert_action_group('window-list', this._actionGroup);
this._settings = ExtensionUtils.getSettings(); this._settings = settings;
this._actionGroup.add_action( this._actionGroup.add_action(
this._settings.create_action('grouping-mode')); this._settings.create_action('grouping-mode'));
this._actionGroup.add_action( this._actionGroup.add_action(
@@ -37,12 +32,12 @@ class WindowListPrefsWidget extends Adw.PreferencesPage {
this.add(groupingGroup); this.add(groupingGroup);
const modes = [ const modes = [
{ mode: 'never', title: _('Never group windows') }, {mode: 'never', title: _('Never group windows')},
{ mode: 'auto', title: _('Group windows when space is limited') }, {mode: 'auto', title: _('Group windows when space is limited')},
{ mode: 'always', title: _('Always group windows') }, {mode: 'always', title: _('Always group windows')},
]; ];
for (const { mode, title } of modes) { for (const {mode, title} of modes) {
const check = new Gtk.CheckButton({ const check = new Gtk.CheckButton({
action_name: 'window-list.grouping-mode', action_name: 'window-list.grouping-mode',
action_target: new GLib.Variant('s', mode), action_target: new GLib.Variant('s', mode),
@@ -84,9 +79,8 @@ class WindowListPrefsWidget extends Adw.PreferencesPage {
} }
} }
/** export default class WindowListPrefs extends ExtensionPreferences {
* @returns {Gtk.Widget} - the prefs widget getPreferencesWidget() {
*/ return new WindowListPrefsWidget(this.getSettings());
function buildPrefsWidget() { }
return new WindowListPrefsWidget();
} }
+113
View File
@@ -0,0 +1,113 @@
.window-list {
spacing: 2px;
font-size: 10pt;
}
.bottom-panel {
background-color: #000000;
border-top-width: 0px;
padding: 2px;
}
.window-button {
padding: 2px, 1px;
}
.window-button:first-child:ltr {
padding-left: 2px;
}
.window-button:last-child:rtl {
padding-right: 2px;
}
.window-button-box {
spacing: 4px;
}
.window-button > StWidget,
.window-picker-toggle > StWidget {
color: #bbb;
background-color: #1d1d1d;
border-radius: 4px;
padding: 3px 6px 1px;
transition: 100ms ease;
}
.window-button > StWidget {
-st-natural-width: 18.75em;
max-width: 18.75em;
}
.window-button:hover > StWidget,
.window-picker-toggle:hover > StWidget {
color: #fff;
background-color: #303030;
}
.window-button:active > StWidget,
.window-button:focus > StWidget {
color: #fff;
background-color: #3f3f3f;
}
.window-button.focused > StWidget,
.window-picker-toggle:checked > StWidget {
color: #fff;
background-color: #3f3f3f;
}
.window-button.focused:active > StWidget,
.window-picker-toggle:checked:active > StWidget {
color: #fff;
background-color: #3f3f3f;
}
.window-button.minimized > StWidget {
color: #666;
background-color: #161616;
}
.window-button.minimized:active > StWidget {
color: #666;
background-color: #161616;
}
.window-button-icon {
width: 24px;
height: 24px;
}
.window-list-workspace-indicator .status-label-bin {
background-color: rgba(200, 200, 200, 0.3);
padding: 0 3px;
margin: 3px;
}
.window-list-workspace-indicator .workspaces-box {
spacing: 3px;
padding: 3px;
}
.window-list-workspace-indicator .workspace {
width: 52px;
border-radius: 4px;
background-color: #1e1e1e;
}
.window-list-workspace-indicator .workspace.active {
background-color: #3f3f3f;
}
.window-list-window-preview {
background-color: #bebebe;
border-radius: 1px;
}
.window-list-window-preview.active {
background-color: #d4d4d4;
}
.notification {
font-weight: normal;
}
@@ -1,4 +1,4 @@
@import url("stylesheet.css"); @import url("stylesheet-dark.css");
#panel.bottom-panel { #panel.bottom-panel {
border-top-width: 1px; border-top-width: 1px;
-115
View File
@@ -1,115 +0,0 @@
.window-list {
spacing: 2px;
font-size: 10pt;
}
.window-button {
padding: 1px;
}
.window-button:first-child:ltr {
padding-left: 2px;
}
.window-button:last-child:rtl {
padding-right: 2px;
}
.window-button-box {
spacing: 4px;
}
.window-button > StWidget,
.window-picker-toggle > StWidget {
color: #bbb;
background-color: black;
border-radius: 2px;
padding: 3px 6px 1px;
box-shadow: inset 1px 1px 4px rgba(255,255,255,0.5);
text-shadow: 1px 1px 4px rgba(0,0,0,0.8);
}
.window-picker-toggle {
padding: 3px;
}
.window-picker-toggle > StWidet {
border: 1px solid rgba(255,255,255,0.3);
}
.window-button > StWidget {
-st-natural-width: 18.75em;
max-width: 18.75em;
}
.window-button:hover > StWidget,
.window-picker-toggle:hover > StWidget {
color: white;
background-color: #1f1f1f;
}
.window-button:active > StWidget,
.window-button:focus > StWidget {
box-shadow: inset 2px 2px 4px rgba(255,255,255,0.5);
}
.window-button.focused > StWidget,
.window-picker-toggle:checked > StWidget {
color: white;
box-shadow: inset 1px 1px 4px rgba(255,255,255,0.7);
}
.window-button.focused:active > StWidget,
.window-picker-toggle:checked:active > StWidget {
box-shadow: inset 2px 2px 4px rgba(255,255,255,0.7);
}
.window-button.minimized > StWidget {
color: #666;
box-shadow: inset -1px -1px 4px rgba(255,255,255,0.5);
}
.window-button.minimized:active > StWidget {
box-shadow: inset -2px -2px 4px rgba(255,255,255,0.5);
}
.window-button-icon {
width: 24px;
height: 24px;
}
.window-list-workspace-indicator .status-label-bin {
background-color: rgba(200, 200, 200, .3);
border: 1px solid #cccccc;
padding: 0 3px;
margin: 3px;
}
.window-list-workspace-indicator .workspaces-box {
spacing: 3px;
padding: 3px;
}
.window-list-workspace-indicator .workspace {
border: 2px solid #000;
width: 52px;
border-radius: 4px;
background-color: #595959;
}
.window-list-workspace-indicator .workspace.active {
border-color: #fff;
}
.window-list-window-preview {
background-color: #bebebe;
border: 1px solid #828282;
}
.window-list-window-preview.active {
background-color: #d4d4d4;
}
.notification {
font-weight: normal;
}
+95 -122
View File
@@ -1,17 +1,20 @@
/* exported WindowPicker, WindowPickerToggle */ import Clutter from 'gi://Clutter';
const { Clutter, GObject, Shell, St } = imports.gi; import GObject from 'gi://GObject';
import Shell from 'gi://Shell';
import St from 'gi://St';
const Layout = imports.ui.layout; import {Extension, InjectionManager} from 'resource:///org/gnome/shell/extensions/extension.js';
const Main = imports.ui.main; import * as Layout from 'resource:///org/gnome/shell/ui/layout.js';
const { WorkspacesDisplay } = imports.ui.workspacesView; import * as Main from 'resource:///org/gnome/shell/ui/main.js';
const Workspace = imports.ui.workspace; import {WorkspacesDisplay} from 'resource:///org/gnome/shell/ui/workspacesView.js';
import * as Workspace from 'resource:///org/gnome/shell/ui/workspace.js';
const { VIGNETTE_BRIGHTNESS } = imports.ui.lightbox; import {VIGNETTE_BRIGHTNESS} from 'resource:///org/gnome/shell/ui/lightbox.js';
const { import {
SIDE_CONTROLS_ANIMATION_TIME, SIDE_CONTROLS_ANIMATION_TIME,
OverviewAdjustment, OverviewAdjustment,
ControlsState, ControlsState
} = imports.ui.overviewControls; } from 'resource:///org/gnome/shell/ui/overviewControls.js';
class MyWorkspacesDisplay extends WorkspacesDisplay { class MyWorkspacesDisplay extends WorkspacesDisplay {
static { static {
@@ -32,12 +35,13 @@ class MyWorkspacesDisplay extends WorkspacesDisplay {
super(controls, workspaceAdjustment, overviewAdjustment); super(controls, workspaceAdjustment, overviewAdjustment);
this._windowPicker = controls;
this._workspaceAdjustment = workspaceAdjustment; this._workspaceAdjustment = workspaceAdjustment;
this._workspaceAdjustment.actor = this; this._workspaceAdjustment.actor = this;
this._nWorkspacesChangedId = workspaceManager.connectObject('notify::n-workspaces',
workspaceManager.connect('notify::n-workspaces', () => this._updateAdjustment(), this);
this._updateAdjustment.bind(this));
this.add_constraint( this.add_constraint(
new Layout.MonitorConstraint({ new Layout.MonitorConstraint({
@@ -48,7 +52,7 @@ class MyWorkspacesDisplay extends WorkspacesDisplay {
prepareToEnterOverview(...args) { prepareToEnterOverview(...args) {
if (!this._scrollEventId) { if (!this._scrollEventId) {
this._scrollEventId = Main.windowPicker.connect('scroll-event', this._scrollEventId = this._windowPicker.connect('scroll-event',
this._onScrollEvent.bind(this)); this._onScrollEvent.bind(this));
} }
@@ -57,7 +61,7 @@ class MyWorkspacesDisplay extends WorkspacesDisplay {
vfunc_hide(...args) { vfunc_hide(...args) {
if (this._scrollEventId > 0) if (this._scrollEventId > 0)
Main.windowPicker.disconnect(this._scrollEventId); this._windowPicker.disconnect(this._scrollEventId);
this._scrollEventId = 0; this._scrollEventId = 0;
super.vfunc_hide(...args); super.vfunc_hide(...args);
@@ -70,88 +74,11 @@ class MyWorkspacesDisplay extends WorkspacesDisplay {
value: workspaceManager.get_active_workspace_index(), value: workspaceManager.get_active_workspace_index(),
}); });
} }
_onDestroy() {
if (this._nWorkspacesChangedId)
global.workspace_manager.disconnect(this._nWorkspacesChangedId);
this._nWorkspacesChangedId = 0;
super._onDestroy();
}
} }
class MyWorkspace extends Workspace.Workspace { export class WindowPicker extends Clutter.Actor {
static {
GObject.registerClass(this);
}
constructor(...args) {
super(...args);
this._adjChangedId =
this._overviewAdjustment.connect('notify::value', () => {
const { value: progress } = this._overviewAdjustment;
const brightness = 1 - (1 - VIGNETTE_BRIGHTNESS) * progress;
for (const bg of this._background?._backgroundGroup ?? []) {
bg.content.set({
vignette: true,
brightness,
});
}
});
}
_onDestroy() {
super._onDestroy();
if (this._adjChangedId)
this._overviewAdjustment.disconnect(this._adjChangedId);
this._adjChangedId = 0;
}
}
class MyWorkspaceBackground extends Workspace.WorkspaceBackground {
static {
GObject.registerClass(this);
}
_updateBorderRadius() {
}
vfunc_allocate(box) {
this.set_allocation(box);
const themeNode = this.get_theme_node();
const contentBox = themeNode.get_content_box(box);
this._bin.allocate(contentBox);
const [contentWidth, contentHeight] = contentBox.get_size();
const monitor = Main.layoutManager.monitors[this._monitorIndex];
const xRatio = contentWidth / this._workarea.width;
const yRatio = contentHeight / this._workarea.height;
const right = area => area.x + area.width;
const bottom = area => area.y + area.height;
const offsets = {
left: xRatio * (this._workarea.x - monitor.x),
right: xRatio * (right(monitor) - right(this._workarea)),
top: yRatio * (this._workarea.y - monitor.y),
bottom: yRatio * (bottom(monitor) - bottom(this._workarea)),
};
contentBox.set_origin(-offsets.left, -offsets.top);
contentBox.set_size(
offsets.left + contentWidth + offsets.right,
offsets.top + contentHeight + offsets.bottom);
this._backgroundGroup.allocate(contentBox);
}
}
var WindowPicker = class WindowPicker extends Clutter.Actor {
static [GObject.signals] = { static [GObject.signals] = {
'open-state-changed': { param_types: [GObject.TYPE_BOOLEAN] }, 'open-state-changed': {param_types: [GObject.TYPE_BOOLEAN]},
}; };
static { static {
@@ -159,16 +86,16 @@ var WindowPicker = class WindowPicker extends Clutter.Actor {
} }
constructor() { constructor() {
super({ reactive: true }); super({reactive: true});
this._visible = false; this._visible = false;
this._modal = false; this._modal = false;
this._overlayKeyId = 0;
this._stageKeyPressId = 0; this._stageKeyPressId = 0;
this._adjustment = new OverviewAdjustment(this); this._adjustment = new OverviewAdjustment(this);
this._injectionManager = new InjectionManager();
this.connect('destroy', this._onDestroy.bind(this)); this.connect('destroy', this._onDestroy.bind(this));
global.bind_property('screen-width', global.bind_property('screen-width',
@@ -186,21 +113,78 @@ var WindowPicker = class WindowPicker extends Clutter.Actor {
if (!Main.sessionMode.hasOverview) { if (!Main.sessionMode.hasOverview) {
this._injectBackgroundShade(); this._injectBackgroundShade();
this._overlayKeyId = global.display.connect('overlay-key', () => { global.display.connectObject('overlay-key', () => {
if (!this._visible) if (!this._visible)
this.open(); this.open();
else else
this.close(); this.close();
}); }, this);
} }
} }
_injectBackgroundShade() { _injectBackgroundShade() {
this._origWorkspace = Workspace.Workspace; const backgroundProto = Workspace.WorkspaceBackground.prototype;
this._origWorkspaceBackground = Workspace.WorkspaceBackground; this._injectionManager.overrideMethod(backgroundProto, '_updateBorderRadius',
() => {
return function () {};
});
this._injectionManager.overrideMethod(backgroundProto, 'vfunc_allocate',
() => {
/* eslint-disable no-invalid-this */
return function (box) {
this.set_allocation(box);
Workspace.Workspace = MyWorkspace; const themeNode = this.get_theme_node();
Workspace.WorkspaceBackground = MyWorkspaceBackground; const contentBox = themeNode.get_content_box(box);
this._bin.allocate(contentBox);
const [contentWidth, contentHeight] = contentBox.get_size();
const monitor = Main.layoutManager.monitors[this._monitorIndex];
const xRatio = contentWidth / this._workarea.width;
const yRatio = contentHeight / this._workarea.height;
const right = area => area.x + area.width;
const bottom = area => area.y + area.height;
const offsets = {
left: xRatio * (this._workarea.x - monitor.x),
right: xRatio * (right(monitor) - right(this._workarea)),
top: yRatio * (this._workarea.y - monitor.y),
bottom: yRatio * (bottom(monitor) - bottom(this._workarea)),
};
contentBox.set_origin(-offsets.left, -offsets.top);
contentBox.set_size(
offsets.left + contentWidth + offsets.right,
offsets.top + contentHeight + offsets.bottom);
this._backgroundGroup.allocate(contentBox);
};
/* eslint-enable */
});
this._injectionManager.overrideMethod(backgroundProto, 'vfunc_parent_set',
() => {
/* eslint-disable no-invalid-this */
return function () {
setTimeout(() => {
const parent = this.get_parent();
if (!parent)
return;
parent._overviewAdjustment.connectObject('notify::value', () => {
const {value: progress} = parent._overviewAdjustment;
const brightness = 1 - (1 - VIGNETTE_BRIGHTNESS) * progress;
for (const bg of this._backgroundGroup ?? []) {
bg.content.set({
vignette: true,
brightness,
});
}
}, this);
});
};
/* eslint-enable */
});
} }
get visible() { get visible() {
@@ -306,27 +290,15 @@ var WindowPicker = class WindowPicker extends Clutter.Actor {
} }
_onDestroy() { _onDestroy() {
if (this._origWorkspace) this._injectionManager.clear();
Workspace.Workspace = this._origWorkspace;
if (this._origWorkspaceBackground)
Workspace.WorkspaceBackground = this._origWorkspaceBackground;
if (this._monitorsChangedId)
Main.layoutManager.disconnect(this._monitorsChangedId);
this._monitorsChangedId = 0;
if (this._overlayKeyId)
global.display.disconnect(this._overlayKeyId);
this._overlayKeyId = 0;
if (this._stageKeyPressId) if (this._stageKeyPressId)
global.stage.disconnect(this._stageKeyPressId); global.stage.disconnect(this._stageKeyPressId);
this._stageKeyPressId = 0; this._stageKeyPressId = 0;
} }
}; }
var WindowPickerToggle = class WindowPickerToggle extends St.Button { export class WindowPickerToggle extends St.Button {
static { static {
GObject.registerClass(this); GObject.registerClass(this);
} }
@@ -350,15 +322,16 @@ var WindowPickerToggle = class WindowPickerToggle extends St.Button {
toggle_mode: true, toggle_mode: true,
}); });
const {windowPicker} = Extension.lookupByURL(import.meta.url);
this.connect('notify::checked', () => { this.connect('notify::checked', () => {
if (this.checked) if (this.checked)
Main.windowPicker.open(); windowPicker.open();
else else
Main.windowPicker.close(); windowPicker.close();
}); });
Main.windowPicker.connect('open-state-changed', () => { windowPicker.connect('open-state-changed', () => {
this.checked = Main.windowPicker.visible; this.checked = windowPicker.visible;
}); });
} }
}; }
+39 -69
View File
@@ -1,13 +1,15 @@
/* exported WorkspaceIndicator */ import Clutter from 'gi://Clutter';
const { Clutter, Gio, GObject, Meta, St } = imports.gi; import Gio from 'gi://Gio';
import GObject from 'gi://GObject';
import Meta from 'gi://Meta';
import St from 'gi://St';
const DND = imports.ui.dnd; import {gettext as _} from 'resource:///org/gnome/shell/extensions/extension.js';
const ExtensionUtils = imports.misc.extensionUtils;
const Main = imports.ui.main;
const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu;
const _ = ExtensionUtils.gettext; import * as DND from 'resource:///org/gnome/shell/ui/dnd.js';
import * as Main from 'resource:///org/gnome/shell/ui/main.js';
import * as PanelMenu from 'resource:///org/gnome/shell/ui/panelMenu.js';
import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js';
const TOOLTIP_OFFSET = 6; const TOOLTIP_OFFSET = 6;
const TOOLTIP_ANIMATION_TIME = 150; const TOOLTIP_ANIMATION_TIME = 150;
@@ -25,24 +27,21 @@ class WindowPreview extends St.Button {
}); });
this._delegate = this; this._delegate = this;
DND.makeDraggable(this, { restoreOnSuccess: true }); DND.makeDraggable(this, {restoreOnSuccess: true});
this._window = window; this._window = window;
this.connect('destroy', this._onDestroy.bind(this)); this._window.connectObject(
'size-changed', () => this.queue_relayout(),
this._sizeChangedId = this._window.connect('size-changed', 'position-changed', () => {
() => this.queue_relayout());
this._positionChangedId = this._window.connect('position-changed',
() => {
this._updateVisible(); this._updateVisible();
this.queue_relayout(); this.queue_relayout();
}); },
this._minimizedChangedId = this._window.connect('notify::minimized', 'notify::minimized', this._updateVisible.bind(this),
this._updateVisible.bind(this)); this);
this._focusChangedId = global.display.connect('notify::focus-window', global.display.connectObject('notify::focus-window',
this._onFocusChanged.bind(this)); this._onFocusChanged.bind(this), this);
this._onFocusChanged(); this._onFocusChanged();
} }
@@ -51,13 +50,6 @@ class WindowPreview extends St.Button {
return this._window; return this._window;
} }
_onDestroy() {
this._window.disconnect(this._sizeChangedId);
this._window.disconnect(this._positionChangedId);
this._window.disconnect(this._minimizedChangedId);
global.display.disconnect(this._focusChangedId);
}
_onFocusChanged() { _onFocusChanged() {
if (global.display.focus_window === this._window) if (global.display.focus_window === this._window)
this.add_style_class_name('active'); this.add_style_class_name('active');
@@ -138,16 +130,13 @@ class WorkspaceThumbnail extends St.Button {
let workspaceManager = global.workspace_manager; let workspaceManager = global.workspace_manager;
this._workspace = workspaceManager.get_workspace_by_index(index); this._workspace = workspaceManager.get_workspace_by_index(index);
this._windowAddedId = this._workspace.connect('window-added', this._workspace.connectObject(
(ws, window) => { 'window-added', (ws, window) => this._addWindow(window),
this._addWindow(window); 'window-removed', (ws, window) => this._removeWindow(window),
}); this);
this._windowRemovedId = this._workspace.connect('window-removed',
(ws, window) => { global.display.connectObject('restacked',
this._removeWindow(window); this._onRestacked.bind(this), this);
});
this._restackedId = global.display.connect('restacked',
this._onRestacked.bind(this));
this._workspace.list_windows().forEach(w => this._addWindow(w)); this._workspace.list_windows().forEach(w => this._addWindow(w));
this._onRestacked(); this._onRestacked();
@@ -245,20 +234,16 @@ class WorkspaceThumbnail extends St.Button {
_onDestroy() { _onDestroy() {
this._tooltip.destroy(); this._tooltip.destroy();
this._workspace.disconnect(this._windowAddedId);
this._workspace.disconnect(this._windowRemovedId);
global.display.disconnect(this._restackedId);
} }
} }
var WorkspaceIndicator = class WorkspaceIndicator extends PanelMenu.Button { export class WorkspaceIndicator extends PanelMenu.Button {
static { static {
GObject.registerClass(this); GObject.registerClass(this);
} }
constructor() { constructor() {
super(0.0, _('Workspace Indicator'), true); super(0.5, _('Workspace Indicator'), true);
this.setMenu(new PopupMenu.PopupMenu(this, 0.0, St.Side.BOTTOM)); this.setMenu(new PopupMenu.PopupMenu(this, 0.0, St.Side.BOTTOM));
this.add_style_class_name('window-list-workspace-indicator'); this.add_style_class_name('window-list-workspace-indicator');
this.remove_style_class_name('panel-button'); this.remove_style_class_name('panel-button');
@@ -274,7 +259,7 @@ var WorkspaceIndicator = class WorkspaceIndicator extends PanelMenu.Button {
let workspaceManager = global.workspace_manager; let workspaceManager = global.workspace_manager;
this._currentWorkspace = workspaceManager.get_active_workspace_index(); this._currentWorkspace = workspaceManager.get_active_workspace_index();
this._statusLabel = new St.Label({ text: this._getStatusText() }); this._statusLabel = new St.Label({text: this._getStatusText()});
this._statusBin = new St.Bin({ this._statusBin = new St.Bin({
style_class: 'status-label-bin', style_class: 'status-label-bin',
@@ -295,39 +280,24 @@ var WorkspaceIndicator = class WorkspaceIndicator extends PanelMenu.Button {
this._workspacesItems = []; this._workspacesItems = [];
this._workspaceManagerSignals = [ workspaceManager.connectObject(
workspaceManager.connect('notify::n-workspaces', 'notify::n-workspaces', this._nWorkspacesChanged.bind(this), GObject.ConnectFlags.AFTER,
this._nWorkspacesChanged.bind(this)), 'workspace-switched', this._onWorkspaceSwitched.bind(this), GObject.ConnectFlags.AFTER,
workspaceManager.connect_after('workspace-switched', 'notify::layout-rows', this._updateThumbnailVisibility.bind(this),
this._onWorkspaceSwitched.bind(this)), this);
workspaceManager.connect('notify::layout-rows',
this._updateThumbnailVisibility.bind(this)),
];
this.connect('scroll-event', this._onScrollEvent.bind(this)); this.connect('scroll-event', this._onScrollEvent.bind(this));
this._updateMenu(); this._updateMenu();
this._updateThumbnails(); this._updateThumbnails();
this._updateThumbnailVisibility(); this._updateThumbnailVisibility();
this._settings = new Gio.Settings({ schema_id: 'org.gnome.desktop.wm.preferences' }); this._settings = new Gio.Settings({schema_id: 'org.gnome.desktop.wm.preferences'});
this._settingsChangedId = this._settings.connect( this._settings.connectObject('changed::workspace-names',
'changed::workspace-names', this._updateMenuLabels.bind(this)); () => this._updateMenuLabels(), this);
}
_onDestroy() {
for (let i = 0; i < this._workspaceManagerSignals.length; i++)
global.workspace_manager.disconnect(this._workspaceManagerSignals[i]);
if (this._settingsChangedId) {
this._settings.disconnect(this._settingsChangedId);
this._settingsChangedId = 0;
}
super._onDestroy();
} }
_updateThumbnailVisibility() { _updateThumbnailVisibility() {
const { workspaceManager } = global; const {workspaceManager} = global;
const vertical = workspaceManager.layout_rows === -1; const vertical = workspaceManager.layout_rows === -1;
const useMenu = const useMenu =
vertical || workspaceManager.n_workspaces > MAX_THUMBNAILS; vertical || workspaceManager.n_workspaces > MAX_THUMBNAILS;
@@ -447,4 +417,4 @@ var WorkspaceIndicator = class WorkspaceIndicator extends PanelMenu.Button {
let newIndex = this._currentWorkspace + diff; let newIndex = this._currentWorkspace + diff;
this._activate(newIndex); this._activate(newIndex);
} }
}; }
+276 -262
View File
@@ -1,276 +1,290 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */ /* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
/* exported init */ import Clutter from 'gi://Clutter';
const { Clutter, Graphene, GObject, St } = imports.gi; import Graphene from 'gi://Graphene';
import St from 'gi://St';
const Main = imports.ui.main; import * as Main from 'resource:///org/gnome/shell/ui/main.js';
const OverviewControls = imports.ui.overviewControls; import * as OverviewControls from 'resource:///org/gnome/shell/ui/overviewControls.js';
const Workspace = imports.ui.workspace; import {InjectionManager} from 'resource:///org/gnome/shell/extensions/extension.js';
const WorkspacesView = imports.ui.workspacesView; import {WindowPreview} from 'resource:///org/gnome/shell/ui/windowPreview.js';
import {Workspace} from 'resource:///org/gnome/shell/ui/workspace.js';
import {WorkspacesView} from 'resource:///org/gnome/shell/ui/workspacesView.js';
const WINDOW_SLOT = 4; const WINDOW_SLOT = 4;
class MyWorkspace extends Workspace.Workspace { export default class Extension {
static {
GObject.registerClass(this);
}
constructor(...args) {
super(...args);
if (this.metaWorkspace && this.metaWorkspace.index() < 9) {
this._tip = new St.Label({
style_class: 'extension-windowsNavigator-window-tooltip',
visible: false,
});
this.add_actor(this._tip);
this.connect('notify::scale-x', () => {
this._tip.set_scale(1 / this.scale_x, 1 / this.scale_x);
});
} else {
this._tip = null;
}
}
vfunc_allocate(box) {
super.vfunc_allocate(box);
if (this._tip)
this._tip.allocate_preferred_size(0, 0);
}
showTooltip() {
if (!this._tip)
return;
this._tip.text = (this.metaWorkspace.index() + 1).toString();
this._tip.show();
this.set_child_below_sibling(this._tip, null);
}
hideTooltip() {
if (this._tip)
this._tip.hide();
}
getWindowWithTooltip(id) {
const { layoutManager } = this._container;
const slot = layoutManager._windowSlots[id - 1];
return slot ? slot[WINDOW_SLOT].metaWindow : null;
}
showWindowsTooltips() {
const { layoutManager } = this._container;
for (let i = 0; i < layoutManager._windowSlots.length; i++) {
if (layoutManager._windowSlots[i])
layoutManager._windowSlots[i][WINDOW_SLOT].showTooltip(`${i + 1}`);
}
}
hideWindowsTooltips() {
const { layoutManager } = this._container;
for (let i in layoutManager._windowSlots) {
if (layoutManager._windowSlots[i])
layoutManager._windowSlots[i][WINDOW_SLOT].hideTooltip();
}
}
// overriding _addWindowClone to apply the tooltip patch on the cloned
// windowPreview
_addWindowClone(metaWindow) {
const clone = super._addWindowClone(metaWindow);
// appling the tooltip patch
(function patchPreview() {
this._text = new St.Label({
style_class: 'extension-windowsNavigator-window-tooltip',
visible: false,
});
this._text.add_constraint(new Clutter.BindConstraint({
source: this.windowContainer,
coordinate: Clutter.BindCoordinate.POSITION,
}));
this._text.add_constraint(new Clutter.AlignConstraint({
source: this.windowContainer,
align_axis: Clutter.AlignAxis.X_AXIS,
pivot_point: new Graphene.Point({ x: 0.5, y: -1 }),
factor: this._closeButtonSide === St.Side.LEFT ? 1 : 0,
}));
this._text.add_constraint(new Clutter.AlignConstraint({
source: this.windowContainer,
align_axis: Clutter.AlignAxis.Y_AXIS,
pivot_point: new Graphene.Point({ x: -1, y: 0.5 }),
factor: 0,
}));
this.add_child(this._text);
}).call(clone);
clone.showTooltip = function (text) {
this._text.set({ text });
this._text.show();
};
clone.hideTooltip = function () {
if (this._text && this._text.visible)
this._text.hide();
};
return clone;
}
}
class MyWorkspacesView extends WorkspacesView.WorkspacesView {
static {
GObject.registerClass(this);
}
constructor(...args) {
super(...args);
this._pickWorkspace = false;
this._pickWindow = false;
this._keyPressEventId =
global.stage.connect('key-press-event', this._onKeyPress.bind(this));
this._keyReleaseEventId =
global.stage.connect('key-release-event', this._onKeyRelease.bind(this));
}
_onDestroy() {
super._onDestroy();
global.stage.disconnect(this._keyPressEventId);
global.stage.disconnect(this._keyReleaseEventId);
}
_hideTooltips() {
if (global.stage.get_key_focus() === global.stage)
global.stage.set_key_focus(this._prevFocusActor);
this._pickWindow = false;
for (let i = 0; i < this._workspaces.length; i++)
this._workspaces[i].hideWindowsTooltips();
}
_hideWorkspacesTooltips() {
global.stage.set_key_focus(this._prevFocusActor);
this._pickWorkspace = false;
for (let i = 0; i < this._workspaces.length; i++)
this._workspaces[i].hideTooltip();
}
_onKeyRelease(s, o) {
if (this._pickWindow &&
(o.get_key_symbol() === Clutter.KEY_Alt_L ||
o.get_key_symbol() === Clutter.KEY_Alt_R))
this._hideTooltips();
if (this._pickWorkspace &&
(o.get_key_symbol() === Clutter.KEY_Control_L ||
o.get_key_symbol() === Clutter.KEY_Control_R))
this._hideWorkspacesTooltips();
}
_onKeyPress(s, o) {
const { ControlsState } = OverviewControls;
if (this._overviewAdjustment.value !== ControlsState.WINDOW_PICKER)
return false;
let workspaceManager = global.workspace_manager;
if ((o.get_key_symbol() === Clutter.KEY_Alt_L ||
o.get_key_symbol() === Clutter.KEY_Alt_R) &&
!this._pickWorkspace) {
this._prevFocusActor = global.stage.get_key_focus();
global.stage.set_key_focus(null);
this._active = workspaceManager.get_active_workspace_index();
this._pickWindow = true;
this._workspaces[workspaceManager.get_active_workspace_index()].showWindowsTooltips();
return true;
}
if ((o.get_key_symbol() === Clutter.KEY_Control_L ||
o.get_key_symbol() === Clutter.KEY_Control_R) &&
!this._pickWindow) {
this._prevFocusActor = global.stage.get_key_focus();
global.stage.set_key_focus(null);
this._pickWorkspace = true;
for (let i = 0; i < this._workspaces.length; i++)
this._workspaces[i].showTooltip();
return true;
}
if (global.stage.get_key_focus() !== global.stage)
return false;
// ignore shift presses, they're required to get numerals in azerty keyboards
if ((this._pickWindow || this._pickWorkspace) &&
(o.get_key_symbol() === Clutter.KEY_Shift_L ||
o.get_key_symbol() === Clutter.KEY_Shift_R))
return true;
if (this._pickWindow) {
if (this._active !== workspaceManager.get_active_workspace_index()) {
this._hideTooltips();
return false;
}
let c = o.get_key_symbol() - Clutter.KEY_KP_0;
if (c > 9 || c <= 0) {
c = o.get_key_symbol() - Clutter.KEY_0;
if (c > 9 || c <= 0) {
this._hideTooltips();
global.log(c);
return false;
}
}
let win = this._workspaces[this._active].getWindowWithTooltip(c);
this._hideTooltips();
if (win)
Main.activateWindow(win, global.get_current_time());
return true;
}
if (this._pickWorkspace) {
let c = o.get_key_symbol() - Clutter.KEY_KP_0;
if (c > 9 || c <= 0) {
c = o.get_key_symbol() - Clutter.KEY_0;
if (c > 9 || c <= 0) {
this._hideWorkspacesTooltips();
return false;
}
}
let workspace = this._workspaces[c - 1];
if (workspace !== undefined)
workspace.metaWorkspace.activate(global.get_current_time());
this._hideWorkspacesTooltips();
return true;
}
return false;
}
}
class Extension {
constructor() { constructor() {
this._origWorkspace = Workspace.Workspace; this._injectionManager = new InjectionManager();
this._origWorkspacesView = WorkspacesView.WorkspacesView;
} }
enable() { enable() {
Workspace.Workspace = MyWorkspace; const previewProto = WindowPreview.prototype;
WorkspacesView.WorkspacesView = MyWorkspacesView;
this._injectionManager.overrideMethod(previewProto, '_init', originalMethod => {
/* eslint-disable no-invalid-this */
return function (...args) {
originalMethod.call(this, ...args);
this._text = new St.Label({
style_class: 'extension-windowsNavigator-window-tooltip',
visible: false,
});
this._text.add_constraint(new Clutter.BindConstraint({
source: this.windowContainer,
coordinate: Clutter.BindCoordinate.POSITION,
}));
this._text.add_constraint(new Clutter.AlignConstraint({
source: this.windowContainer,
align_axis: Clutter.AlignAxis.X_AXIS,
pivot_point: new Graphene.Point({x: 0.5, y: -1}),
factor: this._closeButtonSide === St.Side.LEFT ? 1 : 0,
}));
this._text.add_constraint(new Clutter.AlignConstraint({
source: this.windowContainer,
align_axis: Clutter.AlignAxis.Y_AXIS,
pivot_point: new Graphene.Point({x: -1, y: 0.5}),
factor: 0,
}));
this.add_child(this._text);
};
/* eslint-enable */
});
this._injectionManager.overrideMethod(previewProto, 'showTooltip', () => {
/* eslint-disable no-invalid-this */
return function (text) {
this._text.set({text});
this._text.show();
};
/* eslint-enable */
});
this._injectionManager.overrideMethod(previewProto, 'hideTooltip', () => {
/* eslint-disable no-invalid-this */
return function () {
this._text?.hide();
};
/* eslint-enable */
});
const workspaceProto = Workspace.prototype;
this._injectionManager.overrideMethod(workspaceProto, '_init', originalMethod => {
/* eslint-disable no-invalid-this */
return function (...args) {
originalMethod.call(this, ...args);
if (this.metaWorkspace && this.metaWorkspace.index() < 9) {
this._tip = new St.Label({
style_class: 'extension-windowsNavigator-window-tooltip',
visible: false,
});
this.add_actor(this._tip);
this.connect('notify::scale-x', () => {
this._tip.set_scale(1 / this.scale_x, 1 / this.scale_x);
});
} else {
this._tip = null;
}
};
/* eslint-enable */
});
this._injectionManager.overrideMethod(workspaceProto, 'vfunc_allocate', originalMethod => {
/* eslint-disable no-invalid-this */
return function (box) {
originalMethod.call(this, box);
this._tip?.allocate_preferred_size(0, 0);
};
/* eslint-enable */
});
this._injectionManager.overrideMethod(workspaceProto, 'showTooltip', () => {
/* eslint-disable no-invalid-this */
return function () {
if (!this._tip)
return;
this._tip.text = (this.metaWorkspace.index() + 1).toString();
this._tip.show();
this.set_child_below_sibling(this._tip, null);
};
/* eslint-enable */
});
this._injectionManager.overrideMethod(workspaceProto, 'hideTooltip', () => {
/* eslint-disable no-invalid-this */
return function () {
this._tip?.hide();
};
/* eslint-enable */
});
this._injectionManager.overrideMethod(workspaceProto, 'getWindowWithTooltip', () => {
/* eslint-disable no-invalid-this */
return function (id) {
const {layoutManager} = this._container;
const slot = layoutManager._windowSlots[id - 1];
return slot ? slot[WINDOW_SLOT].metaWindow : null;
};
/* eslint-enable */
});
this._injectionManager.overrideMethod(workspaceProto, 'showWindowsTooltips', () => {
/* eslint-disable no-invalid-this */
return function () {
const {layoutManager} = this._container;
for (let i = 0; i < layoutManager._windowSlots.length; i++) {
if (layoutManager._windowSlots[i])
layoutManager._windowSlots[i][WINDOW_SLOT].showTooltip(`${i + 1}`);
}
};
/* eslint-enable */
});
this._injectionManager.overrideMethod(workspaceProto, 'hideWindowsTooltips', () => {
/* eslint-disable no-invalid-this */
return function () {
const {layoutManager} = this._container;
for (let i in layoutManager._windowSlots) {
if (layoutManager._windowSlots[i])
layoutManager._windowSlots[i][WINDOW_SLOT].hideTooltip();
}
};
/* eslint-enable */
});
const viewProto = WorkspacesView.prototype;
this._injectionManager.overrideMethod(viewProto, '_init', originalMethod => {
/* eslint-disable no-invalid-this */
return function (...args) {
originalMethod.call(this, ...args);
this._pickWorkspace = false;
this._pickWindow = false;
global.stage.connectObject(
'key-press-event', this._onKeyPress.bind(this),
'key-release-event', this._onKeyRelease.bind(this),
this);
};
/* eslint-enable */
});
this._injectionManager.overrideMethod(viewProto, '_hideTooltips', () => {
/* eslint-disable no-invalid-this */
return function () {
if (global.stage.get_key_focus() === global.stage)
global.stage.set_key_focus(this._prevFocusActor);
this._pickWindow = false;
for (let i = 0; i < this._workspaces.length; i++)
this._workspaces[i].hideWindowsTooltips();
};
/* eslint-enable */
});
this._injectionManager.overrideMethod(viewProto, '_hideWorkspacesTooltips', () => {
/* eslint-disable no-invalid-this */
return function () {
global.stage.set_key_focus(this._prevFocusActor);
this._pickWorkspace = false;
for (let i = 0; i < this._workspaces.length; i++)
this._workspaces[i].hideTooltip();
};
/* eslint-enable */
});
this._injectionManager.overrideMethod(viewProto, '_onKeyRelease', () => {
/* eslint-disable no-invalid-this */
return function (actor, event) {
if (this._pickWindow &&
(event.get_key_symbol() === Clutter.KEY_Alt_L ||
event.get_key_symbol() === Clutter.KEY_Alt_R))
this._hideTooltips();
if (this._pickWorkspace &&
(event.get_key_symbol() === Clutter.KEY_Control_L ||
event.get_key_symbol() === Clutter.KEY_Control_R))
this._hideWorkspacesTooltips();
};
/* eslint-enable */
});
this._injectionManager.overrideMethod(viewProto, '_onKeyPress', () => {
/* eslint-disable no-invalid-this */
return function (actor, event) {
const {ControlsState} = OverviewControls;
if (this._overviewAdjustment.value !== ControlsState.WINDOW_PICKER)
return false;
let workspaceManager = global.workspace_manager;
if ((event.get_key_symbol() === Clutter.KEY_Alt_L ||
event.get_key_symbol() === Clutter.KEY_Alt_R) &&
!this._pickWorkspace) {
this._prevFocusActor = global.stage.get_key_focus();
global.stage.set_key_focus(null);
this._active = workspaceManager.get_active_workspace_index();
this._pickWindow = true;
this._workspaces[workspaceManager.get_active_workspace_index()].showWindowsTooltips();
return true;
}
if ((event.get_key_symbol() === Clutter.KEY_Control_L ||
event.get_key_symbol() === Clutter.KEY_Control_R) &&
!this._pickWindow) {
this._prevFocusActor = global.stage.get_key_focus();
global.stage.set_key_focus(null);
this._pickWorkspace = true;
for (let i = 0; i < this._workspaces.length; i++)
this._workspaces[i].showTooltip();
return true;
}
if (global.stage.get_key_focus() !== global.stage)
return false;
// ignore shift presses, they're required to get numerals in azerty keyboards
if ((this._pickWindow || this._pickWorkspace) &&
(event.get_key_symbol() === Clutter.KEY_Shift_L ||
event.get_key_symbol() === Clutter.KEY_Shift_R))
return true;
if (this._pickWindow) {
if (this._active !== workspaceManager.get_active_workspace_index()) {
this._hideTooltips();
return false;
}
let c = event.get_key_symbol() - Clutter.KEY_KP_0;
if (c > 9 || c <= 0) {
c = event.get_key_symbol() - Clutter.KEY_0;
if (c > 9 || c <= 0) {
this._hideTooltips();
log(c);
return false;
}
}
let win = this._workspaces[this._active].getWindowWithTooltip(c);
this._hideTooltips();
if (win)
Main.activateWindow(win, global.get_current_time());
return true;
}
if (this._pickWorkspace) {
let c = event.get_key_symbol() - Clutter.KEY_KP_0;
if (c > 9 || c <= 0) {
c = event.get_key_symbol() - Clutter.KEY_0;
if (c > 9 || c <= 0) {
this._hideWorkspacesTooltips();
return false;
}
}
let workspace = this._workspaces[c - 1];
if (workspace !== undefined)
workspace.metaWorkspace.activate(global.get_current_time());
this._hideWorkspacesTooltips();
return true;
}
return false;
};
/* eslint-enable */
});
} }
disable() { disable() {
Workspace.Workspace = this._origWorkspace; this._injectionManager.clear();
WorkspacesView.WorkspacesView = this._origWorkspacesView;
} }
} }
/**
* @returns {Extension} - the extension's state object
*/
function init() {
return new Extension();
}
+45 -79
View File
@@ -1,15 +1,16 @@
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*- // -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
/* exported init enable disable */ import Clutter from 'gi://Clutter';
import Gio from 'gi://Gio';
import GObject from 'gi://GObject';
import Meta from 'gi://Meta';
import St from 'gi://St';
const { Clutter, Gio, GObject, Meta, St } = imports.gi; import {Extension, gettext as _} from 'resource:///org/gnome/shell/extensions/extension.js';
const DND = imports.ui.dnd; import * as DND from 'resource:///org/gnome/shell/ui/dnd.js';
const ExtensionUtils = imports.misc.extensionUtils; import * as Main from 'resource:///org/gnome/shell/ui/main.js';
const Main = imports.ui.main; import * as PanelMenu from 'resource:///org/gnome/shell/ui/panelMenu.js';
const PanelMenu = imports.ui.panelMenu; import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js';
const PopupMenu = imports.ui.popupMenu;
const _ = ExtensionUtils.gettext;
const WORKSPACE_SCHEMA = 'org.gnome.desktop.wm.preferences'; const WORKSPACE_SCHEMA = 'org.gnome.desktop.wm.preferences';
const WORKSPACE_KEY = 'workspace-names'; const WORKSPACE_KEY = 'workspace-names';
@@ -30,24 +31,21 @@ class WindowPreview extends St.Button {
}); });
this._delegate = this; this._delegate = this;
DND.makeDraggable(this, { restoreOnSuccess: true }); DND.makeDraggable(this, {restoreOnSuccess: true});
this._window = window; this._window = window;
this.connect('destroy', this._onDestroy.bind(this)); this._window.connectObject(
'size-changed', () => this.queue_relayout(),
this._sizeChangedId = this._window.connect('size-changed', 'position-changed', () => {
() => this.queue_relayout());
this._positionChangedId = this._window.connect('position-changed',
() => {
this._updateVisible(); this._updateVisible();
this.queue_relayout(); this.queue_relayout();
}); },
this._minimizedChangedId = this._window.connect('notify::minimized', 'notify::minimized', this._updateVisible.bind(this),
this._updateVisible.bind(this)); this);
this._focusChangedId = global.display.connect('notify::focus-window', global.display.connectObject('notify::focus-window',
this._onFocusChanged.bind(this)); this._onFocusChanged.bind(this), this);
this._onFocusChanged(); this._onFocusChanged();
} }
@@ -56,13 +54,6 @@ class WindowPreview extends St.Button {
return this._window; return this._window;
} }
_onDestroy() {
this._window.disconnect(this._sizeChangedId);
this._window.disconnect(this._positionChangedId);
this._window.disconnect(this._minimizedChangedId);
global.display.disconnect(this._focusChangedId);
}
_onFocusChanged() { _onFocusChanged() {
if (global.display.focus_window === this._window) if (global.display.focus_window === this._window)
this.add_style_class_name('active'); this.add_style_class_name('active');
@@ -143,16 +134,13 @@ class WorkspaceThumbnail extends St.Button {
let workspaceManager = global.workspace_manager; let workspaceManager = global.workspace_manager;
this._workspace = workspaceManager.get_workspace_by_index(index); this._workspace = workspaceManager.get_workspace_by_index(index);
this._windowAddedId = this._workspace.connect('window-added', this._workspace.connectObject(
(ws, window) => { 'window-added', (ws, window) => this._addWindow(window),
this._addWindow(window); 'window-removed', (ws, window) => this._removeWindow(window),
}); this);
this._windowRemovedId = this._workspace.connect('window-removed',
(ws, window) => { global.display.connectObject('restacked',
this._removeWindow(window); this._onRestacked.bind(this), this);
});
this._restackedId = global.display.connect('restacked',
this._onRestacked.bind(this));
this._workspace.list_windows().forEach(w => this._addWindow(w)); this._workspace.list_windows().forEach(w => this._addWindow(w));
this._onRestacked(); this._onRestacked();
@@ -250,10 +238,6 @@ class WorkspaceThumbnail extends St.Button {
_onDestroy() { _onDestroy() {
this._tooltip.destroy(); this._tooltip.destroy();
this._workspace.disconnect(this._windowAddedId);
this._workspace.disconnect(this._windowRemovedId);
global.display.disconnect(this._restackedId);
} }
} }
@@ -263,7 +247,7 @@ class WorkspaceIndicator extends PanelMenu.Button {
} }
constructor() { constructor() {
super(0.0, _('Workspace Indicator')); super(0.5, _('Workspace Indicator'));
let container = new St.Widget({ let container = new St.Widget({
layout_manager: new Clutter.BinLayout(), layout_manager: new Clutter.BinLayout(),
@@ -295,14 +279,11 @@ class WorkspaceIndicator extends PanelMenu.Button {
this._workspaceSection = new PopupMenu.PopupMenuSection(); this._workspaceSection = new PopupMenu.PopupMenuSection();
this.menu.addMenuItem(this._workspaceSection); this.menu.addMenuItem(this._workspaceSection);
this._workspaceManagerSignals = [ workspaceManager.connectObject(
workspaceManager.connect_after('notify::n-workspaces', 'notify::n-workspaces', this._nWorkspacesChanged.bind(this), GObject.ConnectFlags.AFTER,
this._nWorkspacesChanged.bind(this)), 'workspace-switched', this._onWorkspaceSwitched.bind(this), GObject.ConnectFlags.AFTER,
workspaceManager.connect_after('workspace-switched', 'notify::layout-rows', this._updateThumbnailVisibility.bind(this),
this._onWorkspaceSwitched.bind(this)), this);
workspaceManager.connect('notify::layout-rows',
this._updateThumbnailVisibility.bind(this)),
];
this.connect('scroll-event', this._onScrollEvent.bind(this)); this.connect('scroll-event', this._onScrollEvent.bind(this));
this._thumbnailsBox.connect('scroll-event', this._onScrollEvent.bind(this)); this._thumbnailsBox.connect('scroll-event', this._onScrollEvent.bind(this));
@@ -310,28 +291,19 @@ class WorkspaceIndicator extends PanelMenu.Button {
this._updateThumbnails(); this._updateThumbnails();
this._updateThumbnailVisibility(); this._updateThumbnailVisibility();
this._settings = new Gio.Settings({ schema_id: WORKSPACE_SCHEMA }); this._settings = new Gio.Settings({schema_id: WORKSPACE_SCHEMA});
this._settingsChangedId = this._settings.connect( this._settings.connectObject(`changed::${WORKSPACE_KEY}`,
`changed::${WORKSPACE_KEY}`, this._updateMenuLabels.bind(this), this);
this._updateMenuLabels.bind(this));
} }
_onDestroy() { _onDestroy() {
for (let i = 0; i < this._workspaceManagerSignals.length; i++)
global.workspace_manager.disconnect(this._workspaceManagerSignals[i]);
if (this._settingsChangedId) {
this._settings.disconnect(this._settingsChangedId);
this._settingsChangedId = 0;
}
Main.panel.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS); Main.panel.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS);
super._onDestroy(); super._onDestroy();
} }
_updateThumbnailVisibility() { _updateThumbnailVisibility() {
const { workspaceManager } = global; const {workspaceManager} = global;
const vertical = workspaceManager.layout_rows === -1; const vertical = workspaceManager.layout_rows === -1;
const useMenu = const useMenu =
vertical || workspaceManager.n_workspaces > MAX_THUMBNAILS; vertical || workspaceManager.n_workspaces > MAX_THUMBNAILS;
@@ -454,20 +426,14 @@ class WorkspaceIndicator extends PanelMenu.Button {
} }
} }
/** */ export default class WorkspaceIndicatorExtension extends Extension {
function init() { enable() {
ExtensionUtils.initTranslations(); this._indicator = new WorkspaceIndicator();
} Main.panel.addToStatusArea('workspace-indicator', this._indicator);
}
let _indicator; disable() {
this._indicator.destroy();
/** */ delete this._indicator;
function enable() { }
_indicator = new WorkspaceIndicator();
Main.panel.addToStatusArea('workspace-indicator', _indicator);
}
/** */
function disable() {
_indicator.destroy();
} }
+15 -19
View File
@@ -1,11 +1,13 @@
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*- // -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
/* exported init buildPrefsWidget */ 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';
const { Adw, Gio, GLib, GObject, Gtk, Pango } = imports.gi; import {ExtensionPreferences, gettext as _} from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js';
const ExtensionUtils = imports.misc.extensionUtils;
const _ = ExtensionUtils.gettext;
const N_ = e => e; const N_ = e => e;
const WORKSPACE_SCHEMA = 'org.gnome.desktop.wm.preferences'; const WORKSPACE_SCHEMA = 'org.gnome.desktop.wm.preferences';
@@ -41,7 +43,7 @@ class WorkspacesList extends GObject.Object {
GObject.registerClass(this); GObject.registerClass(this);
} }
#settings = new Gio.Settings({ schema_id: WORKSPACE_SCHEMA }); #settings = new Gio.Settings({schema_id: WORKSPACE_SCHEMA});
#names = this.#settings.get_strv(WORKSPACE_KEY); #names = this.#settings.get_strv(WORKSPACE_KEY);
#items = Gtk.StringList.new(this.#names); #items = Gtk.StringList.new(this.#names);
#changedId; #changedId;
@@ -131,8 +133,8 @@ class WorkspaceSettingsWidget extends Adw.PreferencesGroup {
this._workspaces = new WorkspacesList(); this._workspaces = new WorkspacesList();
const store = new Gio.ListStore({ item_type: Gio.ListModel }); const store = new Gio.ListStore({item_type: Gio.ListModel});
const listModel = new Gtk.FlattenListModel({ model: store }); const listModel = new Gtk.FlattenListModel({model: store});
store.append(this._workspaces); store.append(this._workspaces);
store.append(new NewItemModel()); store.append(new NewItemModel());
@@ -157,7 +159,7 @@ class WorkspaceRow extends Adw.PreferencesRow {
} }
constructor(name) { constructor(name) {
super({ name }); super({name});
const box = new Gtk.Box({ const box = new Gtk.Box({
spacing: 12, spacing: 12,
@@ -256,14 +258,8 @@ class NewWorkspaceRow extends Adw.PreferencesRow {
} }
} }
/** */ export default class WorkspaceIndicatorPrefs extends ExtensionPreferences {
function init() { getPreferencesWidget() {
ExtensionUtils.initTranslations(); return new WorkspaceSettingsWidget();
} }
/**
* @returns {Gtk.Widget} - the prefs widget
*/
function buildPrefsWidget() {
return new WorkspaceSettingsWidget();
} }
+4 -1
View File
@@ -68,7 +68,10 @@ rules:
jsdoc/check-tag-names: error jsdoc/check-tag-names: error
jsdoc/check-types: error jsdoc/check-types: error
jsdoc/implements-on-classes: error jsdoc/implements-on-classes: error
jsdoc/newline-after-description: error jsdoc/tag-lines:
- error
- any
- startLines: 1
jsdoc/require-jsdoc: error jsdoc/require-jsdoc: error
jsdoc/require-param: error jsdoc/require-param: error
jsdoc/require-param-description: error jsdoc/require-param-description: error
+5 -2
View File
@@ -3,9 +3,12 @@ rules:
- error - error
- properties: never - properties: never
allow: [^vfunc_, ^on_] allow: [^vfunc_, ^on_]
object-curly-spacing: consistent-return: error
eqeqeq:
- error - error
- always - smart
prefer-arrow-callback: error prefer-arrow-callback: error
globals: globals:
global: readonly global: readonly
parserOptions:
sourceType: module
+20 -4
View File
@@ -1,6 +1,6 @@
project('gnome-shell-extensions', project('gnome-shell-extensions',
version: '42.2', version: '45.beta',
meson_version: '>= 0.53.0', meson_version: '>= 0.58.0',
license: 'GPL2+' license: 'GPL2+'
) )
@@ -15,7 +15,6 @@ datadir = get_option('datadir')
shelldir = join_paths(datadir, 'gnome-shell') shelldir = join_paths(datadir, 'gnome-shell')
extensiondir = join_paths(shelldir, 'extensions') extensiondir = join_paths(shelldir, 'extensions')
modedir = join_paths(shelldir, 'modes') modedir = join_paths(shelldir, 'modes')
themedir = join_paths(shelldir, 'theme')
schemadir = join_paths(datadir, 'glib-2.0', 'schemas') schemadir = join_paths(datadir, 'glib-2.0', 'schemas')
sessiondir = join_paths(datadir, 'gnome-session', 'sessions') sessiondir = join_paths(datadir, 'gnome-session', 'sessions')
@@ -37,6 +36,7 @@ classic_extensions = [
default_extensions = classic_extensions default_extensions = classic_extensions
default_extensions += [ default_extensions += [
'drive-menu', 'drive-menu',
'light-style',
'screenshot-window-sizer', 'screenshot-window-sizer',
'windowsNavigator', 'windowsNavigator',
'workspace-indicator' 'workspace-indicator'
@@ -93,7 +93,23 @@ endif
subdir('extensions') subdir('extensions')
subdir('po') subdir('po')
meson.add_dist_script('meson/generate-stylesheets.py') gnome.post_install(
glib_compile_schemas: true,
)
meson.add_dist_script('meson/check-version.py', meson.add_dist_script('meson/check-version.py',
meson.project_version(), meson.project_version(),
'NEWS') 'NEWS')
summary_options = {
'extensions': enabled_extensions,
'classic_mode': get_option('classic_mode'),
}
summary_dirs = {
'prefix': get_option('prefix'),
'datadir': get_option('datadir'),
}
summary(summary_dirs, section: 'Directories')
summary(summary_options, section: 'Build Options')
-13
View File
@@ -1,13 +0,0 @@
#!/usr/bin/env python3
import os
from pathlib import PurePath
import subprocess
sourceroot = os.environ.get('MESON_SOURCE_ROOT')
distroot = os.environ.get('MESON_DIST_ROOT')
stylesheet_path = PurePath('data/gnome-classic.css')
src = PurePath(sourceroot, stylesheet_path.with_suffix('.scss'))
dst = PurePath(distroot, stylesheet_path)
subprocess.run(['sassc', '-a', src, dst], check=True)
+53 -46
View File
@@ -6,9 +6,8 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell-extensions main\n" "Project-Id-Version: gnome-shell-extensions main\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/issues\n"
"issues\n" "POT-Creation-Date: 2022-07-10 12:54+0000\n"
"POT-Creation-Date: 2022-02-12 02:08+0000\n"
"PO-Revision-Date: 2022-02-12 02:08+0000\n" "PO-Revision-Date: 2022-02-12 02:08+0000\n"
"Last-Translator: Нанба Наала <naala-nanba@rambler.ru>, 2022\n" "Last-Translator: Нанба Наала <naala-nanba@rambler.ru>, 2022\n"
"Language-Team: Abkhazian <ab@li.org>\n" "Language-Team: Abkhazian <ab@li.org>\n"
@@ -34,11 +33,11 @@ msgstr "Аклассикатә GNOME Wayland аҟны"
msgid "GNOME Classic on Xorg" msgid "GNOME Classic on Xorg"
msgstr "Аклассикатә GNOME Xorg аҟны" msgstr "Аклассикатә GNOME Xorg аҟны"
#: extensions/apps-menu/extension.js:112 #: extensions/apps-menu/extension.js:118
msgid "Favorites" msgid "Favorites"
msgstr "Иалкаау" msgstr "Иалкаау"
#: extensions/apps-menu/extension.js:370 #: extensions/apps-menu/extension.js:379
msgid "Applications" msgid "Applications"
msgstr "Аԥшьқәа" msgstr "Аԥшьқәа"
@@ -50,29 +49,30 @@ msgstr "Аԥшьи аусуратә ҵакырақәа рыхьӡынҵеи"
msgid "" msgid ""
"A list of strings, each containing an application id (desktop file name), " "A list of strings, each containing an application id (desktop file name), "
"followed by a colon and the workspace number" "followed by a colon and the workspace number"
msgstr "Ацәаҳәақәа рыхьӡынҵа аиԥшрагәаҭага аԥшьы (desktop-фаил ахьӡ )" msgstr ""
"змоу, зашьҭахь ҩ-кәаԥки аусуратә ҭыԥ аномери гылоу " "Ацәаҳәақәа рыхьӡынҵа аиԥшрагәаҭага аԥшьы (desktop-фаил ахьӡ )змоу, зашьҭахь "
"ҩ-кәаԥки аусуратә ҭыԥ аномери гылоу "
#: extensions/auto-move-windows/prefs.js:19 #: extensions/auto-move-windows/prefs.js:152
msgid "Workspace Rules" msgid "Workspace Rules"
msgstr "Аусуратә ҵакыра аԥҟаррақәа" msgstr "Аусуратә ҵакыра аԥҟаррақәа"
#: extensions/auto-move-windows/prefs.js:245 #: extensions/auto-move-windows/prefs.js:306
msgid "Add Rule" msgid "Add Rule"
msgstr "Аԥҟара ацҵара" msgstr "Аԥҟара ацҵара"
#. TRANSLATORS: %s is the filesystem name #. TRANSLATORS: %s is the filesystem name
#: extensions/drive-menu/extension.js:123 #: extensions/drive-menu/extension.js:126
#: extensions/places-menu/placeDisplay.js:210 #: extensions/places-menu/placeDisplay.js:210
#, javascript-format #, javascript-format
msgid "Ejecting drive “%s” failed:" msgid "Ejecting drive “%s” failed:"
msgstr "Адиск «%s» аҭыгара залымшахеит:" msgstr "Адиск «%s» аҭыгара залымшахеит:"
#: extensions/drive-menu/extension.js:139 #: extensions/drive-menu/extension.js:145
msgid "Removable devices" msgid "Removable devices"
msgstr "Иаҿыҵуа аиҿартәырақәа" msgstr "Иаҿыҵуа аиҿартәырақәа"
#: extensions/drive-menu/extension.js:161 #: extensions/drive-menu/extension.js:167
msgid "Open Files" msgid "Open Files"
msgstr "Афаил аартра" msgstr "Афаил аартра"
@@ -85,9 +85,11 @@ msgid ""
"Try to use more screen for placing window thumbnails by adapting to screen " "Try to use more screen for placing window thumbnails by adapting to screen "
"aspect ratio, and consolidating them further to reduce the bounding box. " "aspect ratio, and consolidating them further to reduce the bounding box. "
"This setting applies only with the natural placement strategy." "This setting applies only with the natural placement strategy."
msgstr "Шәхы иашәырхәа изыцҵоу аекран аҵакыра аминиатиура атыԥаркразы" msgstr ""
"аекран аганқәа реизышәара ԥсахуа аҭыԥыркра шәыржәпала, анаҩс адаԥа ҳәаақәызҵо ашәагаа архәыҷразы" "Шәхы иашәырхәа изыцҵоу аекран аҵакыра аминиатиура атыԥаркразыаекран аганқәа "
"ари ахышәара ахархәара аиуоит аминиатиура «natural» аҭыԥыркра алгоритм ахархәараан" "реизышәара ԥсахуа аҭыԥыркра шәыржәпала, анаҩс адаԥа ҳәаақәызҵо ашәагаа "
"архәыҷразыари ахышәара ахархәара аиуоит аминиатиура «natural» аҭыԥыркра "
"алгоритм ахархәараан"
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:11 #: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:11
msgid "Place window captions on top" msgid "Place window captions on top"
@@ -98,12 +100,13 @@ msgid ""
"If true, place window captions on top the respective thumbnail, overriding " "If true, place window captions on top the respective thumbnail, overriding "
"shell default of placing it at the bottom. Changing this setting requires " "shell default of placing it at the bottom. Changing this setting requires "
"restarting the shell to have any effect." "restarting the shell to have any effect."
msgstr "Иалхзар, ахқәа аминиатиура хыхьтәи ахәҭаҟны аҭыԥ ааныркылалоит" msgstr ""
"(ишыҟоу еиԥш ахқәа ҵаҟатәи аҭыԥ ааныркылоит).Ари ахышәара аԥсахраан," "Иалхзар, ахқәа аминиатиура хыхьтәи ахәҭаҟны аҭыԥ ааныркылалоит(ишыҟоу еиԥш "
"уи аус аура иалагарцазы, иаҭахуп Shell аиҭарура." "ахқәа ҵаҟатәи аҭыԥ ааныркылоит).Ари ахышәара аԥсахраан,уи аус аура "
"иалагарцазы, иаҭахуп Shell аиҭарура."
#: extensions/places-menu/extension.js:88 #: extensions/places-menu/extension.js:94
#: extensions/places-menu/extension.js:91 #: extensions/places-menu/extension.js:97
msgid "Places" msgid "Places"
msgstr "Аҭыԥқәа" msgstr "Аҭыԥқәа"
@@ -166,27 +169,27 @@ msgstr "Аиҭашьақәыргылара"
msgid "Maximize" msgid "Maximize"
msgstr "Аиҵыхра" msgstr "Аиҵыхра"
#: extensions/window-list/extension.js:434 #: extensions/window-list/extension.js:483
msgid "Minimize all" msgid "Minimize all"
msgstr "Зегьы реиҟәырҳәра" msgstr "Зегьы реиҟәырҳәра"
#: extensions/window-list/extension.js:440 #: extensions/window-list/extension.js:489
msgid "Unminimize all" msgid "Unminimize all"
msgstr "Зегьы рырхынҳәра" msgstr "Зегьы рырхынҳәра"
#: extensions/window-list/extension.js:446 #: extensions/window-list/extension.js:495
msgid "Maximize all" msgid "Maximize all"
msgstr "Зегьы реиҵыхра" msgstr "Зегьы реиҵыхра"
#: extensions/window-list/extension.js:454 #: extensions/window-list/extension.js:503
msgid "Unmaximize all" msgid "Unmaximize all"
msgstr "Зегьы реиҭашьақәыргылара" msgstr "Зегьы реиҭашьақәыргылара"
#: extensions/window-list/extension.js:462 #: extensions/window-list/extension.js:511
msgid "Close all" msgid "Close all"
msgstr "Зегьы рыркра" msgstr "Зегьы рыркра"
#: extensions/window-list/extension.js:741 #: extensions/window-list/extension.js:795
msgid "Window List" msgid "Window List"
msgstr "Аԥенџьырқәа рыхьӡынҵа" msgstr "Аԥенџьырқәа рыхьӡынҵа"
@@ -198,18 +201,21 @@ msgstr "Аԥенџьырқәа аидыргәыԥлара анаҭаху"
msgid "" msgid ""
"Decides when to group windows from the same application on the window list. " "Decides when to group windows from the same application on the window list. "
"Possible values are “never”, “auto” and “always”." "Possible values are “never”, “auto” and “always”."
msgstr "Иҳәаақәнаҵоит, ианаҭаху ԥшьык иаҵанакуа аԥенџьырқәа реидыргәыԥлара, аԥенџьырқәа рыхьӡынҵаҟны" msgstr ""
" Иҟалар зылшо аҵакқәа : «never» — ахаан; «auto» — автоматла; «always» — есқьынгьы" "Иҳәаақәнаҵоит, ианаҭаху ԥшьык иаҵанакуа аԥенџьырқәа реидыргәыԥлара, "
"аԥенџьырқәа рыхьӡынҵаҟны Иҟалар зылшо аҵакқәа : «never» — ахаан; «auto» — "
"автоматла; «always» — есқьынгьы"
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20 #: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20
#: extensions/window-list/prefs.js:76 #: extensions/window-list/prefs.js:79
msgid "Show windows from all workspaces" msgid "Show windows from all workspaces"
msgstr "Аҵакырақәа зегьы рҟынтә аԥенџьырқәа раарԥшра" msgstr "Аҵакырақәа зегьы рҟынтә аԥенџьырқәа раарԥшра"
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:21 #: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:21
msgid "Whether to show windows from all workspaces or only the current one." msgid "Whether to show windows from all workspaces or only the current one."
msgstr msgstr ""
"Аԥенџьырқәа рыхьӡынҵа аусуратә ҵакырақәа зегь рҟынтә акәу,мамзар уажәтәи аҟынтә акәу ишаарԥшлатәу" "Аԥенџьырқәа рыхьӡынҵа аусуратә ҵакырақәа зегь рҟынтә акәу,мамзар уажәтәи "
"аҟынтә акәу ишаарԥшлатәу"
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:27 #: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:27
msgid "Show the window list on all monitors" msgid "Show the window list on all monitors"
@@ -219,43 +225,44 @@ msgstr "Аԥенџьырқәа рыхьӡынҵа амониторқәа зег
msgid "" msgid ""
"Whether to show the window list on all connected monitors or only on the " "Whether to show the window list on all connected monitors or only on the "
"primary one." "primary one."
msgstr msgstr ""
"Аԥенџьырқәа рыхьӡынҵа иаҿаку амониторқәа зегьы рыҟноума иахьаарԥшлатәу , мамзар ихадоу аҟны акәу." "Аԥенџьырқәа рыхьӡынҵа иаҿаку амониторқәа зегьы рыҟноума иахьаарԥшлатәу , "
"мамзар ихадоу аҟны акәу."
#: extensions/window-list/prefs.js:32 #: extensions/window-list/prefs.js:35
msgid "Window Grouping" msgid "Window Grouping"
msgstr "Аԥенџьырқәа реидыргәыԥлара" msgstr "Аԥенџьырқәа реидыргәыԥлара"
#: extensions/window-list/prefs.js:37 #: extensions/window-list/prefs.js:40
msgid "Never group windows" msgid "Never group windows"
msgstr "Ахаангьы аԥенџьырқәа реидмыргәыԥлара" msgstr "Ахаангьы аԥенџьырқәа реидмыргәыԥлара"
#: extensions/window-list/prefs.js:38 #: extensions/window-list/prefs.js:41
msgid "Group windows when space is limited" msgid "Group windows when space is limited"
msgstr "Аҭыԥ маҷхазар, аԥенџьырқәа еидшәыргәыԥла" msgstr "Аҭыԥ маҷхазар, аԥенџьырқәа еидшәыргәыԥла"
#: extensions/window-list/prefs.js:39 #: extensions/window-list/prefs.js:42
msgid "Always group windows" msgid "Always group windows"
msgstr "Еснагь аԥенџьырқәа реидыргәыԥлара" msgstr "Еснагь аԥенџьырқәа реидыргәыԥлара"
#: extensions/window-list/prefs.js:63 #: extensions/window-list/prefs.js:66
msgid "Show on all monitors" msgid "Show on all monitors"
msgstr "Амониторқәа зегьы рҟны рырбара" msgstr "Амониторқәа зегьы рҟны рырбара"
#: extensions/window-list/workspaceIndicator.js:249 #: extensions/window-list/workspaceIndicator.js:261
#: extensions/workspace-indicator/extension.js:254 #: extensions/workspace-indicator/extension.js:266
msgid "Workspace Indicator" msgid "Workspace Indicator"
msgstr "Аусуратә ҵакыра аиндикатор" msgstr "Аусуратә ҵакыра аиндикатор"
#: extensions/workspace-indicator/prefs.js:18 #: extensions/workspace-indicator/prefs.js:62
msgid "Workspace Names"
msgstr "Аусуратә ҵакырақәа рыхьӡқәа"
#: extensions/workspace-indicator/prefs.js:39
#, javascript-format #, javascript-format
msgid "Workspace %d" msgid "Workspace %d"
msgstr "Аусуратә ҵакыра %d" msgstr "Аусуратә ҵакыра %d"
#: extensions/workspace-indicator/prefs.js:184 #: extensions/workspace-indicator/prefs.js:129
msgid "Workspace Names"
msgstr "Аусуратә ҵакырақәа рыхьӡқәа"
#: extensions/workspace-indicator/prefs.js:255
msgid "Add Workspace" msgid "Add Workspace"
msgstr "Аусуратә ҵакыра ацҵара" msgstr "Аусуратә ҵакыра ацҵара"
+54 -47
View File
@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: gnome-shell-extensions master\n" "Project-Id-Version: gnome-shell-extensions master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/"
"issues\n" "issues\n"
"POT-Creation-Date: 2021-01-20 23:03+0000\n" "POT-Creation-Date: 2022-07-10 12:54+0000\n"
"PO-Revision-Date: 2021-01-24 15:33+0300\n" "PO-Revision-Date: 2022-10-19 15:20+0300\n"
"Last-Translator: Launchpad translators\n" "Last-Translator: Launchpad translators\n"
"Language-Team: Belarusian <i18n-bel-gnome@googlegroups.com>\n" "Language-Team: Belarusian <i18n-bel-gnome@googlegroups.com>\n"
"Language: be\n" "Language: be\n"
@@ -18,21 +18,30 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && 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" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Poedit 2.4.2\n" "X-Generator: Poedit 3.0\n"
#: data/gnome-classic.desktop.in:3 #: data/gnome-classic.desktop.in:3
msgid "GNOME Classic" msgid "GNOME Classic"
msgstr "Класічны GNOME" msgstr "Класічны GNOME"
#: data/gnome-classic.desktop.in:4 #: data/gnome-classic.desktop.in:4 data/gnome-classic-wayland.desktop.in:4
#: data/gnome-classic-xorg.desktop.in:4
msgid "This session logs you into GNOME Classic" msgid "This session logs you into GNOME Classic"
msgstr "Гэты сеанс выкарыстоўвае класічны GNOME" msgstr "Гэты сеанс выкарыстоўвае класічны GNOME"
#: extensions/apps-menu/extension.js:113 #: data/gnome-classic-wayland.desktop.in:3
msgid "GNOME Classic on Wayland"
msgstr "Класічны GNOME на Wayland"
#: data/gnome-classic-xorg.desktop.in:3
msgid "GNOME Classic on Xorg"
msgstr "Класічны GNOME на Xorg"
#: extensions/apps-menu/extension.js:118
msgid "Favorites" msgid "Favorites"
msgstr "Абраныя" msgstr "Абраныя"
#: extensions/apps-menu/extension.js:369 #: extensions/apps-menu/extension.js:379
msgid "Applications" msgid "Applications"
msgstr "Праграмы" msgstr "Праграмы"
@@ -48,43 +57,41 @@ msgstr ""
"Спіс радкоў, кожны з якіх змяшчае ідэнтыфікатар праграмы (імя файла *." "Спіс радкоў, кожны з якіх змяшчае ідэнтыфікатар праграмы (імя файла *."
"desktop), затым двукроп'е і нумар працоўнай прасторы" "desktop), затым двукроп'е і нумар працоўнай прасторы"
#: extensions/auto-move-windows/prefs.js:35 #: extensions/auto-move-windows/prefs.js:152
msgid "Workspace Rules" msgid "Workspace Rules"
msgstr "Правілы для працоўнай прасторы" msgstr "Правілы для працоўнай прасторы"
#: extensions/auto-move-windows/prefs.js:237 #: extensions/auto-move-windows/prefs.js:306
msgid "Add Rule" msgid "Add Rule"
msgstr "Дадаць правіла" msgstr "Дадаць правіла"
#. TRANSLATORS: %s is the filesystem name #. TRANSLATORS: %s is the filesystem name
#: extensions/drive-menu/extension.js:112 #: extensions/drive-menu/extension.js:126
#: extensions/places-menu/placeDisplay.js:233 #: extensions/places-menu/placeDisplay.js:210
#, javascript-format #, javascript-format
msgid "Ejecting drive “%s” failed:" msgid "Ejecting drive “%s” failed:"
msgstr "Не ўдалося выняць дыск «%s»:" msgstr "Не ўдалося выняць дыск «%s»:"
#: extensions/drive-menu/extension.js:128 #: extensions/drive-menu/extension.js:145
msgid "Removable devices" msgid "Removable devices"
msgstr "Здымныя прылады" msgstr "Здымныя прылады"
#: extensions/drive-menu/extension.js:155 #: extensions/drive-menu/extension.js:167
msgid "Open Files" msgid "Open Files"
msgstr "Адкрыць файлы" msgstr "Адкрыць файлы"
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:5 #: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:5
#, fuzzy
msgid "Use more screen for windows" msgid "Use more screen for windows"
msgstr "Выкарыстоўваць большую плошчу экрана для вокнаў" msgstr "Выкарыстоўваць большую плошчу экрана для вокнаў"
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:6 #: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:6
#, fuzzy
msgid "" msgid ""
"Try to use more screen for placing window thumbnails by adapting to screen " "Try to use more screen for placing window thumbnails by adapting to screen "
"aspect ratio, and consolidating them further to reduce the bounding box. " "aspect ratio, and consolidating them further to reduce the bounding box. "
"This setting applies only with the natural placement strategy." "This setting applies only with the natural placement strategy."
msgstr "" msgstr ""
"Спрабаваць выкарыстаць большую плошчу экрана для размяшчэння мініяцюр праз " "Спрабаваць выкарыстаць большую плошчу экрана для размяшчэння мініяцюр праз "
"змяненне суадносінаў бакоў экрана, ўшчыльняючы іх, каб зменшыць памеры " "змяненне суадносін бакоў экрана, ўшчыльняючы іх, каб зменшыць памеры "
"абмежавальнай рамкі. Гэты параметр ужываецца толькі з натуральным " "абмежавальнай рамкі. Гэты параметр ужываецца толькі з натуральным "
"размяшчэннем мініяцюр." "размяшчэннем мініяцюр."
@@ -102,31 +109,31 @@ msgstr ""
"перадвызначана). Каб змена налады ўступіла ў сілу, трэба перазапусціць " "перадвызначана). Каб змена налады ўступіла ў сілу, трэба перазапусціць "
"абалонку." "абалонку."
#: extensions/places-menu/extension.js:89 #: extensions/places-menu/extension.js:94
#: extensions/places-menu/extension.js:93 #: extensions/places-menu/extension.js:97
msgid "Places" msgid "Places"
msgstr "Месцы" msgstr "Месцы"
#: extensions/places-menu/placeDisplay.js:46 #: extensions/places-menu/placeDisplay.js:49
#, javascript-format #, javascript-format
msgid "Failed to launch “%s”" msgid "Failed to launch “%s”"
msgstr "Не ўдалося запусціць «%s»" msgstr "Не ўдалося запусціць «%s»"
#: extensions/places-menu/placeDisplay.js:61 #: extensions/places-menu/placeDisplay.js:64
#, javascript-format #, javascript-format
msgid "Failed to mount volume for “%s”" msgid "Failed to mount volume for “%s”"
msgstr "Не ўдалося прымацаваць том для «%s»." msgstr "Не ўдалося прымацаваць том для «%s»."
#: extensions/places-menu/placeDisplay.js:125
#: extensions/places-menu/placeDisplay.js:148 #: extensions/places-menu/placeDisplay.js:148
#: extensions/places-menu/placeDisplay.js:171
msgid "Computer" msgid "Computer"
msgstr "Камп'ютар" msgstr "Камп'ютар"
#: extensions/places-menu/placeDisplay.js:359 #: extensions/places-menu/placeDisplay.js:336
msgid "Home" msgid "Home"
msgstr "Хатняя папка" msgstr "Хатняя папка"
#: extensions/places-menu/placeDisplay.js:404 #: extensions/places-menu/placeDisplay.js:381
msgid "Browse Network" msgid "Browse Network"
msgstr "Агляд сеткі" msgstr "Агляд сеткі"
@@ -146,47 +153,47 @@ msgstr "Назва тэмы"
msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell" msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell"
msgstr "Назва тэмы, што загрузіцца з ~/.themes/name/gnome-shell" msgstr "Назва тэмы, што загрузіцца з ~/.themes/name/gnome-shell"
#: extensions/window-list/extension.js:98 #: extensions/window-list/extension.js:72
msgid "Close" msgid "Close"
msgstr "Закрыць" msgstr "Закрыць"
#: extensions/window-list/extension.js:118 #: extensions/window-list/extension.js:92
msgid "Unminimize" msgid "Unminimize"
msgstr "Скасаваць згортванне" msgstr "Скасаваць згортванне"
#: extensions/window-list/extension.js:118 #: extensions/window-list/extension.js:92
msgid "Minimize" msgid "Minimize"
msgstr "Згарнуць" msgstr "Згарнуць"
#: extensions/window-list/extension.js:125 #: extensions/window-list/extension.js:99
msgid "Unmaximize" msgid "Unmaximize"
msgstr "Скасаваць разгортванне" msgstr "Скасаваць разгортванне"
#: extensions/window-list/extension.js:125 #: extensions/window-list/extension.js:99
msgid "Maximize" msgid "Maximize"
msgstr "Разгарнуць" msgstr "Разгарнуць"
#: extensions/window-list/extension.js:432 #: extensions/window-list/extension.js:483
msgid "Minimize all" msgid "Minimize all"
msgstr "Згарнуць усе" msgstr "Згарнуць усе"
#: extensions/window-list/extension.js:438 #: extensions/window-list/extension.js:489
msgid "Unminimize all" msgid "Unminimize all"
msgstr "Скасаваць згортванне для ўсіх" msgstr "Скасаваць згортванне для ўсіх"
#: extensions/window-list/extension.js:444 #: extensions/window-list/extension.js:495
msgid "Maximize all" msgid "Maximize all"
msgstr "Разгарнуць усе" msgstr "Разгарнуць усе"
#: extensions/window-list/extension.js:452 #: extensions/window-list/extension.js:503
msgid "Unmaximize all" msgid "Unmaximize all"
msgstr "Скасаваць разгортванне для ўсіх" msgstr "Скасаваць разгортванне для ўсіх"
#: extensions/window-list/extension.js:460 #: extensions/window-list/extension.js:511
msgid "Close all" msgid "Close all"
msgstr "Закрыць усе" msgstr "Закрыць усе"
#: extensions/window-list/extension.js:737 #: extensions/window-list/extension.js:795
msgid "Window List" msgid "Window List"
msgstr "Спіс вокнаў" msgstr "Спіс вокнаў"
@@ -203,7 +210,7 @@ msgstr ""
"значэнні: «never» (ніколі), «auto» (аўтаматычна), «always» (заўсёды)." "значэнні: «never» (ніколі), «auto» (аўтаматычна), «always» (заўсёды)."
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20 #: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20
#: extensions/window-list/prefs.js:100 #: extensions/window-list/prefs.js:79
msgid "Show windows from all workspaces" msgid "Show windows from all workspaces"
msgstr "Паказваць вокны з усіх працоўных прастор" msgstr "Паказваць вокны з усіх працоўных прастор"
@@ -222,41 +229,41 @@ msgid ""
msgstr "" msgstr ""
"Паказваць спіс вокнаў на ўсіх падлучаных маніторах ці толькі на асноўным." "Паказваць спіс вокнаў на ўсіх падлучаных маніторах ці толькі на асноўным."
#: extensions/window-list/prefs.js:29 #: extensions/window-list/prefs.js:35
msgid "Window Grouping" msgid "Window Grouping"
msgstr "Групаванне вокнаў" msgstr "Групаванне вокнаў"
#: extensions/window-list/prefs.js:58 #: extensions/window-list/prefs.js:40
msgid "Never group windows" msgid "Never group windows"
msgstr "Ніколі не групаваць вокны" msgstr "Ніколі не групаваць вокны"
#: extensions/window-list/prefs.js:59 #: extensions/window-list/prefs.js:41
msgid "Group windows when space is limited" msgid "Group windows when space is limited"
msgstr "Групаваць вокны калі не хапае месца" msgstr "Групаваць вокны калі не хапае месца"
#: extensions/window-list/prefs.js:60 #: extensions/window-list/prefs.js:42
msgid "Always group windows" msgid "Always group windows"
msgstr "Заўсёды групаваць вокны" msgstr "Заўсёды групаваць вокны"
#: extensions/window-list/prefs.js:94 #: extensions/window-list/prefs.js:66
msgid "Show on all monitors" msgid "Show on all monitors"
msgstr "Паказваць на ўсіх маніторах" msgstr "Паказваць на ўсіх маніторах"
#: extensions/window-list/workspaceIndicator.js:247 #: extensions/window-list/workspaceIndicator.js:261
#: extensions/workspace-indicator/extension.js:253 #: extensions/workspace-indicator/extension.js:266
msgid "Workspace Indicator" msgid "Workspace Indicator"
msgstr "Індыкатар працоўнай прасторы" msgstr "Індыкатар працоўнай прасторы"
#: extensions/workspace-indicator/prefs.js:34 #: extensions/workspace-indicator/prefs.js:62
msgid "Workspace Names"
msgstr "Назвы працоўных прастор"
#: extensions/workspace-indicator/prefs.js:67
#, javascript-format #, javascript-format
msgid "Workspace %d" msgid "Workspace %d"
msgstr "Працоўная прастора %d" msgstr "Працоўная прастора %d"
#: extensions/workspace-indicator/prefs.js:208 #: extensions/workspace-indicator/prefs.js:129
msgid "Workspace Names"
msgstr "Назвы працоўных прастор"
#: extensions/workspace-indicator/prefs.js:255
msgid "Add Workspace" msgid "Add Workspace"
msgstr "Дадаць працоўную прастору" msgstr "Дадаць працоўную прастору"
+55 -46
View File
@@ -12,8 +12,8 @@ msgstr ""
"Project-Id-Version: gnome-shell-extensions master\n" "Project-Id-Version: gnome-shell-extensions master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/"
"issues\n" "issues\n"
"POT-Creation-Date: 2020-05-28 00:55+0000\n" "POT-Creation-Date: 2023-02-18 15:10+0000\n"
"PO-Revision-Date: 2020-07-14 00:40+0300\n" "PO-Revision-Date: 2023-08-01 23:41+0300\n"
"Last-Translator: Efstathios Iosifidis <eiosifidis@gnome.org>\n" "Last-Translator: Efstathios Iosifidis <eiosifidis@gnome.org>\n"
"Language-Team: Greek, Modern (1453-) <gnome-el-list@gnome.org>\n" "Language-Team: Greek, Modern (1453-) <gnome-el-list@gnome.org>\n"
"Language: el\n" "Language: el\n"
@@ -21,22 +21,31 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 1.8.7.1\n" "X-Generator: Poedit 3.3.2\n"
"X-Project-Style: gnome\n" "X-Project-Style: gnome\n"
#: data/gnome-classic.desktop.in:3 data/gnome-classic.session.desktop.in:3 #: data/gnome-classic.desktop.in:3
msgid "GNOME Classic" msgid "GNOME Classic"
msgstr "GNOME Classic" msgstr "GNOME Classic"
#: data/gnome-classic.desktop.in:4 #: data/gnome-classic.desktop.in:4 data/gnome-classic-wayland.desktop.in:4
#: data/gnome-classic-xorg.desktop.in:4
msgid "This session logs you into GNOME Classic" msgid "This session logs you into GNOME Classic"
msgstr "Αυτή η συνεδρία σας συνδέει στο GNOME Classic" msgstr "Αυτή η συνεδρία σας συνδέει στο GNOME Classic"
#: extensions/apps-menu/extension.js:113 #: data/gnome-classic-wayland.desktop.in:3
msgid "GNOME Classic on Wayland"
msgstr "GNOME Classic σε Wayland"
#: data/gnome-classic-xorg.desktop.in:3
msgid "GNOME Classic on Xorg"
msgstr "GNOME Classic σε Xorg"
#: extensions/apps-menu/extension.js:118
msgid "Favorites" msgid "Favorites"
msgstr "Αγαπημένα" msgstr "Αγαπημένα"
#: extensions/apps-menu/extension.js:369 #: extensions/apps-menu/extension.js:380
msgid "Applications" msgid "Applications"
msgstr "Εφαρμογές" msgstr "Εφαρμογές"
@@ -53,26 +62,26 @@ msgstr ""
"(όνομα αρχείου επιφάνειας εργασίας), ακολουθούμενη από άνω-κάτω τελεία και " "(όνομα αρχείου επιφάνειας εργασίας), ακολουθούμενη από άνω-κάτω τελεία και "
"τον αριθμό του χώρου εργασίας" "τον αριθμό του χώρου εργασίας"
#: extensions/auto-move-windows/prefs.js:35 #: extensions/auto-move-windows/prefs.js:152
msgid "Workspace Rules" msgid "Workspace Rules"
msgstr "Κανόνες χώρων εργασίας" msgstr "Κανόνες χώρων εργασίας"
#: extensions/auto-move-windows/prefs.js:243 #: extensions/auto-move-windows/prefs.js:306
msgid "Add Rule" msgid "Add Rule"
msgstr "Προσθήκη κανόνα" msgstr "Προσθήκη κανόνα"
#. TRANSLATORS: %s is the filesystem name #. TRANSLATORS: %s is the filesystem name
#: extensions/drive-menu/extension.js:112 #: extensions/drive-menu/extension.js:126
#: extensions/places-menu/placeDisplay.js:233 #: extensions/places-menu/placeDisplay.js:212
#, javascript-format #, javascript-format
msgid "Ejecting drive “%s” failed:" msgid "Ejecting drive “%s” failed:"
msgstr "Αποτυχία εξαγωγής του δίσκου «%s»:" msgstr "Αποτυχία εξαγωγής του δίσκου «%s»:"
#: extensions/drive-menu/extension.js:128 #: extensions/drive-menu/extension.js:145
msgid "Removable devices" msgid "Removable devices"
msgstr "Αφαιρούμενες συσκευές" msgstr "Αφαιρούμενες συσκευές"
#: extensions/drive-menu/extension.js:155 #: extensions/drive-menu/extension.js:167
msgid "Open Files" msgid "Open Files"
msgstr "Άνοιγμα αρχείων" msgstr "Άνοιγμα αρχείων"
@@ -106,31 +115,31 @@ msgstr ""
"στο κάτω μέρος. Η αλλαγή αυτής της ρύθμισης απαιτεί επανεκκίνηση του " "στο κάτω μέρος. Η αλλαγή αυτής της ρύθμισης απαιτεί επανεκκίνηση του "
"κελύφους για να υπάρξει κάποιο αποτέλεσμα." "κελύφους για να υπάρξει κάποιο αποτέλεσμα."
#: extensions/places-menu/extension.js:89 #: extensions/places-menu/extension.js:94
#: extensions/places-menu/extension.js:93 #: extensions/places-menu/extension.js:97
msgid "Places" msgid "Places"
msgstr "Τοποθεσίες" msgstr "Τοποθεσίες"
#: extensions/places-menu/placeDisplay.js:46 #: extensions/places-menu/placeDisplay.js:52
#, javascript-format #, javascript-format
msgid "Failed to launch “%s”" msgid "Failed to launch “%s”"
msgstr "Αποτυχία εκκίνησης «%s»" msgstr "Αποτυχία εκκίνησης «%s»"
#: extensions/places-menu/placeDisplay.js:61 #: extensions/places-menu/placeDisplay.js:67
#, javascript-format #, javascript-format
msgid "Failed to mount volume for “%s”" msgid "Failed to mount volume for “%s”"
msgstr "Αποτυχία προσάρτησης τόμου για «%s»" msgstr "Αποτυχία προσάρτησης τόμου για «%s»"
#: extensions/places-menu/placeDisplay.js:148 #: extensions/places-menu/placeDisplay.js:127
#: extensions/places-menu/placeDisplay.js:171 #: extensions/places-menu/placeDisplay.js:150
msgid "Computer" msgid "Computer"
msgstr "Υπολογιστής" msgstr "Υπολογιστής"
#: extensions/places-menu/placeDisplay.js:359 #: extensions/places-menu/placeDisplay.js:340
msgid "Home" msgid "Home"
msgstr "Προσωπικός φάκελος" msgstr "Προσωπικός φάκελος"
#: extensions/places-menu/placeDisplay.js:404 #: extensions/places-menu/placeDisplay.js:385
msgid "Browse Network" msgid "Browse Network"
msgstr "Περιήγηση δικτύου" msgstr "Περιήγηση δικτύου"
@@ -151,47 +160,47 @@ msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell"
msgstr "" msgstr ""
"Το όνομα του θέματος που θα φορτωθεί από το ~ /.themes/name/gnome-shell" "Το όνομα του θέματος που θα φορτωθεί από το ~ /.themes/name/gnome-shell"
#: extensions/window-list/extension.js:98 #: extensions/window-list/extension.js:72
msgid "Close" msgid "Close"
msgstr "Κλείσιμο" msgstr "Κλείσιμο"
#: extensions/window-list/extension.js:118 #: extensions/window-list/extension.js:92
msgid "Unminimize" msgid "Unminimize"
msgstr "Αποελαχιστοποίηση" msgstr "Αποελαχιστοποίηση"
#: extensions/window-list/extension.js:118 #: extensions/window-list/extension.js:92
msgid "Minimize" msgid "Minimize"
msgstr "Ελαχιστοποίηση" msgstr "Ελαχιστοποίηση"
#: extensions/window-list/extension.js:125 #: extensions/window-list/extension.js:99
msgid "Unmaximize" msgid "Unmaximize"
msgstr "Απομεγιστοποίηση" msgstr "Απομεγιστοποίηση"
#: extensions/window-list/extension.js:125 #: extensions/window-list/extension.js:99
msgid "Maximize" msgid "Maximize"
msgstr "Μεγιστοποίηση" msgstr "Μεγιστοποίηση"
#: extensions/window-list/extension.js:428 #: extensions/window-list/extension.js:483
msgid "Minimize all" msgid "Minimize all"
msgstr "Ελαχιστοποίηση όλων" msgstr "Ελαχιστοποίηση όλων"
#: extensions/window-list/extension.js:434 #: extensions/window-list/extension.js:489
msgid "Unminimize all" msgid "Unminimize all"
msgstr "Αποελαχιστοποίηση όλων" msgstr "Αποελαχιστοποίηση όλων"
#: extensions/window-list/extension.js:440 #: extensions/window-list/extension.js:495
msgid "Maximize all" msgid "Maximize all"
msgstr "Μεγιστοποίηση όλων" msgstr "Μεγιστοποίηση όλων"
#: extensions/window-list/extension.js:448 #: extensions/window-list/extension.js:503
msgid "Unmaximize all" msgid "Unmaximize all"
msgstr "Απομεγιστοποίηση όλων" msgstr "Απομεγιστοποίηση όλων"
#: extensions/window-list/extension.js:456 #: extensions/window-list/extension.js:511
msgid "Close all" msgid "Close all"
msgstr "Κλείσιμο όλων" msgstr "Κλείσιμο όλων"
#: extensions/window-list/extension.js:734 #: extensions/window-list/extension.js:795
msgid "Window List" msgid "Window List"
msgstr "Λίστα παραθύρου" msgstr "Λίστα παραθύρου"
@@ -209,7 +218,7 @@ msgstr ""
"«always» (πάντα)." "«always» (πάντα)."
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20 #: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20
#: extensions/window-list/prefs.js:100 #: extensions/window-list/prefs.js:79
msgid "Show windows from all workspaces" msgid "Show windows from all workspaces"
msgstr "Εμφάνιση των παραθύρων από όλους τους χώρους εργασίας" msgstr "Εμφάνιση των παραθύρων από όλους τους χώρους εργασίας"
@@ -230,41 +239,41 @@ msgstr ""
"Αν θα εμφανίζεται ο κατάλογος παραθύρων όλων των συνδεμένων οθονών ή μόνο " "Αν θα εμφανίζεται ο κατάλογος παραθύρων όλων των συνδεμένων οθονών ή μόνο "
"της κύριας οθόνης." "της κύριας οθόνης."
#: extensions/window-list/prefs.js:29 #: extensions/window-list/prefs.js:35
msgid "Window Grouping" msgid "Window Grouping"
msgstr "Ομαδοποίηση παραθύρου" msgstr "Ομαδοποίηση παραθύρου"
#: extensions/window-list/prefs.js:58 #: extensions/window-list/prefs.js:40
msgid "Never group windows" msgid "Never group windows"
msgstr "Να μη γίνεται ποτέ ομαδοποίηση παραθύρων" msgstr "Να μη γίνεται ποτέ ομαδοποίηση παραθύρων"
#: extensions/window-list/prefs.js:59 #: extensions/window-list/prefs.js:41
msgid "Group windows when space is limited" msgid "Group windows when space is limited"
msgstr "Ομαδοποίηση παραθύρων όταν ο χώρος είναι περιορισμένος" msgstr "Ομαδοποίηση παραθύρων όταν ο χώρος είναι περιορισμένος"
#: extensions/window-list/prefs.js:60 #: extensions/window-list/prefs.js:42
msgid "Always group windows" msgid "Always group windows"
msgstr "Να γίνεται πάντα ομαδοποίηση παραθύρων" msgstr "Να γίνεται πάντα ομαδοποίηση παραθύρων"
#: extensions/window-list/prefs.js:94 #: extensions/window-list/prefs.js:66
msgid "Show on all monitors" msgid "Show on all monitors"
msgstr "Να εμφανίζεται σε όλες τις οθόνες" msgstr "Να εμφανίζεται σε όλες τις οθόνες"
#: extensions/window-list/workspaceIndicator.js:207 #: extensions/window-list/workspaceIndicator.js:261
#: extensions/workspace-indicator/extension.js:213 #: extensions/workspace-indicator/extension.js:266
msgid "Workspace Indicator" msgid "Workspace Indicator"
msgstr "Δείκτης χώρου εργασίας" msgstr "Δείκτης χώρου εργασίας"
#: extensions/workspace-indicator/prefs.js:34 #: extensions/workspace-indicator/prefs.js:62
msgid "Workspace Names"
msgstr "Ονόματα χώρων εργασίας:"
#: extensions/workspace-indicator/prefs.js:67
#, javascript-format #, javascript-format
msgid "Workspace %d" msgid "Workspace %d"
msgstr "Χώρος εργασίας %d" msgstr "Χώρος εργασίας %d"
#: extensions/workspace-indicator/prefs.js:218 #: extensions/workspace-indicator/prefs.js:129
msgid "Workspace Names"
msgstr "Ονόματα χώρων εργασίας"
#: extensions/workspace-indicator/prefs.js:255
msgid "Add Workspace" msgid "Add Workspace"
msgstr "Προσθήκη χώρου εργασίας" msgstr "Προσθήκη χώρου εργασίας"
+1 -1
View File
@@ -80,7 +80,7 @@ msgstr "Dispositivi rimovibili"
#: extensions/drive-menu/extension.js:171 #: extensions/drive-menu/extension.js:171
msgid "Open Files" msgid "Open Files"
msgstr "Apri file" msgstr "Apri File"
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:5 #: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:5
msgid "Use more screen for windows" msgid "Use more screen for windows"
+6 -3
View File
@@ -9,15 +9,15 @@ msgstr ""
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/"
"issues\n" "issues\n"
"POT-Creation-Date: 2022-02-13 10:42+0000\n" "POT-Creation-Date: 2022-02-13 10:42+0000\n"
"PO-Revision-Date: 2022-02-13 14:35+0100\n" "PO-Revision-Date: 2022-09-14 16:37+0200\n"
"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n" "Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
"Language-Team: \n" "Language-Team: \n"
"Language: ka\n" "Language: ka\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Poedit 3.0.1\n" "X-Generator: Poedit 3.1.1\n"
#: data/gnome-classic.desktop.in:3 #: data/gnome-classic.desktop.in:3
msgid "GNOME Classic" msgid "GNOME Classic"
@@ -104,6 +104,9 @@ msgid ""
"shell default of placing it at the bottom. Changing this setting requires " "shell default of placing it at the bottom. Changing this setting requires "
"restarting the shell to have any effect." "restarting the shell to have any effect."
msgstr "" msgstr ""
"თუ ჩართულია, ფანჯრის სათაური შესაბამისი მინიატურის თავზე გამოჩნდება, რითიც "
"გადაფარავს გარსის ნაგულისხმებ მნიშვნელობას, რომ ის ძირზე იყოს. ამ "
"პარამეტრის ძალაში შესასვლელად საჭიროა გარსის გადატვირთვა."
#: extensions/places-menu/extension.js:88 #: extensions/places-menu/extension.js:88
#: extensions/places-menu/extension.js:91 #: extensions/places-menu/extension.js:91
+73 -74
View File
@@ -6,33 +6,41 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell-extension gnome 3.14\n" "Project-Id-Version: gnome-shell-extension gnome 3.14\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/issues\n"
"issues\n" "POT-Creation-Date: 2022-07-10 12:54+0000\n"
"POT-Creation-Date: 2020-05-28 00:55+0000\n" "PO-Revision-Date: 2022-09-08 02:59+0545\n"
"PO-Revision-Date: 2021-05-01 11:32+0545\n"
"Last-Translator: Pawan Chitrakar <chautari@gmail.com>\n" "Last-Translator: Pawan Chitrakar <chautari@gmail.com>\n"
"Language-Team: Nepali Translation Team <chautari@gmail.com>\n" "Language-Team: Nepali Translation Team <chautari@gmail.com>\n"
"Language: ne\n" "Language: ne\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.4.2\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 3.0.1\n"
"X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-SourceCharset: UTF-8\n"
#: data/gnome-classic.desktop.in:3 data/gnome-classic.session.desktop.in:3 #: data/gnome-classic.desktop.in:3
msgid "GNOME Classic" msgid "GNOME Classic"
msgstr "जिनोम क्लासिक" msgstr "जिनोम क्लासिक"
#: data/gnome-classic.desktop.in:4 #: data/gnome-classic.desktop.in:4 data/gnome-classic-wayland.desktop.in:4
#: data/gnome-classic-xorg.desktop.in:4
msgid "This session logs you into GNOME Classic" msgid "This session logs you into GNOME Classic"
msgstr "यो सेसन जिनोम क्लासिकमा लगईन हुन्छ" msgstr "यो सेसन जिनोम क्लासिकमा लगईन हुन्छ"
#: extensions/apps-menu/extension.js:113 #: data/gnome-classic-wayland.desktop.in:3
msgid "GNOME Classic on Wayland"
msgstr "वेल्याण्डमा जिनोम क्लासिक"
#: data/gnome-classic-xorg.desktop.in:3
msgid "GNOME Classic on Xorg"
msgstr "Xorg मा जिनोम क्लासिक"
#: extensions/apps-menu/extension.js:118
msgid "Favorites" msgid "Favorites"
msgstr "मनपर्ने" msgstr "मनपर्ने"
#: extensions/apps-menu/extension.js:369 #: extensions/apps-menu/extension.js:379
msgid "Applications" msgid "Applications"
msgstr "अनुप्रयोग" msgstr "अनुप्रयोग"
@@ -42,32 +50,31 @@ msgstr "अनुप्रयोग र कार्यस्थल सूची
#: extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml:7 #: extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml:7
msgid "" msgid ""
"A list of strings, each containing an application id (desktop file name), " "A list of strings, each containing an application id (desktop file name), followed by a colon "
"followed by a colon and the workspace number" "and the workspace number"
msgstr "" msgstr ""
"स्ट्रिङहरूको सूची, प्रत्येकमा अनुप्रयोग आईडी (डेस्कटप फाइल नाम) समाविष्ट छ, त्यसपछि " "स्ट्रिङहरूको सूची, प्रत्येकमा अनुप्रयोग आईडी (डेस्कटप फाइल नाम) समाविष्ट छ, त्यसपछि विराम र कार्यस्थान "
"विराम र कार्यस्थान नम्बरद्वारा अनुगमन गरियो" "नम्बरद्वारा अनुगमन गरियो"
#: extensions/auto-move-windows/prefs.js:35 #: extensions/auto-move-windows/prefs.js:152
msgid "Workspace Rules" msgid "Workspace Rules"
msgstr "कार्यस्थान नियम" msgstr "कार्यस्थान नियम"
#: extensions/auto-move-windows/prefs.js:243 #: extensions/auto-move-windows/prefs.js:306
msgid "Add Rule" msgid "Add Rule"
msgstr "नियम थप्नुहोस्" msgstr "नियम थप्नुहोस्"
#. TRANSLATORS: %s is the filesystem name #. TRANSLATORS: %s is the filesystem name
#: extensions/drive-menu/extension.js:112 #: extensions/drive-menu/extension.js:126 extensions/places-menu/placeDisplay.js:210
#: extensions/places-menu/placeDisplay.js:233
#, javascript-format #, javascript-format
msgid "Ejecting drive “%s” failed:" msgid "Ejecting drive “%s” failed:"
msgstr "\"%s\" ड्राइभ निकाल्न असफल भयो:" msgstr "\"%s\" ड्राइभ निकाल्न असफल भयो:"
#: extensions/drive-menu/extension.js:128 #: extensions/drive-menu/extension.js:145
msgid "Removable devices" msgid "Removable devices"
msgstr "छुट्याउन मिल्ने यन्त्र" msgstr "छुट्याउन मिल्ने यन्त्र"
#: extensions/drive-menu/extension.js:155 #: extensions/drive-menu/extension.js:167
msgid "Open Files" msgid "Open Files"
msgstr "खुला फाइल" msgstr "खुला फाइल"
@@ -77,13 +84,12 @@ msgstr "सञ्झ्यालका लागि बढी पर्दा
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:6 #: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:6
msgid "" msgid ""
"Try to use more screen for placing window thumbnails by adapting to screen " "Try to use more screen for placing window thumbnails by adapting to screen aspect ratio, and "
"aspect ratio, and consolidating them further to reduce the bounding box. " "consolidating them further to reduce the bounding box. This setting applies only with the "
"This setting applies only with the natural placement strategy." "natural placement strategy."
msgstr "" msgstr ""
"सञ्झ्याल थम्बनेलहरू पर्दा आकार अनुपातमा अनुकूल गरेर राख्नका लागि धेरै पर्दा प्रयोग गर्न " "सञ्झ्याल थम्बनेलहरू पर्दा आकार अनुपातमा अनुकूल गरेर राख्नका लागि धेरै पर्दा प्रयोग गर्न प्रयास गर्नुहोस्, र "
"प्रयास गर्नुहोस्, र तिनीहरूलाई बाउन्डिङ बाकस घटाउन अझ संगठित गर्नुहोस् । यो तरिका " "तिनीहरूलाई बाउन्डिङ बाकस घटाउन अझ संगठित गर्नुहोस् । यो तरिका प्राकृतिक प्लेसमेन्ट रणनीतिमा मात्र लागू हुन्छ।"
"प्राकृतिक प्लेसमेन्ट रणनीतिमा मात्र लागू हुन्छ।"
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:11 #: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:11
msgid "Place window captions on top" msgid "Place window captions on top"
@@ -91,39 +97,36 @@ msgstr "सञ्झ्याल क्याप्सन माथि राख
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:12 #: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:12
msgid "" msgid ""
"If true, place window captions on top the respective thumbnail, overriding " "If true, place window captions on top the respective thumbnail, overriding shell default of "
"shell default of placing it at the bottom. Changing this setting requires " "placing it at the bottom. Changing this setting requires restarting the shell to have any "
"restarting the shell to have any effect." "effect."
msgstr "" msgstr ""
"ठीक भएमा, सम्बन्धित थम्बनेलको माथि सञ्झ्याल क्याप्सन राख्नुहोस्, यसलाई तल राख्ने " "ठीक भएमा, सम्बन्धित थम्बनेलको माथि सञ्झ्याल क्याप्सन राख्नुहोस्, यसलाई तल राख्ने पूर्वनिर्धारित शेल अधिलेखन "
"पूर्वनिर्धारित शेल अधिलेखन गर्नुहोस् । यो सेटिङ परिवर्तन गर्न कुनै प्रभाव पार्न शेल पुन: " "गर्नुहोस् । यो सेटिङ परिवर्तन गर्न कुनै प्रभाव पार्न शेल पुन: सुरुआत गर्नु आवश्यक हुन्छ ।"
"सुरुआत गर्नु आवश्यक हुन्छ ।"
#: extensions/places-menu/extension.js:89 #: extensions/places-menu/extension.js:94 extensions/places-menu/extension.js:97
#: extensions/places-menu/extension.js:93
msgid "Places" msgid "Places"
msgstr "ठाउँहरू" msgstr "ठाउँहरू"
#: extensions/places-menu/placeDisplay.js:46 #: extensions/places-menu/placeDisplay.js:49
#, javascript-format #, javascript-format
msgid "Failed to launch “%s”" msgid "Failed to launch “%s”"
msgstr "%s सुरु गर्न असफल" msgstr "%s सुरु गर्न असफल"
#: extensions/places-menu/placeDisplay.js:61 #: extensions/places-menu/placeDisplay.js:64
#, javascript-format #, javascript-format
msgid "Failed to mount volume for “%s”" msgid "Failed to mount volume for “%s”"
msgstr "\"%s\" का लागि भोल्युम माउन्ट गर्न असफल" msgstr "\"%s\" का लागि भोल्युम माउन्ट गर्न असफल"
#: extensions/places-menu/placeDisplay.js:148 #: extensions/places-menu/placeDisplay.js:125 extensions/places-menu/placeDisplay.js:148
#: extensions/places-menu/placeDisplay.js:171
msgid "Computer" msgid "Computer"
msgstr "कम्प्युटर" msgstr "कम्प्युटर"
#: extensions/places-menu/placeDisplay.js:359 #: extensions/places-menu/placeDisplay.js:336
msgid "Home" msgid "Home"
msgstr "गृह" msgstr "गृह"
#: extensions/places-menu/placeDisplay.js:404 #: extensions/places-menu/placeDisplay.js:381
msgid "Browse Network" msgid "Browse Network"
msgstr "सञ्जाल ब्राउज गर्नुहोस्" msgstr "सञ्जाल ब्राउज गर्नुहोस्"
@@ -143,47 +146,47 @@ msgstr "सारभूत नाम"
msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell" msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell"
msgstr "~/.themes/name/gnome-shell बाट लोड गरिनुपर्ने विषयवस्तुको नाम" msgstr "~/.themes/name/gnome-shell बाट लोड गरिनुपर्ने विषयवस्तुको नाम"
#: extensions/window-list/extension.js:98 #: extensions/window-list/extension.js:72
msgid "Close" msgid "Close"
msgstr "बन्द" msgstr "बन्द"
#: extensions/window-list/extension.js:118 #: extensions/window-list/extension.js:92
msgid "Unminimize" msgid "Unminimize"
msgstr "न्यूनतम नबनाउनुहोस्" msgstr "न्यूनतम नबनाउनुहोस्"
#: extensions/window-list/extension.js:118 #: extensions/window-list/extension.js:92
msgid "Minimize" msgid "Minimize"
msgstr "सानो बनाउनुहोस्" msgstr "सानो बनाउनुहोस्"
#: extensions/window-list/extension.js:125 #: extensions/window-list/extension.js:99
msgid "Unmaximize" msgid "Unmaximize"
msgstr "अघिकतम नबनाउनुहोस्" msgstr "अघिकतम नबनाउनुहोस्"
#: extensions/window-list/extension.js:125 #: extensions/window-list/extension.js:99
msgid "Maximize" msgid "Maximize"
msgstr "ठूलो बनाउनुहोस्" msgstr "ठूलो बनाउनुहोस्"
#: extensions/window-list/extension.js:428 #: extensions/window-list/extension.js:483
msgid "Minimize all" msgid "Minimize all"
msgstr "सबै सानो बनाउनुहोस्" msgstr "सबै सानो बनाउनुहोस्"
#: extensions/window-list/extension.js:434 #: extensions/window-list/extension.js:489
msgid "Unminimize all" msgid "Unminimize all"
msgstr "सबै न्यूनतम नबनाउनुहोस्" msgstr "सबै न्यूनतम नबनाउनुहोस्"
#: extensions/window-list/extension.js:440 #: extensions/window-list/extension.js:495
msgid "Maximize all" msgid "Maximize all"
msgstr "सबै ठूलो बनाउनुहोस्" msgstr "सबै ठूलो बनाउनुहोस्"
#: extensions/window-list/extension.js:448 #: extensions/window-list/extension.js:503
msgid "Unmaximize all" msgid "Unmaximize all"
msgstr "सबैलाई अघिकतम नबनाउनुहोस्" msgstr "सबैलाई अघिकतम नबनाउनुहोस्"
#: extensions/window-list/extension.js:456 #: extensions/window-list/extension.js:511
msgid "Close all" msgid "Close all"
msgstr "सबै बन्द गर्नुहोस्" msgstr "सबै बन्द गर्नुहोस्"
#: extensions/window-list/extension.js:734 #: extensions/window-list/extension.js:795
msgid "Window List" msgid "Window List"
msgstr "सञ्झ्याल सूची" msgstr "सञ्झ्याल सूची"
@@ -193,14 +196,14 @@ msgstr "कहिले सञ्झ्याल समुहबध्द गर
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:13 #: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:13
msgid "" msgid ""
"Decides when to group windows from the same application on the window list. " "Decides when to group windows from the same application on the window list. Possible values are "
"Possible values are “never”, “auto” and “always”." "“never”, “auto” and “always”."
msgstr "" msgstr ""
"सञ्झ्याल सूचीमा उस्तै अनुप्रयोगबाट कहिले समूह बनाउने निर्णय गर्दछ । सम्भावित मान \"कहिले " "सञ्झ्याल सूचीमा उस्तै अनुप्रयोगबाट कहिले समूह बनाउने निर्णय गर्दछ । सम्भावित मान \"कहिले पनि\", \"स्वचालित\" र "
"पनि\", \"स्वचालित\" र \"सधैँ\" हुन् ।" "\"सधैँ\" हुन् ।"
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20 #: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20
#: extensions/window-list/prefs.js:100 #: extensions/window-list/prefs.js:79
msgid "Show windows from all workspaces" msgid "Show windows from all workspaces"
msgstr "सबै कार्यस्थानबाट सन्झ्याल देखाउनुहोस्" msgstr "सबै कार्यस्थानबाट सन्झ्याल देखाउनुहोस्"
@@ -213,48 +216,44 @@ msgid "Show the window list on all monitors"
msgstr "सबै मोनिटरमा सञ्झ्याल सूची देखाउनुहोस्" msgstr "सबै मोनिटरमा सञ्झ्याल सूची देखाउनुहोस्"
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:28 #: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:28
msgid "" msgid "Whether to show the window list on all connected monitors or only on the primary one."
"Whether to show the window list on all connected monitors or only on the " msgstr "सबै जडान गरिएको मोनिटरमा वा प्राथमिक मोनिटरमा मात्र सञ्झ्याल सूची देखाउने या नदेखाउने ।"
"primary one."
msgstr ""
"सबै जडान गरिएको मोनिटरमा वा प्राथमिक मोनिटरमा मात्र सञ्झ्याल सूची देखाउने या नदेखाउने "
"।"
#: extensions/window-list/prefs.js:29 #: extensions/window-list/prefs.js:35
msgid "Window Grouping" msgid "Window Grouping"
msgstr "समूहबद्ध सञ्झ्याल" msgstr "समूहबद्ध सञ्झ्याल"
#: extensions/window-list/prefs.js:58 #: extensions/window-list/prefs.js:40
msgid "Never group windows" msgid "Never group windows"
msgstr "सञ्झ्याल समुहबध्द नगर्ने" msgstr "सञ्झ्याल समुहबध्द नगर्ने"
#: extensions/window-list/prefs.js:59 #: extensions/window-list/prefs.js:41
msgid "Group windows when space is limited" msgid "Group windows when space is limited"
msgstr "खाली स्थान सिमित भएको बेलामा सञ्झ्यालहरू समूह गर्नुहोस्" msgstr "खाली स्थान सिमित भएको बेलामा सञ्झ्यालहरू समूह गर्नुहोस्"
#: extensions/window-list/prefs.js:60 #: extensions/window-list/prefs.js:42
msgid "Always group windows" msgid "Always group windows"
msgstr "सञ्झ्याल सधैँ समुहबध्द गर्ने" msgstr "सञ्झ्याल सधैँ समुहबध्द गर्ने"
#: extensions/window-list/prefs.js:94 #: extensions/window-list/prefs.js:66
msgid "Show on all monitors" msgid "Show on all monitors"
msgstr "सबै मोनिटरमा देखाउनुहोस्" msgstr "सबै मोनिटरमा देखाउनुहोस्"
#: extensions/window-list/workspaceIndicator.js:207 #: extensions/window-list/workspaceIndicator.js:261
#: extensions/workspace-indicator/extension.js:213 #: extensions/workspace-indicator/extension.js:266
msgid "Workspace Indicator" msgid "Workspace Indicator"
msgstr "कार्यस्थान सूचक" msgstr "कार्यस्थान सूचक"
#: extensions/workspace-indicator/prefs.js:34 #: extensions/workspace-indicator/prefs.js:62
msgid "Workspace Names"
msgstr "कार्यस्थल नाम"
#: extensions/workspace-indicator/prefs.js:67
#, javascript-format #, javascript-format
msgid "Workspace %d" msgid "Workspace %d"
msgstr "कार्यस्थल %d" msgstr "कार्यस्थल %d"
#: extensions/workspace-indicator/prefs.js:218 #: extensions/workspace-indicator/prefs.js:129
msgid "Workspace Names"
msgstr "कार्यस्थल नाम"
#: extensions/workspace-indicator/prefs.js:255
msgid "Add Workspace" msgid "Add Workspace"
msgstr "कार्यस्थल थप्नुहोस्" msgstr "कार्यस्थल थप्नुहोस्"
+50 -51
View File
@@ -6,20 +6,20 @@
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell-extensions gnome-3-0\n" "Project-Id-Version: gnome-shell-extensions\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/"
"issues\n" "issues\n"
"POT-Creation-Date: 2021-11-06 14:08+0000\n" "POT-Creation-Date: 2022-07-10 12:54+0000\n"
"PO-Revision-Date: 2021-12-11 15:12+0300\n" "PO-Revision-Date: 2022-09-14 13:09+0300\n"
"Last-Translator: Aleksandr Melman <Alexmelman88@gmail.com>\n" "Last-Translator: Aleksandr Melman <Alexmelman88@gmail.com>\n"
"Language-Team: Русский <gnome-cyr@gnome.org>\n" "Language-Team: Русский <gnome-cyr@gnome.org>\n"
"Language: ru\n" "Language: ru\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Poedit 3.0\n" "X-Generator: Poedit 3.1\n"
#: data/gnome-classic.desktop.in:3 #: data/gnome-classic.desktop.in:3
msgid "GNOME Classic" msgid "GNOME Classic"
@@ -28,7 +28,7 @@ msgstr "Классический GNOME"
#: data/gnome-classic.desktop.in:4 data/gnome-classic-wayland.desktop.in:4 #: data/gnome-classic.desktop.in:4 data/gnome-classic-wayland.desktop.in:4
#: data/gnome-classic-xorg.desktop.in:4 #: data/gnome-classic-xorg.desktop.in:4
msgid "This session logs you into GNOME Classic" msgid "This session logs you into GNOME Classic"
msgstr "Данный сеанс использует классический рабочий стол GNOME" msgstr "Данный сеанс использует классический GNOME"
#: data/gnome-classic-wayland.desktop.in:3 #: data/gnome-classic-wayland.desktop.in:3
msgid "GNOME Classic on Wayland" msgid "GNOME Classic on Wayland"
@@ -38,17 +38,17 @@ msgstr "Классический GNOME на Wayland"
msgid "GNOME Classic on Xorg" msgid "GNOME Classic on Xorg"
msgstr "Классический GNOME на Xorg" msgstr "Классический GNOME на Xorg"
#: extensions/apps-menu/extension.js:112 #: extensions/apps-menu/extension.js:118
msgid "Favorites" msgid "Favorites"
msgstr "Избранное" msgstr "Избранное"
#: extensions/apps-menu/extension.js:366 #: extensions/apps-menu/extension.js:379
msgid "Applications" msgid "Applications"
msgstr "Приложения" msgstr "Приложения"
#: extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml:6 #: extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml:6
msgid "Application and workspace list" msgid "Application and workspace list"
msgstr "Приложение и список рабочих областей" msgstr "Приложение и список рабочих столов"
#: extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml:7 #: extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml:7
msgid "" msgid ""
@@ -56,28 +56,28 @@ msgid ""
"followed by a colon and the workspace number" "followed by a colon and the workspace number"
msgstr "" msgstr ""
"Список строк, содержащих идентификатор приложения (имя desktop-файла), за " "Список строк, содержащих идентификатор приложения (имя desktop-файла), за "
"которым следует двоеточие и номер рабочего места" "которым следует двоеточие и номер рабочего стола"
#: extensions/auto-move-windows/prefs.js:34 #: extensions/auto-move-windows/prefs.js:152
msgid "Workspace Rules" msgid "Workspace Rules"
msgstr "Правила для рабочей области" msgstr "Правила для рабочих столов"
#: extensions/auto-move-windows/prefs.js:236 #: extensions/auto-move-windows/prefs.js:306
msgid "Add Rule" msgid "Add Rule"
msgstr "Добавить правило" msgstr "Добавить правило"
#. TRANSLATORS: %s is the filesystem name #. TRANSLATORS: %s is the filesystem name
#: extensions/drive-menu/extension.js:133 #: extensions/drive-menu/extension.js:126
#: extensions/places-menu/placeDisplay.js:233 #: extensions/places-menu/placeDisplay.js:210
#, javascript-format #, javascript-format
msgid "Ejecting drive “%s” failed:" msgid "Ejecting drive “%s” failed:"
msgstr "Не удалось извлечь диск «%s»:" msgstr "Не удалось извлечь диск «%s»:"
#: extensions/drive-menu/extension.js:149 #: extensions/drive-menu/extension.js:145
msgid "Removable devices" msgid "Removable devices"
msgstr "Съёмные устройства" msgstr "Съёмные устройства"
#: extensions/drive-menu/extension.js:171 #: extensions/drive-menu/extension.js:167
msgid "Open Files" msgid "Open Files"
msgstr "Открыть файлы" msgstr "Открыть файлы"
@@ -110,31 +110,31 @@ msgstr ""
"умолчанию заголовки располагаются снизу). При изменении этого параметра, " "умолчанию заголовки располагаются снизу). При изменении этого параметра, "
"чтобы оно вступило в силу, необходимо перезапустить Shell." "чтобы оно вступило в силу, необходимо перезапустить Shell."
#: extensions/places-menu/extension.js:88 #: extensions/places-menu/extension.js:94
#: extensions/places-menu/extension.js:91 #: extensions/places-menu/extension.js:97
msgid "Places" msgid "Places"
msgstr "Места" msgstr "Места"
#: extensions/places-menu/placeDisplay.js:46 #: extensions/places-menu/placeDisplay.js:49
#, javascript-format #, javascript-format
msgid "Failed to launch “%s”" msgid "Failed to launch “%s”"
msgstr "Не удалось запустить «%s»" msgstr "Не удалось запустить «%s»"
#: extensions/places-menu/placeDisplay.js:61 #: extensions/places-menu/placeDisplay.js:64
#, javascript-format #, javascript-format
msgid "Failed to mount volume for “%s”" msgid "Failed to mount volume for “%s”"
msgstr "Не удалось смонтировать том для «%s»" msgstr "Не удалось смонтировать том для «%s»"
#: extensions/places-menu/placeDisplay.js:125
#: extensions/places-menu/placeDisplay.js:148 #: extensions/places-menu/placeDisplay.js:148
#: extensions/places-menu/placeDisplay.js:171
msgid "Computer" msgid "Computer"
msgstr "Компьютер" msgstr "Компьютер"
#: extensions/places-menu/placeDisplay.js:359 #: extensions/places-menu/placeDisplay.js:336
msgid "Home" msgid "Home"
msgstr "Домашняя папка" msgstr "Домашняя папка"
#: extensions/places-menu/placeDisplay.js:404 #: extensions/places-menu/placeDisplay.js:381
msgid "Browse Network" msgid "Browse Network"
msgstr "Обзор сети" msgstr "Обзор сети"
@@ -175,28 +175,28 @@ msgstr "Восстановить"
msgid "Maximize" msgid "Maximize"
msgstr "Развернуть" msgstr "Развернуть"
#: extensions/window-list/extension.js:434 #: extensions/window-list/extension.js:483
msgid "Minimize all" msgid "Minimize all"
msgstr "Свернуть все" msgstr "Свернуть все"
# ну или "восстановить", правда тогда появляется неоднозначный повтор (unmaximize) # ну или "восстановить", правда тогда появляется неоднозначный повтор (unmaximize)
#: extensions/window-list/extension.js:440 #: extensions/window-list/extension.js:489
msgid "Unminimize all" msgid "Unminimize all"
msgstr "Вернуть все" msgstr "Вернуть все"
#: extensions/window-list/extension.js:446 #: extensions/window-list/extension.js:495
msgid "Maximize all" msgid "Maximize all"
msgstr "Развернуть все" msgstr "Развернуть все"
#: extensions/window-list/extension.js:454 #: extensions/window-list/extension.js:503
msgid "Unmaximize all" msgid "Unmaximize all"
msgstr "Восстановить все" msgstr "Восстановить все"
#: extensions/window-list/extension.js:462 #: extensions/window-list/extension.js:511
msgid "Close all" msgid "Close all"
msgstr "Закрыть все" msgstr "Закрыть все"
#: extensions/window-list/extension.js:741 #: extensions/window-list/extension.js:795
msgid "Window List" msgid "Window List"
msgstr "Список окон" msgstr "Список окон"
@@ -214,14 +214,14 @@ msgstr ""
"«always» — всегда." "«always» — всегда."
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20 #: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20
#: extensions/window-list/prefs.js:86 #: extensions/window-list/prefs.js:79
msgid "Show windows from all workspaces" msgid "Show windows from all workspaces"
msgstr "Отображать окна со всех рабочих областей" msgstr "Отображать окна со всех рабочих столов"
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:21 #: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:21
msgid "Whether to show windows from all workspaces or only the current one." msgid "Whether to show windows from all workspaces or only the current one."
msgstr "" msgstr ""
"Показывать ли список окон со всех рабочих областей или только с текущей." "Показывать ли список окон со всех рабочих столов или только с текущего."
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:27 #: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:27
msgid "Show the window list on all monitors" msgid "Show the window list on all monitors"
@@ -235,41 +235,40 @@ msgstr ""
"Показывать ли список окон на всех подключенных мониторах или только на " "Показывать ли список окон на всех подключенных мониторах или только на "
"основном." "основном."
#: extensions/window-list/prefs.js:39 #: extensions/window-list/prefs.js:35
msgid "Window Grouping" msgid "Window Grouping"
msgstr "Группировка окон" msgstr "Группировка окон"
#: extensions/window-list/prefs.js:63 #: extensions/window-list/prefs.js:40
msgid "Never group windows" msgid "Never group windows"
msgstr "Никогда не группировать окна" msgstr "Никогда не группировать окна"
#: extensions/window-list/prefs.js:64 #: extensions/window-list/prefs.js:41
msgid "Group windows when space is limited" msgid "Group windows when space is limited"
msgstr "Группировать окна, если место ограничено" msgstr "Группировать окна, если место ограничено"
#: extensions/window-list/prefs.js:65 #: extensions/window-list/prefs.js:42
msgid "Always group windows" msgid "Always group windows"
msgstr "Всегда группировать окна" msgstr "Всегда группировать окна"
#: extensions/window-list/prefs.js:81 #: extensions/window-list/prefs.js:66
msgid "Show on all monitors" msgid "Show on all monitors"
msgstr "Показывать на всех мониторах" msgstr "Показывать на всех мониторах"
#: extensions/window-list/workspaceIndicator.js:249 #: extensions/window-list/workspaceIndicator.js:261
#: extensions/workspace-indicator/extension.js:254 #: extensions/workspace-indicator/extension.js:266
msgid "Workspace Indicator" msgid "Workspace Indicator"
msgstr "Индикатор рабочей области" msgstr "Индикатор рабочих столов"
#: extensions/workspace-indicator/prefs.js:33 #: extensions/workspace-indicator/prefs.js:62
msgid "Workspace Names"
msgstr "Названия рабочих областей"
#: extensions/workspace-indicator/prefs.js:66
#, javascript-format #, javascript-format
msgid "Workspace %d" msgid "Workspace %d"
msgstr "Рабочая область %d" msgstr "Рабочий стол %d"
#: extensions/workspace-indicator/prefs.js:207 #: extensions/workspace-indicator/prefs.js:129
msgid "Workspace Names"
msgstr "Названия рабочих столов"
#: extensions/workspace-indicator/prefs.js:255
msgid "Add Workspace" msgid "Add Workspace"
msgstr "Добавить рабочую область" msgstr "Добавить рабочий стол"
+42 -128
View File
@@ -1,5 +1,5 @@
# Turkish translation for gnome-shell-extensions. # Turkish translation for gnome-shell-extensions.
# Copyright (C) 2012-2019 gnome-shell-extensions's COPYRIGHT HOLDER # Copyright (C) 2012-2022 gnome-shell-extensions's COPYRIGHT HOLDER
# This file is distributed under the same license as the gnome-shell-extensions package. # This file is distributed under the same license as the gnome-shell-extensions package.
# #
# Osman Karagöz <osmank3@gmail.com>, 2012. # Osman Karagöz <osmank3@gmail.com>, 2012.
@@ -14,7 +14,7 @@ msgstr ""
"Project-Id-Version: gnome-shell-extensions master\n" "Project-Id-Version: gnome-shell-extensions master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/"
"issues\n" "issues\n"
"POT-Creation-Date: 2021-11-06 14:08+0000\n" "POT-Creation-Date: 2022-07-10 12:54+0000\n"
"PO-Revision-Date: 2022-02-14 01:35+0300\n" "PO-Revision-Date: 2022-02-14 01:35+0300\n"
"Last-Translator: Emin Tufan Çetin <etcetin@gmail.com>\n" "Last-Translator: Emin Tufan Çetin <etcetin@gmail.com>\n"
"Language-Team: Turkish <gnome-turk@gnome.org>\n" "Language-Team: Turkish <gnome-turk@gnome.org>\n"
@@ -42,11 +42,11 @@ msgstr "Wayland üstünde GNOME Klasik"
msgid "GNOME Classic on Xorg" msgid "GNOME Classic on Xorg"
msgstr "Xorg üstünde GNOME Klasik" msgstr "Xorg üstünde GNOME Klasik"
#: extensions/apps-menu/extension.js:112 #: extensions/apps-menu/extension.js:118
msgid "Favorites" msgid "Favorites"
msgstr "Gözdeler" msgstr "Gözdeler"
#: extensions/apps-menu/extension.js:366 #: extensions/apps-menu/extension.js:379
msgid "Applications" msgid "Applications"
msgstr "Uygulamalar" msgstr "Uygulamalar"
@@ -62,26 +62,26 @@ msgstr ""
"Her biri, bir uygulama kimliği (masaüstü dosya adı) ardından gelen iki nokta " "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" "üst üste ve çalışma alanı numarasını içeren dizgeler listesi"
#: extensions/auto-move-windows/prefs.js:34 #: extensions/auto-move-windows/prefs.js:152
msgid "Workspace Rules" msgid "Workspace Rules"
msgstr "Çalışma Alanı Kuralları" msgstr "Çalışma Alanı Kuralları"
#: extensions/auto-move-windows/prefs.js:236 #: extensions/auto-move-windows/prefs.js:306
msgid "Add Rule" msgid "Add Rule"
msgstr "Kural Ekle" msgstr "Kural Ekle"
#. TRANSLATORS: %s is the filesystem name #. TRANSLATORS: %s is the filesystem name
#: extensions/drive-menu/extension.js:133 #: extensions/drive-menu/extension.js:126
#: extensions/places-menu/placeDisplay.js:233 #: extensions/places-menu/placeDisplay.js:210
#, javascript-format #, javascript-format
msgid "Ejecting drive “%s” failed:" msgid "Ejecting drive “%s” failed:"
msgstr "“%s” sürücüsü çıkarılamadı:" msgstr "“%s” sürücüsü çıkarılamadı:"
#: extensions/drive-menu/extension.js:149 #: extensions/drive-menu/extension.js:145
msgid "Removable devices" msgid "Removable devices"
msgstr "Çıkarılabilir aygıtlar" msgstr "Çıkarılabilir aygıtlar"
#: extensions/drive-menu/extension.js:171 #: extensions/drive-menu/extension.js:167
msgid "Open Files" msgid "Open Files"
msgstr "Dosyaları Aç" msgstr "Dosyaları Aç"
@@ -96,9 +96,9 @@ msgid ""
"This setting applies only with the natural placement strategy." "This setting applies only with the natural placement strategy."
msgstr "" msgstr ""
"Ekran en-boy oranına uyarak ve sınır kutucuğunu küçültüp daha da " "Ekran en-boy oranına uyarak ve sınır kutucuğunu küçültüp daha da "
"sıkılaştırarak, pencere küçük resimlerini yerleştirmek için ekranda daha " "sıkılaştırarak, pencere küçük resimlerini yerleştirmek için ekranda daha çok "
"çok alan kullanmayı dene. Bu seçenek yalnızca doğal yerleştirme stratejisi " "alan kullanmayı dene. Bu seçenek yalnızca doğal yerleştirme stratejisi ile "
"ile geçerlidir." "geçerlidir."
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:11 #: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:11
msgid "Place window captions on top" msgid "Place window captions on top"
@@ -115,31 +115,31 @@ msgstr ""
"Yapılan değişikliklerin etkili olması için kabuğun yeniden başlatılması " "Yapılan değişikliklerin etkili olması için kabuğun yeniden başlatılması "
"gerekir." "gerekir."
#: extensions/places-menu/extension.js:88 #: extensions/places-menu/extension.js:94
#: extensions/places-menu/extension.js:91 #: extensions/places-menu/extension.js:97
msgid "Places" msgid "Places"
msgstr "Yerler" msgstr "Yerler"
#: extensions/places-menu/placeDisplay.js:46 #: extensions/places-menu/placeDisplay.js:49
#, javascript-format #, javascript-format
msgid "Failed to launch “%s”" msgid "Failed to launch “%s”"
msgstr "“%s” başlatılamadı" msgstr "“%s” başlatılamadı"
#: extensions/places-menu/placeDisplay.js:61 #: extensions/places-menu/placeDisplay.js:64
#, javascript-format #, javascript-format
msgid "Failed to mount volume for “%s”" msgid "Failed to mount volume for “%s”"
msgstr "“%s” için birim bağlanamadı" msgstr "“%s” için birim bağlanamadı"
#: extensions/places-menu/placeDisplay.js:125
#: extensions/places-menu/placeDisplay.js:148 #: extensions/places-menu/placeDisplay.js:148
#: extensions/places-menu/placeDisplay.js:171
msgid "Computer" msgid "Computer"
msgstr "Bilgisayar" msgstr "Bilgisayar"
#: extensions/places-menu/placeDisplay.js:359 #: extensions/places-menu/placeDisplay.js:336
msgid "Home" msgid "Home"
msgstr "Ev" msgstr "Ev"
#: extensions/places-menu/placeDisplay.js:404 #: extensions/places-menu/placeDisplay.js:381
msgid "Browse Network" msgid "Browse Network"
msgstr "Ağa Gözat" msgstr "Ağa Gözat"
@@ -179,27 +179,27 @@ msgstr "Önceki duruma getir"
msgid "Maximize" msgid "Maximize"
msgstr "En büyük duruma getir" msgstr "En büyük duruma getir"
#: extensions/window-list/extension.js:434 #: extensions/window-list/extension.js:483
msgid "Minimize all" msgid "Minimize all"
msgstr "Tümünü simge durumuna küçült" msgstr "Tümünü simge durumuna küçült"
#: extensions/window-list/extension.js:440 #: extensions/window-list/extension.js:489
msgid "Unminimize all" msgid "Unminimize all"
msgstr "Tümünü önceki duruma getir" msgstr "Tümünü önceki duruma getir"
#: extensions/window-list/extension.js:446 #: extensions/window-list/extension.js:495
msgid "Maximize all" msgid "Maximize all"
msgstr "Tümünü en büyük duruma getir" msgstr "Tümünü en büyük duruma getir"
#: extensions/window-list/extension.js:454 #: extensions/window-list/extension.js:503
msgid "Unmaximize all" msgid "Unmaximize all"
msgstr "Tümünü önceki duruma getir" msgstr "Tümünü önceki duruma getir"
#: extensions/window-list/extension.js:462 #: extensions/window-list/extension.js:511
msgid "Close all" msgid "Close all"
msgstr "Tümünü kapat" msgstr "Tümünü kapat"
#: extensions/window-list/extension.js:741 #: extensions/window-list/extension.js:795
msgid "Window List" msgid "Window List"
msgstr "Pencere Listesi" msgstr "Pencere Listesi"
@@ -217,7 +217,7 @@ msgstr ""
"“always” (her zaman)." "“always” (her zaman)."
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20 #: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20
#: extensions/window-list/prefs.js:86 #: extensions/window-list/prefs.js:79
msgid "Show windows from all workspaces" msgid "Show windows from all workspaces"
msgstr "Tüm çalışma alanlarındaki pencereleri göster" msgstr "Tüm çalışma alanlarındaki pencereleri göster"
@@ -236,129 +236,43 @@ msgid ""
"Whether to show the window list on all connected monitors or only on the " "Whether to show the window list on all connected monitors or only on the "
"primary one." "primary one."
msgstr "" msgstr ""
"Pencere listesinin tüm bağlı monitörlerde mi yoksa yalnızca birincil monitörde " "Pencere listesinin tüm bağlı monitörlerde mi yoksa yalnızca birincil "
"mi gösterileceğini belirtir." "monitörde mi gösterileceğini belirtir."
#: extensions/window-list/prefs.js:39 #: extensions/window-list/prefs.js:35
msgid "Window Grouping" msgid "Window Grouping"
msgstr "Pencere Kümeleme" msgstr "Pencere Kümeleme"
#: extensions/window-list/prefs.js:63 #: extensions/window-list/prefs.js:40
msgid "Never group windows" msgid "Never group windows"
msgstr "Pencereleri asla kümeleme" msgstr "Pencereleri asla kümeleme"
#: extensions/window-list/prefs.js:64 #: extensions/window-list/prefs.js:41
msgid "Group windows when space is limited" msgid "Group windows when space is limited"
msgstr "Yer kısıtlıyken pencereleri kümele" msgstr "Yer kısıtlıyken pencereleri kümele"
#: extensions/window-list/prefs.js:65 #: extensions/window-list/prefs.js:42
msgid "Always group windows" msgid "Always group windows"
msgstr "Pencereleri her zaman kümele" msgstr "Pencereleri her zaman kümele"
#: extensions/window-list/prefs.js:81 #: extensions/window-list/prefs.js:66
msgid "Show on all monitors" msgid "Show on all monitors"
msgstr "Tüm monitörlerde göster" msgstr "Tüm monitörlerde göster"
#: extensions/window-list/workspaceIndicator.js:249 #: extensions/window-list/workspaceIndicator.js:261
#: extensions/workspace-indicator/extension.js:254 #: extensions/workspace-indicator/extension.js:266
msgid "Workspace Indicator" msgid "Workspace Indicator"
msgstr "Çalışma Alanı Belirteci" msgstr "Çalışma Alanı Belirteci"
#: extensions/workspace-indicator/prefs.js:33 #: extensions/workspace-indicator/prefs.js:62
msgid "Workspace Names"
msgstr "Çalışma Alanı Adları"
#: extensions/workspace-indicator/prefs.js:66
#, javascript-format #, javascript-format
msgid "Workspace %d" msgid "Workspace %d"
msgstr "Çalışma Alanı %d" msgstr "Çalışma Alanı %d"
#: extensions/workspace-indicator/prefs.js:207 #: extensions/workspace-indicator/prefs.js:129
msgid "Workspace Names"
msgstr "Çalışma Alanı Adları"
#: extensions/workspace-indicator/prefs.js:255
msgid "Add Workspace" msgid "Add Workspace"
msgstr "Çalışma Alanı Ekle" msgstr "Çalışma Alanı Ekle"
#~ msgid "Application"
#~ msgstr "Uygulama"
#~ msgid "Create new matching rule"
#~ msgstr "Yeni bir eşleşme kuralı oluştur"
#~ msgid "Add"
#~ msgstr "Ekle"
#~ msgid "Name"
#~ msgstr "Ad"
#~ msgid "Attach modal dialog to the parent window"
#~ msgstr "Yardımcı iletişim penceresini ana pencereye iliştir"
#~ msgid ""
#~ "This key overrides the key in org.gnome.mutter when running GNOME Shell."
#~ msgstr ""
#~ "Bu anahtar, GNOME Shell çalışırken org.gnome.mutter içindeki anahtarı "
#~ "geçersiz kılar."
#~ msgid "Arrangement of buttons on the titlebar"
#~ msgstr "Başlık çubuğundaki düğmelerin düzeni"
#~ msgid ""
#~ "This key overrides the key in org.gnome.desktop.wm.preferences when "
#~ "running GNOME Shell."
#~ msgstr ""
#~ "Bu anahtar, GNOME Kabuğu çalışırken org.gnome.desktop.wm.preferences "
#~ "içindeki anahtarı geçersiz kılar."
#~ msgid "Enable edge tiling when dropping windows on screen edges"
#~ msgstr ""
#~ "Pencereler ekran kenarlarında bırakıldığında kenar döşemeyi etkinleştir"
#~ msgid "Workspaces only on primary monitor"
#~ msgstr "Çalışma alanları sadece birincil ekranda"
#~ msgid "Delay focus changes in mouse mode until the pointer stops moving"
#~ msgstr ""
#~ "Fare kipinde odak değişikliklerini işaretçi hareketi durana kadar beklet"
#~ msgid "Thumbnail only"
#~ msgstr "Yalnızca küçük resim"
#~ msgid "Application icon only"
#~ msgstr "Sadece uygulama simgesi"
#~ msgid "Thumbnail and application icon"
#~ msgstr "Küçük resim ve uygulama simgesi"
#~ msgid "Present windows as"
#~ msgstr "Pencereleri farklı sun"
#~ msgid "Activities Overview"
#~ msgstr "Etkinlikler Genel Görünümü"
#~ msgid "Hello, world!"
#~ msgstr "Merhaba dünya!"
#~ msgid "Alternative greeting text."
#~ msgstr "Alternatif karşılama metni."
#~ msgid ""
#~ "If not empty, it contains the text that will be shown when clicking on "
#~ "the panel."
#~ msgstr "Eğer boş değilse, panele tıklandığında gösterilecek metni içerir."
#~ msgid "Message"
#~ msgstr "İleti"
#~ msgid ""
#~ "Example aims to show how to build well behaved extensions for the Shell "
#~ "and as such it has little functionality on its own.\n"
#~ "Nevertheless its possible to customize the greeting message."
#~ msgstr ""
#~ "Bu örnek, Shell için uygun eklentilerin nasıl geliştirileceğini "
#~ "göstermeyi amaçlar; bu yüzden kendi başına çok az işleve sahiptir.\n"
#~ "Yine de karşılama iletisini özelleştirmek mümkündür."
#~ msgid "CPU"
#~ msgstr "İşlemci"
#~ msgid "Memory"
#~ msgstr "Bellek"