Compare commits

..
Author SHA1 Message Date
Jeremy Bicha fcefdc3271 New upstream version 42.3 2022-07-13 17:46:10 +02: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
Florian Müllner 959782835d Bump version to 42.2
Update NEWS.
2022-05-28 14:30:58 +02:00
Jason Lynch 412762ae9d window-list: Set visibility based on the target monitor.
Currently, the visibility of the window list on a given monitor is set
according to the fullscreen status of the primary monitor. When a
fullscreen application is on a secondary monitor (but not on the primary
monitor), entering and exiting the overview will lead to the window list
incorrectly being visible on the monitor with the fullscreen
application.

Instead, determine the visibility based on the fullscreen status of the
monitor being evaluated.

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

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/230>
2022-05-19 18:31:33 -07:00
Florian Müllner 6e4f4126b6 native-window-placement: Adjust to 42 changes
gnome-shell's new screenshot UI reuses the overview's window
picker layout, but its window previews don't give access to
the underlying MetaWindow.

Adjust to that by using the boundingBox property instead, which
is all we really need from the window anyway.

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

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/229>
2022-05-19 19:08:59 +02:00
Cheng-Chia Tseng 5dc212d1e5 Update Chinese (Taiwan) translation 2022-05-11 16:02:45 +00:00
Jeremy Bicha b2455f0ecd New upstream version 42.1 2022-05-09 08:02:09 -04:00
Florian Müllner a02c9b6589 Bump version to 42.1
Update NEWS.
2022-05-06 13:35:32 +02:00
Florian Müllner 18e18f240f Update sass submodule 2022-05-06 13:30:26 +02:00
Zurab Kargareteli 96bdc7c74a Add Georgian translation 2022-04-23 16:59:34 +00:00
Ngọc Quân Trần 812b96a571 Update Vietnamese translation 2022-04-03 07:51:00 +00:00
Florian Müllner a51145f9db window-list: Fix cleaning up signal on removal
The map uses windows as key, so trying to remove the handler ID
will leave stray windows/signals.

Spotted by Ron Yorston.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/225>
2022-03-29 17:06:40 +02:00
Nathan Follens 36fc042e27 Update Dutch translation 2022-03-25 11:44:09 +00:00
Rūdolfs Mazurs 54f39318ba Update Latvian translation 2022-03-24 20:15:56 +00:00
Florian Müllner cbd5c2438d classic: Drop unnecessary calendar styling
It is already fully covered by the light variant.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/222>
2022-03-24 00:08:09 +00:00
Florian Müllner 29e032d89c classic: Drop unused toggle-switch style/assets
gnome-shell dropped the separate us/intl handling back in 2019.
That includes adding the corresponding style classes, so the
style and assets are completely unused now.

Nobody noticed because gnome-shell itself includes assets for
a light variant, so we can simply drop the unused stuff.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/222>
2022-03-24 00:08:09 +00:00
Florian Müllner 72a9696249 build: Remove unused stylesheets
The only reason for installing empty stylesheets is minimizing
build system differences between extensions. That's not a very
good reason and we don't do this for other optional files like
schemas.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/223>
2022-03-24 00:53:13 +01:00
Milo Casagrande 9ca89cdf63 Update Italian translation 2022-03-17 08:34:22 +00:00
Jeremy Bicha 573aba17d7 New upstream version 42.0 2022-03-14 11:29:53 -04:00
Florian Müllner 227c900d1c Bump version to 42.0
Update NEWS.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/220>
2022-03-12 23:57:47 +01:00
Baurzhan Muftakhidinov 49b304f3b7 Update Kazakh translation 2022-03-12 17:57:43 +00:00
sicklylife ac77f0b879 Update Japanese translation 2022-03-12 10:42:11 +00:00
Марко Костић 54e02b1925 Update Serbian translation 2022-03-11 06:11:09 +00:00
Balázs Úr 1489e42c46 Update Hungarian translation 2022-03-11 00:39:00 +00:00
Philipp Kiemle 684004bd89 Update German translation 2022-03-10 23:34:18 +00:00
Jeremy Bicha 2117c42d74 New upstream version 42~rc 2022-03-08 09:32:26 -05:00
Florian Müllner 80e68be9fa Bump version to 42.rc
Update NEWS.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/219>
2022-03-07 16:04:51 +01:00
Florian Müllner 06af10e0d3 Update sass submodule
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/219>
2022-03-07 16:03:40 +01:00
Changwoo Ryu 95b8aa38cb Update Korean translation 2022-03-03 12:45:28 +00:00
Charles Monzat b010bff5d9 Update French translation 2022-03-03 07:53:48 +00:00
Alan Mortensen a8b73861a6 Updated Danish translation 2022-02-28 18:46:32 +01:00
Luna Jernberg bd002fa96d Update Swedish translation 2022-02-28 15:17:45 +00:00
Jiri Grönroos 5712dd05d9 Update Finnish translation 2022-02-27 16:54:51 +00:00
Piotr Drąg 694b0552c2 Update Polish translation 2022-02-26 15:17:47 +01:00
Dušan Kazik d9f5726d45 Update Slovak translation 2022-02-25 07:14:55 +00:00
Marco Trevisan (Treviño) 5edffcd859 New upstream version 42~beta 2022-02-23 02:57:09 +01:00
Florian Müllner 3c5a56b440 auto-move: Bind list to model
Using a model gives us a clear separation between data and representation,
as well as between regular rows and the "new item" row at the end.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/218>
2022-02-18 13:09:35 +01:00
Florian Müllner 725cf83551 auto-move-windows: Change 'update' action to 'rename'
Limiting the action to the row that changed instead of the list as
a whole makes it easier to only update the changed value and not
recreate the entire list.

This doesn't make a difference right now, because we carefully sync
the list to reuse existing rows, but we are about to back the list
with a GListModel instead of updating it manually.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/218>
2022-02-18 13:08:09 +01:00
Florian Müllner f91275ffd2 workspace-indicator: Bind list to model
Using a model gives us a clear separation between data and representation,
as well as between regular rows and the "new item" row at the end.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/218>
2022-02-18 13:02:17 +01:00
Florian Müllner f0e46f4b12 workspace-indicator: Change 'update' action to 'rename'
Limiting the action to the row that changed instead of the list as
a whole makes it easier to only update the changed value and not
recreate the entire list.

This doesn't make a difference right now, because we carefully sync
the list to reuse existing rows, but we are about to back the list
with a GListModel instead of updating it manually.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/218>
2022-02-18 12:55:57 +01:00
Florian Müllner 57f7f21ecb workspace-indicator: Bind name to action target
Since we now have an override for bind_properties_full(), we can
use that instead of an explicit notify handler.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/218>
2022-02-18 12:42:07 +01:00
Florian Müllner 9f673f27ef cleanup: Use static class blocks for gtype registration
gjs enabled support for static class blocks, which gives us a
less error-prone and more readable alternative to _classInit(),
provided we make sure to call registerClass() first.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/215>
2022-02-18 03:34:06 +00:00
Florian Müllner 08db193b31 cleanup: Use regular constructors in GObject subclasses
As a side-effect of supporting class fields, regular constructors
now work in GObject subclasses. Using _init() still works and
there's no functional difference, but it's simply much nicer
to use the same syntax for all classes.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/215>
2022-02-18 03:34:06 +00:00
Florian Müllner 0be8b10995 cleanup: Simplify action handling
GTK4 has dedicated API for widget-specific actions, make use of that
instead of explicitly managing an action group.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/215>
2022-02-18 03:34:06 +00:00
Florian Müllner b35df9062c lint: Sync with gjs
This is needed for eslint to recognize static class blocks.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/215>
2022-02-18 03:34:06 +00:00
Florian Müllner f6f34c6341 ci: Replace js78 job
Provided we use the correct version of the SpiderMonkey shell, we
can perform checks using the same engine that is used by gjs.

However some engine features are opt-in, so the set of features enabled
by gjs and js91 may differ. The obvious option for avoiding this is
replacing js91 with gjs for tests.

Switch to the newly added gjs-check-syntax script, which does precisely
that.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/215>
2022-02-18 03:34:06 +00:00
Florian Müllner 22e4ca8925 ci: Bump gnome-shell image
We are about to make use of new language features, so update to an
image that has the necessary tooling.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/215>
2022-02-18 03:34:06 +00:00
Marek Černocký 4fd2be744e Updated Czech translation 2022-02-16 10:00:12 +01:00
Florian Müllner 31e48437ec classic: Update list of sass sources 2022-02-14 23:49:00 +01:00
Florian Müllner 78f1bb3cc9 Update sass submodule 2022-02-14 23:48:12 +01:00
Florian Müllner 14cdb5fa16 Bump version to 42.beta
Update NEWS.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/216>
2022-02-14 23:18:46 +01:00
Emin Tufan Çetin 533cd07cfd Update Turkish translation 2022-02-13 22:42:10 +00:00
Alexander Shopov 7232118978 Update Bulgarian translation 2022-02-13 10:41:54 +00:00
Naala Nanba 7a1286ec1c Update Abkhazian translation 2022-02-12 20:25:06 +00:00
Naala Nanba a51a52268e Update Abkhazian translation 2022-02-12 19:40:52 +00:00
Naala Nanba 6db43f9603 Add Abkhazian translation 2022-02-12 19:36:35 +00:00
Florian Müllner f7b5836c75 auto-move-windows: Use custom spin button in prefs
Gtk.SpinButton doesn't look great in lists, so replace it with a
small custom widget based on current mockups from the design team.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/213>
2022-02-12 02:05:50 +00:00
Florian Müllner ffb2b27477 auto-move-windows: Use libadwaita's row widgets
We get to remove a bunch of boring code, and get something better
looking and more standardized in return.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/213>
2022-02-12 02:05:50 +00:00
Florian Müllner dd3c524c49 prefs: Replace 'content' list style
It's deprecated in favor of 'boxed-list'.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/213>
2022-02-12 02:05:50 +00:00
Florian Müllner b92973df00 cleanup: Simplify promisify() calls
If the finish function isn't specified, promisify will now try
to use the async name without '_async'/'_begin' suffix (if any)
and '_finish' appended.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/214>
2022-02-11 16:22:38 +01:00
Florian Müllner 0b7e8f9720 user-theme: Stop using Gio._LocalFilePrototype
Now that promisify() works on interfaces, we don't need this
cludge anymore.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/214>
2022-02-11 16:22:38 +01:00
Florian Müllner f6342d3b52 cleanup: Replace Promise wrappers
gjs now supports overriding interface methods, which means that
promisify started to work on interfaces.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/214>
2022-02-11 16:22:38 +01:00
Florian Müllner 013b3fb73c apps-menu: Adapt to Clutter.Grab changes
Device grabs are gone, switch to the new API.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/212>
2022-02-10 00:28:04 +01:00
Florian Müllner 69527857f8 window-list: Adapt to Clutter.Grab changes
pushModal() now returns a grab object that has to be passed to
popModal() to release the grab.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/212>
2022-02-10 00:12:22 +01:00
Florian Müllner e0128a7817 window-list: Use libadwaita for preferences
libadwaita has now become stable and will be part of the GNOME 42
platform. Time to embrace it and get fancier preferences with
less code.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/209>
2022-02-08 19:22:41 +00:00
Florian Müllner 62628b25c6 auto-move-windows: Use libadwaita for preferences
libadwaita has now become stable and will be part of the GNOME 42
platform. Time to embrace it and get fancier preferences with
less code.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/209>
2022-02-08 19:22:41 +00:00
Florian Müllner 3f89b57c96 workspace-indicator: Use libadwaita for preferences
libadwaita has now become stable and will be part of the GNOME 42
platform. Time to embrace it and get fancier preferences with
less code.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/209>
2022-02-08 19:22:41 +00:00
Florian Müllner 01537b401f user-theme: Use libadwaita for preferences
libadwaita has now become stable and will be part of the GNOME 42
platform. Time to embrace it and get fancier preferences with
less code.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/209>
2022-02-08 19:22:41 +00:00
Matej Urbančič 30e846274c Update Slovenian translation 2022-01-26 21:03:10 +00:00
Florian Müllner d340922fea window-list: Track window-created/unmanaged
Shell's WindowTracker switched to those signals instead of tracking
windows through MetaWorkspace's window-added/removed signals.

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

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

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

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/207>
2022-01-26 12:33:35 +00:00
Florian Müllner 8dd8d6f561 workspace-indicator: Fix cancelling editing with Esc
The CallbackAction's callback must return true to stop the event
from propagating to the dialog, where it will trigger the close
binding.

It makes sense to still allow closing the dialog with Escape while
not editing a row. The easiest way to achieve that is by moving the
controller to the entry.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/208>
2022-01-26 10:55:59 +00:00
Jan Beich cdaa837d48 meson: Drop unused argument for i18n.merge_file()
Ignored in Meson < 0.60.0, deprecated since 0.60.1 and fatal since 0.61.0.

data/meson.build:23:0: ERROR: Function does not take positional arguments.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/210>
2022-01-25 11:52:56 +00:00
Boyuan Yang 7576b5c602 Update Chinese (China) translation 2022-01-13 20:28:37 +00:00
Florian Müllner fac3d8b8c4 Bump version to 42.alpha
Update NEWS.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/206>
2022-01-10 22:40:29 +01:00
Rafael Fontenelle cecf778381 Update Brazilian Portuguese translation 2022-01-07 22:59:34 +00:00
Kukuh Syafaat 0663a989f4 Update Indonesian translation 2022-01-05 03:24:29 +00:00
Asier Sarasua Garmendia 7b2d9d0b73 Update Basque translation 2021-12-25 14:00:09 +00:00
Aurimas Černius f220e11bce Updated Lithuanian translation 2021-12-14 13:49:10 +02:00
Aleksandr Melman af4165d3e5 Update Russian translation 2021-12-13 11:27:53 +00:00
Sveinn í Felli c82ca68c03 Update Icelandic translation 2021-12-13 09:08:27 +00: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
Florian Müllner 02e5029eb6 window-list: Fix OSK
The reveal animation moved from Main.layoutManager.keyboardBox to
the keyboard itself, so instead of applying an additional translation
for the bottom panel, we override the translation that would reveal
the keyboard (and thus prevent it from showing altogether).

Fix this by moving our translation to the keyboardBox instead.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/199>
2021-11-26 20:01:40 +01:00
Daniel Mustieles d98153ba9e Updated Spanish translation 2021-11-26 18:05:13 +01:00
Fran Dieguez 4d913adcec Update Galician translation 2021-11-19 22:22:52 +00:00
MohammadSaleh Kamyab 5729d0b84a Update Persian translation 2021-11-18 22:40:00 +00:00
Sebastian Keller 4a26cecd7d native-window-placement: Remove custom styling
The window-picker padding was causing it to become smaller in the
overview resulting in a jump when opening it and caused sizing issues
with the workspace view in the app picker. However it is not needed
anymore with the new overview, so this can be fixed by simply removing
it.

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

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

Fixes: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/issues/301
Fixes: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/issues/309
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/189>
2021-11-17 12:37:28 +00:00
Jordi Mas i Hernandez e5a3fa4cfa Update Catalan translation 2021-11-15 07:57:14 +00:00
Goran Vidović 6268e82f35 Update Croatian translation 2021-11-12 11:25:34 +00:00
Yaron Shahrabani 348a5777d3 Update Hebrew translation 2021-11-11 22:54:01 +00:00
Hugo Carvalho 594af0c412 Update Portuguese translation 2021-11-07 22:32:42 +00:00
Quentin PAGÈS d6a81150b6 Update Occitan translation 2021-11-07 19:54:26 +00:00
Fabio Tomat 38b3413e94 Update Friulian translation 2021-11-07 16:51:51 +00:00
Just Perfection 762ec75601 user-theme: Extensions review guidelines compatibility
Extensions review guidelines enforces extensions to
don't create objects in the constructor of the class
that init() returns. so creating settings object in enable()
can make the extension compatible with the ego review guidelines.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/197>
2021-11-06 21:58:59 +00:00
Yuri Chornoivan 6da9a39959 Update Ukrainian translation 2021-11-06 16:35:25 +00:00
Piotr Drąg 2938a1a312 Update POTFILES.in
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/198>
2021-11-06 15:02:17 +01:00
Neal Gompa eb517c8517 classic: Install the session for Wayland and ship override sessions
The regular GNOME session ships with three options:

* GNOME
* GNOME on Wayland (available when GDM starts in X11)
* GNOME on Xorg (available when GDM starts in Wayland)

The main GNOME session is set up so it works to match how GDM starts,
so GNOME is on Wayland if GDM is (or GNOME is on X11 if GDM is).

For GNOME Classic, we are missing this setup, so port this behavior
over from the GNOME session setup.

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

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

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/195>
2021-10-29 09:58:38 -04:00
Jeremy Bicha db131fc7da New upstream version 41.0 2021-10-03 20:42:40 -04:00
Sveinn í Felli 396f4ef566 Update Icelandic translation 2021-09-29 10:18:03 +00:00
Goran Vidović c26b4803c3 Update Croatian translation 2021-09-23 14:38:14 +00:00
Florian Müllner 4ccf12e988 Bump version to 41.0
Update NEWS.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/192>
2021-09-19 12:47:07 +02:00
Florian Müllner 74121fce78 Bump version to 41.rc.1
Update NEWS.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/191>
2021-09-06 01:40:31 +02:00
Florian Müllner 0a7491d747 build: Bump meson requirement
Passing arguments to dist scripts was only introduced after 0.44,
so bump the requirement to shut up the corresponding warning.

Meson 0.53 is the same version requirement as gnome-shell, so that
shouldn't be an issue for distributors.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/191>
2021-09-06 01:40:11 +02:00
Florian Müllner 68bf3e7ff7 ci: Fix classic build
The option name used in CI was wrong, so we did not actually build
the auxiliary classic mode file.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/190>
2021-09-06 00:41:04 +02:00
Florian Müllner 93dd8f535d ci: Init submodule
As the gnome-shell-sass submodule isn't included under subprojects,
meson doesn't handle it automatically.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/190>
2021-09-06 00:39:50 +02:00
Florian Müllner 0b993525f5 build: Check sassc errors when generating stylesheet
We currently just call sassc, but don't check its return value. That
means as long as sassc is available, the script (and therefore the
newly added dist CI job) will succeed.

Make sure we fail on failure.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/190>
2021-09-06 00:33:08 +02:00
Florian Müllner 5dfdb68c75 Bump version to 41.rc
Update NEWS.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/188>
2021-09-05 02:02:52 +02:00
Florian Müllner 443d1dc42b ci: Add dist job
So far, releases are done locally by invoking `meson dist`.

We can do better and leverage the existing CI infrastructure, to get
to the following release workflow:

 - bump version in meson.build, update NEWS etc.
 - open merge request for the release
 - merge when the pipeline (including dist check) succeeds
 - tag the release
 - wait for the tag pipeline to spit out the tarball artifact

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/186>
2021-09-04 05:10:23 +02:00
Florian Müllner 34f6c9514a ci: Add a fedora build job
We currently use a setup modelled after the flatpak CI workflow,
where we produce extension bundles and expose them as artifacts
for easy testing.

It still makes sense to test a regular build though, in particular
as that can include classic mode support.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/186>
2021-09-04 05:10:23 +02:00
Florian Müllner 2f2619403a ci: Build custom image
The gnome-shell image we are using is well-suited for the jobs we
are running, but the lack of sassc means that we don't cover classic
mode.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/186>
2021-09-04 05:10:23 +02:00
Florian Müllner d25cc847f3 ci: Reindent yaml configuration
The file currently uses a mix of 4 and 2 space indentation (with the
occasional 1 space thrown in). It looks like most GNOME projects have
settled on 2-space indentation, so use that.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/186>
2021-09-04 05:10:23 +02:00
Florian Müllner 769ad859e6 build: Check NEWS for version
I don't think this ever happened to me, but it can't hurt enforcing
that every release has a corresponding NEWS entry.

(The script has been copied from Polari, thus the metainfo support)

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/186>
2021-09-04 05:10:23 +02:00
Florian Müllner 7ba0e5b42c apps-menu: Stop using panel-main-menu shortcut
It's an old GNOME 2 shortcut that's no longer worth supporting in
the regular session. Instead, set up a new shortcut backed by our
own schema.

https://discourse.gnome.org/t/difference-between-show-the-overview-and-show-the-activities-overview-keyboard-shortcuts/6572

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/173>
2021-08-31 23:42:23 +02:00
Florian Müllner 201339345d window-list: Only show at the end of the overview transition
gnome-shell now considers the work area in the overview, so popping
up at the beginning of the overview transition is now more jarring
than at the end.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/185>
2021-08-26 23:36:53 +02:00
Florian Müllner 6ee4205f1e window-list: Fix initial visibility
Mutter uses an undefined initial in-fullscreen state, so it will
always emit the `in-fullscreen-changed` signal when it determines
the actual initial state.

This didn't use to be an issue when the shell started in the session,
but now results in the window list ending up visible in the overview
on startup.

Work around this by hiding ourselves again when the in-fullscreen
state changes in the overview.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/185>
2021-08-26 23:28:44 +02:00
Florian Müllner 2307e2cabe Bump version to 41.beta
Update NEWS.
2021-08-18 01:50:19 +02:00
Florian Müllner 4becaa28ce Update sass submodule 2021-08-18 01:50:19 +02:00
Florian Müllner cc45bd63ab cleanup: Use new gettext() convenience
gnome-shell now includes convenience helpers for gettext functions that
use an extension's text domain (as initialized by initTranslations()).

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/183>
2021-08-14 23:15:56 +02:00
Florian Müllner 757bcee4e2 build: Use backend-agnostic meson commands for export
There's no alternative backend in sight for us, but it's nice to
only deal with a single build tool.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/182>
2021-08-13 05:25:47 +02:00
Florian Müllner 1340b209f9 window-list: Simplify radio handling
Instead of handling the active state manually and updating settings
on changes, we can use GActions to leave the nitty-gritty to GTK.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/181>
2021-08-13 05:22:41 +02:00
Florian Müllner 8f362d57fe lint: Synchronize configuration with gjs
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/180>
2021-08-13 04:57:35 +02:00
Florian Müllner d0b9c9b54a cleanup: Document functions
gjs now enforces this in its eslint configuration. Adding type
information generally is a good idea, so add appropriate comments
to public functions before picking up that configuration change.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/180>
2021-08-13 04:48:22 +02:00
Florian Müllner 6284b0c489 window-list: Move functions into base class
The helper functions date back to a time when AppButton and WindowButton
were unconnected classes. But nowadays they share a common base class, so
we have a better place for them than external helper functions.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/180>
2021-08-13 04:39:00 +02:00
Florian Müllner 8a211f98fd 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-11 19:05:45 +02:00
Florian Müllner d6633397b7 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-11 19:05:45 +02:00
Florian Müllner 0d06cc685e 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-11 18:42:43 +02:00
Marco Trevisan (Treviño) 8de89a44a4 README: Fix typo on instructions to move to main branch 2021-07-21 19:50:34 +02:00
Florian Müllner f3b1f10f6c ci: Set FDO_UPSTREAM_REPO
ci-fairy uses the variable to set the upstream remote that is used
to build the commit range to check.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/178>
2021-07-19 17:23:44 +02:00
Florian Müllner 2bced47762 classic: Remove padding from app menu
It is now inconsistent with other top bar items, so drop it.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/167>
2021-07-18 21:57:38 +00:00
Florian Müllner 7ba9b87064 docs: Add README section for default branch
We are about to change it, so briefly outline how to update local
checkouts.

(Copied from glib)

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/177>
2021-07-14 21:11:59 +02:00
Florian Müllner a642c439ce docs: Use HEAD in external URLs
That way the link will keep working when the other project changes
its default branch name.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/177>
2021-07-14 20:37:15 +02:00
Florian Müllner d421bbfa60 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-13 11:54:21 +02:00
Florian Müllner 3539ce1139 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-13 11:46:16 +02:00
Florian Müllner 94b907f46d 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

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/merge_requests/174>
2021-07-12 16:04:50 +00:00
Alexander Shopov 1e04622eb4 Update Bulgarian translation 2021-07-11 08:21:24 +00:00
Florian Müllner 519269be9d 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>
2021-06-23 18:15:42 +02:00
Florian Müllner 7d6670ce3c 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>
2021-06-23 17:52:19 +02:00
Juliano de Souza Camargo 50bd597baa Update Portuguese translation
(cherry picked from commit 12eedcf6f7)
2021-06-07 10:22:07 +00:00
Hugo Carvalho 4403b54fbc Update Portuguese translation
(cherry picked from commit 08d382facc)
2021-06-02 16:10:00 +00:00
Adam Goode d6648b0b5c 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>
2021-05-26 11:57:41 +00:00
Florian Müllner 861e5c0be6 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 15:45:21 +02:00
Florian Müllner bf86b84d6c Post-release version bump 2021-05-14 17:01:12 +02:00
134 changed files with 5643 additions and 4892 deletions
+171
View File
@@ -0,0 +1,171 @@
include:
- remote: 'https://gitlab.freedesktop.org/freedesktop/ci-templates/-/raw/bbe5232986c9b98eb1efe62484e07216f7d1a4df/templates/fedora.yml'
- remote: "https://gitlab.freedesktop.org/freedesktop/ci-templates/-/raw/6f86b8bcb0cd5168c32779c4fea9a893c4a0c046/templates/ci-fairy.yml"
image: registry.gitlab.gnome.org/gnome/gnome-shell/fedora/35:2022-02-18.0
stages:
- pre_review
- prepare
- review
- build
- deploy
default:
# Cancel jobs if newer commits are pushed to the branch
interruptible: true
# Auto-retry jobs in case of infra failures
retry:
max: 1
when:
- 'runner_system_failure'
- 'stuck_or_timeout_failure'
- 'scheduler_failure'
- 'api_failure'
variables:
FDO_UPSTREAM_REPO: GNOME/gnome-shell-extensions
LINT_LOG: "eslint-report.xml"
workflow:
rules:
- if: '$CI_MERGE_REQUEST_IID'
- if: '$CI_COMMIT_TAG'
- if: '$CI_COMMIT_BRANCH'
.pipeline_guard: &pipeline_guard
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
- if: '$CI_COMMIT_TAG'
- if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
- if: '$CI_COMMIT_BRANCH =~ /^gnome-[0-9-]+$/'
- when: 'manual'
.gnome-shell-extensions.fedora:34:
variables:
FDO_DISTRIBUTION_VERSION: 34
FDO_DISTRIBUTION_TAG: '2021-08-31.0'
FDO_DISTRIBUTION_PACKAGES: >
meson git gettext sassc
.prereview_req: &prereview_req
needs:
- check_commit_log
- check-merge-request
check_commit_log:
extends:
- .fdo.ci-fairy
stage: pre_review
script:
- if [[ x"$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" != "x" ]] ;
then
ci-fairy check-commits --junit-xml=commit-message-junit-report.xml ;
else
echo "Not a merge request" ;
fi
<<: *pipeline_guard
artifacts:
expire_in: 1 week
paths:
- commit-message-junit-report.xml
reports:
junit: commit-message-junit-report.xml
check-merge-request:
extends:
- .fdo.ci-fairy
stage: pre_review
script:
- if [[ x"$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" != "x" ]] ;
then
ci-fairy check-merge-request --require-allow-collaboration --junit-xml=check-merge-request-report.xml ;
else
echo "Not a merge request" ;
fi
<<: *pipeline_guard
artifacts:
expire_in: 1 week
paths:
- check-merge-request-report.xml
reports:
junit: check-merge-request-report.xml
build-fedora-container:
extends:
- .fdo.container-build@fedora@x86_64
- .gnome-shell-extensions.fedora:34
stage: prepare
<<: *prereview_req
js_check:
stage: review
<<: *prereview_req
script:
- gjs-check-syntax
eslint:
stage: review
<<: *prereview_req
script:
- eslint -o $LINT_LOG -f junit --resolve-plugins-relative-to $(npm root -g) extensions
artifacts:
paths:
- ${LINT_LOG}
reports:
junit: ${LINT_LOG}
build-bundles:
stage: build
<<: *prereview_req
script:
- ./export-zips.sh
artifacts:
name: 'Extension bundles'
expose_as: 'Get Extension bundles here'
paths:
- zip-files/
fedora-build:
extends:
- .fdo.distribution-image@fedora
- .gnome-shell-extensions.fedora:34
stage: build
needs:
- build-fedora-container
before_script:
- git submodule update --init
script:
- meson setup build --werror -Dextension_set=all -Dclassic_mode=true
- meson compile -C build
- meson test -C build
- meson install -C build
artifacts:
paths:
- build
fedora-dist:
extends:
- .fdo.distribution-image@fedora
- .gnome-shell-extensions.fedora:34
stage: deploy
needs:
- fedora-build
before_script:
- git submodule update --init
script:
- meson dist -C build
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
changes:
- "**/meson.build"
- meson/*
fedora-dist-tarball:
extends: fedora-dist
artifacts:
expose_as: 'Get tarball here'
paths:
- build/meson-dist/$CI_PROJECT_NAME-$CI_COMMIT_TAG.tar.xz
rules:
- if: '$CI_COMMIT_TAG'
+13
View File
@@ -0,0 +1,13 @@
patterns:
deny:
- regex: '^$CI_MERGE_REQUEST_PROJECT_URL/(-/)?merge_requests/$CI_MERGE_REQUEST_IID$'
message: Commit message must not contain a link to its own merge request
- regex: '^extensions/'
message: Commit message subject should not be prefixed with 'extensions/', use the extension name instead
where: subject
- regex: '^[^:]+: [a-z]'
message: "Commit message subject should be properly Capitalized. E.g. 'window: Marginalize extradicity'"
where: subject
- regex: '^\S*\.js:'
message: Commit message subject prefix should not include .js
where: subject
+1 -1
View File
@@ -28,4 +28,4 @@ imports (like imports.lang or imports.dbus) and introspection,
the other for Shell API. Within the same group, put everything the other for Shell API. Within the same group, put everything
in alphabetic order. in alphabetic order.
[coding-style]: https://gitlab.gnome.org/GNOME/gjs/blob/master/doc/Style_Guide.md [coding-style]: https://gitlab.gnome.org/GNOME/gjs/blob/HEAD/doc/Style_Guide.md
+104 -17
View File
@@ -1,30 +1,117 @@
40.4 42.3
==== ====
* drive-menu: Fix indicator visibility [Florian; !176] * screenshot-window-sizer: Fix reported sizes on wayland [Florian; !232]
* Use distinct gettext domain for e.g.o uploads [Florian; #335] * window-list: Improve touch support [Florian; !233]
Contributors: Contributors:
Florian Müllner Florian Müllner
42.2
40.3
==== ====
* drive-menu: Improve detection of network mounts [Florian; !27] * native-window-placement: Adjust to gnome-shell 42 changes [Florian; !229]
* Misc. bug fixes [Florian; #340] * window-list: Fix visibility on non-primary monitors [Jason; !230]
Contributors: Contributors:
Florian Müllner Jason Lynch, Florian Müllner
40.2
====
* window-list: Extend reactive area of minimap to screen edges [Adam; !171]
* Misc. bug fixes [Florian; !172]
Contributors:
Adam Goode, Florian Müllner
Translators: Translators:
Hugo Carvalho [pt], Juliano de Souza Camargo [pt] Cheng-Chia Tseng [zh_TW]
42.1
====
* Misc. bug fixes and cleanups [Florian; !223, !222, !225]
Contributors:
Florian Müllner
Translators:
Milo Casagrande [it], Rūdolfs Mazurs [lv], Nathan Follens [nl],
Ngọc Quân Trần [vi], Zurab Kargareteli [ka]
42.0
====
Translators:
Philipp Kiemle [de], Balázs Úr [hu], Марко Костић [sr], sicklylife [ja],
Baurzhan Muftakhidinov [kk]
42.rc
=====
* Misc. bug fixes and cleanups [Florian; !215, !218]
Contributors:
Florian Müllner
Translators:
Marek Černocký [cs], Dušan Kazik [sk], Piotr Drąg [pl], Jiri Grönroos [fi],
Luna Jernberg [sv], Alan Mortensen [da], Charles Monzat [fr],
Changwoo Ryu [ko]
42.beta
=======
* workspace-indicator: Fix cancelling editing with Esc [Florian; !208]
* window-list: Update window tracking to avoid missing icons [Florian; !207]
* Use libadwaita for preferences [Florian; !209, !213]
* Adapt to Clutter grab API changes [Florian; !212]
* Misc. bug fixes and cleanups [Jan, Florian; !210, !214]
Contributors:
Jan Beich, Florian Müllner, Naala Nanba
Translators:
Boyuan Yang [zh_CN], Matej Urbančič [sl], Naala Nanba [ab],
Alexander Shopov [bg], Emin Tufan Çetin [tr]
42.alpha
========
* native-window-placement: Fix distorted layout in app grid [Sebastian; !189]
* window-list: Fix on-screen keyboard [Florian; !199]
* Misc. bug fixes and cleanups [Neal; Just; !195, !197]
Contributors:
Piotr Drąg, Neal Gompa, Sebastian Keller, Florian Müllner, Just Perfection
Translators:
Goran Vidović [hr], Sveinn í Felli [is], Yuri Chornoivan [uk],
Fabio Tomat [fur], Quentin PAGÈS [oc], Hugo Carvalho [pt],
Yaron Shahrabani [he], Jordi Mas i Hernandez [ca], MohammadSaleh Kamyab [fa],
Fran Dieguez [gl], Daniel Mustieles [es], Aleksandr Melman [ru],
Aurimas Černius [lt], Asier Sarasua Garmendia [eu], Kukuh Syafaat [id],
Rafael Fontenelle [pt_BR]
41.0
====
* Bump version
41.rc.1
=======
* Fix pre-generating stylesheets in tarball [Florian; !190]
Contributors:
Florian Müllner
41.rc
=====
* window-list: Adapt to overview-on-startup [Florian; !185]
* apps-menu: Use a custom 'toggle-menu' shortcut [Florian; !173]
* Misc. bug fixes and cleanups [Florian; !186]
Contributors:
Florian Müllner
41.beta
=======
* window-list: Extend reactive area of minimap to screen edges [Adam; !171]
* drive-menu: Improve detection of network mounts [Florian; !27, !176]
* Use distinct gettext domain for e.g.o uploads [Florian; #335]
* Misc. bug fixes and cleanups [Florian; !172, !174, !177, !167, !178, !180,
!181, !182, !183]
Contributors:
Marco Trevisan (Treviño), Adam Goode, Florian Müllner
Translators:
Hugo Carvalho [pt], Juliano de Souza Camargo [pt], Alexander Shopov [bg]
40.1 40.1
==== ====
+13
View File
@@ -69,6 +69,19 @@ GSettings key.
Adds a simple workspace switcher to the top bar. Adds a simple workspace switcher to the top bar.
## Default branch
The default development branch is `main`. If you still have a local
checkout under the old name, use:
```sh
git checkout master
git branch -m master main
git fetch
git branch --unset-upstream
git branch -u origin/master
git symbolic-ref refs/remotes/origin/HEAD refs/remotes/origin/main
```
## License ## License
GNOME Shell Extensions are distributed under the terms of the GNU General GNOME Shell Extensions are distributed under the terms of the GNU General
-178
View File
@@ -1,178 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="24"
height="24"
id="svg10621"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="calendar-today.svg">
<defs
id="defs10623">
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient34508-1-3"
id="radialGradient99561-1"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.72146227,0,0,0.27484277,14.205424,21.754717)"
cx="51"
cy="30"
fx="51"
fy="30"
r="42" />
<linearGradient
inkscape:collect="always"
id="linearGradient34508-1-3">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop34510-1-9" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop34512-4-5" />
</linearGradient>
<radialGradient
r="42"
fy="30"
fx="51"
cy="30"
cx="51"
gradientTransform="matrix(0.72146227,0,0,0.27484277,14.205424,21.754717)"
gradientUnits="userSpaceOnUse"
id="radialGradient10592"
xlink:href="#linearGradient34508-1-3"
inkscape:collect="always" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient34508-1-3"
id="radialGradient3770"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.72146227,0,0,0.27484277,14.205424,21.754717)"
cx="51"
cy="30"
fx="51"
fy="30"
r="42" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient34508-1-3"
id="radialGradient3001"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.72146227,0,0,0.27484277,14.205424,21.754717)"
cx="51"
cy="30"
fx="51"
fy="30"
r="42" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient34508-1-3"
id="radialGradient3007"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.72146227,0,0,0.27484277,14.205424,21.754717)"
cx="51"
cy="30"
fx="51"
fy="30"
r="42" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient34508-1-3"
id="radialGradient3067"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.72146227,0,0,0.27484277,14.205424,21.754717)"
cx="51"
cy="30"
fx="51"
fy="30"
r="42" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient34508-1-3"
id="radialGradient3072"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.72146227,0,0,0.27484277,14.205424,21.754717)"
cx="51"
cy="30"
fx="51"
fy="30"
r="42" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient34508-1-3"
id="radialGradient2997"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.72146227,0,0,0.27484277,14.205424,21.754717)"
cx="51"
cy="30"
fx="51"
fy="30"
r="42" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#d3d3d3"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:zoom="8"
inkscape:cx="-55.349829"
inkscape:cy="-31.442864"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="2133"
inkscape:window-height="1241"
inkscape:window-x="238"
inkscape:window-y="89"
inkscape:window-maximized="0"
borderlayer="true"
inkscape:showpageshadow="false">
<inkscape:grid
type="xygrid"
id="grid3109"
empspacing="5"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true" />
</sodipodi:namedview>
<metadata
id="metadata10626">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-469.08263,-537.99307)">
<circle
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#555753;fill-opacity:0.23756906;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="path7305"
cx="481.57138"
cy="559.4649"
r="1.5" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 5.6 KiB

-262
View File
@@ -1,262 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="65"
height="22"
id="svg10865"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="classic-toggle-off-intl.svg">
<defs
id="defs10867">
<linearGradient
id="linearGradient62852-6-5">
<stop
id="stop62854-6-7"
offset="0"
style="stop-color:#ffffff;stop-opacity:1" />
<stop
style="stop-color:#eeeeec;stop-opacity:1"
offset="0.97726452"
id="stop62858-8-0" />
<stop
id="stop62860-5-3"
offset="1"
style="stop-color:#f5f5f4;stop-opacity:1" />
</linearGradient>
<inkscape:path-effect
is_visible="true"
id="path-effect62989-8-0"
effect="spiro" />
<linearGradient
id="linearGradient62821-5-8">
<stop
id="stop62823-2-4"
offset="0"
style="stop-color:#d1d3d1;stop-opacity:1;" />
<stop
id="stop62825-3-8"
offset="1"
style="stop-color:#ebebeb;stop-opacity:1;" />
</linearGradient>
<linearGradient
id="linearGradient62852-6-5-3">
<stop
id="stop62854-6-7-6"
offset="0"
style="stop-color:#ffffff;stop-opacity:1" />
<stop
style="stop-color:#eeeeec;stop-opacity:1"
offset="0.97726452"
id="stop62858-8-0-3" />
<stop
id="stop62860-5-3-9"
offset="1"
style="stop-color:#f5f5f4;stop-opacity:1" />
</linearGradient>
<inkscape:path-effect
effect="spiro"
id="path-effect62829-6-8-0"
is_visible="true" />
<linearGradient
id="linearGradient62821-5-8-1">
<stop
id="stop62823-2-4-2"
offset="0"
style="stop-color:#d1d3d1;stop-opacity:1;" />
<stop
id="stop62825-3-8-9"
offset="1"
style="stop-color:#ebebeb;stop-opacity:1;" />
</linearGradient>
<linearGradient
y2="507.42715"
x2="702.58966"
y1="484.49405"
x1="702.58966"
gradientTransform="matrix(1.3066667,0,0,1,-841.64667,-483)"
gradientUnits="userSpaceOnUse"
id="linearGradient11647"
xlink:href="#linearGradient62821-5-8-1"
inkscape:collect="always" />
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath65663">
<rect
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:new"
id="rect65665"
width="96.999924"
height="24.292892"
x="708.71954"
y="406.96973"
rx="3.1139846"
ry="1.9595497"
inkscape:export-filename="/home/lapo.fedora/SparkleShare/gnome-mockups/content selection/content-selection.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90" />
</clipPath>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5378-2-5-9-9-0-80-7-6-8-4-5-7-3-6-2-9"
id="linearGradient65582"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.5250827,0,0,0.72144839,620.16092,156.4917)"
x1="207.17195"
y1="497.39584"
x2="207.17195"
y2="531.48669" />
<linearGradient
inkscape:collect="always"
id="linearGradient5378-2-5-9-9-0-80-7-6-8-4-5-7-3-6-2-9">
<stop
style="stop-color:#f4f6f4;stop-opacity:1"
offset="0"
id="stop5380-6-1-1-9-3-6-3-6-45-6-4-4-9-9-8-9" />
<stop
style="stop-color:#d7dad7;stop-opacity:1"
offset="1"
id="stop5382-06-3-6-4-2-4-6-8-0-9-6-8-7-7-6-7" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient65584">
<stop
style="stop-color:#f1f1f1;stop-opacity:1"
offset="0"
id="stop65586" />
<stop
style="stop-color:#a7aba7;stop-opacity:0;"
offset="1"
id="stop65588" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5378-2-5-9-9-0-80-7-6-8-4-5-7-3-6-2-9"
id="linearGradient65582-5"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.5250827,0,0,0.72144839,-75.348673,-359.16458)"
x1="207.17195"
y1="497.39584"
x2="207.17195"
y2="531.48669" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient65584"
id="linearGradient65590-6"
x1="716.62506"
y1="537.23358"
x2="716.62506"
y2="535.23358"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.0139469,0,0,1.0139469,-705.52354,-521.99915)" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="23.565368"
inkscape:cy="19.596892"
inkscape:document-units="px"
inkscape:current-layer="g62929"
showgrid="false"
borderlayer="true"
inkscape:showpageshadow="false"
inkscape:snap-nodes="false"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:snap-others="false"
inkscape:window-width="2560"
inkscape:window-height="1342"
inkscape:window-x="0"
inkscape:window-y="28"
inkscape:window-maximized="1"
showborder="false">
<inkscape:grid
type="xygrid"
id="grid11512" />
</sodipodi:namedview>
<metadata
id="metadata10870">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-1030.3622)">
<g
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
inkscape:export-filename="/home/lapo.fedora/SparkleShare/gnome-mockups/system-settings/network/network-panel-summary.png"
style="display:inline"
id="g62929"
transform="translate(-643.91421,517.29894)">
<g
transform="translate(0,30)"
id="g62931">
<rect
style="fill:#cecece;fill-opacity:1;stroke:#a7a7a7;stroke-width:1;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;color:#000000;color-interpolation:sRGB;color-interpolation-filters:linearRGB;fill-rule:nonzero;stroke-linejoin:miter;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;clip-rule:nonzero;opacity:1;isolation:auto;mix-blend-mode:normal;solid-color:#000000;solid-opacity:1;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;filter-blend-mode:normal;filter-gaussianBlur-deviation:0;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto"
id="rect62935"
width="63.856125"
height="21.093594"
x="644.5"
y="483.5"
rx="2"
ry="2" />
<rect
style="fill:url(#linearGradient65582);fill-opacity:1;stroke:#a7a7a7;stroke-width:0.97313344;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline;color:#000000;clip-rule:nonzero;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill-rule:nonzero;stroke-linejoin:miter;stroke-dashoffset:0;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;filter-blend-mode:normal;filter-gaussianBlur-deviation:0;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect62937"
width="29.97398"
height="17.022524"
x="646.55896"
y="485.61429"
rx="1"
ry="1" />
<g
transform="translate(-38.048674,-1.9445437)"
id="g62939" />
<path
inkscape:connector-curvature="0"
inkscape:original-d="m 647.78241,486.57192 27.73523,0"
inkscape:path-effect="#path-effect62989-8-0"
id="path62947"
d="m 647.78241,486.57192 27.73523,0"
style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
</g>
<g
id="g11665"
transform="matrix(0.78906097,0,0,0.78906097,178.78814,111.57844)" />
<path
sodipodi:type="arc"
id="path3016"
sodipodi:cx="50.375"
sodipodi:cy="11.875"
sodipodi:rx="4.625"
sodipodi:ry="4.625"
d="M 55,11.875 A 4.625,4.625 0 0 1 50.375,16.5 4.625,4.625 0 0 1 45.75,11.875 4.625,4.625 0 0 1 50.375,7.25 4.625,4.625 0 0 1 55,11.875 Z"
transform="translate(642.41421,512.02037)"
style="fill:none;stroke:#2e3436;stroke-width:2;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 9.5 KiB

-222
View File
@@ -1,222 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="65"
height="22"
id="svg10865"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="classic-toggle-off-us.svg">
<defs
id="defs10867">
<linearGradient
id="linearGradient62852-6-5">
<stop
id="stop62854-6-7"
offset="0"
style="stop-color:#ffffff;stop-opacity:1" />
<stop
style="stop-color:#eeeeec;stop-opacity:1"
offset="0.97726452"
id="stop62858-8-0" />
<stop
id="stop62860-5-3"
offset="1"
style="stop-color:#f5f5f4;stop-opacity:1" />
</linearGradient>
<inkscape:path-effect
is_visible="true"
id="path-effect62989-8-0"
effect="spiro" />
<linearGradient
id="linearGradient62821-5-8">
<stop
id="stop62823-2-4"
offset="0"
style="stop-color:#d1d3d1;stop-opacity:1;" />
<stop
id="stop62825-3-8"
offset="1"
style="stop-color:#ebebeb;stop-opacity:1;" />
</linearGradient>
<linearGradient
id="linearGradient62852-6-5-3">
<stop
id="stop62854-6-7-6"
offset="0"
style="stop-color:#ffffff;stop-opacity:1" />
<stop
style="stop-color:#eeeeec;stop-opacity:1"
offset="0.97726452"
id="stop62858-8-0-3" />
<stop
id="stop62860-5-3-9"
offset="1"
style="stop-color:#f5f5f4;stop-opacity:1" />
</linearGradient>
<inkscape:path-effect
effect="spiro"
id="path-effect62829-6-8-0"
is_visible="true" />
<linearGradient
id="linearGradient62821-5-8-1">
<stop
id="stop62823-2-4-2"
offset="0"
style="stop-color:#d1d3d1;stop-opacity:1;" />
<stop
id="stop62825-3-8-9"
offset="1"
style="stop-color:#ebebeb;stop-opacity:1;" />
</linearGradient>
<linearGradient
y2="507.42715"
x2="702.58966"
y1="484.49405"
x1="702.58966"
gradientTransform="matrix(1.3066667,0,0,1,-841.64667,-483)"
gradientUnits="userSpaceOnUse"
id="linearGradient11647"
xlink:href="#linearGradient62821-5-8-1"
inkscape:collect="always" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5378-2-5-9-9-0-80-7-6-8-4-5-7-3-6-2-9"
id="linearGradient65582"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.5250827,0,0,0.72144839,620.16092,156.4917)"
x1="207.17195"
y1="497.39584"
x2="207.17195"
y2="531.48669" />
<linearGradient
inkscape:collect="always"
id="linearGradient5378-2-5-9-9-0-80-7-6-8-4-5-7-3-6-2-9">
<stop
style="stop-color:#f4f6f4;stop-opacity:1"
offset="0"
id="stop5380-6-1-1-9-3-6-3-6-45-6-4-4-9-9-8-9" />
<stop
style="stop-color:#d7dad7;stop-opacity:1"
offset="1"
id="stop5382-06-3-6-4-2-4-6-8-0-9-6-8-7-7-6-7" />
</linearGradient>
<inkscape:path-effect
is_visible="true"
id="path-effect62989-8-0-6"
effect="spiro" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="78.222729"
inkscape:cy="-3.6620078"
inkscape:document-units="px"
inkscape:current-layer="g62929"
showgrid="false"
borderlayer="true"
inkscape:showpageshadow="false"
inkscape:snap-nodes="false"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:snap-others="false"
inkscape:window-width="2560"
inkscape:window-height="1342"
inkscape:window-x="0"
inkscape:window-y="28"
inkscape:window-maximized="1"
showborder="false">
<inkscape:grid
type="xygrid"
id="grid11512" />
</sodipodi:namedview>
<metadata
id="metadata10870">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-1030.3622)">
<g
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
inkscape:export-filename="/home/lapo.fedora/SparkleShare/gnome-mockups/system-settings/network/network-panel-summary.png"
style="display:inline"
id="g62929"
transform="translate(-643.91421,517.29894)">
<g
style="display:inline"
transform="translate(0,30)"
id="g62931">
<rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#cecece;fill-opacity:1;fill-rule:nonzero;stroke:#a7a7a7;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new"
id="rect62935"
width="63.856125"
height="21.093594"
x="644.5"
y="483.5"
rx="2"
ry="2" />
<rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient65582);fill-opacity:1;fill-rule:nonzero;stroke:#a7a7a7;stroke-width:0.97313344;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect62937"
width="29.97398"
height="17.022524"
x="646.55896"
y="485.61429"
rx="1"
ry="1" />
<g
transform="translate(-38.048674,-1.9445437)"
id="g62939" />
<path
inkscape:connector-curvature="0"
inkscape:original-d="m 647.78241,486.57192 27.73523,0"
inkscape:path-effect="#path-effect62989-8-0-6"
id="path62947"
d="m 647.78241,486.57192 27.73523,0"
style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
</g>
<g
id="g11665"
transform="matrix(0.78906097,0,0,0.78906097,167.78814,111.57844)">
<text
xml:space="preserve"
style="font-size:12.69556618px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#2e3436;fill-opacity:1;stroke:none;font-family:Cantarell;-inkscape-font-specification:Cantarell Bold"
x="644.46393"
y="533.87158"
id="text62949"
sodipodi:linespacing="125%"
transform="scale(1.0113976,0.98873084)"><tspan
sodipodi:role="line"
id="tspan62951"
x="644.46393"
y="533.87158">OFF</tspan></text>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 8.0 KiB

-175
View File
@@ -1,175 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="65"
height="22"
id="svg10865"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="classic-toggle-on-intl.svg">
<defs
id="defs10867">
<linearGradient
id="linearGradient62852-6-5">
<stop
id="stop62854-6-7"
offset="0"
style="stop-color:#ffffff;stop-opacity:1" />
<stop
style="stop-color:#eeeeec;stop-opacity:1"
offset="0.97726452"
id="stop62858-8-0" />
<stop
id="stop62860-5-3"
offset="1"
style="stop-color:#f5f5f4;stop-opacity:1" />
</linearGradient>
<inkscape:path-effect
is_visible="true"
id="path-effect62989-8-0"
effect="spiro" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient38513"
id="linearGradient38519"
x1="690"
y1="506.25049"
x2="690"
y2="480.93414"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
id="linearGradient38513">
<stop
style="stop-color:#729fcf;stop-opacity:1"
offset="0"
id="stop38515" />
<stop
style="stop-color:#6f9ccd;stop-opacity:1"
offset="1"
id="stop38517" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient62852-6-5"
id="linearGradient62981-1-1"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.85639946,0,0,0.81059641,57.747905,92.132229)"
x1="740"
y1="486.10501"
x2="740"
y2="505.3204" />
<inkscape:path-effect
is_visible="true"
id="path-effect62989-8-0-8"
effect="spiro" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="9.3225163"
inkscape:cy="-0.1588306"
inkscape:document-units="px"
inkscape:current-layer="g62929"
showgrid="false"
borderlayer="true"
inkscape:showpageshadow="false"
inkscape:snap-nodes="false"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:snap-others="false"
inkscape:window-width="2560"
inkscape:window-height="1342"
inkscape:window-x="0"
inkscape:window-y="28"
inkscape:window-maximized="1"
showborder="false">
<inkscape:grid
type="xygrid"
id="grid11512" />
</sodipodi:namedview>
<metadata
id="metadata10870">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-1030.3622)">
<g
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
inkscape:export-filename="/home/lapo.fedora/SparkleShare/gnome-mockups/system-settings/network/network-panel-summary.png"
style="display:inline"
id="g62929"
transform="translate(-643.91421,517.29894)">
<g
style="display:inline"
transform="translate(0,30)"
id="g62931">
<rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient38519);fill-opacity:1;fill-rule:nonzero;stroke:#3465a4;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect62935"
width="63.856125"
height="21.093594"
x="644.5"
y="483.5"
rx="2"
ry="2" />
<rect
style="display:inline;fill:url(#linearGradient62981-1-1);fill-opacity:1;stroke:#3465a4;stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect62937"
width="29.97398"
height="17.022524"
x="676.49646"
y="485.67679"
rx="1"
ry="1" />
<g
transform="translate(-7.9861743,-1.9445437)"
id="g62939" />
<path
inkscape:connector-curvature="0"
inkscape:original-d="m 677.59874,486.57192 27.94632,0"
inkscape:path-effect="#path-effect62989-8-0-8"
id="path62947"
d="m 677.59874,486.57192 27.94632,0"
style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
</g>
<path
inkscape:connector-curvature="0"
id="path4444"
d="m 661.91421,522.09451 0,7"
style="fill:#3465a4;stroke:#3465a4;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;color:#000000;fill-opacity:1;fill-rule:nonzero;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<path
style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="m 18,7.96875 0,7"
id="path3922"
inkscape:connector-curvature="0"
transform="translate(643.91421,513.06326)" />
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 6.2 KiB

-209
View File
@@ -1,209 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="65"
height="22"
id="svg10865"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="classic-toggle-on-us.svg">
<defs
id="defs10867">
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient62852-6-5"
id="linearGradient62981-1-1"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.85639946,0,0,0.81059641,57.747905,92.132229)"
x1="740"
y1="486.10501"
x2="740"
y2="505.3204" />
<linearGradient
id="linearGradient62852-6-5">
<stop
id="stop62854-6-7"
offset="0"
style="stop-color:#ffffff;stop-opacity:1" />
<stop
style="stop-color:#eeeeec;stop-opacity:1"
offset="0.97726452"
id="stop62858-8-0" />
<stop
id="stop62860-5-3"
offset="1"
style="stop-color:#f5f5f4;stop-opacity:1" />
</linearGradient>
<inkscape:path-effect
is_visible="true"
id="path-effect62989-8-0"
effect="spiro" />
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath65663">
<rect
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:new"
id="rect65665"
width="96.999924"
height="24.292892"
x="708.71954"
y="406.96973"
rx="3.1139846"
ry="1.9595497"
inkscape:export-filename="/home/lapo.fedora/SparkleShare/gnome-mockups/content selection/content-selection.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90" />
</clipPath>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient38513"
id="linearGradient38519"
x1="690"
y1="506.25049"
x2="690"
y2="480.93414"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
id="linearGradient38513">
<stop
style="stop-color:#729fcf;stop-opacity:1"
offset="0"
id="stop38515" />
<stop
style="stop-color:#6f9ccd;stop-opacity:1"
offset="1"
id="stop38517" />
</linearGradient>
<linearGradient
gradientTransform="translate(-644,-483)"
inkscape:collect="always"
xlink:href="#linearGradient38513"
id="linearGradient38519-3"
x1="690"
y1="506.25049"
x2="690"
y2="480.93414"
gradientUnits="userSpaceOnUse" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="20.775745"
inkscape:cy="7.0434022"
inkscape:document-units="px"
inkscape:current-layer="g62929"
showgrid="false"
borderlayer="true"
inkscape:showpageshadow="false"
inkscape:snap-nodes="false"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:snap-others="false"
inkscape:window-width="2560"
inkscape:window-height="1342"
inkscape:window-x="0"
inkscape:window-y="28"
inkscape:window-maximized="1"
showborder="false">
<inkscape:grid
type="xygrid"
id="grid11512" />
</sodipodi:namedview>
<metadata
id="metadata10870">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-1030.3622)">
<g
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
inkscape:export-filename="/home/lapo.fedora/SparkleShare/gnome-mockups/system-settings/network/network-panel-summary.png"
style="display:inline"
id="g62929"
transform="translate(-643.91421,517.29894)">
<g
transform="translate(0,30)"
id="g62931">
<rect
style="fill:url(#linearGradient38519);fill-opacity:1;stroke:#3465a4;stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill-rule:nonzero;stroke-linejoin:miter;stroke-dashoffset:0;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;filter-blend-mode:normal;filter-gaussianBlur-deviation:0;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect62935"
width="63.856125"
height="21.093594"
x="644.5"
y="483.5"
rx="2"
ry="2" />
<rect
style="fill:url(#linearGradient62981-1-1);fill-opacity:1;stroke:#3465a4;stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
id="rect62937"
width="29.97398"
height="17.022524"
x="676.49646"
y="485.67679"
rx="1"
ry="1" />
<g
transform="translate(-7.9861743,-1.9445437)"
id="g62939" />
<path
inkscape:connector-curvature="0"
inkscape:original-d="m 677.59874,486.57192 27.94632,0"
inkscape:path-effect="#path-effect62989-8-0"
id="path62947"
d="m 677.59874,486.57192 27.94632,0"
style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
</g>
<text
transform="scale(1.0113976,0.98873084)"
sodipodi:linespacing="125%"
id="text62949-7"
y="534.96918"
x="646.71399"
style="font-size:10.01104736px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#3465a4;fill-opacity:1;stroke:none;display:inline;font-family:Cantarell;-inkscape-font-specification:Cantarell Bold;"
xml:space="preserve"><tspan
y="534.96918"
x="646.71399"
id="tspan62951-7"
sodipodi:role="line">ON</tspan></text>
<text
transform="scale(1.0113976,0.98873084)"
sodipodi:linespacing="125%"
id="text62949"
y="533.94482"
x="646.71399"
style="font-size:10.01104736px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Cantarell;-inkscape-font-specification:Cantarell Bold"
xml:space="preserve"><tspan
y="533.94482"
x="646.71399"
id="tspan62951"
sodipodi:role="line">ON</tspan></text>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 7.5 KiB

+8
View File
@@ -0,0 +1,8 @@
[Desktop Entry]
Name=GNOME Classic on Wayland
Comment=This session logs you into GNOME Classic
Exec=env GNOME_SHELL_SESSION_MODE=classic gnome-session
TryExec=gnome-session
Type=Application
DesktopNames=GNOME-Classic;GNOME;
X-GDM-SessionRegisters=true
+8
View File
@@ -0,0 +1,8 @@
[Desktop Entry]
Name=GNOME Classic on Xorg
Comment=This session logs you into GNOME Classic
Exec=env GNOME_SHELL_SESSION_MODE=classic gnome-session
TryExec=gnome-session
Type=Application
DesktopNames=GNOME-Classic;GNOME;
X-GDM-SessionRegisters=true
+1
View File
@@ -5,3 +5,4 @@ Exec=env GNOME_SHELL_SESSION_MODE=classic gnome-session
TryExec=gnome-session TryExec=gnome-session
Type=Application Type=Application
DesktopNames=GNOME-Classic;GNOME; DesktopNames=GNOME-Classic;GNOME;
X-GDM-SessionRegisters=true
+1 -13
View File
@@ -84,8 +84,8 @@ $variant: 'light';
} }
#appMenu { #appMenu {
padding: 0 8px 0 8px;
spinner-image: url("classic-process-working.svg"); spinner-image: url("classic-process-working.svg");
.panel-status-menu-box { padding: 0; }
} }
.tile-preview-left.on-primary, .tile-preview-left.on-primary,
.tile-preview-right.on-primary, .tile-preview-right.on-primary,
@@ -93,15 +93,3 @@ $variant: 'light';
/* keep in sync with -panel-corner-radius */ /* keep in sync with -panel-corner-radius */
border-radius: 0; border-radius: 0;
} }
@each $v in us, intl {
.toggle-switch-#{$v} {
background-image: url("classic-toggle-off-#{$v}.svg");
&:checked { background-image: url("classic-toggle-on-#{$v}.svg"); }
}
}
.calendar-day-with-events {
background-image: url("calendar-today.svg");
}
+1 -1
View File
@@ -11,6 +11,6 @@ will then be synchronized periodically before releases.
GNOME Shell Sass is distributed under the terms of the GNU General Public GNOME Shell Sass is distributed under the terms of the GNU General Public
License, version 2 or later. See the [COPYING][license] file for details. License, version 2 or later. See the [COPYING][license] file for details.
[shell-subtree]: https://gitlab.gnome.org/GNOME/gnome-shell/tree/master/data/theme/gnome-shell-sass [shell-subtree]: https://gitlab.gnome.org/GNOME/gnome-shell/tree/HEAD/data/theme/gnome-shell-sass
[sass-repo]: https://gitlab.gnome.org/GNOME/gnome-shell-sass [sass-repo]: https://gitlab.gnome.org/GNOME/gnome-shell-sass
[license]: COPYING [license]: COPYING
+68 -18
View File
@@ -1,34 +1,84 @@
// When color definition differs for dark and light variant, // When color definition differs for dark and light variant,
// it gets @if ed depending on $variant // it gets @if-ed depending on $variant
$base_color: if($variant == 'light', #fff, lighten(desaturate(#241f31, 20%), 2%)); //GNOME Color Palette
$bg_color: if($variant == 'light', #f6f5f4, darken(desaturate(#3d3846, 100%), 4%)); $blue_1: #99c1f1;
$fg_color: if($variant == 'light', #2e3436, #eeeeec); $blue_2: #62a0ea;
$blue_3: #3584e4;
$blue_4: #1c71d8;
$blue_5: #1a5fb4;
$green_1: #8ff0a4;
$green_2: #57e389;
$green_3: #33d17a;
$green_4: #2ec27e;
$green_5: #26a269;
$yellow_1: #f9f06b;
$yellow_2: #f8e45c;
$yellow_3: #f6d32d;
$yellow_4: #f5c211;
$yellow_5: #e5a50a;
$orange_1: #ffbe6f;
$orange_2: #ffa348;
$orange_3: #ff7800;
$orange_4: #e66100;
$orange_5: #c64600;
$red_1: #f66151;
$red_2: #ed333b;
$red_3: #e01b24;
$red_4: #c01c28;
$red_5: #a51d2d;
$purple_1: #dc8add;
$purple_2: #c061cb;
$purple_3: #9141ac;
$purple_4: #813d9c;
$purple_5: #613583;
$brown_1: #cdab8f;
$brown_2: #b5835a;
$brown_3: #986a44;
$brown_4: #865e3c;
$brown_5: #63452c;
$light_1: #ffffff;
$light_2: #f6f5f4;
$light_3: #deddda;
$light_4: #c0bfbc;
$light_5: #9a9996;
$dark_1: #77767b;
$dark_2: #5e5c64;
$dark_3: #3d3846;
$dark_4: #241f31;
$dark_5: #000000;
$base_color: if($variant == 'light', #fff, darken(desaturate(#241f31, 100%), 2%));
$bg_color: if($variant == 'light', #f6f5f4, lighten($base_color, 5%));
$fg_color: if($variant == 'light', transparentize(black, .2), white);
$selected_fg_color: #fff; $selected_fg_color: #fff;
$selected_bg_color: if($variant == 'light', #3584e4, darken(#3584e4, 10%)); $selected_bg_color: #3584e4;
$selected_borders_color: if($variant== 'light', darken($selected_bg_color, 15%), darken($selected_bg_color, 30%)); $selected_borders_color: if($variant== 'light', darken($selected_bg_color, 15%), darken($selected_bg_color, 30%));
$borders_color: if($variant == 'light', darken($bg_color, 18%), darken($bg_color, 8%));
$borders_edge: if($variant == 'light', rgba(255,255,255,0.8), transparentize($fg_color, 0.93)); $borders_color: if($variant == 'light', transparentize($fg_color, .5), transparentize($fg_color, .9));
$borders_edge: if($variant == 'light', rgba(255,255,255,0.8), lighten($bg_color, 5%));
$link_color: if($variant == 'light', darken($selected_bg_color, 10%), lighten($selected_bg_color, 20%)); $link_color: if($variant == 'light', darken($selected_bg_color, 10%), lighten($selected_bg_color, 20%));
$link_visited_color: if($variant == 'light', darken($selected_bg_color, 20%), lighten($selected_bg_color, 10%)); $link_visited_color: if($variant == 'light', darken($selected_bg_color, 20%), lighten($selected_bg_color, 10%));
$top_hilight: $borders_edge;
$warning_color: #f57900; $warning_color: if($variant == 'light', $yellow_5, #cd9309);
$error_color: #ff8080; $error_color: if($variant == 'light', $red_3, $red_4);
$success_color: if($variant == 'light', #33d17a, darken(#33d17a, 10%)); $success_color: if($variant == 'light', $green_4, $green_5);
$destructive_color: if($variant == 'light', #e01b24, darken(#e01b24, 10%)); $destructive_color: $error_color;
$osd_fg_color: #eeeeec; $osd_fg_color: white;
$osd_text_color: white; $osd_bg_color: transparentize(desaturate($bg_color, 100%),0.04);
$osd_bg_color: transparentize(darken(desaturate(#3d3846, 100%), 12%),0.04);
$osd_insensitive_bg_color: transparentize(mix($osd_fg_color, opacify($osd_bg_color, 1), 10%), 0.5); $osd_insensitive_bg_color: transparentize(mix($osd_fg_color, opacify($osd_bg_color, 1), 10%), 0.5);
$osd_insensitive_fg_color: mix($osd_fg_color, opacify($osd_bg_color, 1), 50%); $osd_insensitive_fg_color: if($variant == 'light', mix($osd_fg_color, $osd_bg_color, 80%), mix($osd_fg_color, $osd_bg_color, 70%));
$osd_borders_color: transparentize(black, 0.3); $osd_borders_color: transparentize(black, 0.3);
$osd_outer_borders_color: transparentize(white, 0.84); $osd_outer_borders_color: transparentize($osd_fg_color, 0.98);
$shadow_color: if($variant == 'light', rgba(0,0,0,0.1), rgba(0,0,0,0.2)); $shadow_color: if($variant == 'light', rgba(0,0,0,0.1), rgba(0,0,0,0.2));
$system_bg_color: desaturate(#241f31,100%); //neutralize the HIG color
// overview background color
$system_bg_color: $base_color;
//insensitive state derived colors //insensitive state derived colors
$insensitive_fg_color: mix($fg_color, $bg_color, 50%); $insensitive_fg_color: mix($fg_color, $bg_color, 50%);
+117 -72
View File
@@ -28,26 +28,24 @@ $cakeisalie: "This stylesheet is generated, DO NOT EDIT";
// padding, margin and spacing // padding, margin and spacing
$base_padding: 6px; $base_padding: 6px;
$base_margin: 4px; $base_margin: 4px;
$base_spacing: 6px;
// border radii // border radii
$base_border_radius: 8px; $base_border_radius: 8px;
$modal_radius:$base_border_radius * 2; // radii of things that display over other things, e.g. popovers
$modal_radius: $base_border_radius*2; // 24px
// non-standard colors // derived hover colors
$bubble_borders_color: lighten($borders_color, if($variant=='light', 0%, 5%)); $hover_bg_color: if($variant=='light', darken($bg_color, 3%), lighten($bg_color, 4%));
// $bubble_borders_color: if($variant == 'light', rgba(255,255,255,0.1), rgba(0,0,0,0.3)); $hover_fg_color: if($variant=='light', darken($fg_color, 5%), lighten($fg_color, 4%));
// hover // derived active colors
$hover_bg_color: if($variant=='light', darken($bg_color, 3%), lighten($bg_color, 5%)); $active_bg_color: if($variant=='light', darken($bg_color, 5%), lighten($bg_color, 6%));
$hover_fg_color: if($variant=='light', darken($fg_color, 5%), lighten($fg_color, 5%)); $active_fg_color: if($variant=='light', darken($fg_color, 5%), lighten($fg_color, 6%));
$hover_borders_color: lighten($borders_color,if($variant=='light', 5%, 3%));
// active // derived checked colors
$active_bg_color: if($variant == 'light', darken($bg_color, 7%), darken($bg_color, 9%)); $checked_bg_color: if($variant=='light', darken($bg_color, 7%), lighten($bg_color, 9%));
$active_fg_color: darken($fg_color,if($variant=='light', 5%, 3%)); $checked_fg_color: if($variant=='light', darken($fg_color, 7%), lighten($fg_color, 9%));
$active_borders_color: darken($borders_color,if($variant=='light', 5%, 3%));
// fonts // fonts
$base_font_size: 11; $base_font_size: 11;
@@ -55,6 +53,7 @@ $text_shadow_color: if($variant == 'light', rgba(255,255,255,0.3), rgba(0,0,0,0.
// icons // icons
$base_icon_size: 1.09em; $base_icon_size: 1.09em;
$large_icon_size: $base_icon_size*2; // 32px
// $base_icon_size: 16px; // $base_icon_size: 16px;
// Stage // Stage
@@ -65,20 +64,13 @@ stage {
/* Common Stylings */ /* Common Stylings */
// Text
%status_text {
font-size: 2em;
font-weight: bold;
color: $osd_fg_color;
}
// osd panels // osd panels
%osd_panel { %osd_panel {
color: $osd_fg_color; color: $osd_fg_color;
background-color: $osd_bg_color; background-color: $osd_bg_color;
//border: 1px solid $osd_outer_borders_color; border: 1px solid $osd_outer_borders_color;
border-radius: $base_border_radius * 2 + 4px; border-radius: 999px;
padding: $base_padding * 2; padding: $base_padding*2;
} }
// Overview panels // Overview panels
@@ -89,9 +81,10 @@ stage {
} }
// icon tiles // icon tiles
%icon_tile { %tile {
border-radius: $base_border_radius + 4px; border-radius: $base_border_radius * 2; // 16px
padding: $base_padding; padding: $base_padding;
spacing: $base_padding;
border: 2px solid transparent; border: 2px solid transparent;
transition-duration: 100ms; transition-duration: 100ms;
text-align: center; text-align: center;
@@ -101,76 +94,128 @@ stage {
%bubble_panel { %bubble_panel {
color: $fg_color; color: $fg_color;
background-color: $bg_color; background-color: $bg_color;
border: 1px solid if($variant=='light', rgba(0,0,0, 0.6), $borders_color); border-radius: $base_border_radius*1.25 + 1px;
border: 1px solid $borders_edge;
} }
// button styling // normal button styling
%button { %button {
border-radius: $base_border_radius; border-radius: $base_border_radius - 2px; // 6px
border-style: solid; border-style: solid;
border-width: 1px; border-width: 1px;
min-height: 22px; font-weight: bold;
padding: $base_padding * 0.5 $base_padding * 4; padding: $base_padding*.5 $base_padding*4;
@include button(normal); @include button(normal);
&:focus { @include button(focus);} &:focus { @include button(focus);}
&:hover { @include button(hover);} &:hover { @include button(hover);}
&:insensitive { @include button(insensitive);} &:insensitive { @include button(insensitive);}
&:active { @include button(active);} &:active { @include button(active);}
&:checked { @include button(checked);}
} }
// buttons in dialogs // buttons in dialogs/notifications
// lighter in color and have a greater radius
$bubble_button_radius:$base_border_radius*1.25;
$bubble_buttons_color: if($variant == 'light', darken($bg_color, 12%), lighten($bg_color, 7%));
%bubble_button { %bubble_button {
@include button(normal, $shadow: none);
padding: $base_padding * 2; padding: $base_padding * 2;
border-style: solid; font-weight: bold !important;
border-width: 1px;
border-left-width: 0;
border-bottom-width: 0;
&:insensitive { @include button(insensitive, $shadow: none); } &:ltr {margin-right: 1px;}
&:focus { @include button(focus, $shadow: none); } &:rtl {margin-left: 1px;}
&:hover { @include button(hover, $shadow: none); }
&:active { @include button(active, $shadow: none); }
// radius is 2 pixel less to fit in bubble @include button(normal, $c:$bubble_buttons_color);
&:first-child { &:insensitive { @include button(insensitive, $c:$bubble_buttons_color);}
border-radius: 0 0 0 $modal_radius - 2px; &:focus { @include button(focus, $c:$bubble_buttons_color);}
&:hover { @include button(hover, $c:$bubble_buttons_color);}
&:active { @include button(active, $c:$bubble_buttons_color);}
&:checked { @include button(checked, $c:$bubble_buttons_color);}
&:first-child:ltr {
border-radius: 0 0 0 $bubble_button_radius;
} }
&:last-child { &:last-child:ltr {
border-right-width: 0; border-radius: 0 0 $bubble_button_radius 0;
border-radius: 0 0 $modal_radius - 2px 0; margin-right: 0 !important;
}
&:first-child:rtl {
border-radius: 0 0 $bubble_button_radius 0;
}
&:last-child:rtl {
border-radius: 0 0 0 $bubble_button_radius;
margin-left: 0 !important;
} }
&:first-child:last-child { &:first-child:last-child {
border-radius: 0 0 $modal_radius - 2px $modal_radius - 2px; border-radius: 0 0 $bubble_button_radius $bubble_button_radius !important;
margin-left: 0 !important;
margin-right: 0 !important;
} }
} }
// buttons on OSD elements
// notification styling // that are undecorated by default and use OSD colors
@mixin notification_bubble($flat: false) { %osd_button {
border-width: 1px; @include button(undecorated);
border-style: solid; &:insensitive { @include button(undecorated, $c:$osd_bg_color);}
border-radius: $base_border_radius + 2px; &:focus { @include button(focus, $c:$osd_bg_color);}
margin: $base_margin; &:hover { @include button(hover, $c:$osd_bg_color);}
&:active { @include button(active, $c:$osd_bg_color);}
@if $flat { &:outlined,&:checked { @include button(checked, $c:$osd_bg_color);}
@include button(undecorated);
} @else {
@include button(normal);
}
&:focus {
@include button(focus);
}
&:hover {
@include button(hover);
}
&:active {
@include button(active);
}
} }
/* General Typography */
%large_title {
font-weight: 300;
@include fontsize(24);
}
%title_1 {
font-weight: 800;
@include fontsize(20);
}
%title_2 {
font-weight: 800;
@include fontsize(15);
}
%title_3 {
font-weight: 700;
@include fontsize(15);
}
%title_4 {
font-weight: 700;
@include fontsize(13);
}
%heading {
font-weight: 700;
@include fontsize(11);
}
%caption_heading {
font-weight: 700;
@include fontsize(9);
}
%caption {
font-weight: 400;
@include fontsize(9);
}
%smaller {
font-weight: 400;
@include fontsize(8);
}
%monospace {font-family: monospace;}
%numeric { font-feature-settings: "tnum";}
+213 -133
View File
@@ -25,103 +25,51 @@
// entries // entries
@mixin entry($t, $fc:$selected_bg_color, $edge: $borders_edge) { @mixin entry($t, $fc:$selected_bg_color) {
// //
// Entries drawing function // Entries drawing function
// //
// $t: entry type // $t: entry type
// $fc: focus color // $fc: focus color
// $edge: set to none to not draw the bottom edge or specify a color to not use the default one
// //
// possible $t values: // possible $t values:
// normal, focus, insensitive // normal, focus, insensitive
// //
@if $t==normal { @if $t==normal {
background-color: $base_color; background-color: lighten($bg_color, 5%);
border-color: $borders_color; color: transparentize($fg_color,0.3);
border: 2px solid lighten($bg_color, 5%);
} }
@if $t==focus { @if $t==focus {
border-color: if($fc==$selected_bg_color, background-color: mix(lighten($bg_color, 5%), $selected_bg_color, 95%);
$selected_borders_color, border-color: $fc;
darken($fc,35%)); color: $fg_color;
box-shadow: inset 0 0 0 1px $fc; &:hover {}
} }
@if $t==hover { }
@if $t==hover {
background-color:lighten($hover_bg_color, 5%);
border-color:lighten($hover_bg_color, 5%);
color: transparentize($fg_color,0.3);
}
@if $t==insensitive { @if $t==insensitive {
background-color:lighten($insensitive_bg_color, 5%);
border-color: lighten($insensitive_bg_color, 5%);
color: $insensitive_fg_color; color: $insensitive_fg_color;
border-color: $insensitive_bg_color;
box-shadow: none;
} }
} }
// buttons // On-screen Keyboard
@mixin keyboard_key($t, $c:$osd_bg_color, $tc:$osd_fg_color) {
@function draw_border_color ($c) {
//
// colored buttons want the border form the base color
//
@return if($variant == 'light', darken($c, 18%), darken($c, 4%));
}
@function draw_text_shadow_color ($tc:$fg_color, $bg:$bg_color) {
// //
// calculate the color of text shadows // Keyboard key drawing function
// //
// $tc is the text color // $t: key type,
// $bg is the background color // $c: base key color for colored* types
//
$lbg: lightness($bg)/100%;
@if lightness($tc)<50% { @return rgba(255,255,255,$lbg/($lbg*1.3)); }
@else { @return rgba(0,0,0,1-$lbg*0.8); }
}
@function draw_button_hilight_color($c) {
//
// calculate the right top highlight color for buttons
//
// $c: base color;
//
@if lightness($c)>90% { @return white; }
@else if lightness($c)>80% { @return rgba(255,255,255, 0.7); }
@else if lightness($c)>50% { @return rgba(255,255,255, 0.5); }
@else if lightness($c)>40% { @return rgba(255,255,255, 0.3); }
@else { @return rgba(255,255,255, 0.1); }
}
@mixin draw_button_text_shadow ($tc:$fg_color, $bg:$bg_color) {
//
// helper function for the text emboss effect
//
// $tc is the optional text color, not the shadow color
//
// TODO: this functions needs a way to deal with special cases
//
$shadow: draw_text_shadow_color($tc, $bg);
@if lightness($tc)<50% {
text-shadow: 0 1px $shadow;
icon-shadow: 0 1px $shadow;
}
@else {
text-shadow: 0 -1px $shadow;
icon-shadow: 0 -1px $shadow;
}
}
@mixin button($t, $c:$bg_color, $tc:$fg_color, $edge: $borders_edge, $shadow: $shadow_color) {
//
// Button drawing function
//
// $t: button type,
// $c: base button color for colored* types
// $tc: optional text color for colored* types // $tc: optional text color for colored* types
// $edge: set to none to not draw the bottom edge or specify a color to not
// use the default one
// $shadow: set to none to not draw the drop shadow or specify a color to not
// use the default one
// //
// possible $t values: // possible $t values:
// normal, hover, active, insensitive, insensitive-active, // normal, hover, active, insensitive, insensitive-active,
@@ -129,104 +77,236 @@
// osd, osd-hover, osd-active, osd-insensitive, osd-backdrop, undecorated // osd, osd-hover, osd-active, osd-insensitive, osd-backdrop, undecorated
// //
$hilight_color: draw_button_hilight_color($c); // normal key
$button_edge: if($edge == none, none, draw_widget_edge($edge)); @if $t==normal {
$blank_edge: if($edge == none, none, draw_widget_edge(transparentize($edge,1))); color: $tc;
$button_shadow: if($shadow == none, none, 0 1px 1px 0 $shadow); background-color: lighten($c, 3%);
}
// focused key
@if $t==focus {
color: $tc;
background-color: mix(lighten($c, 3%), $selected_bg_color, 90%);
box-shadow: inset 0 0 0 2px transparentize($selected_bg_color, 0.4);
&:hover {
background-color: mix(lighten($c, 8%), $selected_bg_color, 90%);
box-shadow: inset 0 0 0 2px transparentize($selected_bg_color, 0.3);
}
&:active {
background-color: mix(lighten($c, 10%), $selected_bg_color, 90%);
box-shadow: inset 0 0 0 2px transparentize($selected_bg_color, 0.3);
}
}
// hover key
@else if $t==hover {
color: $tc;
background-color: lighten($c, 7%);
}
// active key
@else if $t==active {
color: $tc;
background-color: lighten($c, 10%);
}
// checked key
@else if $t==checked {
color: $tc;
background-color: lighten($c, 15%);
}
// insensitive key
@else if $t==insensitive {
color: $insensitive_fg_color;
background-color: $insensitive_bg_color;
}
// reset
@else if $t==undecorated {
background-color: transparent;
background-image: none;
}
}
// buttons
// since buttons are all flat an borderless now the mixin is simpler
@mixin button($t, $tc:$fg_color, $c:$bg_color) {
$button_bg_color: mix($tc, $c, 5%);
//
// Button drawing function
//
// $t: button type,
// $c: base button colors, derived from fg_color
// $tc: base button colors, derived from fg_color
//
// possible $t values:
// normal, hover, active, insensitive, insensitive-active,
// backdrop, backdrop-active, backdrop-insensitive, backdrop-insensitive-active,
// osd, osd-hover, osd-active, osd-insensitive, osd-backdrop, undecorated
//
// normal button // normal button
@if $t==normal { @if $t==normal {
color: $tc; color: $tc;
background-color: lighten($c, 3%); background-color: $button_bg_color;
border-color: draw_border_color($c);
@include draw_shadows($button_shadow);
// box-shadow: 0 1px 1px 0 rgba(0,0,0,0.1);
text-shadow: 0 1px $text_shadow_color;
icon-shadow: 0 1px $text_shadow_color;
} }
// focused button // focused button
@if $t==focus { @if $t==focus {
color: $tc; color: $tc;
text-shadow: 0 1px $text_shadow_color; background-color: mix($button_bg_color, $selected_bg_color, 90%);
icon-shadow: 0 1px $text_shadow_color;
box-shadow: inset 0 0 0 2px transparentize($selected_bg_color, 0.4); box-shadow: inset 0 0 0 2px transparentize($selected_bg_color, 0.4);
//border-color: $selected_bg_color; &:hover {
background-color: mix(lighten($button_bg_color, 3%), $selected_bg_color, 90%);
box-shadow: inset 0 0 0 2px transparentize($selected_bg_color, 0.3);
}
&:active {
background-color: mix(lighten($button_bg_color, 6%), $selected_bg_color, 90%);
box-shadow: inset 0 0 0 2px transparentize($selected_bg_color, 0.3);
}
} }
// hover button // hover button
@else if $t==hover { @else if $t==hover {
color: $tc; color: $tc;
background-color: lighten($c, if($variant == 'light', 8%, 5%)); background-color: lighten($button_bg_color, 3%);
border-color: if($variant == 'light', draw_border_color(lighten($c, 7%)), draw_border_color($c));
@include draw_shadows($button_shadow);
text-shadow: 0 1px $text_shadow_color;
icon-shadow: 0 1px $text_shadow_color;
} }
// active button // active button
@else if $t==active { @else if $t==active {
color: $tc; color: $tc;
background-color: darken($c,3%); background-color: lighten($button_bg_color, 6%);
border-color: draw_border_color(if($variant == 'light', $c, darken($c,7%))); }
text-shadow: none;
icon-shadow: none; // checked button
box-shadow: none; @else if $t==checked {
color: $tc;
background-color: lighten($button_bg_color, 9%);
&:hover { background-color: lighten($button_bg_color, 12%);}
&:active { background-color: lighten($button_bg_color, 15%);}
} }
// insensitive button // insensitive button
@else if $t==insensitive { @else if $t==insensitive {
color: $insensitive_fg_color; color: transparentize($tc, 0.5);
border-color: $insensitive_borders_color; background-color: transparentize($tc, .95);
background-color: $insensitive_bg_color; }
box-shadow: none;
text-shadow: none; // default/suggested button
icon-shadow: none; @else if $t==default {
background-color: $selected_bg_color;
color: $selected_fg_color;
&:focus {
box-shadow: inset 0 0 0 2px transparentize($selected_bg_color, 0.4);
}
&:hover, &:focus {
background-color: lighten($selected_bg_color, 5%);
color: lighten($selected_fg_color, 5%);
}
&:active {
background-color: darken($selected_bg_color, 7%);
color: darken($selected_fg_color, 7%);
}
&:insensitive {
@include button(insensitive);
background-color: transparentize($selected_bg_color, .5);
color: transparentize($selected_fg_color, .5);
}
} }
// reset // reset
@else if $t==undecorated { @else if $t==undecorated {
border-color: transparent;
background-color: transparent; background-color: transparent;
background-image: none; background-color: none;
@include draw_shadows(inset 0 1px rgba(255,255,255,0),$blank_edge); &:insensitive {
text-shadow: none; @include button(insensitive);
icon-shadow: none; background-color: transparent;
color: transparentize($selected_fg_color, .5);
}
} }
} }
// overview icons // tile
@mixin overview-icon($color) { @mixin tile_button($color, $flat: true) {
.overview-icon { @extend %tile;
@extend %icon_tile; @if $flat {
color: $color; background-color: transparent;
} @else {
background-color: transparentize($color, .84);
} }
&:hover { background-color: transparentize($color, .9);}
&:selected, &:focus {
background-color: transparentize($color, .87);
&:hover { background-color: transparentize($color, .84);}
&:active { background-color: transparentize($color, .87);}
}
&:active { background-color: transparentize($color, .84);}
&:outlined, &:checked {
background-color: transparentize($color, .81);
&:active { background-color: transparentize($color, .78);}
&:hover { background-color: transparentize($color, .75);}
}
&:drop {
border: 2px solid transparentize($selected_bg_color, .2); //already 2px transparent so no jumping
background-color: transparentize($selected_bg_color, .8);
}
}
&:hover, // overview icon, dash, app grid
&:selected { @mixin overview_icon($color, $flat: true) {
.overview-icon { .overview-icon { @extend %tile; }
background-color: transparentize($color, .9); @if $flat {
} .overview-icon { background-color: transparent;}
} @else {
.overview-icon { background-color: transparentize($color, .81);}
}
&:hover .overview-icon { background-color: transparentize($color, .9);}
&:selected .overview-icon,
&:focus .overview-icon {
background-color: transparentize($color, .87);
&:hover .overview-icon { background-color: transparentize($color, .84);}
&:active .overview-icon { background-color: transparentize($color, .87);}
}
&:active .overview-icon { background-color: transparentize($color, .84);}
&:outlined .overview-icon,
&:checked .overview-icon {
background-color: transparentize($color, .81);
&:active .overview-icon { background-color: transparentize($color, .78);}
&:hover .overview-icon { background-color: transparentize($color, .75);}
}
&:drop .overview-icon {
border: 2px solid transparentize($selected_bg_color, .2); //already 2px transparent so no jumping
background-color: transparentize($selected_bg_color, .8);
}
}
// styling for elements within popovers that look like notifications
@mixin card($flat: false) {
border-radius: $base_border_radius;
margin: $base_margin;
box-shadow: 0 1px 1px 0 rgba(0,0,0,.1);
@if $flat {
@include button(undecorated);
box-shadow: none !important;
} @else {
@include button(normal);
} }
&:focus { &:focus {
.overview-icon { @include button(focus);
background-color: transparentize($color, .7);
// border-color: $selected_bg_color;
}
} }
&:drop { &:hover {
.overview-icon { @include button(hover);
border: 2px solid $selected_bg_color; //already 2px transparent so no jumping
background-color: transparentize($selected_bg_color, .8);
}
} }
&:active, &:active {
&:checked { @include button(active);
.overview-icon {
background-color: transparentize(darken($osd_bg_color, 10%), .5);
}
} }
} }
@@ -1,7 +1,6 @@
// When color definition differs for dark and light variant, // When color definition differs for dark and light variant,
// it gets @if ed depending on $variant // it gets @if ed depending on $variant
$base_color: #222; $base_color: #222;
$bg_color: #000; $bg_color: #000;
$fg_color: #fff; $fg_color: #fff;
@@ -13,7 +12,6 @@ $borders_color: darken($bg_color,12%);
$borders_edge: transparentize($fg_color, 0.9); $borders_edge: transparentize($fg_color, 0.9);
$link_color: lighten($selected_bg_color,20%); $link_color: lighten($selected_bg_color,20%);
$link_visited_color: lighten($selected_bg_color,10%); $link_visited_color: lighten($selected_bg_color,10%);
$top_hilight: $borders_edge;
$warning_color: #f57900; $warning_color: #f57900;
$error_color: #cc0000; $error_color: #cc0000;
@@ -24,6 +22,8 @@ $osd_fg_color: #eeeeec;
$osd_bg_color: #2e3436; $osd_bg_color: #2e3436;
$osd_borders_color: rgba(0,0,0, 0.7); $osd_borders_color: rgba(0,0,0, 0.7);
$osd_outer_borders_color: rgba(255,255,255, 0.1); $osd_outer_borders_color: rgba(255,255,255, 0.1);
$osd_insensitive_bg_color: mix($osd_fg_color, $osd_bg_color, 10%);
$osd_insensitive_fg_color: if($variant == 'light', mix($osd_fg_color, $osd_bg_color, 80%), mix($osd_fg_color, $osd_bg_color, 70%));
$shadow_color: rgba(0,0,0, 0.1); $shadow_color: rgba(0,0,0, 0.1);
$system_bg_color: desaturate(#241f31,100%); //neutralize the HIG color $system_bg_color: desaturate(#241f31,100%); //neutralize the HIG color
+1 -1
View File
@@ -29,6 +29,7 @@
@import 'widgets/osd'; @import 'widgets/osd';
@import 'widgets/switcher-popup'; @import 'widgets/switcher-popup';
@import 'widgets/workspace-switcher'; @import 'widgets/workspace-switcher';
@import 'widgets/screenshot';
// Panel // Panel
@import 'widgets/panel'; @import 'widgets/panel';
@import 'widgets/corner-ripple'; @import 'widgets/corner-ripple';
@@ -43,7 +44,6 @@
// A11y / misc // A11y / misc
@import 'widgets/a11y'; @import 'widgets/a11y';
@import 'widgets/misc'; @import 'widgets/misc';
@import 'widgets/tiled-previews';
@import 'widgets/keyboard'; @import 'widgets/keyboard';
@import 'widgets/looking-glass'; @import 'widgets/looking-glass';
// Lock / login screens // Lock / login screens
+27 -41
View File
@@ -4,45 +4,39 @@ $app_icon_size: 96px;
// app icons // app icons
.icon-grid { .icon-grid {
row-spacing: $base_spacing * 2; row-spacing: $base_padding * 2;
column-spacing: $base_spacing * 2; column-spacing: $base_padding * 2;
max-row-spacing: $base_spacing * 12; max-row-spacing: $base_padding * 7;
max-column-spacing: $base_spacing * 12; max-column-spacing: $base_padding * 7;
page-padding-top: $base_padding * 4; page-padding-top: $base_padding * 4;
page-padding-bottom: $base_padding * 4; page-padding-bottom: $base_padding * 4;
page-padding-left: $base_padding * 2; page-padding-left: $base_padding * 3;
page-padding-right: $base_padding * 2; page-padding-right: $base_padding * 3;
} }
/* App Icons */ /* App Icons */
$app_grid_fg_color: #fff;
// Icon tiles in the app grid // Icon tiles in the app grid
.app-well-app, .app-well-app {
%app-well-app { @include overview_icon($osd_fg_color);
@include overview-icon($app_grid_fg_color);
.overview-icon { padding: $base_padding*2;}
.overview-icon.overview-icon-with-label { .overview-icon.overview-icon-with-label {
padding: 10px 8px 5px 8px;
> StBoxLayout { > StBoxLayout {
spacing: $base_spacing; spacing: $base_padding;
} }
} }
} }
/* App Folders */ // app folders
.app-well-app.app-folder { .app-well-app.app-folder {
background-color: $dash_background_color; @include overview_icon($osd_fg_color, $flat: false);
border-radius: $base_border_radius + 4px; // same as %icon_tile
} }
// expanded folder // expanded folder
.app-folder-dialog { //style like the dash .app-folder-dialog {
border-radius: $modal_radius * 1.5; border-radius: $modal_radius*2;
background-color: $dash_background_color; background-color: $dash_background_color;
padding: 12px 0px 12px 0px;
& .folder-name-container { & .folder-name-container {
padding: 24px 36px 0; padding: 24px 36px 0;
@@ -50,8 +44,7 @@ $app_grid_fg_color: #fff;
& .folder-name-label, & .folder-name-label,
& .folder-name-entry { & .folder-name-entry {
font-size: 18pt; @extend %title_1;
font-weight: 800;
} }
& .folder-name-entry { width: 300px } & .folder-name-entry { width: 300px }
@@ -61,19 +54,17 @@ $app_grid_fg_color: #fff;
& .edit-folder-button { & .edit-folder-button {
@extend %button; @extend %button;
padding: 0; padding: 0;
width: 36px; width: 36px;
height: 36px; height: 36px;
border-radius: 18px; border-radius: 99px;
& > StIcon { icon-size: $base_icon_size }
& > StIcon { icon-size: 16px }
} }
} }
& .icon-grid { & .icon-grid {
row-spacing: $base_spacing * 2; row-spacing: $base_padding * 2;
column-spacing: $base_spacing * 5; column-spacing: $base_padding * 5;
page-padding-top: 0; page-padding-top: 0;
page-padding-bottom: 0; page-padding-bottom: 0;
page-padding-left: 0; page-padding-left: 0;
@@ -84,10 +75,11 @@ $app_grid_fg_color: #fff;
margin-bottom: 18px; margin-bottom: 18px;
} }
} }
.app-folder-dialog-container { .app-folder-dialog-container {
padding: 12px; padding: $base_padding*2;
width: 620px; width: 640px;
height: 620px; height: 640px;
} }
// Running app indicator (also shown in dash) // Running app indicator (also shown in dash)
@@ -95,24 +87,18 @@ $app_grid_fg_color: #fff;
height: 5px; height: 5px;
width: 5px; width: 5px;
border-radius:5px; border-radius:5px;
margin-bottom: 8px;
background-color: $osd_fg_color; background-color: $osd_fg_color;
margin-bottom: 1px;
} }
// Rename popup for app folders // Rename popup for app folders
.rename-folder-popup { .rename-folder-popup {
.rename-folder-popup-item { .rename-folder-popup-item {
spacing: $base_spacing; spacing: $base_padding;
&:ltr, &:rtl { padding: 0 $base_padding * 2; } &:ltr, &:rtl { padding: 0 $base_padding * 2; }
} }
} }
// right-click app menu
.app-menu,
.app-well-menu {
max-width: 27.25em;
}
// App Grid pagination indicators // App Grid pagination indicators
.page-indicator { .page-indicator {
padding: $base_padding $base_padding * 2 0; padding: $base_padding $base_padding * 2 0;
@@ -149,7 +135,7 @@ $app_grid_fg_color: #fff;
background-gradient-start: rgba(255, 255, 255, 0.05); background-gradient-start: rgba(255, 255, 255, 0.05);
background-gradient-end: transparent; background-gradient-end: transparent;
background-gradient-direction: horizontal; background-gradient-direction: horizontal;
border-radius: 15px 0px 0px 15px; border-radius: $modal_radius*1.5 0px 0px $modal_radius*1.5;
} }
&.previous:ltr, &.previous:ltr,
@@ -157,7 +143,7 @@ $app_grid_fg_color: #fff;
background-gradient-start: transparent; background-gradient-start: transparent;
background-gradient-end: rgba(255, 255, 255, 0.05); background-gradient-end: rgba(255, 255, 255, 0.05);
background-gradient-direction: horizontal; background-gradient-direction: horizontal;
border-radius: 0px 15px 15px 0px; border-radius: 0px $modal_radius*1.5 $modal_radius*1.5 0px;
} }
} }
@@ -2,4 +2,5 @@
.button { .button {
@extend %button; // that's it @extend %button; // that's it
min-height: 22px;
} }
+108 -143
View File
@@ -1,291 +1,256 @@
/* Date/Time Menu */ /* Date/Time Menu */
.clock-display-box {
spacing: 2px;
.clock {
padding-left: $base_padding * 2;
padding-right: $base_padding * 2;
}
}
// overall menu // overall menu
#calendarArea { #calendarArea {
padding:0; padding: $base_padding - 2px;
} }
// Calendar menu side column // Calendar menu side column
.datemenu-calendar-column { .datemenu-calendar-column {
spacing: $base_spacing; spacing: $base_padding;
border: 0 solid $bubble_borders_color; &:ltr {padding-left: $base_padding;}
padding: 0 $base_padding * 2; &:rtl {padding-right: $base_padding;}
.datemenu-displays-box {spacing: $base_padding;}
&:ltr {margin-right: $base_margin * 2; border-left-width: 1px; }
&:rtl {margin-left: $base_margin * 2; border-right-width: 1px; }
.datemenu-displays-section {
}
.datemenu-displays-box {
spacing: $base_spacing;
}
}
.events-section-title {
@include notification_bubble($flat: true);
color: desaturate(darken($fg_color,40%), 10%);
font-weight: bold;
padding: .4em;
} }
/* today button (the date) */ /* today button (the date) */
.datemenu-today-button { .datemenu-today-button {
@include notification_bubble($flat: true); @include card($flat: true);
padding: $base_padding * 1.5; padding: $base_padding * 1.5;
// weekday label // weekday label
.day-label { .day-label {
@include fontsize($base_font_size+1); @extend %heading;
font-weight: bold;
} }
// date label // date label
.date-label { .date-label {
@include fontsize($base_font_size+7); @extend %title_2;
font-weight: 1000;
} }
} }
/* Calendar */ /* Calendar */
.calendar { .calendar {
@include notification_bubble; @include card(flat);
padding: $base_padding; margin-top: 0;
// month // month header
.calendar-month-label { .calendar-month-header {
color: lighten($fg_color,5%);
font-weight: bold; // prev/next month icons
padding: 8px 0; .calendar-change-month-back StIcon,
&:focus {} .calendar-change-month-forward StIcon {
icon-size: $base_icon_size;
}
// month label
.calendar-month-label {
color: lighten($fg_color,5%);
@extend %heading;
padding: 8px 0;
}
.pager-button {
background-color: transparent;
height: 32px;
width: 32px;
margin: 2px;
border-radius: $base_border_radius - 2px;
&:hover, &:focus {background-color: $hover_bg_color;}
&:active {background-color: $active_bg_color;}
}
} }
// prev/next month icons $calendar_day_size: 3em;
.calendar-change-month-back StIcon,
.calendar-change-month-forward StIcon {
icon-size: $base_icon_size;
}
.pager-button {
background-color: transparent;
height: 32px;
width: 32px;
border-radius: $base_border_radius;
&:hover, &:focus { background-color: lighten($hover_bg_color, 5%); }
&:active { background-color: $active_bg_color; }
}
$calendar_day_size: 32px;
.calendar-day-base { .calendar-day-base {
@include fontsize($base_font_size - 3);
text-align: center; text-align: center;
width: $calendar_day_size;
height: $calendar_day_size;
padding: 0;
margin: 2px; margin: 2px;
border-radius: $calendar_day_size * 0.5 + 2px; padding: 0 !important;
border: 1px solid transparent; //avoid jumparound due to today height: $calendar_day_size !important;
font-feature-settings: "tnum"; width: $calendar_day_size !important;
&:hover, &:focus { background-color: $hover_bg_color; } border-radius: 99px;
@extend %numeric;
@extend %smaller;
&:hover {background-color: $hover_bg_color;}
&:focus {
background-color: mix($bg_color, $selected_bg_color, 80%);
color: $selected_fg_color;
box-shadow:inset 0 0 0 2px transparentize($selected_bg_color, 0.4);
}
&:active,&:selected { &:active,&:selected {
color: lighten($fg_color,10%); color: $active_fg_color;
background-color: darken($bg_color,5%); background-color: $active_bg_color;
&:focus {
background-color: mix($active_bg_color, $selected_bg_color, 80%);
}
} }
// day of week heading // day of week heading
&.calendar-day-heading { &.calendar-day-heading {
color: lighten($fg_color,10%); color: $insensitive_fg_color;
margin-top: 1em; padding-top: $base_padding;
@include fontsize($base_font_size - 4); height: 16px !important; // force heading to be smaller height
font-weight: bold;
@extend %smaller;
} }
} }
.calendar-day { //border collapse hack - see calendar.js .calendar-day {}
border-width: 0;
}
.calendar-day-top {
border-top-width: 1px;
}
.calendar-day-left {
border-left-width: 1px;
}
.calendar-work-day {} .calendar-work-day {}
.calendar-nonwork-day {color: $insensitive_fg_color;}
.calendar-nonwork-day { .calendar-other-month-day {
color: $insensitive_fg_color; color: transparentize($fg_color, 0.5);
&.calendar-nonwork-day {
color: transparentize($insensitive_fg_color, 0.5);
}
} }
// Today // Today
.calendar-today { .calendar-today {
font-weight: bold;
border: 1px solid transparent;
background-color: $selected_bg_color; background-color: $selected_bg_color;
color: $selected_fg_color; font-weight: 800;
color: $selected_fg_color !important;
&:hover,&:focus { &:hover,&:focus {
background-color:lighten($selected_bg_color, 3%); background-color:lighten($selected_bg_color, 3%);
color: $selected_fg_color; color: inherit;
} }
&:active,&:selected { &:active,&:selected {
background-color: $selected_bg_color; background-color: $selected_bg_color;
color: $selected_fg_color; color: inherit;
&:hover,&:focus { &:hover,&:focus {
background-color:lighten($selected_bg_color, 3%); background-color:lighten($selected_bg_color, 3%);
color: $selected_fg_color; color: inherit;
} }
} }
} }
.calendar-day-with-events { .calendar-day-with-events {
background-image: url("resource:///org/gnome/shell/theme/calendar-today.svg"); background-image: if($variant == 'light', url("resource:///org/gnome/shell/theme/calendar-today-light.svg"),url("resource:///org/gnome/shell/theme/calendar-today.svg"));
&.calendar-work-day { background-size: contain;
color: lighten($fg_color,10%);
font-weight: bold;
}
}
.calendar-other-month-day {
color: transparentize($fg_color ,0.5);
} }
.calendar-week-number { .calendar-week-number {
@include fontsize($base_font_size - 4); @include fontsize($base_font_size - 4);
font-weight: bold; font-weight: bold;
height: 1.8em; font-feature-settings: "tnum";
width: 2.3em;
border-radius: 2px;
margin: 6px; margin: 6px;
padding: 0 $base_padding;
border-radius: 3px;
background-color: darken($bg_color, 2%); background-color: darken($bg_color, 2%);
color: lighten($fg_color, 5%); color: $insensitive_fg_color
} }
} }
/* Events */ /* Events */
.events-button { .events-button {
@include notification_bubble; @include card;
padding: $base_padding * 2; padding: $base_padding * 2;
.events-box { .events-box {
spacing: $base_spacing; spacing: $base_padding;
} }
.events-list { .events-list {
spacing: 2 * $base_spacing; spacing: 2 * $base_padding;
} }
.events-title { .events-title {
color: desaturate(darken($fg_color,40%), 10%); @extend %heading;
font-weight: bold; color: $insensitive_fg_color;
margin-bottom: $base_margin; margin-bottom: $base_margin;
} }
.event-time { .event-time {
color: darken($fg_color,20%); @extend %numeric;
font-feature-settings: "tnum"; @extend %caption;
@include fontsize($base_font_size - 1); color: $insensitive_fg_color;
} }
} }
/* World clocks */ /* World clocks */
.world-clocks-button { .world-clocks-button {
@include notification_bubble; @include card;
padding: $base_padding * 2; padding: $base_padding * 2;
.world-clocks-grid { .world-clocks-grid {
spacing-rows: $base_spacing; spacing-rows: $base_padding;
spacing-columns: $base_spacing * 2; spacing-columns: $base_padding * 2;
} }
// title // title
.world-clocks-header { .world-clocks-header {
color: desaturate(darken($fg_color,40%), 10%); @extend %heading;
font-weight: bold; color: $insensitive_fg_color;
} }
// city label // city label
.world-clocks-city { .world-clocks-city {
color: $fg_color; color: $fg_color;
@include fontsize($base_font_size);
font-weight: normal;
} }
// timezone time // timezone time
.world-clocks-time { .world-clocks-time {
font-weight: bold; @extend %heading;
@extend %numeric;
color: $fg_color; color: $fg_color;
font-feature-settings: "tnum";
@include fontsize($base_font_size);
&:ltr { text-align: right; } &:ltr {text-align: right;}
&:rtl { text-align: left; } &:rtl {text-align: left;}
} }
// timezone offset label // timezone offset label
.world-clocks-timezone { .world-clocks-timezone {
color: darken($fg_color,20%); @extend %numeric;
font-feature-settings: "tnum"; @extend %caption;
@include fontsize($base_font_size - 1); color: $insensitive_fg_color;
} }
} }
/* Weather */ /* Weather */
.weather-button { .weather-button {
@include notification_bubble; @include card;
padding: $base_padding * 2; padding: $base_padding * 2;
.weather-box { .weather-box {
spacing: $base_spacing + $base_margin; spacing: $base_padding + $base_margin;
} }
.weather-header-box { .weather-header-box {
spacing: $base_spacing; spacing: $base_padding;
} }
.weather-header { .weather-header {
color: desaturate(darken($fg_color,40%), 10%); color: $insensitive_fg_color;
font-weight: bold; @extend %heading;
&.location { &.location {
font-weight: normal; font-weight: normal;
@include fontsize($base_font_size - 1);
} }
} }
.weather-grid { .weather-grid {
spacing-rows: $base_spacing; spacing-rows: $base_padding;
spacing-columns: $base_spacing * 2; spacing-columns: $base_padding * 2;
} }
.weather-forecast-time { .weather-forecast-time {
@extend %numeric;
@extend %caption;
color: darken($fg_color,30%); color: darken($fg_color,30%);
font-feature-settings: "tnum";
@include fontsize($base_font_size - 2);
font-weight: normal;
padding-top: 0.2em; padding-top: 0.2em;
padding-bottom: 0.4em; padding-bottom: 0.4em;
} }
.weather-forecast-icon { .weather-forecast-icon {
icon-size: $base_icon_size * 2; icon-size: $large_icon_size;
} }
.weather-forecast-temp { .weather-forecast-temp {
font-weight: bold; @extend %heading;
} }
} }
@@ -1,7 +1,7 @@
/* Check Boxes */ /* Check Boxes */
// these are equal to the size of the SVG assets // these are equal to the size of the SVG assets
$check_height: 22px; $check_height: 24px;
$check_width: 24px; $check_width: 24px;
@@ -10,9 +10,9 @@ $check_width: 24px;
StBin { StBin {
width: $check_width; width: $check_width;
height: $check_height; height: $check_height;
background-image: url("resource:///org/gnome/shell/theme/checkbox-off.svg"); background-image: if($variant == 'light', url("resource:///org/gnome/shell/theme/checkbox-off-light.svg"), url("resource:///org/gnome/shell/theme/checkbox-off.svg"));
} }
&:focus StBin { background-image: url("resource:///org/gnome/shell/theme/checkbox-off-focused.svg"); } &:focus StBin { background-image: if($variant == 'light', url("resource:///org/gnome/shell/theme/checkbox-off-focused-light.svg"), url("resource:///org/gnome/shell/theme/checkbox-off-focused.svg"));; }
&:checked StBin { background-image: url("resource:///org/gnome/shell/theme/checkbox.svg"); } &:checked StBin { background-image: url("resource:///org/gnome/shell/theme/checkbox.svg"); }
&:focus:checked StBin { background-image: url("resource:///org/gnome/shell/theme/checkbox-focused.svg"); } &:focus:checked StBin { background-image: url("resource:///org/gnome/shell/theme/checkbox-focused.svg"); }
} }
+35 -33
View File
@@ -1,18 +1,14 @@
/* Dash */ /* Dash */
$dash_background_color: #3b3b3b; $dash_background_color: lighten($system_bg_color, 5%);
$dash_placeholder_size: 32px; $dash_placeholder_size: 32px;
$dash_padding: $base_padding + 4px; // 10px $dash_padding: $base_padding*2; // 12px
$dash_spacing: $base_padding / 4; $dash_border_radius: $modal_radius + $dash_padding;
$dash_bottom_margin: $base_margin * 4;
$dash_border_radius: $modal_radius * 1.5;
// container for the dash
#dash { #dash {
@include fontsize($base_font_size - 2); @extend %caption;
margin-top: $base_spacing * 3; margin-top: $dash_padding;
padding: 0 $dash_padding;
.placeholder { .placeholder {
// background-image: url("resource:///org/gnome/shell/theme/dash-placeholder.svg"); // background-image: url("resource:///org/gnome/shell/theme/dash-placeholder.svg");
@@ -26,27 +22,46 @@ $dash_border_radius: $modal_radius * 1.5;
height: $dash_placeholder_size; height: $dash_placeholder_size;
} }
.overview-icon { // Running app indicator (also shown in app grid)
padding: $dash_padding / 2; .app-well-app-running-dot {
margin-bottom: 14px; // hardcoded
} }
} }
// background of the dash behind app icons
.dash-background { .dash-background {
background-color: $dash_background_color; background-color: $dash_background_color;
margin-bottom: $dash_bottom_margin;
padding: $dash_padding;
border-radius: $dash_border_radius; border-radius: $dash_border_radius;
padding: $dash_padding;
spacing: $base_padding;
margin-bottom: $dash_padding;
} }
// Dash Items // items on the dash
.dash-item-container .app-well-app, .show-apps { .dash-item-container {
padding: $dash_padding $dash_spacing $dash_padding + $dash_bottom_margin; > * {margin: 0 2px;}
&:ltr:first-child {margin-left: 0;}
&:rtl:first-child {margin-right: 0;}
// each app item on the dash
.app-well-app .overview-icon {
padding: $base_padding;
}
// show apps button
.show-apps { @include overview_icon($osd_fg_color);}
.show-apps, .app-well-app {
padding-bottom: $dash_padding;
}
} }
// separator between favourites and running apps
.dash-separator { .dash-separator {
width: 1px; width: 1px;
margin: 0 ($dash_spacing + ($dash_padding / 2)) $dash_bottom_margin; margin: 0 $base_margin;
background-color: transparentize($osd_fg_color,0.7); background-color: $borders_color;
margin-bottom: $dash_padding;
} }
// OSD Tooltip // OSD Tooltip
@@ -56,18 +71,5 @@ $dash_border_radius: $modal_radius * 1.5;
border-radius: 99px; border-radius: 99px;
padding: $base_padding $base_padding * 2; padding: $base_padding $base_padding * 2;
text-align: center; text-align: center;
-y-offset: $base_margin * 3; // distance from the dash edge -y-offset: $base_margin * 2; // distance from the dash edge
}
// Show apps button
.show-apps {
@include overview-icon($osd_fg_color);
&:focus,
&:checked {
.overview-icon {
background-color: transparentize($osd_bg_color,0.5);
color: $fg_color;
}
}
} }
+8 -14
View File
@@ -1,11 +1,10 @@
/* Modal Dialogs */ /* Modal Dialogs */
.headline { .headline {
@include fontsize($base_font_size + 1); @extend %title_4;
} }
.modal-dialog { .modal-dialog {
border-radius: $modal_radius;
@extend %bubble_panel; @extend %bubble_panel;
.modal-dialog-content-box { .modal-dialog-content-box {
@@ -35,13 +34,9 @@
.message-dialog-title { .message-dialog-title {
text-align: center; text-align: center;
font-size: 18pt; @extend %title_2;
font-weight: 800;
&.lightweight { &.lightweight { @extend %title_4;}
font-size: 13pt;
font-weight: 800;
}
} }
.message-dialog-description { text-align: center; } .message-dialog-description { text-align: center; }
} }
@@ -52,7 +47,7 @@
.dialog-list-title { .dialog-list-title {
text-align: center; text-align: center;
font-weight: bold; @extend %heading;
} }
.dialog-list-scrollview { max-height: 200px; } .dialog-list-scrollview { max-height: 200px; }
@@ -65,7 +60,7 @@
.dialog-list-item-title { font-weight: bold; } .dialog-list-item-title { font-weight: bold; }
.dialog-list-item-description { .dialog-list-item-description {
color: darken($fg_color,5%); color: darken($fg_color,5%);
@include fontsize($base_font_size - 1); @extend %caption;
} }
} }
} }
@@ -79,7 +74,7 @@
} }
.run-dialog-entry { width: 20em; } .run-dialog-entry { width: 20em; }
.run-dialog-description { .run-dialog-description {
@include fontsize($base_font_size - 1); @extend %caption;
text-align: center; text-align: center;
color: darken($fg_color, 20%); color: darken($fg_color, 20%);
} }
@@ -120,7 +115,7 @@
.prompt-dialog-info-label, .prompt-dialog-info-label,
.prompt-dialog-null-label { .prompt-dialog-null-label {
text-align: center; text-align: center;
@include fontsize($base_font_size - 1); @extend %caption;
} }
.prompt-dialog-error-label { .prompt-dialog-error-label {
@@ -145,8 +140,7 @@
} }
.audio-selection-device { .audio-selection-device {
border: 1px solid $bubble_borders_color; border-radius: $base_border_radius*2;
border-radius: 12px;
&:hover,&:focus { background-color: $hover_bg_color; } &:hover,&:focus { background-color: $hover_bg_color; }
&:active { &:active {
background-color: $selected_bg_color; background-color: $selected_bg_color;
+6 -2
View File
@@ -3,23 +3,27 @@
StEntry { StEntry {
border-radius: $base_border_radius; border-radius: $base_border_radius;
padding: 8px; padding: 8px;
border-width: 1px;
color: $fg_color; color: $fg_color;
@include entry(normal); @include entry(normal);
//&:hover { @include entry(hover);} &:hover { @include entry(hover);}
&:focus { @include entry(focus);} &:focus { @include entry(focus);}
&:insensitive { @include entry(insensitive);} &:insensitive { @include entry(insensitive);}
selection-background-color: $selected_bg_color; selection-background-color: $selected_bg_color;
selected-color: $selected_fg_color; selected-color: $selected_fg_color;
StIcon.capslock-warning { StIcon.capslock-warning {
icon-size: 16px; icon-size: 16px;
warning-color: $warning_color; warning-color: $warning_color;
padding: 0 4px; padding: 0 4px;
} }
StIcon.peek-password { StIcon.peek-password {
icon-size: $base_icon_size; icon-size: $base_icon_size;
padding: 0 4px; padding: 0 4px;
} }
StLabel.hint-text { StLabel.hint-text {
margin-left: 2px; margin-left: 2px;
color: transparentize($fg_color, 0.3); color: transparentize($fg_color, 0.3);
+15 -14
View File
@@ -5,31 +5,32 @@
} }
.candidate-popup-content { .candidate-popup-content {
padding: 0.5em; padding: $base_padding;
spacing: 0.3em; spacing: $base_padding;
@extend .popup-menu-content;
} }
.candidate-index { .candidate-index {
padding: 0 0.5em 0 0; padding: 0;
color: darken($fg_color,10%); padding-right: $base_padding;
color: $insensitive_fg_color;
} }
.candidate-box { .candidate-box {
padding: 0.3em 0.5em 0.3em 0.5em; padding: $base_padding $base_padding*2 $base_padding $base_padding*2;
border-radius: $base_border_radius; border-radius: $base_border_radius;
&:selected,&:hover { background-color: $selected_bg_color; color: $selected_fg_color; } &:selected { background-color: $selected_bg_color; color: $selected_fg_color; }
&:hover { background-color: $hover_bg_color; color: $hover_fg_color; }
} }
.candidate-page-button-box { .candidate-page-button-box {
height: 2em; height: 2em;
.vertical & { padding-top: 0.5em; } .vertical & { padding-top: $base_padding*2; }
.horizontal & { padding-left: 0.5em; } .horizontal & { padding-left: $base_padding*2; }
} }
.candidate-page-button { .candidate-page-button { padding: $base_padding;}
padding: 4px;
}
.candidate-page-button-previous { border-radius: $base_border_radius 0px 0px $base_border_radius; border-right-width: 0; } .candidate-page-button-previous { border-radius: $base_border_radius 0px 0px $base_border_radius; border-right-width: 0;box-shadow: none;}
.candidate-page-button-next { border-radius: 0px $base_border_radius $base_border_radius 0px; } .candidate-page-button-next { border-radius: 0px $base_border_radius $base_border_radius 0px;box-shadow: none;}
.candidate-page-button-icon { icon-size: 1em; } .candidate-page-button-icon { icon-size: $base_icon_size; }
+64 -26
View File
@@ -1,15 +1,16 @@
/* On-screen Keyboard */ /* On-screen Keyboard */
$key_size: 1.2em; $key_size: 1.2em;
$key_border_radius: $base_border_radius + 3px; $key_border_radius: $base_border_radius + 4px; // 12px
$key_bg_color: $bg_color; $key_bg_color: darken($osd_fg_color, 70%);
// $default_key_bg_color: darken($key_bg_color, 4%); // $default_key_bg_color: darken($key_bg_color, 4%);
$default_key_bg_color: if($variant=='light', darken($osd_bg_color, 11%), lighten($osd_bg_color, 2%)); $default_key_bg_color: if($variant=='light', darken($key_bg_color, 11%), darken($key_bg_color, 10%));
// draw keys using button function // draw keys using button function
#keyboard { #keyboard {
background-color: transparentize(if($variant=='light', darken($bg_color, 5%), darken($bg_color, 8%)), 0.1); // background-color: transparentize(if($variant=='light', darken($bg_color, 5%), darken($bg_color, 8%)), 0.1);
background-color: $osd_bg_color;
box-shadow: inset 0 1px 0 0 $osd_outer_borders_color; box-shadow: inset 0 1px 0 0 $osd_outer_borders_color;
.page-indicator { .page-indicator {
@@ -31,18 +32,21 @@ $default_key_bg_color: if($variant=='light', darken($osd_bg_color, 11%), lighten
// the keys // the keys
.keyboard-key { .keyboard-key {
@include button(normal, $c:$key_bg_color);
&:focus { @include button(focus);}
&:hover, &:checked { @include button(hover, $c: $key_bg_color);}
&:active { @include button(active, $c: $key_bg_color); }
@include fontsize($base_font_size + 5); @include fontsize($base_font_size + 5);
font-weight: bold;
min-height: $key_size; min-height: $key_size;
min-width: $key_size; min-width: $key_size;
border-width: 1px; border-width: 1px;
border-style: solid; border-style: solid;
border-radius: $key_border_radius; border-radius: $key_border_radius;
box-shadow: 0 1px 0 0 $shadow_color;
@include keyboard_key(normal, $key_bg_color, $osd_fg_color);
&:focus { @include keyboard_key(focus);}
&:hover { @include keyboard_key(hover, $key_bg_color, $osd_fg_color);}
&:active { @include keyboard_key(active, $key_bg_color, $osd_fg_color); }
&:checked { @include keyboard_key(checked, $key_bg_color, $osd_fg_color); }
&:grayed { //FIXMEy &:grayed { //FIXMEy
background-color: darken($bg_color, 3%); background-color: darken($bg_color, 3%);
@@ -52,42 +56,59 @@ $default_key_bg_color: if($variant=='light', darken($osd_bg_color, 11%), lighten
// non-character keys // non-character keys
&.default-key { &.default-key {
@include button(normal, $c:$default_key_bg_color); @include keyboard_key(normal, $default_key_bg_color, $osd_fg_color);
&:hover, &:checked {@include button(hover, $c: $default_key_bg_color);} &:hover {@include keyboard_key(hover, $default_key_bg_color, $osd_fg_color);}
&:active { @include button(active, $c: $default_key_bg_color);} &:active { @include keyboard_key(active, $default_key_bg_color, $osd_fg_color);}
&:checked { @include keyboard_key(checked, $default_key_bg_color, $osd_fg_color);}
border-radius: $key_border_radius;
} }
// enter key is suggested-action // enter key is suggested-action
&.enter-key { &.enter-key {
@include button(normal, $c:$selected_bg_color, $tc:$selected_fg_color); @include keyboard_key(normal, $selected_bg_color, $selected_fg_color);
&:hover, &:checked { @include button(hover, $c: lighten($selected_bg_color, 3%));} &:hover { @include keyboard_key(hover, $selected_bg_color, $selected_fg_color);}
&:active {@include button(active, $c: darken($selected_bg_color, 2%));} &:active {@include keyboard_key(active, $selected_bg_color, $selected_fg_color);}
&:checked {@include keyboard_key(checked, $selected_bg_color, $selected_fg_color);}
border-radius: $key_border_radius;
color: $osd_fg_color;
} }
&.shift-key-uppercase { color: $selected_bg_color } &.shift-key-lowercase {}
// pressed shift has different style
&.shift-key-uppercase {
background-color: lighten($key_bg_color, 20%);
color: $osd_bg_color;
&:hover {
background-color: lighten($key_bg_color, 25%);
color: lighten($osd_bg_color, 5%);
}
}
StIcon { icon-size: 1.125em; } // size of icons on keys
StIcon { icon-size: 24px; }
} }
// long press on a key popup // long press on a key popup
.keyboard-subkeys { .keyboard-subkeys {
color: $osd_fg_color; -arrow-border-radius: $base_border_radius*2;
-arrow-border-radius: $modal_radius;
-arrow-background-color: $osd_bg_color; -arrow-background-color: $osd_bg_color;
-arrow-border-width: 1px; -arrow-border-width: 1px;
-arrow-border-color: lighten($osd_bg_color, 9%); -arrow-border-color: lighten($osd_bg_color, 9%);
-arrow-base: 20px; -arrow-base: 20px;
-arrow-rise: 10px; -arrow-rise: 10px;
-boxpointer-gap: $base_spacing; -boxpointer-gap: $base_padding;
padding: $base_padding;
.keyboard-key { .keyboard-key {
@include button(normal, $c:$key_bg_color); @include keyboard_key(normal, $key_bg_color, $osd_fg_color);
&:focus { @include button(focus);} &:focus { @include keyboard_key(focus);}
&:hover, &:checked { @include button(hover, $c: $key_bg_color);} &:hover { @include keyboard_key(hover, $key_bg_color, $osd_fg_color);}
&:active { @include button(active, $c: $key_bg_color); } &:active { @include keyboard_key(active, $key_bg_color, $osd_fg_color); }
&:checked { @include keyboard_key(checked, $key_bg_color, $osd_fg_color); }
border-radius:$base_border_radius; border-radius:$key_border_radius;
} }
} }
@@ -112,4 +133,21 @@ $default_key_bg_color: if($variant=='light', darken($osd_bg_color, 11%), lighten
@include fontsize($base_font_size + 3); @include fontsize($base_font_size + 3);
spacing: 12px; spacing: 12px;
min-height: 20pt; min-height: 20pt;
padding: $base_padding*2;
color: $osd_fg_color;
// each suggestion
StButton {
margin: 0 3px;
min-width: 32px;
border-radius: $base_border_radius - 2px;
padding: $base_padding $base_padding*3;
@include keyboard_key(undecorated, $key_bg_color, $osd_fg_color);
&:focus { @include keyboard_key(focus);}
&:hover { @include keyboard_key(hover, $key_bg_color, $osd_fg_color);}
&:active { @include keyboard_key(active, $key_bg_color, $osd_fg_color); }
&:checked { @include keyboard_key(checked, $key_bg_color, $osd_fg_color); }
}
} }
@@ -13,14 +13,6 @@
$_gdm_bg: $system_bg_color; $_gdm_bg: $system_bg_color;
StEntry {
@if $variant=='dark' {
$_gdm_entry_bg: darken($system_bg_color, 3%);
background-color: $_gdm_entry_bg;
color: $fg_color;
}
}
.modal-dialog-button-box { spacing: 3px; } .modal-dialog-button-box { spacing: 3px; }
.modal-dialog-button { .modal-dialog-button {
padding: 4px 18px; padding: 4px 18px;
@@ -47,26 +39,7 @@
color: transparentize($osd_fg_color, 0.3); color: transparentize($osd_fg_color, 0.3);
} }
&:default { &:default {
@include button(normal, $c:$selected_bg_color, $tc:$selected_fg_color); @include button(default);
border-color: $selected_bg_color;
&:hover, &:focus {
@include button(hover,$c:$selected_bg_color, $tc:$selected_fg_color);
$_def_hover_c: lighten($selected_bg_color, 5%);
background-color: $_def_hover_c;
border-color: $_def_hover_c;
}
&:active {
@include button(active,$c:$selected_bg_color, $tc:$selected_fg_color);
$_def_active_c: darken($selected_bg_color, 5%);
background-color: $_def_active_c;
border-color: $_def_active_c;
}
&:insensitive {
@include button(insensitive);
border-color: darken($selected_bg_color, 10%);
background-color: darken($selected_bg_color, 10%);
color: transparentize($selected_fg_color, 0.3);
}
} }
} }
@@ -75,8 +48,8 @@
.login-dialog-session-list-button { .login-dialog-session-list-button {
padding: 0; padding: 0;
border-radius: 99px; border-radius: 99px;
width: $base_icon_size * 2; width: $large_icon_size;
height: $base_icon_size * 2; height: $large_icon_size;
border-color: darken($system_bg_color, 3%); border-color: darken($system_bg_color, 3%);
background-color: darken($system_bg_color, 3%); background-color: darken($system_bg_color, 3%);
@@ -103,12 +76,38 @@
} }
.login-dialog-not-listed-label { .login-dialog-not-listed-label {
@include fontsize($base_font_size - 1); @extend %caption;
font-weight: bold; font-weight: bold;
color: darken($osd_fg_color,30%); color: darken($osd_fg_color,30%);
padding-top: 1em; padding-top: 1em;
} }
.login-dialog-auth-list-view { -st-vfade-offset: 1em; }
.login-dialog-auth-list {
spacing: 6px;
margin-left: 2em;
}
.login-dialog-auth-list-title {
margin-left: 2em;
}
.login-dialog-auth-list-item {
border-radius: $base_border_radius + 4px;
padding: 6px;
color: darken($osd_fg_color,30%);
&:focus, &:selected { background-color: $selected_bg_color; color: $selected_fg_color; }
}
.login-dialog-auth-list-label {
@include fontsize($base_font_size + 2);
font-weight: bold;
padding-left: 15px;
&:ltr { padding-left: 14px; text-align: left; }
&:rtl { padding-right: 14px; text-align: right; }
}
.login-dialog-user-list-view { -st-vfade-offset: 1em; } .login-dialog-user-list-view { -st-vfade-offset: 1em; }
.login-dialog-user-list { .login-dialog-user-list {
spacing: 12px; spacing: 12px;
@@ -159,7 +158,7 @@
.login-dialog-prompt-layout { .login-dialog-prompt-layout {
padding-top: 24px; padding-top: 24px;
padding-bottom: 12px; padding-bottom: 12px;
spacing: $base_spacing * 2; spacing: $base_padding * 2;
width: 23em; width: 23em;
} }
@@ -172,3 +171,34 @@
@include fontsize($base_font_size + 1); @include fontsize($base_font_size + 1);
padding-top: 1em; padding-top: 1em;
} }
.login-dialog {
StEntry {
@if $variant=='dark' {
$_gdm_entry_bg: darken($system_bg_color, 3%);
background-color: $_gdm_entry_bg;
color: $fg_color;
}
}
}
// Custom styling for unlock entry
.unlock-dialog {
StEntry {
border:none !important;
&:focus {
background-color: transparentize($fg_color, 0.9);
}
&:insensitive {
color: transparentize($fg_color, 0.5);
background-color: transparentize($fg_color, 0.95);
}
}
.cancel-button,
.switch-user-button,
.login-dialog-session-list-button {
border-color: transparent;
background-color: transparentize($fg_color, 0.9);
}
}
@@ -1,46 +1,65 @@
/* Looking Glass */ /* Looking Glass */
$text_fg_color: #ccc;
// Dialog // Dialog
#LookingGlassDialog { #LookingGlassDialog {
background-color: $osd_bg_color; background-color: $osd_bg_color;
spacing: $base_spacing; border-radius: 0 0 $modal_radius $modal_radius;
padding: 4px; border-top-width: 0;
border: 1px solid transparentize($osd_fg_color, 0.8); border: 1px solid $osd_outer_borders_color;
border-radius: $base_border_radius;
color: $osd_fg_color; color: $osd_fg_color;
padding: $base_padding;
spacing: $base_padding;
box-shadow: 0 2px 4px 0 rgba(0,0,0,0.1);
& > #Toolbar { & > #Toolbar {
border: none; border: none;
border-radius: $base_border_radius; padding: $base_padding;
background-color: $osd_bg_color; border-radius: 0;
background-color: transparent;
spacing: $base_padding;
.lg-toolbar-button {
padding: $base_padding $base_padding*2;
@extend %button;
& > StIcon { icon-size: $base_icon_size; }
}
}
.labels {
spacing: $base_padding;
} }
.labels { spacing: $base_spacing; }
.notebook-tab { .notebook-tab {
-natural-hpadding: $base_padding * 2; -natural-hpadding: $base_padding*2;
-minimum-hpadding: 6px; -minimum-hpadding: $base_padding*2;
font-weight: bold; font-weight: bold;
padding: $base_padding $base_padding*2;
color: darken($osd_fg_color, 15%); color: darken($osd_fg_color, 15%);
transition-duration: 100ms; transition-duration: 100ms;
padding-left: .3em; box-shadow:none;
padding-right: .3em; border:none;
border-bottom-width: 2px; border-radius: $base_border_radius - 2px;
background-color: transparent;
&:hover { &:hover {
color: $osd_fg_color; color: $osd_fg_color;
background-color: transparentize($osd_fg_color, 0.95);
} }
&:selected { &:selected {
border-bottom-width: 2px;
box-shadow: inset 0 -2px 0 0 lighten($selected_bg_color, 5%);
color: $osd_fg_color; color: $osd_fg_color;
background-color: transparentize($osd_fg_color, 0.9);
} }
} }
StBoxLayout#EvalBox { padding: 4px; spacing: $base_spacing; }
StBoxLayout#ResultsArea { spacing: $base_spacing; } StBoxLayout#EvalBox { padding: 4px; spacing: $base_padding; padding: $base_padding; }
StBoxLayout#ResultsArea { spacing: $base_padding; padding: $base_padding; }
} }
.lg-dialog { .lg-dialog {
StEntry { StEntry {
background-color: transparentize(lighten($osd_bg_color, 5%), 0.4); background-color: transparentize(lighten($osd_bg_color, 5%), 0.4);
color: $osd_fg_color; color: $osd_fg_color;
@@ -49,55 +68,55 @@ $text_fg_color: #ccc;
selection-background-color: $selected_bg_color; selection-background-color: $selected_bg_color;
selected-color: $selected_fg_color; selected-color: $selected_fg_color;
} }
.shell-link { .shell-link {
color: $link_color; color: $link_color;
&:hover { color: lighten($link_color, 10%); } &:hover { color: lighten($link_color, 10%); }
&:active { color: darken($link_color, 10%); } &:active { color: darken($link_color, 10%); }
} }
.actor-link { .actor-link {
color: $text_fg_color; color: $insensitive_fg_color;
&:hover { color: lighten($text_fg_color, 20%); } &:hover { color: lighten($insensitive_fg_color, 20%); }
&:active { color: darken($text_fg_color, 20%); } &:active { color: darken($insensitive_fg_color, 20%); }
} }
} }
.lg-completions-text { .lg-completions-text {
font-size: .9em; @extend %caption;
font-style: italic; font-style: italic;
} }
.lg-obj-inspector-title { .lg-obj-inspector-title {
spacing: $base_spacing; spacing: $base_padding;
} }
.lg-obj-inspector-button { .lg-obj-inspector-button {
border: 1px solid $osd_borders_color; border: 1px solid $osd_borders_color;
padding: 4px; padding: 4px;
border-radius: $base_border_radius; border-radius: $base_border_radius;
&:hover { border: 1px solid #ffffff; } &:hover { border: 1px solid #ffffff; }
} }
// Extensions // Extensions
#lookingGlassExtensions { padding: 4px; } #lookingGlassExtensions { padding: $base_padding; }
.lg-extensions-list { .lg-extensions-list {
padding: 4px; padding: $base_padding;
spacing: 6px; spacing: $base_padding;
} }
.lg-extension { .lg-extension {
border: 1px solid lighten($osd_borders_color, 5%); padding: $base_padding*2;
background-color: lighten($osd_bg_color, 5%); @include card;
border-radius: $base_border_radius;
padding: 4px;
} }
.lg-extension-name { .lg-extension-name {
font-weight: bold; @extend %heading;
} }
.lg-extension-meta { .lg-extension-meta {
spacing: 6px; spacing: $base_padding;
} }
// Inspector // Inspector
@@ -105,5 +124,19 @@ $text_fg_color: #ccc;
background: $osd_bg_color; background: $osd_bg_color;
border: 1px solid $osd_borders_color; border: 1px solid $osd_borders_color;
border-radius: $base_border_radius; border-radius: $base_border_radius;
padding: 6px; padding: $base_padding;
} }
.lg-debug-flag-button {
StLabel { padding: $base_padding, 2 * $base_padding; }
color: $fg_color;
&:hover { color: lighten($fg_color, 20%); }
&:active { color: darken($fg_color, 20%); }
}
.lg-debug-flags-header {
padding-top: 2 * $base_padding;
padding: $base_padding;
@extend %title_2;
}
@@ -3,45 +3,77 @@
// main list // main list
.message-list { .message-list {
width: 31.5em; width: 29em;
padding: 0 $base_padding * 2; border: solid $borders_color;
.message-list-placeholder { spacing: 12px; } // padding and margins to account for scrollbar
&:ltr {margin-left: 0; margin-right: $base_margin; padding-right: $base_padding; border-right-width: 1px; }
&:rtl {margin-right: 0; margin-left: $base_margin; padding-left: $base_padding; border-left-width: 1px; }
.message-list-placeholder {
@extend %title_2;
color: transparentize($insensitive_fg_color, .5);
// icon size and color
> StIcon {
icon-size: $base_icon_size*3; // 48px
margin-bottom: $base_margin*3;
-st-icon-style: symbolic;
}
}
} }
.message-list-sections { .message-list-sections {
spacing: $base_spacing; spacing: $base_padding;
margin: 0 $base_margin * 4; // to account for scrollbar margin: 0;
padding-bottom: $base_padding;
// to account for scrollbar
&:ltr {margin-right: $base_margin * 3; }
&:rtl {margin-left: $base_margin * 3;}
} }
.message-list-section, .message-list-section,
.message-list-section-list { .message-list-section-list {
spacing: $base_spacing; spacing: $base_padding;
} }
// do-not-disturb + clear button // do-not-disturb + clear button
.message-list-controls { .message-list-controls {
margin: ($base_margin * 2) ($base_margin * 4) 0;
// NOTE: remove the padding if notification_bubble could remove margin for drop shadow // NOTE: remove the padding if notification_bubble could remove margin for drop shadow
padding: $base_margin; padding: $base_padding;
spacing: $base_spacing * 2; spacing: $base_padding;
@extend %heading;
.dnd-button {
// We need this because the focus outline isn't inset like for the buttons
// so the dnd button would grow when it gets focus if we didn't change only
// its color when focusing.
border-width: 2px;
border-color: transparent;
border-radius: 32px;
border-style: solid;
&:focus {
border-color: transparentize($selected_bg_color, 0.4);
}
}
} }
// message bubbles // message bubbles
.message { .message {
@include notification_bubble; @include card;
// icon container // icon container
.message-icon-bin { .message-icon-bin {
padding: ($base_padding * 3) 0 ($base_padding * 3) ($base_padding * 2); padding: ($base_padding * 3);
&:rtl { &:ltr {padding-right:$base_padding;}
padding: ($base_padding * 3) ($base_padding * 2) ($base_padding * 3) 0; &:rtl {padding-left:$base_padding;}
}
// icon size and color // icon size and color
> StIcon { > StIcon {
icon-size: $base_icon_size*2; // 32px icon-size: $large_icon_size; // 32px
-st-icon-style: symbolic; -st-icon-style: symbolic;
} }
@@ -54,13 +86,16 @@
// content // content
.message-content { .message-content {
padding: $base_padding + $base_margin * 2;
spacing: 4px; spacing: 4px;
padding: ($base_padding*1.5);
margin-bottom: $base_margin*2;
} }
// title // title
.message-title { .message-title {
font-weight: bold; font-weight: bold;
/* HACK: the label should be baseline-aligned with a 1em label, fake this with some bottom padding */
padding-top: 0.57em;
} }
// secondary container in title box // secondary container in title box
@@ -81,15 +116,17 @@
// close button // close button
.message-close-button { .message-close-button {
color: lighten($fg_color, 15%); color: $fg_color;
&:hover { color: if($variant=='light', lighten($fg_color, 30%), darken($fg_color, 10%)); } background-color: transparentize($fg_color, 0.9);
&:active { color: if($variant=='light', lighten($fg_color, 40%), darken($fg_color, 20%)); } border-radius: 99px;
padding: $base_padding - 1px;
margin: 1px;
&:hover {background-color: transparentize($fg_color, 0.8);}
&:active {background-color: transparentize($fg_color, 0.9);}
} }
// body // body
.message-body { .message-body {color: darken($fg_color, 10%);}
color: darken($fg_color, 10%);
}
} }
// URLs in messages // URLs in messages
@@ -99,30 +136,32 @@
/* Media Controls */ /* Media Controls */
.message-media-control { .message-media-control {
padding: $base_padding * 2 1.64em; // $base_padding * 4 = 24px padding: 0 $base_padding*3;
color: darken($fg_color, 15%); margin: $base_padding*2 0;
border-radius: $base_border_radius;
color: $fg_color;
// uses $hover_bg_color since the media controls are in a notification_bubble // colors are lightened since the media controls are in a card
&:hover { &:hover {
background-color: lighten($hover_bg_color, 5%); background-color: lighten($hover_bg_color, 5%);
color: $fg_color; color: $fg_color;
} }
&:active { &:active {
background-color: darken($hover_bg_color, 2%); background-color: lighten($active_bg_color, 5%);
color: $fg_color; color: $fg_color;
} }
&:insensitive { color: darken($fg_color,40%); } &:insensitive { color: lighten($insensitive_fg_color, 5%); }
// fix border-radius for last button // fix margin for last button
&:last-child:ltr { border-radius: 0 $base_border_radius+2 $base_border_radius+2 0; } &:last-child:ltr { margin-right: $base_margin*3; }
&:last-child:rtl { border-radius: $base_border_radius+2 0 0 $base_border_radius+2; } &:last-child:rtl { margin-left: $base_margin*3; }
} }
// album-art // album-art
.media-message-cover-icon { .media-message-cover-icon {
icon-size: $base_icon_size*2 !important; // 48px icon-size: $base_icon_size*3 !important; // 48px
border-radius: $base_border_radius; border-radius: $base_border_radius;
// when there is no artwork // when there is no artwork
@@ -131,6 +170,7 @@
background-color: $bg_color; background-color: $bg_color;
border: 1px solid transparent; border: 1px solid transparent;
border-radius: $base_border_radius; border-radius: $base_border_radius;
icon-size: $base_icon_size * 2 !important; icon-size: $large_icon_size !important; // 32px
padding: ($base_padding*2 + 2); // 16px
} }
} }
+7 -1
View File
@@ -48,7 +48,7 @@
.caps-lock-warning-label { .caps-lock-warning-label {
text-align: center; text-align: center;
padding-bottom: 8px; padding-bottom: 8px;
@include fontsize($base_font_size - 1); @extend %caption;
color: $warning_color; color: $warning_color;
} }
@@ -57,3 +57,9 @@
.workspace-animation { .workspace-animation {
background-color: $system_bg_color; background-color: $system_bg_color;
} }
/* Tiled window previews */
.tile-preview {
background-color: transparentize($selected_bg_color,0.5);
border: 1px solid $selected_bg_color;
}
@@ -1,4 +1,4 @@
/* Network Dialogs */ /* Select Network dialogs */
.nm-dialog { .nm-dialog {
max-height: 34em; max-height: 34em;
min-height: 31em; min-height: 31em;
@@ -10,47 +10,39 @@
padding: 24px; padding: 24px;
} }
.nm-dialog-airplane-box { spacing: 12px; } .nm-dialog-header { @extend %heading; }
.nm-dialog-subheader { color: $insensitive_fg_color;}
.nm-dialog-airplane-headline { .nm-dialog-header-icon { icon-size: $large_icon_size;}
font-weight: bold;
text-align: center;
}
.nm-dialog-airplane-text { color: $fg_color; }
// header
.nm-dialog-header {
font-weight: bold;
}
.nm-dialog-header-icon {
icon-size: $base_icon_size * 2;
}
.nm-dialog-header-hbox { spacing: 10px; } .nm-dialog-header-hbox { spacing: 10px; }
// list of networks
.nm-dialog-scroll-view { .nm-dialog-scroll-view {
border: 1px solid $borders_color; padding:$base_padding;
padding:0; border-radius: $base_border_radius;
background-color: darken($bg_color, 3%); background-color: $base_color;
} }
// list item
.nm-dialog-item { .nm-dialog-item {
@include fontsize($base_font_size);
border-bottom: 1px solid $borders_color;
padding: $base_padding * 2; padding: $base_padding * 2;
spacing: 0px;
&:selected { &:selected {
background-color: $selected_bg_color; background-color: $selected_bg_color;
border-radius: $base_border_radius - 3px;
color: $selected_fg_color; color: $selected_fg_color;
} }
&:hover { background-color:$hover_bg_color;}
} }
// icons in list
.nm-dialog-icon { icon-size: $base_icon_size; } .nm-dialog-icon { icon-size: $base_icon_size; }
.nm-dialog-icons { spacing: $base_spacing * 2; } .nm-dialog-icons { spacing: $base_padding * 2; }
// no networks // no networks
.no-networks-box { spacing: $base_padding; }
.no-networks-label { color: $insensitive_fg_color; } .no-networks-label { color: $insensitive_fg_color; }
.no-networks-box { spacing: $base_padding; }
// airplane mode
.nm-dialog-airplane-box {
text-align: center;
spacing: 12px;
}
.nm-dialog-airplane-headline { @extend %title_3;}
.nm-dialog-airplane-text { color: $insensitive_fg_color;}
@@ -2,11 +2,15 @@
$notification_banner_height: 64px; $notification_banner_height: 64px;
$notification_banner_width: 34em; $notification_banner_width: 34em;
$notification_banner_radius: $base_border_radius*1.5;
// Banner notifications // Banner notifications
.notification-banner { .notification-banner {
min-height: $notification_banner_height; min-height: $notification_banner_height;
width: $notification_banner_width; width: $notification_banner_width;
box-shadow: 0 2px 4px 2px rgba(0,0,0,0.1);
border-radius: $notification_banner_radius;
margin: $base_margin;
.notification-actions { .notification-actions {
spacing: 0; spacing: 0;
+29 -10
View File
@@ -1,32 +1,51 @@
/* OSD */ /* OSD */
$osd_levelbar_height:8px; $osd_levelbar_height:6px;
.osd-window { .osd-window {
@extend %osd_panel; @extend %osd_panel;
@extend %heading;
text-align: center; text-align: center;
font-weight: bold; font-weight: bold;
spacing: $base_spacing * 2; // 12px spacing: $base_padding * 2; // 12px
margin: $base_margin * 8; // 32px padding: $base_padding * 2 $base_padding * 3;
min-width: 64px; & > * { spacing: 8px; }
min-height: 64px; margin-bottom: 4em;
StIcon { StIcon { icon-size:$large_icon_size;}
icon-size:$base_icon_size * 6;
StLabel {
&:ltr { margin-right: 6px; }
&:rtl { margin-left: 6px; }
} }
.osd-monitor-label { font-size: 3em; }
.level { .level {
margin-bottom: 4px;
&:first-child { margin-bottom: 0px; }
height: $osd_levelbar_height; height: $osd_levelbar_height;
min-width:$base_icon_size * 10;
-barlevel-height: $osd_levelbar_height; -barlevel-height: $osd_levelbar_height;
-barlevel-background-color: transparentize($osd_fg_color, if($variant=='light', 0.7, 0.9)); -barlevel-background-color: transparentize($osd_fg_color, if($variant=='light', 0.7, 0.9));
-barlevel-active-background-color: $osd_fg_color; -barlevel-active-background-color: $osd_fg_color;
-barlevel-overdrive-color: $destructive_color; -barlevel-overdrive-color: $destructive_color;
-barlevel-overdrive-separator-width: 3px; -barlevel-overdrive-separator-width: 3px;
&:ltr { margin-right: 6px; }
&:rtl { margin-left: 6px; }
} }
} }
// Monitor number label
.osd-monitor-label {
@extend %osd_panel;
border-radius: $modal_radius;
font-size: 3em;
font-weight: bold;
margin: $base_margin * 3;
text-align: center;
min-width: 1.3em;
}
/* Pad OSD */ /* Pad OSD */
.pad-osd-window { .pad-osd-window {
padding: 32px; padding: 32px;
@@ -42,4 +61,4 @@ $osd_levelbar_height:8px;
.resize-popup { .resize-popup {
@extend %osd_panel; @extend %osd_panel;
} }
+1 -1
View File
@@ -1,7 +1,7 @@
/* OVERVIEW */ /* OVERVIEW */
.controls-manager, .secondary-monitor-workspaces { .controls-manager, .secondary-monitor-workspaces {
spacing: $base_spacing * 2; spacing: $base_padding * 2;
} }
#overviewGroup { #overviewGroup {
+98 -25
View File
@@ -1,9 +1,8 @@
/* Top Bar */ /* Top Bar */
// a.k.a. the panel // a.k.a. the panel
$panel_corner_radius: $base_border_radius+1;
$panel_bg_color: #000; $panel_bg_color: #000;
$panel_fg_color: #ddd; $panel_fg_color: if($variant == 'light', lighten($bg_color, 10%), darken($fg_color, 5%));
$panel_height: 2.2em; $panel_height: 2.2em;
$panel_transition_duration: 250ms; // same as the overview transition duration $panel_transition_duration: 250ms; // same as the overview transition duration
@@ -11,7 +10,7 @@ $panel_transition_duration: 250ms; // same as the overview transition duration
background-color: $panel_bg_color; background-color: $panel_bg_color;
font-weight: bold; font-weight: bold;
height: $panel_height; height: $panel_height;
font-feature-settings: "tnum"; @extend %numeric;
transition-duration: $panel_transition_duration; transition-duration: $panel_transition_duration;
// transparent panel on lock & login screens // transparent panel on lock & login screens
@@ -19,20 +18,6 @@ $panel_transition_duration: 250ms; // same as the overview transition duration
&.login-screen, &.login-screen,
&:overview { &:overview {
background-color: transparent; background-color: transparent;
.panel-corner {
-panel-corner-opacity: 0;
}
}
// the rounded outset corners
.panel-corner {
-panel-corner-radius: $panel_corner_radius;
-panel-corner-background-color: $panel_bg_color;
-panel-corner-border-width: 2px;
-panel-corner-border-color: transparent;
-panel-corner-opacity: 1;
transition-duration: $panel_transition_duration;
} }
// panel menus // panel menus
@@ -53,8 +38,20 @@ $panel_transition_duration: 250ms; // same as the overview transition duration
} }
} }
&:hover, &:active, &:overview, &:focus, &:checked { &.screen-recording-indicator {
box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.20); box-shadow: inset 0 0 0 100px $screenshot_ui_button_red;
StBoxLayout {
spacing: $base_padding;
}
StIcon {
icon-size: $base_icon_size;
}
}
&:active, &:overview, &:focus, &:checked {
box-shadow: inset 0 0 0 100px transparentize($panel_fg_color, 0.8);
// The clock display needs to have the background on .clock because // The clock display needs to have the background on .clock because
// we want to exclude the do-not-disturb indicator from the background // we want to exclude the do-not-disturb indicator from the background
@@ -62,9 +59,41 @@ $panel_transition_duration: 250ms; // same as the overview transition duration
box-shadow: none; box-shadow: none;
.clock { .clock {
box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.20); box-shadow: inset 0 0 0 100px transparentize($panel_fg_color, 0.8);
} }
} }
&.screen-recording-indicator {
box-shadow: inset 0 0 0 100px transparentize($screenshot_ui_button_red, 0.15);
}
}
&:hover {
box-shadow: inset 0 0 0 100px transparentize($panel_fg_color, 0.85);
&.clock-display {
box-shadow: none;
.clock {
box-shadow: inset 0 0 0 100px transparentize($panel_fg_color, 0.85);
}
}
&.screen-recording-indicator {
box-shadow: inset 0 0 0 100px transparentize($screenshot_ui_button_red, 0.1);
}
}
&:active:hover, &:overview:hover, &:focus:hover, &:checked:hover {
box-shadow: inset 0 0 0 100px transparentize($panel_fg_color, 0.75);
&.clock-display {
box-shadow: none;
.clock {
box-shadow: inset 0 0 0 100px transparentize($panel_fg_color, 0.75);
}
}
&.screen-recording-indicator {
box-shadow: inset 0 0 0 100px transparentize($screenshot_ui_button_red, 0.2);
}
} }
// status area icons // status area icons
@@ -94,16 +123,48 @@ $panel_transition_duration: 250ms; // same as the overview transition duration
&.login-screen, &.login-screen,
&:overview { &:overview {
.panel-button { .panel-button {
&:hover, &:active, &:overview, &:focus, &:checked { &:active, &:overview, &:focus, &:checked {
box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.15); box-shadow: inset 0 0 0 100px rgba(255,255,255, 0.15);
&.clock-display { &.clock-display {
box-shadow: none; box-shadow: none;
.clock { .clock {
box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.15); box-shadow: inset 0 0 0 100px rgba(255,255,255, 0.15);
} }
} }
&.screen-recording-indicator {
box-shadow: inset 0 0 0 100px transparentize($screenshot_ui_button_red, 0.15);
}
}
&:hover {
box-shadow: inset 0 0 0 100px rgba(255,255,255, 0.10);
&.clock-display {
box-shadow: none;
.clock {
box-shadow: inset 0 0 0 100px rgba(255,255,255, 0.10);
}
}
&.screen-recording-indicator {
box-shadow: inset 0 0 0 100px transparentize($screenshot_ui_button_red, 0.1);
}
}
&:active:hover, &:overview:hover, &:focus:hover, &:checked:hover {
box-shadow: inset 0 0 0 100px rgba(255,255,255, 0.2);
&.clock-display {
box-shadow: none;
.clock {
box-shadow: inset 0 0 0 100px rgba(255,255,255, 0.2);
}
}
&.screen-recording-indicator {
box-shadow: inset 0 0 0 100px transparentize($screenshot_ui_button_red, 0.2);
}
} }
} }
} }
@@ -125,11 +186,23 @@ $panel_transition_duration: 250ms; // same as the overview transition duration
// App Menu // App Menu
#appMenu { #appMenu {
spacing: $base_spacing; spacing: $base_padding;
.label-shadow { color: transparent; } .label-shadow { color: transparent; }
} }
#appMenu .panel-status-menu-box { #appMenu .panel-status-menu-box {
padding: 0 $base_padding; padding: 0 $base_padding;
spacing: $base_spacing; spacing: $base_padding;
}
// Clock
.clock-display-box {
spacing: 2px;
.clock {
padding-left: $base_padding * 2;
padding-right: $base_padding * 2;
}
} }
+132 -59
View File
@@ -1,16 +1,8 @@
/* Popovers/Menus */ /* Popovers/Menus */
$popover_arrow_height: 12px; // the popover itself
//.the popover itself
.popup-menu-boxpointer { .popup-menu-boxpointer {
-arrow-border-radius: $base_border_radius+4; -arrow-rise: $base_margin+2px; // distance from the panel & screen edge
-arrow-background-color: $bg_color;
-arrow-border-width: 1px;
-arrow-border-color: $borders_color;
-arrow-base: $popover_arrow_height * 2;
-arrow-rise: $popover_arrow_height;
-arrow-box-shadow: 0 1px 3px rgba(0,0,0,0.5); // dreaming bugzilla #689995
} }
// container of the popover menu // container of the popover menu
@@ -18,114 +10,195 @@ $popover_arrow_height: 12px;
min-width: 15em; min-width: 15em;
color: $fg_color; color: $fg_color;
//.popup-status-menu-item { font-weight: normal; color: pink; } //dunno what that is //.popup-status-menu-item {font-weight: normal; color: pink;} //dunno what that is
&.panel-menu { &.panel-menu {
-boxpointer-gap: $base_margin; // distance from the panel margin-bottom: 1.75em; // so it doesn't touch the bottom of the screen
margin-bottom: 1.75em;
} }
} }
// popover content
.popup-menu-content { .popup-menu-content {
padding: $base_padding * 2 + $base_margin 0; padding: $base_padding;
border-radius: $modal_radius - 2px;
border: 1px solid $borders_edge;
box-shadow: 0 2px 4px 0 rgba(0,0,0,0.1);
background-color: $bg_color;
} }
// menu items // menu items
.popup-menu-item { .popup-menu-item {
padding: $base_padding*1.5 $base_padding*2;
border-radius: $base_border_radius;
spacing: $base_padding; spacing: $base_padding;
padding: $base_padding; transition: 0.2s all ease;
background-color: transparent;
&:ltr { padding-right:1.75em; padding-left: 0; } &:ltr {padding-left: $base_padding;}
&:rtl { padding-right: 0; padding-left:1.75em; } &:rtl {padding-right: $base_padding;}
&:focus, &:hover {
background-color: $hover_bg_color !important;
&:active { background-color: $active_bg_color !important;}
}
&:checked {background-color: $checked_bg_color !important;}
&:checked { &:checked {
background-color: lighten($bg_color, 2%); margin-bottom: 0;
box-shadow: none; box-shadow: inset 0 -1px 0 0 darken($checked_bg_color, 5%);
border-radius: $base_border_radius $base_border_radius 0 0;
&:focus,&:hover { background-color: lighten($checked_bg_color, 3%) !important;}
&:active { background-color: lighten($checked_bg_color, 5%) !important;}
} }
&.selected { &:active {
background-color: transparentize(white, if($variant=='light', 0.2, 0.9)); background-color: lighten($active_bg_color, 5%);
color: $fg_color; color: $active_fg_color;
} }
&:active { &:insensitive {color: transparentize($fg_color,0.5);}
background-color: $selected_bg_color;
color: $selected_fg_color;
}
&:insensitive { color: transparentize($fg_color,0.5);} // add margin to switches in menu items
.toggle-switch {
&:ltr { margin-left: $base_margin;}
&:rtl { margin-right: $base_margin;}
}
} }
// all icons and other graphical elements
// all other graphical elements (sliders)
.popup-inactive-menu-item { .popup-inactive-menu-item {
color: $fg_color; color: $fg_color;
&:insensitive { color: $insensitive_fg_color; }
&:insensitive { color: transparentize($fg_color,0.5); }
} }
// symbolic icons in popover // symbolic icons in popover
.popup-menu-arrow, .popup-menu-arrow,
.popup-menu-icon { icon-size: $base_icon_size; } .popup-menu-icon {
icon-size: 16px !important; // for some reason the variable doesn't work here
}
.popup-menu-arrow {
}
// popover submenus // popover submenus
.popup-sub-menu { .popup-sub-menu {
background-color: darken($bg_color, 3%); background-color: $checked_bg_color;
box-shadow: none; border-radius: 0 0 $base_border_radius $base_border_radius;
border-top: 1px solid transparentize($borders_color, 0.2);
border-bottom: 1px solid transparentize($borders_color, 0.2); .popup-menu-ornament {
min-width: $base_icon_size !important;
}
// submenu specific styles
.popup-menu-item {
border-radius: 0;
margin: 0;
&:last-child {
border-radius: 0 0 $base_border_radius $base_border_radius;
}
&:focus,&:hover { background-color: lighten($hover_bg_color, 10%) !important;}
&:checked {
background-color: lighten($checked_bg_color, 10%) !important;
&:focus,&:hover { background-color: lighten($checked_bg_color, 8%) !important;}
}
&:active { background-color: lighten($active_bg_color, 10%) !important;}
}
.popup-menu-section {
.popup-menu-item:last-child {
&:hover,&:focus { border-radius: 0;}
}
&:last-child .popup-menu-item:last-child {
border-radius: 0 0 $base_border_radius $base_border_radius;
}
}
} }
// container for radio and check boxes // container for radio and check boxes
.popup-menu-ornament { .popup-menu-ornament {
@extend %heading;
width: 1.2em; width: 1.2em;
text-align: center !important;
&:ltr { text-align: right }; &:ltr { text-align: right;}
&:rtl { text-align: left }; &:rtl { text-align: left;}
} }
// separator // separator
.popup-separator-menu-item { .popup-separator-menu-item {
padding: 0; margin: 6px 0;
padding:0 !important;
&:ltr { margin-right: $base_margin;}
&:rtl { margin-left: $base_margin;}
.popup-separator-menu-item-separator { .popup-separator-menu-item-separator {
//-margin-horizontal: 24px;
height: 1px; //not really the whole box height: 1px; //not really the whole box
margin: 6px 64px; background-color: $borders_color;
background-color: lighten($borders_color, 2%); }
.popup-sub-menu & { //submenu separators
margin: 0 64px 0 32px; .popup-menu-ornament {
@if $variant == 'dark' { width: 0 !important;
background-color: lighten($bg_color,10%); }
}
// separators in submenus
.popup-sub-menu & {
background-color: transparent;
// account for ornament
&:ltr { margin-right: 2.5em;}
&:rtl { margin-left: 2.5em;}
.popup-separator-menu-item-separator {
background-color: lighten($borders_color, 7%);
} }
} }
} }
// desktop background menu // desktop background menu
.background-menu { .background-menu {
-boxpointer-gap: $base_margin; -boxpointer-gap: 0px;
-arrow-rise: 0px; // hide the beak on the menu -arrow-rise: 0px; // hide the beak on the menu
} }
// system status menu // system status menu
.aggregate-menu { .aggregate-menu {
min-width: 21em; min-width: 22em;
// this is unneeded at the top-level in this menu, hide it
.popup-menu-ornament { width: 0 !important; }
// lock screen, shutdown, etc. buttons // lock screen, shutdown, etc. buttons
.popup-menu-icon { .popup-menu-icon {
padding:0;
margin: 0 $base_margin;
-st-icon-style: symbolic; -st-icon-style: symbolic;
&:ltr {margin-right: $base_margin*2;}
&:rtl {margin-left: $base_margin*2;}
} }
// account for ornaments in submenus with padding
.popup-sub-menu .popup-menu-item > :first-child { .popup-sub-menu .popup-menu-item > :first-child {
// account for icons in submenus with padding // this value is hardcoded for visual effect
&:ltr { &:ltr { margin-left: 1em;}
padding-left: $base_padding + $base_margin * 2; &:rtl { margin-right: 1em;}
margin-left: $base_icon_size; }
} }
&:rtl {
padding-right: $base_padding + $base_margin * 2; ; // right-click (and panel) app menu
margin-right: $base_icon_size; .app-menu {
max-width: 27.25em;
// this is unneeded at the top-level in this menu, hide it
.popup-menu-ornament { width: 0 !important; }
.popup-inactive-menu-item:first-child {
// "Open Windows" label
> StLabel {
@extend %caption_heading;
&:ltr {margin-right: $base_margin*2;}
&:rtl {margin-left: $base_margin*2;}
} }
} }
} }
@@ -11,7 +11,7 @@
.unlock-dialog-clock-time { .unlock-dialog-clock-time {
font-size: 64pt; font-size: 64pt;
padding-top: 42px; padding-top: 42px;
font-feature-settings: "tnum"; @extend %numeric;
} }
.unlock-dialog-clock-date { .unlock-dialog-clock-date {
@@ -25,10 +25,11 @@
} }
.unlock-dialog-notifications-container { .unlock-dialog-notifications-container {
margin: 12px 0; margin: 12px;
spacing: 6px; spacing: 6px;
width: 23em; width: 23em;
background-color: transparent; background-color: transparent;
.summary-notification-stack-scrollview { .summary-notification-stack-scrollview {
padding-top: 0; padding-top: 0;
padding-bottom: 0; padding-bottom: 0;
@@ -36,39 +37,36 @@
.notification, .notification,
.unlock-dialog-notification-source { .unlock-dialog-notification-source {
padding: 12px 6px; padding: 12px 16px;
border: none; border: none;
background-color: transparentize($osd_bg_color,0.7); background-color: transparentize($osd_fg_color,0.9);
color: $osd_fg_color; color: $osd_fg_color;
border-radius: $modal_radius; border-radius: $modal_radius;
&.critical { background-color: transparentize($osd_bg_color,0.1) } &.critical { background-color: transparentize($osd_fg_color,0.8) }
} }
} }
.unlock-dialog-notification-label { .unlock-dialog-notification-label {
padding: 0px 0px 0px 12px; padding: 0 0 0 12px;
} }
.unlock-dialog-notification-count-text { .unlock-dialog-notification-count-text {
weight: bold; font-weight: bold;
padding: 0 6px; padding: 0 12px;
color: $osd_bg_color; color: $osd_fg_color;
background-color: transparentize($osd_fg_color, 0.7); background-color: transparentize($osd_fg_color, 0.9);
border-radius: 99px; border-radius: 99px;
margin-right: 12px;
} }
.screen-shield-background { //just the shadow, really .screen-shield-background { //just the shadow, really
background: black; background: black;
box-shadow: 0px 2px 4px rgba(0,0,0,0.6); box-shadow: 0 2px 4px rgba(0,0,0,0.6);
} }
#lockDialogGroup { #lockDialogGroup {
background-color: $system_bg_color; background-color: $system_bg_color;
} }
#unlockDialogNotifications { #unlockDialogNotifications {
StButton#vhandle, StButton#hhandle { StButton#vhandle, StButton#hhandle {
background-color: transparentize($bg_color,0.7); background-color: transparentize($bg_color,0.7);
@@ -0,0 +1,201 @@
// Screenshot UI
.icon-label-button-container {
spacing: $base_padding;
@extend %caption;
StIcon { icon-size: 32px;}
}
$screenshot_ui_panel_padding: $base_padding*3;
$screenshot_ui_shot_cast_margin: 21px;
$screenshot_ui_panel_border_radius: $modal_radius + $screenshot_ui_shot_cast_margin;
$screenshot_ui_shot_cast_spacing: 3px;
$screenshot_ui_button_red: $error_color;
.screenshot-ui-panel {
@extend %osd_panel;
border-radius: $screenshot_ui_panel_border_radius;
padding: $screenshot_ui_panel_padding;
// Reduce the bottom padding a little to accommodate the large capture button.
padding-bottom: $screenshot_ui_panel_padding - 6px;
margin-bottom: 4em;
spacing: $base_padding * 2;
}
.screenshot-ui-close-button {
@extend .window-close; // copy window close button
padding: $base_padding !important; // but with more padding
&.left { margin-left: 8px;}
&.right { margin-right: 8px;}
}
.screenshot-ui-type-button {
@extend %osd_button;
min-width: 48px;
padding: $base_padding * 2 $base_padding * 3 !important;
border-radius: $screenshot_ui_panel_border_radius - $screenshot_ui_panel_padding;
}
.screenshot-ui-capture-button {
width: 36px;
height: 36px;
border-radius: 99px;
border: 4px $osd_fg_color;
padding: 4px;
.screenshot-ui-capture-button-circle {
background-color: $osd_fg_color;
transition-duration: 200ms;
&:hover, &:focus { background-color: $hover_bg_color;}
border-radius: 99px;
}
&:hover, &:focus {
.screenshot-ui-capture-button-circle {
background-color: darken($osd_fg_color, 15%);
}
}
&:active {
.screenshot-ui-capture-button-circle {
background-color: darken($osd_fg_color, 50%);
}
}
&:cast {
.screenshot-ui-capture-button-circle {
background-color: $screenshot_ui_button_red;
}
&:hover, &:focus {
.screenshot-ui-capture-button-circle {
background-color: lighten($screenshot_ui_button_red, 5%);
}
}
&:active {
.screenshot-ui-capture-button-circle {
background-color: darken($screenshot_ui_button_red, 7%);
}
}
}
}
.screenshot-ui-shot-cast-container {
background-color: $hover_bg_color;
border-radius: $modal_radius;
padding: $screenshot_ui_shot_cast_spacing;
spacing: $screenshot_ui_shot_cast_spacing;
&:ltr { margin-left: $screenshot_ui_shot_cast_margin - $screenshot_ui_panel_padding;}
&:rtl { margin-right: $screenshot_ui_shot_cast_margin - $screenshot_ui_panel_padding;}
}
.screenshot-ui-shot-cast-button {
padding: $base_padding $base_padding*2;
background-color: transparent;
&:hover, &:focus { background-color: lighten($hover_bg_color, 5%);}
&:active { background-color: lighten($active_bg_color,5%);}
&:checked { background-color: white;color: black;}
border-radius: $modal_radius - $screenshot_ui_shot_cast_spacing;
StIcon { icon-size: $base_icon_size;}
}
.screenshot-ui-show-pointer-button {
@extend %osd_button;
border-radius: 99px;
padding: $base_padding * 2 !important;
StIcon { icon-size: $base_icon_size;}
}
.screenshot-ui-area-indicator-shade {
background-color: rgba(0,0,0,.3);
}
.screenshot-ui-area-selector {
.screenshot-ui-area-indicator-shade {
background-color: rgba(0,0,0,.5);
}
.screenshot-ui-area-indicator-selection {
border: 2px white;
}
}
.screenshot-ui-area-selector-handle {
border-radius: 99px;
background-color: white;
box-shadow: 0 1px 3px 2px rgba(0,0,0,0.2);
width: 24px;
height: 24px;
}
.screenshot-ui-window-selector {
background-color: $system_bg_color;
.screenshot-ui-window-selector-window-container {
margin: 100px;
}
&:primary-monitor {
.screenshot-ui-window-selector-window-container {
// Make some room for the panel.
margin-bottom: 200px;
}
}
}
.screenshot-ui-window-selector-window-border {
transition-duration: 200ms;
border-radius: $modal_radius;
border: 6px transparent;
}
.screenshot-ui-window-selector-check {
transition-duration: 200ms;
color: transparent;
border-radius: 99px;
border-width: 12px;
icon-size: 24px;
}
.screenshot-ui-window-selector-window {
&:hover {
.screenshot-ui-window-selector-window-border {
border-color: darken($selected_bg_color, 15%);
}
}
&:checked {
.screenshot-ui-window-selector-window-border {
border-color: $selected_bg_color;
background-color: transparentize($selected_bg_color, 0.8);
}
.screenshot-ui-window-selector-check {
color: $selected_fg_color;
background-color: $selected_bg_color;
}
}
}
.screenshot-ui-screen-selector {
transition-duration: 200ms;
background-color: rgba(0,0,0,.5);
&:hover { background-color: rgba(0,0,0,.3);}
&:active { background-color: rgba(0,0,0,.7);}
&:checked {
background-color: transparent;
border: 2px white;
}
}
.screenshot-ui-tooltip {
color: $osd_fg_color;
background-color: $osd_bg_color;
border-radius: 99px;
padding: $base_padding $base_padding * 2;
text-align: center;
-y-offset: 24px;
}
@@ -9,8 +9,8 @@ StScrollBar {
padding: 0; padding: 0;
StScrollView & { StScrollView & {
min-width: 14px; min-width: 8px;
min-height: 14px; min-height: 8px;
} }
StBin#trough { StBin#trough {
@@ -20,10 +20,10 @@ StScrollBar {
StButton#vhandle, StButton#hhandle { StButton#vhandle, StButton#hhandle {
border-radius: 8px; border-radius: 8px;
background-color: mix($fg_color, $bg_color, 60%); background-color: mix($fg_color, $bg_color, 30%);
//border: 3px solid transparent; //would be nice to margin or at least to transparent border: 3px solid transparent; //would be nice to margin or at least to transparent
margin: 3px; transition: 500ms all ease;
&:hover { background-color: mix($fg_color, $bg_color, 80%); } &:hover {background-color: mix($fg_color, $bg_color, 50%);}
&:active { background-color: $selected_bg_color; } &:active {background-color: mix($fg_color, $bg_color, 40%);}
} }
} }
@@ -5,33 +5,22 @@ $search_entry_height: 36px;
%search_entry, %search_entry,
.search-entry { .search-entry {
width: $search_entry_width;
padding: $base_padding+1 $base_padding+3;
border-radius: $search_entry_height * 0.5; // half the height border-radius: $search_entry_height * 0.5; // half the height
color: transparentize($fg_color,0.3);
background-color: $bg_color;
border-color: $borders_color;
margin-top: $base_spacing * 2;
margin-bottom: $base_spacing;
&:hover { margin-top: $base_padding * 2;
background-color: $hover_bg_color; margin-bottom: $base_padding;
border-color: $hover_borders_color; padding: $base_padding+1 $base_padding+3;
color: $hover_fg_color; width: $search_entry_width;
}
&:focus { @include entry(normal);
padding: $base_padding $base_padding+2; // 1px less to account for wider border &:hover { @include entry(hover);}
border-width: 2px; &:focus { @include entry(focus);}
border-style: solid; &:insensitive { @include entry(insensitive);}
border-color: $selected_bg_color;
color: $fg_color;
box-shadow: inset 0 1px 2px 1px rgba(0,0,0,0.2);
}
.search-entry-icon { .search-entry-icon {
icon-size: $base_icon_size;
padding: 0 4px;
color: inherit; color: inherit;
icon-size: $base_icon_size;
margin-top: 2px; // center vertically
padding: 0 4px;
} }
} }
@@ -1,94 +1,82 @@
/* Search */ /* Search */
// search overview container // search overview container
#searchResults {
margin: 0 $base_margin;
}
#searchResultsContent { #searchResultsContent {
max-width: 1024px; max-width: 1072px;
spacing: $base_margin * 2;
} }
// search results sections "the boxes" // search results sections "the boxes"
.search-section { .search-section {
// This should be equal to #searchResultsContent spacing // This should be equal to #searchResultsContent spacing
spacing: $base_margin * 2; spacing: $base_padding*3;
// separator // separator (unstyled)
.search-section-separator { .search-section-separator {
// height: 1px; height: $base_margin*2; // use it as a spacer
// background-color: $osd_outer_borders_color;
height: 0;
background-color: transparent; background-color: transparent;
} }
} }
// content // content
.search-section-content { .search-section-content {
background-color: transparentize(lighten($osd_bg_color, 5%), 0.2); background-color: lighten($system_bg_color, 5%);
border-radius: $modal_radius+3; border-radius: $modal_radius*1.5;
border: 1px solid $osd_outer_borders_color; border: 1px solid $osd_outer_borders_color;
box-shadow: 0 2px 4px 0 $shadow_color;
text-shadow: 0 1px if($variant == 'light', rgba(255,255,255,0.2), rgba(0,0,0,0.2));
color: $osd_fg_color; color: $osd_fg_color;
padding: $base_padding * 3; padding: $base_padding*2;
// This is the space between the provider icon and the results container margin:0 $base_margin*3;
spacing: $base_margin * 2;
} }
%search-section-content-item { %search_section_content_item {
@extend %icon_tile; @include tile_button($osd_fg_color);
border-radius: $base_border_radius+3px;
&:focus,
&:hover,
&:selected {
background-color: transparentize($osd_fg_color, .9);
transition-duration: 200ms;
}
&:active,
&:checked {
background-color: transparentize(darken($osd_bg_color, 10%), .1);
}
} }
// "no results" text // "no results" text
.search-statustext { .search-statustext {
@extend %status_text; @extend %title_1;
} }
.grid-search-results { .grid-search-results {
spacing: $base_spacing * 6; spacing: $base_padding*5;
margin:0 $base_margin*3;
} }
// Search results with icons // Search results with icons
.grid-search-result { .grid-search-result {
@extend %app-well-app; @extend .app-well-app;
} }
// search result provider // search result provider
.search-provider-icon { .search-provider-icon {
@extend %search-section-content-item; @extend %search_section_content_item;
&:ltr {margin-right: $base_margin;}
&:rtl {margin-left: $base_margin;}
// content // content
.list-search-provider-content { .list-search-provider-content {
spacing: $base_spacing * 2; spacing: $base_padding * 2;
// provider labels // provider labels
.list-search-provider-details { .list-search-provider-details {
width: 120px; width: 120px;
margin-top: 0; color: $osd_fg_color;
color: darken($osd_fg_color, 8%);
// font-weight: bold;
} }
} }
} }
// search results list // search results list
.list-search-results { .list-search-results {
spacing: $base_spacing; spacing: $base_padding;
} }
// search result listitem // search result listitem
.list-search-result { .list-search-result {
@extend %search-section-content-item; @extend %search_section_content_item;
// content // content
.list-search-result-content { .list-search-result-content {
@@ -97,12 +85,12 @@
// list item title (with leading icon) // list item title (with leading icon)
.list-search-result-title { .list-search-result-title {
spacing: $base_spacing * 2; spacing: $base_padding * 2;
// font-weight: bold; // font-weight: bold;
} }
// list item description // list item description
.list-search-result-description { .list-search-result-description {
color: darken($osd_fg_color, 30%); color: $osd_insensitive_fg_color;
} }
} }
+11 -16
View File
@@ -1,27 +1,22 @@
/* Slider */ /* Slider */
$slider_size: 15px; $slider_size: 16px;
.slider { .slider {
height: $slider_size;
// slider trough // slider trough
-barlevel-height: 3px; // has to be an odd number -barlevel-height: 4px;
-barlevel-background-color: $borders_color; //background of the trough -barlevel-background-color: if($variant == 'light', transparentize($fg_color, 0.6), transparentize($fg_color, 0.8)); //background of the trough
-barlevel-border-width: 1px; -barlevel-border-width: 2px;
-barlevel-border-color: $borders_color; // trough border color -barlevel-border-color: transparent; // trough border color
// fill style // fill style
-barlevel-active-background-color: $selected_bg_color; //active trough fill -barlevel-active-background-color: $selected_bg_color;
-barlevel-active-border-color: if($variant == 'light', darken($selected_bg_color, 4%), lighten($selected_bg_color, 2%)); //active trough border -barlevel-active-border-color: transparent;
// overfill style (red in this case) // overfill style (red in this case)
-barlevel-overdrive-color: $destructive_color; -barlevel-overdrive-color: $destructive_color;
-barlevel-overdrive-border-color: if($variant == 'light', darken($destructive_color, 4%), lighten($destructive_color, 2%)); //trough border when red; -barlevel-overdrive-border-color: transparent; //trough border when red;
-barlevel-overdrive-separator-width:1px; -barlevel-overdrive-separator-width:1px;
// slider handler // slider handler
-slider-handle-radius: $slider_size * 0.5; // half the size of the size -slider-handle-radius: $slider_size * 0.5; // half the size of the size
-slider-handle-border-width: 1px; -slider-handle-border-width: 0;
-slider-handle-border-color: if($variant == 'light', $borders_color, $fg_color); -slider-handle-border-color: transparent; // because 0 width
}
color: if($variant == 'light', lighten($bg_color, 10%), $fg_color);
&:hover { color: $hover_bg_color; }
&:active { color: $active_bg_color; }
}
@@ -1,37 +1,33 @@
/* App Switcher */ /* App Switcher */
// same as dash
$switcher_padding: $base_padding + 4px; // 10px
$switcher_border_radius: $modal_radius + 8px;
// the full screen container of the switcher
.switcher-popup { .switcher-popup {
padding: 8px; padding: 0;
spacing: $base_spacing * 4; spacing: $base_padding * 4;
} }
// switcher onscreen panel // switcher onscreen panel
.switcher-list { .switcher-list {
@extend %osd_panel; @extend %osd_panel;
padding: $switcher_padding;
border-radius: $switcher_border_radius;
box-shadow: 0 8px 8px 0 rgba(0,0,0,0.1);
// container for items in list
.switcher-list-item-container {
spacing: $base_padding * 2;
}
// each item in the list
.item-box { .item-box {
padding: 8px; @include tile_button($osd_fg_color);
border-radius: $base_border_radius + 1px; // override over style so mouse doesn't steal focus
border: 1px solid transparent; &:hover {background: none;}
&:outlined {
background-color: transparentize($osd_fg_color, 0.7);
}
&:selected {
background-color: transparentize($osd_fg_color, 0.7);
color: $osd_fg_color;
}
}
// window thumbnails
.thumbnail-box {
padding: 2px;
spacing: $base_spacing;
}
.thumbnail {
width: 256px;
} }
.separator { .separator {
@@ -39,16 +35,27 @@
background: $borders_color; background: $borders_color;
} }
.switcher-list-item-container { // container of thumbnails
spacing: $base_spacing * 2; .thumbnail-box {
padding: 2px;
spacing: $base_padding;
}
// window thumbnail itself
.thumbnail {
width: 256px; // equal to THUMBNAIL_DEFAULT_SIZE in altTab.js
border-radius:$base_border_radius;
} }
} }
// arrow if app has multiple windows
.switcher-arrow { .switcher-arrow {
border-color: rgba(0,0,0,0); border-color: transparentize($osd_fg_color, 0.2);
color: transparentize($fg_color,0.2); color: transparentize($osd_fg_color, 0.2);
&:highlighted { &:highlighted {
color: $fg_color; border-color: $osd_fg_color;
color: $osd_fg_color;
} }
} }
+5 -5
View File
@@ -1,16 +1,16 @@
/* Switches */ /* Switches */
// these are equal to the size of the SVG assets // these are equal to the size of the SVG assets
$switch_height: 22px; $switch_height: 26px;
$switch_width: 46px; $switch_width: 48px;
.toggle-switch { .toggle-switch {
color: $fg_color; color: $fg_color;
height: $switch_height; height: $switch_height;
width: $switch_width; width: $switch_width;
background-size: contain; background-size: contain;
background-image: if($variant == 'light', url("resource:///org/gnome/shell/theme/toggle-off.svg"),url("resource:///org/gnome/shell/theme/toggle-off-dark.svg")); background-image: if($variant == 'light', url("resource:///org/gnome/shell/theme/toggle-off-light.svg"),url("resource:///org/gnome/shell/theme/toggle-off.svg"));
&:checked { &:checked {
background-image: if($variant == 'light', url("resource:///org/gnome/shell/theme/toggle-on.svg"),url("resource:///org/gnome/shell/theme/toggle-on-dark.svg")); background-image: if($variant == 'light', url("resource:///org/gnome/shell/theme/toggle-on-light.svg"),url("resource:///org/gnome/shell/theme/toggle-on.svg"));
} }
} }
@@ -1,19 +0,0 @@
/* Tiled window previews */
$tile_corner_radius: $base_border_radius + 1px;
.tile-preview {
background-color: transparentize($selected_bg_color,0.5);
border: 1px solid $selected_bg_color;
}
.tile-preview-left.on-primary {
border-radius: $tile_corner_radius 0 0 0;
}
.tile-preview-right.on-primary {
border-radius: 0 $tile_corner_radius 0 0;
}
.tile-preview-left.tile-preview-right.on-primary {
border-radius: $tile_corner_radius $tile_corner_radius 0 0;
}
@@ -1,10 +1,11 @@
/* Window Picker */ /* Window Picker */
$window_picker_spacing: $base_spacing; // 6px $window_picker_spacing: $base_padding; // 6px
$window_picker_padding: $base_padding * 2; // 12px $window_picker_padding: $base_padding * 2; // 12px
$window_thumbnail_label_color: transparentize($osd_bg_color, 0.4); $window_thumbnail_label_color: transparentize($osd_bg_color, 0.4);
$window_close_button_color: darken(transparentize($osd_bg_color, .05), 3%);
$window_close_button_size: 30px; $window_close_button_size: 30px;
$window_close_button_padding: 3px; $window_close_button_padding: 3px;
@@ -24,30 +25,28 @@ $window_close_button_padding: 3px;
// Close button // Close button
.window-close { .window-close {
background-color: $osd_bg_color; background-color: $window_close_button_color;
color: $osd_fg_color; color: $osd_fg_color;
border-radius: $window_close_button_size * 0.5 + $window_close_button_padding * 2; border-radius: 99px;
padding: $window_close_button_padding; padding: $window_close_button_padding;
height: $window_close_button_size; height: $window_close_button_size;
width: $window_close_button_size; width: $window_close_button_size;
box-shadow: -1px 1px 5px 0px rgba(0,0,0,0.5);
transition-duration: 300ms; transition-duration: 300ms;
& StIcon { icon-size: 24px; } & StIcon { icon-size: 24px; } // uses non standard icon size
&:hover { &:hover {
background-color: lighten($osd_bg_color, 15%); background-color: mix($osd_fg_color, $window_close_button_color, 15%);
} }
&:active { &:active {
color: transparentize($osd_fg_color, 0.2); color: transparentize($osd_fg_color, 0.2);
background-color: darken($osd_bg_color, 5%); background-color: darken($window_close_button_color, 5%);
} }
} }
.workspace-background { .workspace-background {
// keep in sync with BACKGROUND_CORNER_RADIUS_PIXELS in workspace.js // keep in sync with BACKGROUND_CORNER_RADIUS_PIXELS in workspace.js
border-radius: 30px; border-radius: 30px;
background-color: $osd_bg_color;
box-shadow: 0 4px 16px 4px transparentize(darken($osd_bg_color, 30%), 0.7); box-shadow: 0 4px 16px 4px transparentize(darken($osd_bg_color, 30%), 0.7);
} }
@@ -1,36 +1,25 @@
/* Workspace Switcher */ /* Workspace Switcher */
.workspace-switcher-group {
padding: $base_padding * 2;
}
.workspace-switcher-container { $ws_indicator_height: $large_icon_size;
@extend %osd_panel; $ws_dot_active: $ws_indicator_height / 3;
} $ws_dot_inactive: $ws_indicator_height / 6;
.workspace-switcher { .workspace-switcher {
background: transparent; @extend %osd_panel;
border: none; margin-bottom: 4em;
border-radius: 0; spacing: $base_padding * 2;
padding: 0; padding: $base_padding * 2 $base_padding * 3;
spacing: $base_spacing * 2;
} }
.ws-switcher-box { .ws-switcher-indicator {
background: transparent; background-color: transparentize($osd_fg_color,0.5);
height: 50px; padding: $ws_dot_inactive / 2;
background-size: 32px; margin: ($ws_indicator_height - $ws_dot_inactive) / 2;
border: 1px solid transparentize($osd_fg_color,0.9); border-radius: $ws_indicator_height;
border-radius: $base_border_radius + 3px;
}
// active workspace in the switcher &:active {
.ws-switcher-active-up, background-color: $osd_fg_color;
.ws-switcher-active-down, padding: $ws_dot_active / 2;
.ws-switcher-active-left, margin: ($ws_indicator_height - $ws_dot_active) / 2;
.ws-switcher-active-right { }
height: 52px;
background-color: $selected_bg_color;
border: 1px solid if($variant=='light', darken($selected_bg_color, 8%), lighten($selected_bg_color, 5%));
border-radius: $base_border_radius + 3px;
color: $selected_fg_color;
} }
@@ -3,7 +3,7 @@
// thumbnails in overview // thumbnails in overview
.workspace-thumbnails { .workspace-thumbnails {
visible-width: 32px; //amount visible before hover visible-width: 32px; //amount visible before hover
spacing: $base_spacing; spacing: $base_padding;
padding: $base_padding; padding: $base_padding;
.workspace-thumbnail { .workspace-thumbnail {
+31 -15
View File
@@ -1,12 +1,34 @@
session_desktop = 'gnome-classic.desktop' session_desktop_base = 'gnome-classic'
i18n.merge_file('',
input: session_desktop + '.in', session_desktops = [
output: session_desktop, session_desktop_base,
po_dir: '../po', session_desktop_base + '-xorg',
install: true, session_desktop_base + '-wayland',
install_dir: xsessiondir, ]
type: 'desktop'
) foreach name: session_desktops
session_desktop = name + '.desktop'
if name.endswith('-xorg')
session_instdir = xsessiondir
elif name.endswith('-wayland')
session_instdir = wlsessiondir
else
# FIXME: The same target can not be copied into two directories.
# There is a workaround in meson/session-post-install.py until proper
# solution arises:
# https://github.com/mesonbuild/meson/issues/2416
session_instdir = xsessiondir
#session_instdir = [ xesssiondir, wlsessiondir ]
endif
i18n.merge_file(
input: session_desktop + '.in',
output: session_desktop,
po_dir: '../po',
install: true,
install_dir: session_instdir,
type: 'desktop'
)
endforeach
classic_uuids = [] classic_uuids = []
foreach e : classic_extensions foreach e : classic_extensions
@@ -60,19 +82,13 @@ theme_sources = files(
'gnome-shell-sass/widgets/_slider.scss', 'gnome-shell-sass/widgets/_slider.scss',
'gnome-shell-sass/widgets/_switcher-popup.scss', 'gnome-shell-sass/widgets/_switcher-popup.scss',
'gnome-shell-sass/widgets/_switches.scss', 'gnome-shell-sass/widgets/_switches.scss',
'gnome-shell-sass/widgets/_tiled-previews.scss',
'gnome-shell-sass/widgets/_window-picker.scss', 'gnome-shell-sass/widgets/_window-picker.scss',
'gnome-shell-sass/widgets/_workspace-switcher.scss', 'gnome-shell-sass/widgets/_workspace-switcher.scss',
'gnome-shell-sass/widgets/_workspace-thumbnails.scss' 'gnome-shell-sass/widgets/_workspace-thumbnails.scss'
) )
theme_data = [ theme_data = [
'calendar-today.svg',
'classic-process-working.svg', 'classic-process-working.svg',
'classic-toggle-off-intl.svg',
'classic-toggle-off-us.svg',
'classic-toggle-on-intl.svg',
'classic-toggle-on-us.svg',
'gnome-classic-high-contrast.css' 'gnome-classic-high-contrast.css'
] ]
+1 -1
View File
@@ -7,7 +7,7 @@ builddir=`mktemp -p $srcdir -d _build.XXXXXX` || exit 1
installdir=`mktemp -p $srcdir -d _install.XXXXXX` || exit 1 installdir=`mktemp -p $srcdir -d _install.XXXXXX` || exit 1
meson setup --prefix=$installdir -Dextension_set=all $srcdir $builddir meson setup --prefix=$installdir -Dextension_set=all $srcdir $builddir
ninja -C$builddir install meson install -C $builddir
rm -rf $srcdir/zip-files rm -rf $srcdir/zip-files
mkdir $srcdir/zip-files mkdir $srcdir/zip-files
+40 -33
View File
@@ -12,9 +12,7 @@ const Main = imports.ui.main;
const PanelMenu = imports.ui.panelMenu; const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu; const PopupMenu = imports.ui.popupMenu;
const Me = ExtensionUtils.getCurrentExtension(); const _ = ExtensionUtils.gettext;
const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']);
const _ = Gettext.gettext;
const appSys = Shell.AppSystem.get_default(); const appSys = Shell.AppSystem.get_default();
@@ -26,10 +24,13 @@ const NAVIGATION_REGION_OVERSHOOT = 50;
Gio._promisify(Gio._LocalFilePrototype, 'query_info_async', 'query_info_finish'); Gio._promisify(Gio._LocalFilePrototype, 'query_info_async', 'query_info_finish');
Gio._promisify(Gio._LocalFilePrototype, 'set_attributes_async', 'set_attributes_finish'); Gio._promisify(Gio._LocalFilePrototype, 'set_attributes_async', 'set_attributes_finish');
var ApplicationMenuItem = GObject.registerClass(
class ApplicationMenuItem extends PopupMenu.PopupBaseMenuItem { class ApplicationMenuItem extends PopupMenu.PopupBaseMenuItem {
_init(button, app) { static {
super._init(); GObject.registerClass(this);
}
constructor(button, app) {
super();
this._app = app; this._app = app;
this._button = button; this._button = button;
@@ -95,12 +96,15 @@ class ApplicationMenuItem extends PopupMenu.PopupBaseMenuItem {
icon.style_class = 'icon-dropshadow'; icon.style_class = 'icon-dropshadow';
this._iconBin.set_child(icon); this._iconBin.set_child(icon);
} }
}); }
var CategoryMenuItem = GObject.registerClass(
class CategoryMenuItem extends PopupMenu.PopupBaseMenuItem { class CategoryMenuItem extends PopupMenu.PopupBaseMenuItem {
_init(button, category) { static {
super._init(); GObject.registerClass(this);
}
constructor(button, category) {
super();
this._category = category; this._category = category;
this._button = button; this._button = button;
@@ -182,11 +186,14 @@ class CategoryMenuItem extends PopupMenu.PopupBaseMenuItem {
} }
_onMotionEvent(actor, event) { _onMotionEvent(actor, event) {
let device = event.get_device(); if (!this._grab) {
if (!device.get_grabbed_actor()) {
this._oldX = -1; this._oldX = -1;
this._oldY = -1; this._oldY = -1;
device.grab(this); const grab = global.stage.grab(this);
if (grab.get_seat_state() !== Clutter.GrabState.NONE)
this._grab = grab;
else
grab.dismiss();
} }
this.hover = true; this.hover = true;
@@ -196,7 +203,8 @@ class CategoryMenuItem extends PopupMenu.PopupBaseMenuItem {
this._oldX = -1; this._oldX = -1;
this._oldY = -1; this._oldY = -1;
this.hover = false; this.hover = false;
device.ungrab(); this._grab?.dismiss();
delete this._grab;
let source = event.get_source(); let source = event.get_source();
if (source instanceof St.Widget) if (source instanceof St.Widget)
@@ -212,7 +220,7 @@ class CategoryMenuItem extends PopupMenu.PopupBaseMenuItem {
this._button.selectCategory(this._category); this._button.selectCategory(this._category);
this._button.scrollToCatButton(this); this._button.scrollToCatButton(this);
} }
}); }
class ApplicationsMenu extends PopupMenu.PopupMenu { class ApplicationsMenu extends PopupMenu.PopupMenu {
constructor(sourceActor, arrowAlignment, arrowSide, button) { constructor(sourceActor, arrowAlignment, arrowSide, button) {
@@ -351,10 +359,13 @@ class DesktopTarget {
} }
Signals.addSignalMethods(DesktopTarget.prototype); Signals.addSignalMethods(DesktopTarget.prototype);
let ApplicationsButton = GObject.registerClass(
class ApplicationsButton extends PanelMenu.Button { class ApplicationsButton extends PanelMenu.Button {
_init() { static {
super._init(1.0, null, false); GObject.registerClass(this);
}
constructor() {
super(1.0, null, false);
this.setMenu(new ApplicationsMenu(this, 1.0, St.Side.TOP, this)); this.setMenu(new ApplicationsMenu(this, 1.0, St.Side.TOP, this));
Main.panel.menuManager.addMenu(this.menu); Main.panel.menuManager.addMenu(this.menu);
@@ -380,9 +391,12 @@ class ApplicationsButton extends PanelMenu.Button {
this._hidingId = Main.overview.connect('hiding', () => { this._hidingId = Main.overview.connect('hiding', () => {
this.remove_accessible_state(Atk.StateType.CHECKED); this.remove_accessible_state(Atk.StateType.CHECKED);
}); });
Main.layoutManager.connect('startup-complete', Main.wm.addKeybinding(
this._setKeybinding.bind(this)); 'apps-menu-toggle-menu',
this._setKeybinding(); ExtensionUtils.getSettings(),
Meta.KeyBindingFlags.IGNORE_AUTOREPEAT,
Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW,
() => this.menu.toggle());
this._desktopTarget = new DesktopTarget(); this._desktopTarget = new DesktopTarget();
this._desktopTarget.connect('app-dropped', () => { this._desktopTarget.connect('app-dropped', () => {
@@ -433,11 +447,7 @@ class ApplicationsButton extends PanelMenu.Button {
this._tree.disconnect(this._treeChangedId); this._tree.disconnect(this._treeChangedId);
this._tree = null; this._tree = null;
Main.wm.setCustomKeybindingHandler('panel-main-menu', Main.wm.removeKeybinding('apps-menu-toggle-menu');
Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW,
Main.sessionMode.hasOverview
? Main.overview.toggle.bind(Main.overview)
: null);
this._desktopTarget.destroy(); this._desktopTarget.destroy();
} }
@@ -479,12 +489,6 @@ class ApplicationsButton extends PanelMenu.Button {
super._onOpenStateChanged(menu, open); super._onOpenStateChanged(menu, open);
} }
_setKeybinding() {
Main.wm.setCustomKeybindingHandler('panel-main-menu',
Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW,
() => this.menu.toggle());
}
_redisplay() { _redisplay() {
this.applicationsBox.destroy_all_children(); this.applicationsBox.destroy_all_children();
this.categoriesBox.destroy_all_children(); this.categoriesBox.destroy_all_children();
@@ -670,21 +674,24 @@ class ApplicationsButton extends PanelMenu.Button {
return applist; return applist;
} }
}); }
let appsMenuButton; let appsMenuButton;
/** */
function enable() { function enable() {
appsMenuButton = new ApplicationsButton(); appsMenuButton = new ApplicationsButton();
let index = Main.sessionMode.panel.left.indexOf('activities') + 1; let index = Main.sessionMode.panel.left.indexOf('activities') + 1;
Main.panel.addToStatusArea('apps-menu', appsMenuButton, index, 'left'); Main.panel.addToStatusArea('apps-menu', appsMenuButton, index, 'left');
} }
/** */
function disable() { function disable() {
Main.panel.menuManager.removeMenu(appsMenuButton.menu); Main.panel.menuManager.removeMenu(appsMenuButton.menu);
appsMenuButton.destroy(); appsMenuButton.destroy();
} }
/** */
function init() { function init() {
ExtensionUtils.initTranslations(); ExtensionUtils.initTranslations();
} }
+2
View File
@@ -3,3 +3,5 @@ extension_data += configure_file(
output: metadata_name, output: metadata_name,
configuration: metadata_conf configuration: metadata_conf
) )
extension_data += files('stylesheet.css')
extension_schemas += files(metadata_conf.get('gschemaname') + '.gschema.xml')
+1
View File
@@ -1,6 +1,7 @@
{ {
"extension-id": "@extension_id@", "extension-id": "@extension_id@",
"uuid": "@uuid@", "uuid": "@uuid@",
"settings-schema": "@gschemaname@",
"gettext-domain": "@gettext_domain@", "gettext-domain": "@gettext_domain@",
"name": "Applications Menu", "name": "Applications Menu",
"description": "Add a category-based menu for applications.\nThis extension is part of Classic Mode and is officially supported by GNOME. Please do not report bugs using the form below, use GNOME's GitLab instance instead.", "description": "Add a category-based menu for applications.\nThis extension is part of Classic Mode and is officially supported by GNOME. Please do not report bugs using the form below, use GNOME's GitLab instance instead.",
@@ -0,0 +1,12 @@
<schemalist gettext-domain="gnome-shell-extensions">
<schema id="org.gnome.shell.extensions.apps-menu"
path="/org/gnome/shell/extensions/apps-menu/">
<key name="apps-menu-toggle-menu" type="as">
<default>["&lt;Alt&gt;F1"]</default>
<summary>Keybinding to open the applications menu</summary>
<description>
Keybinding to open the applications menu.
</description>
</key>
</schema>
</schemalist>
@@ -108,10 +108,14 @@ class WindowMover {
let prevCheckWorkspaces; let prevCheckWorkspaces;
let winMover; let winMover;
/** */
function init() { function init() {
ExtensionUtils.initTranslations(); ExtensionUtils.initTranslations();
} }
/**
* @returns {bool} - false (used as MetaLater handler)
*/
function myCheckWorkspaces() { function myCheckWorkspaces() {
let keepAliveWorkspaces = []; let keepAliveWorkspaces = [];
let foundNonEmpty = false; let foundNonEmpty = false;
@@ -132,6 +136,7 @@ function myCheckWorkspaces() {
return false; return false;
} }
/** */
function enable() { function enable() {
prevCheckWorkspaces = Main.wm._workspaceTracker._checkWorkspaces; prevCheckWorkspaces = Main.wm._workspaceTracker._checkWorkspaces;
Main.wm._workspaceTracker._checkWorkspaces = myCheckWorkspaces; Main.wm._workspaceTracker._checkWorkspaces = myCheckWorkspaces;
@@ -139,6 +144,7 @@ function enable() {
winMover = new WindowMover(); winMover = new WindowMover();
} }
/** */
function disable() { function disable() {
Main.wm._workspaceTracker._checkWorkspaces = prevCheckWorkspaces; Main.wm._workspaceTracker._checkWorkspaces = prevCheckWorkspaces;
winMover.destroy(); winMover.destroy();
+252 -177
View File
@@ -2,228 +2,296 @@
// Start apps on custom workspaces // Start apps on custom workspaces
/* exported init buildPrefsWidget */ /* exported init buildPrefsWidget */
const { Gio, GLib, GObject, Gtk, Pango } = imports.gi; const { Adw, Gio, GLib, GObject, Gtk } = imports.gi;
const ExtensionUtils = imports.misc.extensionUtils; const ExtensionUtils = imports.misc.extensionUtils;
const Me = ExtensionUtils.getCurrentExtension();
const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); const _ = ExtensionUtils.gettext;
const _ = Gettext.gettext;
const SETTINGS_KEY = 'application-list'; const SETTINGS_KEY = 'application-list';
const WORKSPACE_MAX = 36; // compiled in limit of mutter const WORKSPACE_MAX = 36; // compiled in limit of mutter
const AutoMoveSettingsWidget = GObject.registerClass( class NewItem extends GObject.Object {}
class AutoMoveSettingsWidget extends Gtk.ScrolledWindow { GObject.registerClass(NewItem);
_init() {
super._init({ class NewItemModel extends GObject.Object {
hscrollbar_policy: Gtk.PolicyType.NEVER, static [GObject.interfaces] = [Gio.ListModel];
static {
GObject.registerClass(this);
}
#item = new NewItem();
vfunc_get_item_type() {
return NewItem;
}
vfunc_get_n_items() {
return 1;
}
vfunc_get_item(_pos) {
return this.#item;
}
}
class Rule extends GObject.Object {
static [GObject.properties] = {
'app-info': GObject.ParamSpec.object(
'app-info', 'app-info', 'app-info',
GObject.ParamFlags.READWRITE,
Gio.DesktopAppInfo),
'workspace': GObject.ParamSpec.uint(
'workspace', 'workspace', 'workspace',
GObject.ParamFlags.READWRITE,
1, WORKSPACE_MAX, 1),
};
static {
GObject.registerClass(this);
}
}
class RulesList extends GObject.Object {
static [GObject.interfaces] = [Gio.ListModel];
static {
GObject.registerClass(this);
}
#settings = ExtensionUtils.getSettings();
#rules = [];
#changedId;
constructor() {
super();
this.#changedId =
this.#settings.connect(`changed::${SETTINGS_KEY}`,
() => this.#sync());
this.#sync();
}
append(appInfo) {
const pos = this.#rules.length;
this.#rules.push(new Rule({ appInfo }));
this.#saveRules();
this.items_changed(pos, 0, 1);
}
remove(id) {
const pos = this.#rules.findIndex(r => r.appInfo.get_id() === id);
if (pos < 0)
return;
this.#rules.splice(pos, 1);
this.#saveRules();
this.items_changed(pos, 1, 0);
}
changeWorkspace(id, workspace) {
const pos = this.#rules.findIndex(r => r.appInfo.get_id() === id);
if (pos < 0)
return;
this.#rules[pos].set({ workspace });
this.#saveRules();
}
#saveRules() {
this.#settings.block_signal_handler(this.#changedId);
this.#settings.set_strv(SETTINGS_KEY,
this.#rules.map(r => `${r.app_info.get_id()}:${r.workspace}`));
this.#settings.unblock_signal_handler(this.#changedId);
}
#sync() {
const removed = this.#rules.length;
this.#rules = [];
for (const stringRule of this.#settings.get_strv(SETTINGS_KEY)) {
const [id, workspace] = stringRule.split(':');
const appInfo = Gio.DesktopAppInfo.new(id);
if (appInfo)
this.#rules.push(new Rule({ appInfo, workspace }));
else
log(`Invalid ID ${id}`);
}
this.items_changed(0, removed, this.#rules.length);
}
vfunc_get_item_type() {
return Rule;
}
vfunc_get_n_items() {
return this.#rules.length;
}
vfunc_get_item(pos) {
return this.#rules[pos] ?? null;
}
}
class AutoMoveSettingsWidget extends Adw.PreferencesGroup {
static {
GObject.registerClass(this);
this.install_action('rules.add', null, self => self._addNewRule());
this.install_action('rules.remove', 's',
(self, name, param) => self._rules.remove(param.unpack()));
this.install_action('rules.change-workspace', '(si)',
(self, name, param) => self._rules.changeWorkspace(...param.deepUnpack()));
}
constructor() {
super({
title: _('Workspace Rules'),
}); });
const box = new Gtk.Box({ this._rules = new RulesList();
orientation: Gtk.Orientation.VERTICAL,
halign: Gtk.Align.CENTER,
spacing: 12,
margin_top: 36,
margin_bottom: 36,
margin_start: 36,
margin_end: 36,
});
this.set_child(box);
box.append(new Gtk.Label({ const store = new Gio.ListStore({ item_type: Gio.ListModel });
label: '<b>%s</b>'.format(_('Workspace Rules')), const listModel = new Gtk.FlattenListModel({ model: store });
use_markup: true, store.append(this._rules);
halign: Gtk.Align.START, store.append(new NewItemModel());
}));
this._list = new Gtk.ListBox({ this._list = new Gtk.ListBox({
selection_mode: Gtk.SelectionMode.NONE, selection_mode: Gtk.SelectionMode.NONE,
valign: Gtk.Align.START, css_classes: ['boxed-list'],
show_separators: true,
}); });
box.append(this._list); this.add(this._list);
const context = this._list.get_style_context(); this._list.bind_model(listModel, item => {
const cssProvider = new Gtk.CssProvider(); return item instanceof NewItem
cssProvider.load_from_data( ? new NewRuleRow()
'list { min-width: 30em; }'); : new RuleRow(item);
context.add_provider(cssProvider,
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION);
context.add_class('frame');
this._list.append(new NewRuleRow());
this._actionGroup = new Gio.SimpleActionGroup();
this._list.insert_action_group('rules', this._actionGroup);
let action;
action = new Gio.SimpleAction({ name: 'add' });
action.connect('activate', this._onAddActivated.bind(this));
this._actionGroup.add_action(action);
action = new Gio.SimpleAction({
name: 'remove',
parameter_type: new GLib.VariantType('s'),
}); });
action.connect('activate', this._onRemoveActivated.bind(this));
this._actionGroup.add_action(action);
action = new Gio.SimpleAction({ name: 'update' });
action.connect('activate', () => {
this._settings.set_strv(SETTINGS_KEY,
this._getRuleRows().map(row => `${row.id}:${row.value}`));
});
this._actionGroup.add_action(action);
this._updateAction = action;
this._settings = ExtensionUtils.getSettings();
this._changedId = this._settings.connect('changed',
this._sync.bind(this));
this._sync();
this.connect('destroy', () => this._settings.run_dispose());
} }
_onAddActivated() { _addNewRule() {
const dialog = new NewRuleDialog(this.get_root()); const dialog = new NewRuleDialog(this.get_root());
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;
if (appInfo) { if (appInfo)
this._settings.set_strv(SETTINGS_KEY, [ this._rules.append(appInfo);
...this._settings.get_strv(SETTINGS_KEY),
`${appInfo.get_id()}:1`,
]);
}
dialog.destroy(); dialog.destroy();
}); });
dialog.show(); dialog.show();
} }
}
_onRemoveActivated(action, param) { class WorkspaceSelector extends Gtk.Widget {
const removed = param.deepUnpack(); static [GObject.properties] = {
this._settings.set_strv(SETTINGS_KEY, 'number': GObject.ParamSpec.uint(
this._settings.get_strv(SETTINGS_KEY).filter(entry => { 'number', 'number', 'number',
const [id] = entry.split(':');
return id !== removed;
}));
}
_getRuleRows() {
return [...this._list].filter(row => !!row.id);
}
_sync() {
const oldRules = this._getRuleRows();
const newRules = this._settings.get_strv(SETTINGS_KEY).map(entry => {
const [id, value] = entry.split(':');
return { id, value };
});
this._settings.block_signal_handler(this._changedId);
this._updateAction.enabled = false;
newRules.forEach(({ id, value }, index) => {
const row = oldRules.find(r => r.id === id);
const appInfo = row
? null : Gio.DesktopAppInfo.new(id);
if (row)
row.set({ value });
else if (appInfo)
this._list.insert(new RuleRow(appInfo, value), index);
});
const removed = oldRules.filter(
({ id }) => !newRules.find(r => r.id === id));
removed.forEach(r => this._list.remove(r));
this._settings.unblock_signal_handler(this._changedId);
this._updateAction.enabled = true;
}
});
const RuleRow = GObject.registerClass({
Properties: {
'id': GObject.ParamSpec.string(
'id', 'id', 'id',
GObject.ParamFlags.READABLE,
''),
'value': GObject.ParamSpec.uint(
'value', 'value', 'value',
GObject.ParamFlags.READWRITE, GObject.ParamFlags.READWRITE,
1, WORKSPACE_MAX, 1), 1, WORKSPACE_MAX, 1),
}, };
}, class RuleRow extends Gtk.ListBoxRow {
_init(appInfo, value) { static {
const box = new Gtk.Box({ GObject.registerClass(this);
spacing: 6,
margin_top: 6, this.set_layout_manager_type(Gtk.BoxLayout);
margin_bottom: 6, }
margin_start: 6,
constructor() {
super();
this.layout_manager.spacing = 6;
const label = new Gtk.Label({
xalign: 1,
margin_end: 6, margin_end: 6,
}); });
this.bind_property('number',
label, 'label',
GObject.BindingFlags.SYNC_CREATE);
label.set_parent(this);
super._init({ const buttonProps = {
activatable: false, css_classes: ['circular'],
value, valign: Gtk.Align.CENTER,
child: box, };
this._decButton = new Gtk.Button({
icon_name: 'list-remove-symbolic',
...buttonProps,
});
this._decButton.set_parent(this);
this._decButton.connect('clicked', () => this.number--);
this._incButton = new Gtk.Button({
icon_name: 'list-add-symbolic',
...buttonProps,
});
this._incButton.set_parent(this);
this._incButton.connect('clicked', () => this.number++);
this.connect('notify::number', () => this._syncButtons());
this._syncButtons();
}
_syncButtons() {
this._decButton.sensitive = this.number > 1;
this._incButton.sensitive = this.number < WORKSPACE_MAX;
}
}
class RuleRow extends Adw.ActionRow {
static {
GObject.registerClass(this);
}
constructor(rule) {
const { appInfo } = rule;
const id = appInfo.get_id();
super({
activatable: false,
title: rule.appInfo.get_display_name(),
}); });
this._appInfo = appInfo;
const icon = new Gtk.Image({ const icon = new Gtk.Image({
css_classes: ['icon-dropshadow'],
gicon: appInfo.get_icon(), gicon: appInfo.get_icon(),
pixel_size: 32, pixel_size: 32,
}); });
icon.get_style_context().add_class('icon-dropshadow'); this.add_prefix(icon);
box.append(icon);
const label = new Gtk.Label({ const wsButton = new WorkspaceSelector();
label: appInfo.get_display_name(), rule.bind_property('workspace',
halign: Gtk.Align.START, wsButton, 'number',
hexpand: true, GObject.BindingFlags.SYNC_CREATE);
max_width_chars: 20, this.add_suffix(wsButton);
ellipsize: Pango.EllipsizeMode.END,
});
box.append(label);
const spinButton = new Gtk.SpinButton({ wsButton.connect('notify::number', () => {
adjustment: new Gtk.Adjustment({ this.activate_action('rules.change-workspace',
lower: 1, new GLib.Variant('(si)', [id, wsButton.number]));
upper: WORKSPACE_MAX,
step_increment: 1,
}),
snap_to_ticks: true,
margin_end: 6,
}); });
this.bind_property('value',
spinButton, 'value',
GObject.BindingFlags.SYNC_CREATE | GObject.BindingFlags.BIDIRECTIONAL);
box.append(spinButton);
const button = new Gtk.Button({ const button = new Gtk.Button({
action_name: 'rules.remove', action_name: 'rules.remove',
action_target: new GLib.Variant('s', this.id), action_target: new GLib.Variant('s', id),
icon_name: 'edit-delete-symbolic', icon_name: 'edit-delete-symbolic',
has_frame: false,
valign: Gtk.Align.CENTER,
}); });
box.append(button); this.add_suffix(button);
this.connect('notify::value',
() => this.activate_action('rules.update', null));
} }
}
get id() {
return this._appInfo.get_id();
}
});
const NewRuleRow = GObject.registerClass(
class NewRuleRow extends Gtk.ListBoxRow { class NewRuleRow extends Gtk.ListBoxRow {
_init() { static {
super._init({ GObject.registerClass(this);
}
constructor() {
super({
action_name: 'rules.add', action_name: 'rules.add',
child: new Gtk.Image({ child: new Gtk.Image({
icon_name: 'list-add-symbolic', icon_name: 'list-add-symbolic',
@@ -237,12 +305,15 @@ class NewRuleRow extends Gtk.ListBoxRow {
this.update_property( this.update_property(
[Gtk.AccessibleProperty.LABEL], [_('Add Rule')]); [Gtk.AccessibleProperty.LABEL], [_('Add Rule')]);
} }
}); }
const NewRuleDialog = GObject.registerClass(
class NewRuleDialog extends Gtk.AppChooserDialog { class NewRuleDialog extends Gtk.AppChooserDialog {
_init(parent) { static {
super._init({ GObject.registerClass(this);
}
constructor(parent) {
super({
transient_for: parent, transient_for: parent,
modal: true, modal: true,
}); });
@@ -265,12 +336,16 @@ class NewRuleDialog extends Gtk.AppChooserDialog {
this.set_response_sensitive(Gtk.ResponseType.OK, this.set_response_sensitive(Gtk.ResponseType.OK,
appInfo && !rules.some(i => i.startsWith(appInfo.get_id()))); appInfo && !rules.some(i => i.startsWith(appInfo.get_id())));
} }
}); }
/** */
function init() { function init() {
ExtensionUtils.initTranslations(); ExtensionUtils.initTranslations();
} }
/**
* @returns {Gtk.Widget} - the prefs widget
*/
function buildPrefsWidget() { function buildPrefsWidget() {
return new AutoMoveSettingsWidget(); return new AutoMoveSettingsWidget();
} }
@@ -1 +0,0 @@
/* This extensions requires no special styling */
+23 -26
View File
@@ -8,14 +8,17 @@ const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu; const PopupMenu = imports.ui.popupMenu;
const ShellMountOperation = imports.ui.shellMountOperation; const ShellMountOperation = imports.ui.shellMountOperation;
const Me = ExtensionUtils.getCurrentExtension(); const _ = ExtensionUtils.gettext;
const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']);
const _ = Gettext.gettext; Gio._promisify(Gio.File.prototype, 'query_filesystem_info_async');
var MountMenuItem = GObject.registerClass(
class MountMenuItem extends PopupMenu.PopupBaseMenuItem { class MountMenuItem extends PopupMenu.PopupBaseMenuItem {
_init(mount) { static {
super._init({ GObject.registerClass(this);
}
constructor(mount) {
super({
style_class: 'drive-menu-item', style_class: 'drive-menu-item',
}); });
@@ -57,20 +60,6 @@ class MountMenuItem extends PopupMenu.PopupBaseMenuItem {
super.destroy(); super.destroy();
} }
_fsIsRemote(root) {
return new Promise((resolve, reject) => {
const attr = Gio.FILE_ATTRIBUTE_FILESYSTEM_REMOTE;
root.query_filesystem_info_async(attr, null, (o, res) => {
try {
const info = root.query_filesystem_info_finish(res);
resolve(!info.get_attribute_boolean(attr));
} catch (e) {
reject(e);
}
});
});
}
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;
@@ -85,7 +74,9 @@ class MountMenuItem extends PopupMenu.PopupBaseMenuItem {
const root = this.mount.get_root(); const root = this.mount.get_root();
try { try {
return await this._fsIsRemote(root); const attr = Gio.FILE_ATTRIBUTE_FILESYSTEM_REMOTE;
const info = await root.query_filesystem_info_async(attr, null);
return !info.get_attribute_boolean(attr);
} catch (e) { } catch (e) {
log(`Failed to query filesystem: ${e.message}`); log(`Failed to query filesystem: ${e.message}`);
} }
@@ -143,12 +134,15 @@ class MountMenuItem extends PopupMenu.PopupBaseMenuItem {
super.activate(event); super.activate(event);
} }
}); }
let DriveMenu = GObject.registerClass(
class DriveMenu extends PanelMenu.Button { class DriveMenu extends PanelMenu.Button {
_init() { static {
super._init(0.0, _('Removable devices')); GObject.registerClass(this);
}
constructor() {
super(0.0, _('Removable devices'));
let icon = new St.Icon({ let icon = new St.Icon({
icon_name: 'media-eject-symbolic', icon_name: 'media-eject-symbolic',
@@ -216,19 +210,22 @@ class DriveMenu extends PanelMenu.Button {
super._onDestroy(); super._onDestroy();
} }
}); }
/** */
function init() { function init() {
ExtensionUtils.initTranslations(); ExtensionUtils.initTranslations();
} }
let _indicator; let _indicator;
/** */
function enable() { function enable() {
_indicator = new DriveMenu(); _indicator = new DriveMenu();
Main.panel.addToStatusArea('drive-menu', _indicator); Main.panel.addToStatusArea('drive-menu', _indicator);
} }
/** */
function disable() { function disable() {
_indicator.destroy(); _indicator.destroy();
} }
+1
View File
@@ -3,3 +3,4 @@ extension_data += configure_file(
output: metadata_name, output: metadata_name,
configuration: metadata_conf configuration: metadata_conf
) )
extension_data += files('stylesheet.css')
@@ -3,6 +3,7 @@ const AppDisplay = imports.ui.appDisplay;
let _activateOriginal = null; let _activateOriginal = null;
/** */
function enable() { function enable() {
_activateOriginal = AppDisplay.AppIcon.prototype.activate; _activateOriginal = AppDisplay.AppIcon.prototype.activate;
AppDisplay.AppIcon.prototype.activate = function () { AppDisplay.AppIcon.prototype.activate = function () {
@@ -10,6 +11,7 @@ function enable() {
}; };
} }
/** */
function disable() { function disable() {
AppDisplay.AppIcon.prototype.activate = _activateOriginal; AppDisplay.AppIcon.prototype.activate = _activateOriginal;
} }
@@ -1 +0,0 @@
/* This extensions requires no special styling */
+1 -1
View File
@@ -15,7 +15,7 @@ foreach e : enabled_extensions
metadata_conf.set('url', 'https://gitlab.gnome.org/GNOME/gnome-shell-extensions') metadata_conf.set('url', 'https://gitlab.gnome.org/GNOME/gnome-shell-extensions')
extension_sources = files(e + '/extension.js') extension_sources = files(e + '/extension.js')
extension_data = files(e + '/stylesheet.css') extension_data = []
subdir(e) subdir(e)
+1
View File
@@ -4,5 +4,6 @@ extension_data += configure_file(
configuration: metadata_conf configuration: metadata_conf
) )
# extension_data += files('stylesheet.css')
# extension_sources += files('prefs.js') # extension_sources += files('prefs.js')
# extension_schemas += files(metadata_conf.get('gschemaname') + '.gschema.xml') # extension_schemas += files(metadata_conf.get('gschemaname') + '.gschema.xml')
@@ -97,7 +97,7 @@ class NaturalLayoutStrategy extends Workspace.LayoutStrategy {
let rects = []; let rects = [];
for (let i = 0; i < clones.length; i++) { for (let i = 0; i < clones.length; i++) {
// save rectangles into 4-dimensional arrays representing two corners of the rectangular: [left_x, top_y, right_x, bottom_y] // save rectangles into 4-dimensional arrays representing two corners of the rectangular: [left_x, top_y, right_x, bottom_y]
let rect = clones[i].metaWindow.get_frame_rect(); let rect = clones[i].boundingBox;
rects[i] = new Rect(rect.x, rect.y, rect.width, rect.height); rects[i] = new Rect(rect.x, rect.y, rect.width, rect.height);
bounds = bounds.union(rects[i]); bounds = bounds.union(rects[i]);
@@ -238,11 +238,13 @@ class NaturalLayoutStrategy extends Workspace.LayoutStrategy {
let winInjections, workspaceInjections; let winInjections, workspaceInjections;
/** */
function resetState() { function resetState() {
winInjections = { }; winInjections = { };
workspaceInjections = { }; workspaceInjections = { };
} }
/** */
function enable() { function enable() {
resetState(); resetState();
@@ -282,6 +284,11 @@ function enable() {
}; };
} }
/**
* @param {Object} object - object that was modified
* @param {Object} injection - the map of previous injections
* @param {string} name - the @injection key that should be removed
*/
function removeInjection(object, injection, name) { function removeInjection(object, injection, name) {
if (injection[name] === undefined) if (injection[name] === undefined)
delete object[name]; delete object[name];
@@ -289,6 +296,7 @@ function removeInjection(object, injection, name) {
object[name] = injection[name]; object[name] = injection[name];
} }
/** */
function disable() { function disable() {
var i; var i;
@@ -1,9 +0,0 @@
.window-caption {
-shell-caption-spacing: 13px; /* current caption height is 26px => set it to half of it. TODO: better solution needed */
}
.window-picker {
-horizontal-spacing: 32px;
-vertical-spacing: 32px;
padding: 64px 32px;
}
+20 -13
View File
@@ -9,19 +9,20 @@ const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu; const PopupMenu = imports.ui.popupMenu;
const Me = ExtensionUtils.getCurrentExtension(); const Me = ExtensionUtils.getCurrentExtension();
const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']);
const _ = Gettext.gettext;
const N_ = x => x;
const PlaceDisplay = Me.imports.placeDisplay; const PlaceDisplay = Me.imports.placeDisplay;
const _ = ExtensionUtils.gettext;
const N_ = x => x;
const PLACE_ICON_SIZE = 16; const PLACE_ICON_SIZE = 16;
var PlaceMenuItem = GObject.registerClass(
class PlaceMenuItem extends PopupMenu.PopupBaseMenuItem { class PlaceMenuItem extends PopupMenu.PopupBaseMenuItem {
_init(info) { static {
super._init({ GObject.registerClass(this);
}
constructor(info) {
super({
style_class: 'place-menu-item', style_class: 'place-menu-item',
}); });
this._info = info; this._info = info;
@@ -75,7 +76,7 @@ class PlaceMenuItem extends PopupMenu.PopupBaseMenuItem {
this._icon.gicon = info.icon; this._icon.gicon = info.icon;
this._label.text = info.name; this._label.text = info.name;
} }
}); }
const SECTIONS = [ const SECTIONS = [
'special', 'special',
@@ -84,10 +85,13 @@ const SECTIONS = [
'network', 'network',
]; ];
let PlacesMenu = GObject.registerClass(
class PlacesMenu extends PanelMenu.Button { class PlacesMenu extends PanelMenu.Button {
_init() { static {
super._init(0.0, _('Places')); GObject.registerClass(this);
}
constructor() {
super(0.0, _('Places'));
let label = new St.Label({ let label = new St.Label({
text: _('Places'), text: _('Places'),
@@ -132,14 +136,16 @@ class PlacesMenu extends PanelMenu.Button {
this._sections[id].actor.visible = places.length > 0; this._sections[id].actor.visible = places.length > 0;
} }
}); }
/** */
function init() { function init() {
ExtensionUtils.initTranslations(); ExtensionUtils.initTranslations();
} }
let _indicator; let _indicator;
/** */
function enable() { function enable() {
_indicator = new PlacesMenu(); _indicator = new PlacesMenu();
@@ -149,6 +155,7 @@ function enable() {
Main.panel.addToStatusArea('places-menu', _indicator, pos, 'left'); Main.panel.addToStatusArea('places-menu', _indicator, pos, 'left');
} }
/** */
function disable() { function disable() {
_indicator.destroy(); _indicator.destroy();
} }
+1
View File
@@ -3,5 +3,6 @@ extension_data += configure_file(
output: metadata_name, output: metadata_name,
configuration: metadata_conf configuration: metadata_conf
) )
extension_data += files('stylesheet.css')
extension_sources += files('placeDisplay.js') extension_sources += files('placeDisplay.js')
+6 -32
View File
@@ -7,12 +7,12 @@ const ExtensionUtils = imports.misc.extensionUtils;
const Main = imports.ui.main; const Main = imports.ui.main;
const ShellMountOperation = imports.ui.shellMountOperation; const ShellMountOperation = imports.ui.shellMountOperation;
const Me = ExtensionUtils.getCurrentExtension(); const _ = ExtensionUtils.gettext;
const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']);
const _ = Gettext.gettext;
const N_ = x => x; const N_ = x => x;
Gio._promisify(Gio.AppInfo, 'launch_default_for_uri_async');
Gio._promisify(Gio.File.prototype, 'mount_enclosing_volume');
const BACKGROUND_SCHEMA = 'org.gnome.desktop.background'; const BACKGROUND_SCHEMA = 'org.gnome.desktop.background';
const Hostname1Iface = '<node> \ const Hostname1Iface = '<node> \
@@ -43,7 +43,7 @@ class PlaceInfo {
async _ensureMountAndLaunch(context, tryMount) { async _ensureMountAndLaunch(context, tryMount) {
try { try {
await this._launchDefaultForUri(this.file.get_uri(), context, null); await Gio.AppInfo.launch_default_for_uri_async(this.file.get_uri(), context, null);
} catch (err) { } catch (err) {
if (!err.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_MOUNTED)) { if (!err.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_MOUNTED)) {
Main.notifyError(_('Failed to launch “%s”').format(this.name), err.message); Main.notifyError(_('Failed to launch “%s”').format(this.name), err.message);
@@ -55,7 +55,7 @@ class PlaceInfo {
}; };
let op = new ShellMountOperation.ShellMountOperation(source); let op = new ShellMountOperation.ShellMountOperation(source);
try { try {
await this._mountEnclosingVolume(0, op.mountOp, null); await this.file.mount_enclosing_volume(0, op.mountOp, null);
if (tryMount) if (tryMount)
this._ensureMountAndLaunch(context, false); this._ensureMountAndLaunch(context, false);
@@ -117,32 +117,6 @@ class PlaceInfo {
throw e; throw e;
} }
} }
_launchDefaultForUri(uri, context, cancel) {
return new Promise((resolve, reject) => {
Gio.AppInfo.launch_default_for_uri_async(uri, context, cancel, (o, res) => {
try {
Gio.AppInfo.launch_default_for_uri_finish(res);
resolve();
} catch (e) {
reject(e);
}
});
});
}
_mountEnclosingVolume(flags, mountOp, cancel) {
return new Promise((resolve, reject) => {
this.file.mount_enclosing_volume(flags, mountOp, cancel, (o, res) => {
try {
this.file.mount_enclosing_volume_finish(res);
resolve();
} catch (e) {
reject(e);
}
});
});
}
} }
Signals.addSignalMethods(PlaceInfo.prototype); Signals.addSignalMethods(PlaceInfo.prototype);
@@ -28,11 +28,15 @@ const MESSAGE_FADE_TIME = 2000;
let text; let text;
/** */
function hideMessage() { function hideMessage() {
text.destroy(); text.destroy();
text = null; text = null;
} }
/**
* @param {string} message - the message to flash
*/
function flashMessage(message) { function flashMessage(message) {
if (!text) { if (!text) {
text = new St.Label({ style_class: 'screenshot-sizer-message' }); text = new St.Label({ style_class: 'screenshot-sizer-message' });
@@ -67,6 +71,11 @@ let SIZES = [
[720, 360], // Phone landscape fullscreen [720, 360], // Phone landscape fullscreen
]; ];
/**
* @param {Meta.Display} display - the display
* @param {Meta.Window=} window - for per-window bindings, the window
* @param {Meta.KeyBinding} binding - the key binding
*/
function cycleScreenshotSizes(display, window, binding) { function cycleScreenshotSizes(display, window, binding) {
// Probably this isn't useful with 5 sizes, but you can decrease instead // Probably this isn't useful with 5 sizes, but you can decrease instead
// of increase by holding down shift. // of increase by holding down shift.
@@ -92,10 +101,6 @@ function cycleScreenshotSizes(display, window, binding) {
for (let i = 0; i < scaledSizes.length; i++) { for (let i = 0; i < scaledSizes.length; i++) {
let [width, height] = scaledSizes[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 // get the best initial window size
let error = Math.abs(width - outerRect.width) + Math.abs(height - outerRect.height); let error = Math.abs(width - outerRect.width) + Math.abs(height - outerRect.height);
if (nearestIndex === undefined || error < nearestError) { if (nearestIndex === undefined || error < nearestError) {
@@ -116,8 +121,18 @@ function cycleScreenshotSizes(display, window, binding) {
if (newY + newHeight > workArea.y + workArea.height) if (newY + newHeight > workArea.y + workArea.height)
newY = Math.max(workArea.y + workArea.height - newHeight); newY = Math.max(workArea.y + workArea.height - newHeight);
const id = window.connect('size-changed', () => {
window.disconnect(id);
_notifySizeChange(window);
});
window.move_resize_frame(true, newX, newY, newWidth, newHeight); window.move_resize_frame(true, newX, newY, newWidth, newHeight);
}
/**
* @param {Meta.Window} window - the window whose size changed
*/
function _notifySizeChange(window) {
const { scaleFactor } = St.ThemeContext.get_for_stage(global.stage);
let newOuterRect = window.get_frame_rect(); let newOuterRect = window.get_frame_rect();
let message = '%d×%d'.format( let message = '%d×%d'.format(
newOuterRect.width / scaleFactor, newOuterRect.width / scaleFactor,
@@ -133,6 +148,7 @@ function cycleScreenshotSizes(display, window, binding) {
flashMessage(message); flashMessage(message);
} }
/** */
function enable() { function enable() {
Main.wm.addKeybinding( Main.wm.addKeybinding(
'cycle-screenshot-sizes', 'cycle-screenshot-sizes',
@@ -148,6 +164,7 @@ function enable() {
cycleScreenshotSizes); cycleScreenshotSizes);
} }
/** */
function disable() { function disable() {
Main.wm.removeKeybinding('cycle-screenshot-sizes'); Main.wm.removeKeybinding('cycle-screenshot-sizes');
Main.wm.removeKeybinding('cycle-screenshot-sizes-backward'); Main.wm.removeKeybinding('cycle-screenshot-sizes-backward');
@@ -3,5 +3,6 @@ extension_data += configure_file(
output: metadata_name, output: metadata_name,
configuration: metadata_conf configuration: metadata_conf
) )
extension_data += files('stylesheet.css')
extension_schemas += files(metadata_conf.get('gschemaname') + '.gschema.xml') extension_schemas += files(metadata_conf.get('gschemaname') + '.gschema.xml')
+7 -9
View File
@@ -13,20 +13,15 @@ const Util = Me.imports.util;
const SETTINGS_KEY = 'name'; const SETTINGS_KEY = 'name';
class ThemeManager { class ThemeManager {
constructor() {
this._settings = ExtensionUtils.getSettings();
}
enable() { enable() {
this._changedId = this._settings.connect(`changed::${SETTINGS_KEY}`, this._changeTheme.bind(this)); this._settings = ExtensionUtils.getSettings();
this._settings.connect(`changed::${SETTINGS_KEY}`, this._changeTheme.bind(this));
this._changeTheme(); this._changeTheme();
} }
disable() { disable() {
if (this._changedId) { this._settings?.run_dispose();
this._settings.disconnect(this._changedId); this._settings = null;
this._changedId = 0;
}
Main.setThemeStylesheet(null); Main.setThemeStylesheet(null);
Main.loadTheme(); Main.loadTheme();
@@ -58,6 +53,9 @@ class ThemeManager {
} }
} }
/**
* @returns {ThemeManager} - the extension state object
*/
function init() { function init() {
return new ThemeManager(); return new ThemeManager();
} }
+29 -74
View File
@@ -4,46 +4,27 @@
// 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 { Gio, GLib, GObject, Gtk } = imports.gi; const { Adw, Gio, GLib, GObject, Gtk } = imports.gi;
const ExtensionUtils = imports.misc.extensionUtils; const ExtensionUtils = imports.misc.extensionUtils;
const Me = ExtensionUtils.getCurrentExtension(); const Me = ExtensionUtils.getCurrentExtension();
const Util = Me.imports.util; const Util = Me.imports.util;
Gio._promisify(Gio._LocalFilePrototype, Gio._promisify(Gio.File.prototype, 'enumerate_children_async');
'enumerate_children_async', 'enumerate_children_finish'); Gio._promisify(Gio.File.prototype, 'query_info_async');
Gio._promisify(Gio._LocalFilePrototype, Gio._promisify(Gio.FileEnumerator.prototype, 'next_files_async');
'query_info_async', 'query_info_finish');
Gio._promisify(Gio.FileEnumerator.prototype,
'next_files_async', 'next_files_finish');
const UserThemePrefsWidget = GObject.registerClass( class UserThemePrefsWidget extends Adw.PreferencesGroup {
class UserThemePrefsWidget extends Gtk.ScrolledWindow { static {
_init() { GObject.registerClass(this);
super._init({ }
hscrollbar_policy: Gtk.PolicyType.NEVER,
});
const box = new Gtk.Box(); constructor() {
this.set_child(box); super({ title: 'Themes' });
this._list = new Gtk.ListBox({
selection_mode: Gtk.SelectionMode.NONE,
show_separators: true,
halign: Gtk.Align.CENTER,
valign: Gtk.Align.START,
hexpand: true,
margin_start: 60,
margin_end: 60,
margin_top: 60,
margin_bottom: 60,
});
this._list.get_style_context().add_class('frame');
box.append(this._list);
this._actionGroup = new Gio.SimpleActionGroup(); this._actionGroup = new Gio.SimpleActionGroup();
this._list.insert_action_group('theme', this._actionGroup); this.insert_action_group('theme', this._actionGroup);
this._settings = ExtensionUtils.getSettings(); this._settings = ExtensionUtils.getSettings();
this._actionGroup.add_action( this._actionGroup.add_action(
@@ -93,10 +74,10 @@ class UserThemePrefsWidget extends Gtk.ScrolledWindow {
} }
_addTheme(name) { _addTheme(name) {
const row = new ThemeRow(name, this._settings); const row = new ThemeRow(name);
this._rows.set(name, row); this._rows.set(name, row);
this._list.append(row); this.add(row);
} }
async _enumerateDir(dir) { async _enumerateDir(dir) {
@@ -123,60 +104,34 @@ class UserThemePrefsWidget extends Gtk.ScrolledWindow {
return fileInfos.map(info => info.get_name()); return fileInfos.map(info => info.get_name());
} }
}); }
const ThemeRow = GObject.registerClass( class ThemeRow extends Adw.ActionRow {
class ThemeRow extends Gtk.ListBoxRow { static {
_init(name, settings) { GObject.registerClass(this);
this._name = name; }
this._settings = settings;
const box = new Gtk.Box({ constructor(name) {
spacing: 12, const check = new Gtk.CheckButton({
margin_start: 12,
margin_end: 12,
margin_top: 12,
margin_bottom: 12,
});
super._init({
action_name: 'theme.name', action_name: 'theme.name',
action_target: new GLib.Variant('s', name), action_target: new GLib.Variant('s', name),
child: box,
}); });
box.append(new Gtk.Label({ super({
label: name || 'Default', title: name || 'Default',
hexpand: true, activatable_widget: check,
xalign: 0,
max_width_chars: 25,
width_chars: 25,
}));
this._checkmark = new Gtk.Image({
icon_name: 'emblem-ok-symbolic',
pixel_size: 16,
});
box.append(this._checkmark);
const id = this._settings.connect('changed::name',
this._syncCheckmark.bind(this));
this._syncCheckmark();
this.connect('destroy', () => {
this._settings.disconnect(id);
this._settings = null;
}); });
this.add_prefix(check);
} }
}
_syncCheckmark() { /** */
const visible = this._name === this._settings.get_string('name');
this._checkmark.opacity = visible ? 1. : 0;
}
});
function init() { function init() {
} }
/**
* @returns {Gtk.Widget} - the prefs widget
*/
function buildPrefsWidget() { function buildPrefsWidget() {
return new UserThemePrefsWidget(); return new UserThemePrefsWidget();
} }
-1
View File
@@ -1 +0,0 @@
/* none used */
+6
View File
@@ -3,6 +3,9 @@ const { GLib } = imports.gi;
const fn = (...args) => GLib.build_filenamev(args); const fn = (...args) => GLib.build_filenamev(args);
/**
* @returns {string[]} - an ordered list of theme directories
*/
function getThemeDirs() { function getThemeDirs() {
return [ return [
fn(GLib.get_home_dir(), '.themes'), fn(GLib.get_home_dir(), '.themes'),
@@ -11,6 +14,9 @@ function getThemeDirs() {
]; ];
} }
/**
* @returns {string[]} - an ordered list of mode theme directories
*/
function getModeThemeDirs() { function getModeThemeDirs() {
return GLib.get_system_data_dirs() return GLib.get_system_data_dirs()
.map(dir => fn(dir, 'gnome-shell', 'theme')); .map(dir => fn(dir, 'gnome-shell', 'theme'));
+168 -130
View File
@@ -11,8 +11,7 @@ const Me = ExtensionUtils.getCurrentExtension();
const { WindowPicker, WindowPickerToggle } = Me.imports.windowPicker; const { WindowPicker, WindowPickerToggle } = Me.imports.windowPicker;
const { WorkspaceIndicator } = Me.imports.workspaceIndicator; const { WorkspaceIndicator } = Me.imports.workspaceIndicator;
const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); const _ = ExtensionUtils.gettext;
const _ = Gettext.gettext;
const ICON_TEXTURE_SIZE = 24; const ICON_TEXTURE_SIZE = 24;
const DND_ACTIVATE_TIMEOUT = 500; const DND_ACTIVATE_TIMEOUT = 500;
@@ -23,34 +22,10 @@ const GroupingMode = {
ALWAYS: 2, ALWAYS: 2,
}; };
/**
function _minimizeOrActivateWindow(window) { * @param {Shell.App} app - an app
let focusWindow = global.display.focus_window; * @returns {number} - the smallest stable sequence of the app's windows
if (focusWindow === window || */
focusWindow && focusWindow.get_transient_for() === window)
window.minimize();
else
window.activate(global.get_current_time());
}
function _openMenu(menu) {
menu.open();
let event = Clutter.get_current_event();
if (event && event.type() === Clutter.EventType.KEY_RELEASE)
menu.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
}
function _onMenuStateChanged(menu, isOpen) {
if (isOpen)
return;
let [x, y] = global.get_pointer();
let actor = global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, x, y);
if (Me.stateObj.someWindowListContains(actor))
actor.sync_hover();
}
function _getAppStableSequence(app) { function _getAppStableSequence(app) {
let windows = app.get_windows().filter(w => !w.skip_taskbar); let windows = app.get_windows().filter(w => !w.skip_taskbar);
return windows.reduce((prev, cur) => { return windows.reduce((prev, cur) => {
@@ -58,7 +33,6 @@ function _getAppStableSequence(app) {
}, Infinity); }, Infinity);
} }
class WindowContextMenu extends PopupMenu.PopupMenu { class WindowContextMenu extends PopupMenu.PopupMenu {
constructor(source, metaWindow) { constructor(source, metaWindow) {
super(source, 0.5, St.Side.BOTTOM); super(source, 0.5, St.Side.BOTTOM);
@@ -132,17 +106,20 @@ class WindowContextMenu extends PopupMenu.PopupMenu {
} }
} }
const WindowTitle = GObject.registerClass(
class WindowTitle extends St.BoxLayout { class WindowTitle extends St.BoxLayout {
_init(metaWindow) { static {
this._metaWindow = metaWindow; GObject.registerClass(this);
}
super._init({ constructor(metaWindow) {
super({
style_class: 'window-button-box', style_class: 'window-button-box',
x_expand: true, x_expand: true,
y_expand: true, y_expand: true,
}); });
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 });
@@ -201,30 +178,33 @@ class WindowTitle extends St.BoxLayout {
this._metaWindow.disconnect(this._notifyWmClass); this._metaWindow.disconnect(this._notifyWmClass);
this._metaWindow.disconnect(this._notifyAppId); this._metaWindow.disconnect(this._notifyAppId);
} }
}); }
class BaseButton extends St.Button {
static {
GObject.registerClass({
GTypeFlags: GObject.TypeFlags.ABSTRACT,
Properties: {
'ignore-workspace': GObject.ParamSpec.boolean(
'ignore-workspace', 'ignore-workspace', 'ignore-workspace',
GObject.ParamFlags.READWRITE,
false),
},
}, this);
}
const BaseButton = GObject.registerClass({ constructor(perMonitor, monitorIndex) {
GTypeFlags: GObject.TypeFlags.ABSTRACT, super({
Properties: {
'ignore-workspace': GObject.ParamSpec.boolean(
'ignore-workspace', 'ignore-workspace', 'ignore-workspace',
GObject.ParamFlags.READWRITE,
false),
},
}, class BaseButton extends St.Button {
_init(perMonitor, monitorIndex) {
this._perMonitor = perMonitor;
this._monitorIndex = monitorIndex;
this._ignoreWorkspace = false;
super._init({
style_class: 'window-button', style_class: 'window-button',
can_focus: true, can_focus: true,
x_expand: true, x_expand: true,
button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE, button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
}); });
this._perMonitor = perMonitor;
this._monitorIndex = monitorIndex;
this._ignoreWorkspace = false;
this.connect('notify::allocation', this.connect('notify::allocation',
this._updateIconGeometry.bind(this)); this._updateIconGeometry.bind(this));
this.connect('clicked', this._onClicked.bind(this)); this.connect('clicked', this._onClicked.bind(this));
@@ -266,6 +246,48 @@ const BaseButton = GObject.registerClass({
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;
@@ -282,10 +304,37 @@ const BaseButton = GObject.registerClass({
return true; return true;
} }
_openMenu(menu) {
menu.open();
let event = Clutter.get_current_event();
if (event && event.type() === Clutter.EventType.KEY_RELEASE)
menu.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
}
_minimizeOrActivateWindow(window) {
let focusWindow = global.display.focus_window;
if (focusWindow === window ||
focusWindow && focusWindow.get_transient_for() === window)
window.minimize();
else
window.activate(global.get_current_time());
}
_onMenuStateChanged(menu, isOpen) {
if (isOpen)
return;
let [x, y] = global.get_pointer();
let actor = global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, x, y);
if (Me.stateObj.someWindowListContains(actor))
actor.sync_hover();
}
_onPopupMenu(_actor) { _onPopupMenu(_actor) {
if (!this._canOpenPopupMenu() || this._contextMenu.isOpen) if (!this._canOpenPopupMenu() || this._contextMenu.isOpen)
return; return;
_openMenu(this._contextMenu); this._openMenu(this._contextMenu);
} }
_isFocused() { _isFocused() {
@@ -343,13 +392,15 @@ const BaseButton = GObject.registerClass({
global.display.disconnect(this._windowLeftMonitorId); global.display.disconnect(this._windowLeftMonitorId);
this._windowLeftMonitorId = 0; this._windowLeftMonitorId = 0;
} }
}); }
const WindowButton = GObject.registerClass(
class WindowButton extends BaseButton { class WindowButton extends BaseButton {
_init(metaWindow, perMonitor, monitorIndex) { static {
super._init(perMonitor, monitorIndex); GObject.registerClass(this);
}
constructor(metaWindow, perMonitor, monitorIndex) {
super(perMonitor, monitorIndex);
this.metaWindow = metaWindow; this.metaWindow = metaWindow;
this._skipTaskbarId = metaWindow.connect('notify::skip-taskbar', () => { this._skipTaskbarId = metaWindow.connect('notify::skip-taskbar', () => {
@@ -362,7 +413,8 @@ class WindowButton extends BaseButton {
this.label_actor = this._windowTitle.label_actor; this.label_actor = this._windowTitle.label_actor;
this._contextMenu = new WindowContextMenu(this, this.metaWindow); this._contextMenu = new WindowContextMenu(this, this.metaWindow);
this._contextMenu.connect('open-state-changed', _onMenuStateChanged); this._contextMenu.connect('open-state-changed',
this._onMenuStateChanged.bind(this));
this._contextMenu.actor.hide(); this._contextMenu.actor.hide();
this._contextMenuManager.addMenu(this._contextMenu); this._contextMenuManager.addMenu(this._contextMenu);
Main.uiGroup.add_actor(this._contextMenu.actor); Main.uiGroup.add_actor(this._contextMenu.actor);
@@ -381,10 +433,10 @@ class WindowButton extends BaseButton {
return; return;
} }
if (button === 1) if (!button || button === 1)
_minimizeOrActivateWindow(this.metaWindow); this._minimizeOrActivateWindow(this.metaWindow);
else else
_openMenu(this._contextMenu); this._openMenu(this._contextMenu);
} }
_isFocused() { _isFocused() {
@@ -420,8 +472,7 @@ class WindowButton extends BaseButton {
global.display.disconnect(this._notifyFocusId); global.display.disconnect(this._notifyFocusId);
this._contextMenu.destroy(); this._contextMenu.destroy();
} }
}); }
class AppContextMenu extends PopupMenu.PopupMenu { class AppContextMenu extends PopupMenu.PopupMenu {
constructor(source) { constructor(source) {
@@ -481,10 +532,13 @@ class AppContextMenu extends PopupMenu.PopupMenu {
} }
} }
const AppButton = GObject.registerClass(
class AppButton extends BaseButton { class AppButton extends BaseButton {
_init(app, perMonitor, monitorIndex) { static {
super._init(perMonitor, monitorIndex); GObject.registerClass(this);
}
constructor(app, perMonitor, monitorIndex) {
super(perMonitor, monitorIndex);
this.app = app; this.app = app;
this._updateVisibility(); this._updateVisibility();
@@ -518,14 +572,16 @@ class AppButton extends BaseButton {
this._menuManager = new PopupMenu.PopupMenuManager(this); this._menuManager = new PopupMenu.PopupMenuManager(this);
this._menu = new PopupMenu.PopupMenu(this, 0.5, St.Side.BOTTOM); this._menu = new PopupMenu.PopupMenu(this, 0.5, St.Side.BOTTOM);
this._menu.connect('open-state-changed', _onMenuStateChanged); this._menu.connect('open-state-changed',
this._onMenuStateChanged.bind(this));
this._menu.actor.hide(); this._menu.actor.hide();
this._menu.connect('activate', this._onMenuActivate.bind(this)); this._menu.connect('activate', this._onMenuActivate.bind(this));
this._menuManager.addMenu(this._menu); this._menuManager.addMenu(this._menu);
Main.uiGroup.add_actor(this._menu.actor); Main.uiGroup.add_actor(this._menu.actor);
this._appContextMenu = new AppContextMenu(this); this._appContextMenu = new AppContextMenu(this);
this._appContextMenu.connect('open-state-changed', _onMenuStateChanged); this._appContextMenu.connect('open-state-changed',
this._onMenuStateChanged.bind(this));
this._appContextMenu.actor.hide(); this._appContextMenu.actor.hide();
Main.uiGroup.add_actor(this._appContextMenu.actor); Main.uiGroup.add_actor(this._appContextMenu.actor);
@@ -592,7 +648,7 @@ class AppButton extends BaseButton {
this._singleWindowTitle.child = this._windowTitle; this._singleWindowTitle.child = this._windowTitle;
this._windowContextMenu = new WindowContextMenu(this, this.metaWindow); this._windowContextMenu = new WindowContextMenu(this, this.metaWindow);
this._windowContextMenu.connect( this._windowContextMenu.connect(
'open-state-changed', _onMenuStateChanged); 'open-state-changed', this._onMenuStateChanged.bind(this));
Main.uiGroup.add_actor(this._windowContextMenu.actor); Main.uiGroup.add_actor(this._windowContextMenu.actor);
this._windowContextMenu.actor.hide(); this._windowContextMenu.actor.hide();
this._contextMenuManager.addMenu(this._windowContextMenu); this._contextMenuManager.addMenu(this._windowContextMenu);
@@ -623,7 +679,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;
@@ -631,7 +687,7 @@ class AppButton extends BaseButton {
if (windows.length === 1) { if (windows.length === 1) {
if (contextMenuWasOpen) if (contextMenuWasOpen)
return; return;
_minimizeOrActivateWindow(windows[0]); this._minimizeOrActivateWindow(windows[0]);
} else { } else {
this._menu.removeAll(); this._menu.removeAll();
@@ -642,12 +698,12 @@ class AppButton extends BaseButton {
item._window = windows[i]; item._window = windows[i];
this._menu.addMenuItem(item); this._menu.addMenuItem(item);
} }
_openMenu(this._menu); this._openMenu(this._menu);
} }
} else { } else {
if (contextMenuWasOpen) if (contextMenuWasOpen)
return; return;
_openMenu(this._contextMenu); this._openMenu(this._contextMenu);
} }
} }
@@ -666,16 +722,15 @@ class AppButton extends BaseButton {
this.app.disconnect(this._windowsChangedId); this.app.disconnect(this._windowsChangedId);
this._menu.destroy(); this._menu.destroy();
} }
}); }
const WindowList = GObject.registerClass(
class WindowList extends St.Widget { class WindowList extends St.Widget {
_init(perMonitor, monitor) { static {
this._perMonitor = perMonitor; GObject.registerClass(this);
this._monitor = monitor; }
super._init({ constructor(perMonitor, monitor) {
super({
name: 'panel', name: 'panel',
style_class: 'bottom-panel solid', style_class: 'bottom-panel solid',
reactive: true, reactive: true,
@@ -684,6 +739,9 @@ class WindowList extends St.Widget {
}); });
this.connect('destroy', this._onDestroy.bind(this)); this.connect('destroy', this._onDestroy.bind(this));
this._perMonitor = perMonitor;
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);
@@ -761,10 +819,9 @@ class WindowList extends St.Widget {
let workspaceManager = global.workspace_manager; let workspaceManager = global.workspace_manager;
this._workspaceSignals = new Map();
this._nWorkspacesChangedId = workspaceManager.connect( this._nWorkspacesChangedId = workspaceManager.connect(
'notify::n-workspaces', this._onWorkspacesChanged.bind(this)); 'notify::n-workspaces', this._updateWorkspaceIndicatorVisibility.bind(this));
this._onWorkspacesChanged(); this._updateWorkspaceIndicatorVisibility();
this._switchWorkspaceId = global.window_manager.connect( this._switchWorkspaceId = global.window_manager.connect(
'switch-workspace', this._checkGrouping.bind(this)); 'switch-workspace', this._checkGrouping.bind(this));
@@ -774,16 +831,23 @@ class WindowList extends St.Widget {
this._updateKeyboardAnchor(); this._updateKeyboardAnchor();
}); });
this._overviewHidingId = Main.overview.connect('hiding', () => { this._overviewHidingId = Main.overview.connect('hidden', () => {
this.visible = !Main.layoutManager.primaryMonitor.inFullscreen; this.visible = !this._monitor.inFullscreen;
this._updateKeyboardAnchor(); this._updateKeyboardAnchor();
}); });
this._fullscreenChangedId = this._fullscreenChangedId =
global.display.connect('in-fullscreen-changed', () => { 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();
}); });
this._windowSignals = new Map();
this._windowCreatedId = global.display.connect(
'window-created', (dsp, win) => this._addWindow(win));
this._dragBeginId = Main.xdndHandler.connect('drag-begin', this._dragBeginId = Main.xdndHandler.connect('drag-begin',
this._monitorDrag.bind(this)); this._monitorDrag.bind(this));
this._dragEndId = Main.xdndHandler.connect('drag-end', this._dragEndId = Main.xdndHandler.connect('drag-end',
@@ -906,7 +970,7 @@ class WindowList extends St.Widget {
w2.metaWindow.get_stable_sequence(); w2.metaWindow.get_stable_sequence();
}); });
for (let i = 0; i < windows.length; i++) for (let i = 0; i < windows.length; i++)
this._onWindowAdded(null, windows[i].metaWindow); this._addWindow(windows[i].metaWindow);
} else { } else {
let apps = this._appSystem.get_running().sort((a1, a2) => { let apps = this._appSystem.get_running().sort((a1, a2) => {
return _getAppStableSequence(a1) - return _getAppStableSequence(a1) -
@@ -918,11 +982,8 @@ class WindowList extends St.Widget {
} }
_updateKeyboardAnchor() { _updateKeyboardAnchor() {
if (!Main.keyboard.keyboardActor) const translationY = Main.overview.visible ? 0 : this.height;
return; Main.layoutManager.keyboardBox.translation_y = -translationY;
let translationY = Main.overview.visible ? 0 : this.height;
Main.keyboard.keyboardActor.translation_y = -translationY;
} }
_onAppStateChanged(appSys, app) { _onAppStateChanged(appSys, app) {
@@ -949,7 +1010,7 @@ class WindowList extends St.Widget {
child.destroy(); child.destroy();
} }
_onWindowAdded(ws, win) { _addWindow(win) {
if (!this._grouped) if (!this._grouped)
this._checkGrouping(); this._checkGrouping();
@@ -960,21 +1021,26 @@ class WindowList extends St.Widget {
if (children.find(c => c.metaWindow === win)) if (children.find(c => c.metaWindow === win))
return; return;
this._windowSignals.set(
win, win.connect('unmanaged', () => this._removeWindow(win)));
let button = new WindowButton(win, this._perMonitor, this._monitor.index); let button = new WindowButton(win, this._perMonitor, this._monitor.index);
this._settings.bind('display-all-workspaces', this._settings.bind('display-all-workspaces',
button, 'ignore-workspace', Gio.SettingsBindFlags.GET); button, 'ignore-workspace', Gio.SettingsBindFlags.GET);
this._windowList.add_child(button); this._windowList.add_child(button);
} }
_onWindowRemoved(ws, win) { _removeWindow(win) {
if (this._grouped) if (this._grouped)
this._checkGrouping(); this._checkGrouping();
if (this._grouped) if (this._grouped)
return; return;
if (win.get_compositor_private()) const id = this._windowSignals.get(win);
return; // not actually removed, just moved to another workspace if (id)
win.disconnect(id);
this._windowSignals.delete(win);
let children = this._windowList.get_children(); let children = this._windowList.get_children();
let child = children.find(c => c.metaWindow === win); let child = children.find(c => c.metaWindow === win);
@@ -982,39 +1048,6 @@ class WindowList extends St.Widget {
child.destroy(); child.destroy();
} }
_onWorkspacesChanged() {
let workspaceManager = global.workspace_manager;
let numWorkspaces = workspaceManager.n_workspaces;
for (let i = 0; i < numWorkspaces; i++) {
let workspace = workspaceManager.get_workspace_by_index(i);
if (this._workspaceSignals.has(workspace))
continue;
let signals = { windowAddedId: 0, windowRemovedId: 0 };
signals._windowAddedId = workspace.connect_after(
'window-added', this._onWindowAdded.bind(this));
signals._windowRemovedId = workspace.connect(
'window-removed', this._onWindowRemoved.bind(this));
this._workspaceSignals.set(workspace, signals);
}
this._updateWorkspaceIndicatorVisibility();
}
_disconnectWorkspaceSignals() {
let workspaceManager = global.workspace_manager;
let numWorkspaces = workspaceManager.n_workspaces;
for (let i = 0; i < numWorkspaces; i++) {
let workspace = workspaceManager.get_workspace_by_index(i);
let signals = this._workspaceSignals.get(workspace);
this._workspaceSignals.delete(workspace);
workspace.disconnect(signals._windowAddedId);
workspace.disconnect(signals._windowRemovedId);
}
}
_monitorDrag() { _monitorDrag() {
DND.addDragMonitor(this._dragMonitor); DND.addDragMonitor(this._dragMonitor);
} }
@@ -1078,18 +1111,20 @@ class WindowList extends St.Widget {
Main.keyboard._bottomDragAction.disconnect(this._keyboardVisiblechangedId); Main.keyboard._bottomDragAction.disconnect(this._keyboardVisiblechangedId);
this._keyboardVisiblechangedId = 0; this._keyboardVisiblechangedId = 0;
this._disconnectWorkspaceSignals();
global.workspace_manager.disconnect(this._nWorkspacesChangedId); global.workspace_manager.disconnect(this._nWorkspacesChangedId);
this._nWorkspacesChangedId = 0; this._nWorkspacesChangedId = 0;
global.window_manager.disconnect(this._switchWorkspaceId); global.window_manager.disconnect(this._switchWorkspaceId);
this._switchWorkspaceId = 0; this._switchWorkspaceId = 0;
this._windowSignals.forEach((id, win) => win.disconnect(id));
this._windowSignals.clear();
Main.overview.disconnect(this._overviewShowingId); Main.overview.disconnect(this._overviewShowingId);
Main.overview.disconnect(this._overviewHidingId); Main.overview.disconnect(this._overviewHidingId);
global.display.disconnect(this._fullscreenChangedId); global.display.disconnect(this._fullscreenChangedId);
global.display.disconnect(this._windowCreatedId);
this._stopMonitoringDrag(); this._stopMonitoringDrag();
Main.xdndHandler.disconnect(this._dragBeginId); Main.xdndHandler.disconnect(this._dragBeginId);
@@ -1101,7 +1136,7 @@ class WindowList extends St.Widget {
for (let i = 0; i < windows.length; i++) for (let i = 0; i < windows.length; i++)
windows[i].metaWindow.set_icon_geometry(null); windows[i].metaWindow.set_icon_geometry(null);
} }
}); }
class Extension { class Extension {
constructor() { constructor() {
@@ -1170,6 +1205,9 @@ class Extension {
} }
} }
/**
* @returns {Extension} - the extension's state object
*/
function init() { function init() {
return new Extension(); return new Extension();
} }
+1
View File
@@ -3,6 +3,7 @@ extension_data += configure_file(
output: metadata_name, output: metadata_name,
configuration: metadata_conf configuration: metadata_conf
) )
extension_data += files('stylesheet.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')
+61 -79
View File
@@ -1,110 +1,92 @@
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*- // -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
/* exported init buildPrefsWidget */ /* exported init buildPrefsWidget */
const { Gio, GObject, Gtk } = imports.gi; const { Adw, Gio, GLib, GObject, Gtk } = imports.gi;
const ExtensionUtils = imports.misc.extensionUtils; const ExtensionUtils = imports.misc.extensionUtils;
const Me = ExtensionUtils.getCurrentExtension();
const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']);
const _ = Gettext.gettext;
const _ = ExtensionUtils.gettext;
/** */
function init() { function init() {
ExtensionUtils.initTranslations(); ExtensionUtils.initTranslations();
} }
const WindowListPrefsWidget = GObject.registerClass( class WindowListPrefsWidget extends Adw.PreferencesPage {
class WindowListPrefsWidget extends Gtk.Box { static {
_init() { GObject.registerClass(this);
super._init({ }
orientation: Gtk.Orientation.VERTICAL,
spacing: 6,
margin_top: 36,
margin_bottom: 36,
margin_start: 36,
margin_end: 36,
halign: Gtk.Align.CENTER,
});
let groupingLabel = '<b>%s</b>'.format(_('Window Grouping')); constructor() {
this.append(new Gtk.Label({ super();
label: groupingLabel, use_markup: true,
halign: Gtk.Align.START,
}));
const box = new Gtk.Box({ this._actionGroup = new Gio.SimpleActionGroup();
orientation: Gtk.Orientation.VERTICAL, this.insert_action_group('window-list', this._actionGroup);
spacing: 12,
margin_bottom: 12,
});
this.append(box);
const context = box.get_style_context();
const cssProvider = new Gtk.CssProvider();
cssProvider.load_from_data(
'box { padding: 12px; }');
context.add_provider(cssProvider,
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION);
context.add_class('frame');
context.add_class('view');
this._settings = ExtensionUtils.getSettings(); this._settings = ExtensionUtils.getSettings();
let currentMode = this._settings.get_string('grouping-mode'); this._actionGroup.add_action(
let range = this._settings.get_range('grouping-mode'); this._settings.create_action('grouping-mode'));
let modes = range.deep_unpack()[1].deep_unpack(); this._actionGroup.add_action(
this._settings.create_action('show-on-all-monitors'));
this._actionGroup.add_action(
this._settings.create_action('display-all-workspaces'));
let modeLabels = { const groupingGroup = new Adw.PreferencesGroup({
'never': _('Never group windows'), title: _('Window Grouping'),
'auto': _('Group windows when space is limited'), });
'always': _('Always group windows'), this.add(groupingGroup);
};
let radio = null; const modes = [
let currentRadio = null; { mode: 'never', title: _('Never group windows') },
for (let i = 0; i < modes.length; i++) { { mode: 'auto', title: _('Group windows when space is limited') },
let mode = modes[i]; { mode: 'always', title: _('Always group windows') },
let label = modeLabels[mode]; ];
if (!label) {
log('Unhandled option "%s" for grouping-mode'.format(mode));
continue;
}
radio = new Gtk.CheckButton({ for (const { mode, title } of modes) {
active: !i, const check = new Gtk.CheckButton({
label, action_name: 'window-list.grouping-mode',
group: radio, action_target: new GLib.Variant('s', mode),
margin_end: 12,
}); });
box.append(radio); const row = new Adw.ActionRow({
activatable_widget: check,
if (currentMode === mode) title,
currentRadio = radio;
radio.connect('toggled', button => {
if (button.active)
this._settings.set_string('grouping-mode', mode);
}); });
row.add_prefix(check);
groupingGroup.add(row);
} }
if (currentRadio) const miscGroup = new Adw.PreferencesGroup();
currentRadio.active = true; this.add(miscGroup);
let check = new Gtk.CheckButton({ let toggle = new Gtk.Switch({
label: _('Show on all monitors'), action_name: 'window-list.show-on-all-monitors',
valign: Gtk.Align.CENTER,
}); });
this._settings.bind('show-on-all-monitors', check, 'active', Gio.SettingsBindFlags.DEFAULT); let row = new Adw.ActionRow({
this.append(check); title: _('Show on all monitors'),
activatable_widget: toggle,
});
row.add_suffix(toggle);
miscGroup.add(row);
check = new Gtk.CheckButton({ toggle = new Gtk.Switch({
label: _('Show windows from all workspaces'), action_name: 'window-list.display-all-workspaces',
valign: Gtk.Align.CENTER,
}); });
this._settings.bind('display-all-workspaces', check, 'active', Gio.SettingsBindFlags.DEFAULT); this._settings.bind('display-all-workspaces',
this.append(check); toggle, 'active', Gio.SettingsBindFlags.DEFAULT);
row = new Adw.ActionRow({
title: _('Show windows from all workspaces'),
activatable_widget: toggle,
});
row.add_suffix(toggle);
miscGroup.add(row);
} }
}); }
/**
* @returns {Gtk.Widget} - the prefs widget
*/
function buildPrefsWidget() { function buildPrefsWidget() {
return new WindowListPrefsWidget(); return new WindowListPrefsWidget();
} }
+52 -32
View File
@@ -13,13 +13,15 @@ const {
ControlsState, ControlsState,
} = imports.ui.overviewControls; } = imports.ui.overviewControls;
let MyWorkspacesDisplay = GObject.registerClass(
class MyWorkspacesDisplay extends WorkspacesDisplay { class MyWorkspacesDisplay extends WorkspacesDisplay {
_init(controls, overviewAdjustment) { static {
GObject.registerClass(this);
}
constructor(controls, overviewAdjustment) {
let workspaceManager = global.workspace_manager; let workspaceManager = global.workspace_manager;
this._overviewAdjustment = overviewAdjustment; const workspaceAdjustment = new St.Adjustment({
this._workspaceAdjustment = new St.Adjustment({
value: workspaceManager.get_active_workspace_index(), value: workspaceManager.get_active_workspace_index(),
lower: 0, lower: 0,
page_increment: 1, page_increment: 1,
@@ -28,14 +30,15 @@ class MyWorkspacesDisplay extends WorkspacesDisplay {
upper: workspaceManager.n_workspaces, upper: workspaceManager.n_workspaces,
}); });
super(controls, workspaceAdjustment, overviewAdjustment);
this._workspaceAdjustment = workspaceAdjustment;
this._workspaceAdjustment.actor = this;
this._nWorkspacesChangedId = this._nWorkspacesChangedId =
workspaceManager.connect('notify::n-workspaces', workspaceManager.connect('notify::n-workspaces',
this._updateAdjustment.bind(this)); this._updateAdjustment.bind(this));
super._init(controls, this._workspaceAdjustment, this._overviewAdjustment);
this._workspaceAdjustment.actor = this;
this.add_constraint( this.add_constraint(
new Layout.MonitorConstraint({ new Layout.MonitorConstraint({
primary: true, primary: true,
@@ -75,12 +78,15 @@ class MyWorkspacesDisplay extends WorkspacesDisplay {
super._onDestroy(); super._onDestroy();
} }
}); }
const MyWorkspace = GObject.registerClass(
class MyWorkspace extends Workspace.Workspace { class MyWorkspace extends Workspace.Workspace {
_init(...args) { static {
super._init(...args); GObject.registerClass(this);
}
constructor(...args) {
super(...args);
this._adjChangedId = this._adjChangedId =
this._overviewAdjustment.connect('notify::value', () => { this._overviewAdjustment.connect('notify::value', () => {
@@ -102,10 +108,13 @@ class MyWorkspace extends Workspace.Workspace {
this._overviewAdjustment.disconnect(this._adjChangedId); this._overviewAdjustment.disconnect(this._adjChangedId);
this._adjChangedId = 0; this._adjChangedId = 0;
} }
}); }
const MyWorkspaceBackground = GObject.registerClass(
class MyWorkspaceBackground extends Workspace.WorkspaceBackground { class MyWorkspaceBackground extends Workspace.WorkspaceBackground {
static {
GObject.registerClass(this);
}
_updateBorderRadius() { _updateBorderRadius() {
} }
@@ -138,22 +147,26 @@ class MyWorkspaceBackground extends Workspace.WorkspaceBackground {
offsets.top + contentHeight + offsets.bottom); offsets.top + contentHeight + offsets.bottom);
this._backgroundGroup.allocate(contentBox); this._backgroundGroup.allocate(contentBox);
} }
}); }
var WindowPicker = GObject.registerClass({ var WindowPicker = class WindowPicker extends Clutter.Actor {
Signals: { static [GObject.signals] = {
'open-state-changed': { param_types: [GObject.TYPE_BOOLEAN] }, 'open-state-changed': { param_types: [GObject.TYPE_BOOLEAN] },
}, };
}, class extends Clutter.Actor {
_init() { static {
GObject.registerClass(this);
}
constructor() {
super({ reactive: true });
this._visible = false; this._visible = false;
this._modal = false; this._modal = false;
this._overlayKeyId = 0; this._overlayKeyId = 0;
this._stageKeyPressId = 0; this._stageKeyPressId = 0;
super._init({ reactive: true });
this._adjustment = new OverviewAdjustment(this); this._adjustment = new OverviewAdjustment(this);
this.connect('destroy', this._onDestroy.bind(this)); this.connect('destroy', this._onDestroy.bind(this));
@@ -273,17 +286,21 @@ var WindowPicker = GObject.registerClass({
if (this._modal) if (this._modal)
return true; return true;
this._modal = Main.pushModal(this, { const grab = Main.pushModal(global.stage, {
actionMode: Shell.ActionMode.OVERVIEW, actionMode: Shell.ActionMode.OVERVIEW,
}); });
if (grab.get_seat_state() !== Clutter.GrabState.NONE) {
if (!this._modal) { this._grab = grab;
this._modal = true;
} else {
Main.popModal(grab);
this.hide(); this.hide();
return false; return false;
} }
} else if (this._modal) { } else if (this._modal) {
Main.popModal(this); Main.popModal(this._grab);
this._modal = false; this._modal = false;
this._grab = null;
} }
return true; return true;
} }
@@ -307,11 +324,14 @@ var WindowPicker = GObject.registerClass({
global.stage.disconnect(this._stageKeyPressId); global.stage.disconnect(this._stageKeyPressId);
this._stageKeyPressId = 0; this._stageKeyPressId = 0;
} }
}); };
var WindowPickerToggle = GObject.registerClass( var WindowPickerToggle = class WindowPickerToggle extends St.Button {
class WindowPickerToggle extends St.Button { static {
_init() { GObject.registerClass(this);
}
constructor() {
let iconBin = new St.Widget({ let iconBin = new St.Widget({
layout_manager: new Clutter.BinLayout(), layout_manager: new Clutter.BinLayout(),
}); });
@@ -323,7 +343,7 @@ class WindowPickerToggle extends St.Button {
x_align: Clutter.ActorAlign.CENTER, x_align: Clutter.ActorAlign.CENTER,
y_align: Clutter.ActorAlign.CENTER, y_align: Clutter.ActorAlign.CENTER,
})); }));
super._init({ super({
style_class: 'window-picker-toggle', style_class: 'window-picker-toggle',
child: iconBin, child: iconBin,
visible: !Main.sessionMode.hasOverview, visible: !Main.sessionMode.hasOverview,
@@ -341,4 +361,4 @@ class WindowPickerToggle extends St.Button {
this.checked = Main.windowPicker.visible; this.checked = Main.windowPicker.visible;
}); });
} }
}); };
+28 -20
View File
@@ -7,20 +7,20 @@ const Main = imports.ui.main;
const PanelMenu = imports.ui.panelMenu; const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu; const PopupMenu = imports.ui.popupMenu;
const Me = ExtensionUtils.getCurrentExtension(); const _ = ExtensionUtils.gettext;
const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']);
const _ = Gettext.gettext;
const TOOLTIP_OFFSET = 6; const TOOLTIP_OFFSET = 6;
const TOOLTIP_ANIMATION_TIME = 150; const TOOLTIP_ANIMATION_TIME = 150;
const MAX_THUMBNAILS = 6; const MAX_THUMBNAILS = 6;
let WindowPreview = GObject.registerClass(
class WindowPreview extends St.Button { class WindowPreview extends St.Button {
_init(window) { static {
super._init({ GObject.registerClass(this);
}
constructor(window) {
super({
style_class: 'window-list-window-preview', style_class: 'window-list-window-preview',
}); });
@@ -72,10 +72,13 @@ class WindowPreview extends St.Button {
this._window.window_type !== Meta.WindowType.DESKTOP && this._window.window_type !== Meta.WindowType.DESKTOP &&
this._window.showing_on_its_workspace(); this._window.showing_on_its_workspace();
} }
}); }
let WorkspaceLayout = GObject.registerClass(
class WorkspaceLayout extends Clutter.LayoutManager { class WorkspaceLayout extends Clutter.LayoutManager {
static {
GObject.registerClass(this);
}
vfunc_get_preferred_width() { vfunc_get_preferred_width() {
return [0, 0]; return [0, 0];
} }
@@ -102,12 +105,15 @@ class WorkspaceLayout extends Clutter.LayoutManager {
child.allocate(childBox); child.allocate(childBox);
} }
} }
}); }
let WorkspaceThumbnail = GObject.registerClass(
class WorkspaceThumbnail extends St.Button { class WorkspaceThumbnail extends St.Button {
_init(index) { static {
super._init({ GObject.registerClass(this);
}
constructor(index) {
super({
style_class: 'workspace', style_class: 'workspace',
child: new Clutter.Actor({ child: new Clutter.Actor({
layout_manager: new WorkspaceLayout(), layout_manager: new WorkspaceLayout(),
@@ -244,12 +250,15 @@ class WorkspaceThumbnail extends St.Button {
this._workspace.disconnect(this._windowRemovedId); this._workspace.disconnect(this._windowRemovedId);
global.display.disconnect(this._restackedId); global.display.disconnect(this._restackedId);
} }
}); }
var WorkspaceIndicator = GObject.registerClass( var WorkspaceIndicator = class WorkspaceIndicator extends PanelMenu.Button {
class WorkspaceIndicator extends PanelMenu.Button { static {
_init() { GObject.registerClass(this);
super._init(0.0, _('Workspace Indicator'), true); }
constructor() {
super(0.0, _('Workspace Indicator'), true);
this.setMenu(new PopupMenu.PopupMenu(this, 0.0, St.Side.BOTTOM)); this.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');
@@ -438,5 +447,4 @@ class WorkspaceIndicator extends PanelMenu.Button {
let newIndex = this._currentWorkspace + diff; let newIndex = this._currentWorkspace + diff;
this._activate(newIndex); this._activate(newIndex);
} }
}); };
+17 -8
View File
@@ -9,10 +9,13 @@ const WorkspacesView = imports.ui.workspacesView;
const WINDOW_SLOT = 4; const WINDOW_SLOT = 4;
var MyWorkspace = GObject.registerClass(
class MyWorkspace extends Workspace.Workspace { class MyWorkspace extends Workspace.Workspace {
_init(...args) { static {
super._init(...args); GObject.registerClass(this);
}
constructor(...args) {
super(...args);
if (this.metaWorkspace && this.metaWorkspace.index() < 9) { if (this.metaWorkspace && this.metaWorkspace.index() < 9) {
this._tip = new St.Label({ this._tip = new St.Label({
@@ -115,12 +118,15 @@ class MyWorkspace extends Workspace.Workspace {
return clone; return clone;
} }
}); }
var MyWorkspacesView = GObject.registerClass(
class MyWorkspacesView extends WorkspacesView.WorkspacesView { class MyWorkspacesView extends WorkspacesView.WorkspacesView {
_init(...args) { static {
super._init(...args); GObject.registerClass(this);
}
constructor(...args) {
super(...args);
this._pickWorkspace = false; this._pickWorkspace = false;
this._pickWindow = false; this._pickWindow = false;
@@ -243,7 +249,7 @@ class MyWorkspacesView extends WorkspacesView.WorkspacesView {
} }
return false; return false;
} }
}); }
class Extension { class Extension {
constructor() { constructor() {
@@ -262,6 +268,9 @@ class Extension {
} }
} }
/**
* @returns {Extension} - the extension's state object
*/
function init() { function init() {
return new Extension(); return new Extension();
} }
+1
View File
@@ -3,3 +3,4 @@ extension_data += configure_file(
output: metadata_name, output: metadata_name,
configuration: metadata_conf configuration: metadata_conf
) )
extension_data += files('stylesheet.css')
+30 -18
View File
@@ -9,10 +9,7 @@ const Main = imports.ui.main;
const PanelMenu = imports.ui.panelMenu; const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu; const PopupMenu = imports.ui.popupMenu;
const Me = ExtensionUtils.getCurrentExtension(); const _ = ExtensionUtils.gettext;
const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']);
const _ = Gettext.gettext;
const WORKSPACE_SCHEMA = 'org.gnome.desktop.wm.preferences'; const WORKSPACE_SCHEMA = 'org.gnome.desktop.wm.preferences';
const WORKSPACE_KEY = 'workspace-names'; const WORKSPACE_KEY = 'workspace-names';
@@ -22,10 +19,13 @@ const TOOLTIP_ANIMATION_TIME = 150;
const MAX_THUMBNAILS = 6; const MAX_THUMBNAILS = 6;
let WindowPreview = GObject.registerClass(
class WindowPreview extends St.Button { class WindowPreview extends St.Button {
_init(window) { static {
super._init({ GObject.registerClass(this);
}
constructor(window) {
super({
style_class: 'workspace-indicator-window-preview', style_class: 'workspace-indicator-window-preview',
}); });
@@ -77,10 +77,13 @@ class WindowPreview extends St.Button {
this._window.window_type !== Meta.WindowType.DESKTOP && this._window.window_type !== Meta.WindowType.DESKTOP &&
this._window.showing_on_its_workspace(); this._window.showing_on_its_workspace();
} }
}); }
let WorkspaceLayout = GObject.registerClass(
class WorkspaceLayout extends Clutter.LayoutManager { class WorkspaceLayout extends Clutter.LayoutManager {
static {
GObject.registerClass(this);
}
vfunc_get_preferred_width() { vfunc_get_preferred_width() {
return [0, 0]; return [0, 0];
} }
@@ -107,12 +110,15 @@ class WorkspaceLayout extends Clutter.LayoutManager {
child.allocate(childBox); child.allocate(childBox);
} }
} }
}); }
let WorkspaceThumbnail = GObject.registerClass(
class WorkspaceThumbnail extends St.Button { class WorkspaceThumbnail extends St.Button {
_init(index) { static {
super._init({ GObject.registerClass(this);
}
constructor(index) {
super({
style_class: 'workspace', style_class: 'workspace',
child: new Clutter.Actor({ child: new Clutter.Actor({
layout_manager: new WorkspaceLayout(), layout_manager: new WorkspaceLayout(),
@@ -249,12 +255,15 @@ class WorkspaceThumbnail extends St.Button {
this._workspace.disconnect(this._windowRemovedId); this._workspace.disconnect(this._windowRemovedId);
global.display.disconnect(this._restackedId); global.display.disconnect(this._restackedId);
} }
}); }
let WorkspaceIndicator = GObject.registerClass(
class WorkspaceIndicator extends PanelMenu.Button { class WorkspaceIndicator extends PanelMenu.Button {
_init() { static {
super._init(0.0, _('Workspace Indicator')); GObject.registerClass(this);
}
constructor() {
super(0.0, _('Workspace Indicator'));
let container = new St.Widget({ let container = new St.Widget({
layout_manager: new Clutter.BinLayout(), layout_manager: new Clutter.BinLayout(),
@@ -443,19 +452,22 @@ class WorkspaceIndicator extends PanelMenu.Button {
let newIndex = global.workspace_manager.get_active_workspace_index() + diff; let newIndex = global.workspace_manager.get_active_workspace_index() + diff;
this._activate(newIndex); this._activate(newIndex);
} }
}); }
/** */
function init() { function init() {
ExtensionUtils.initTranslations(); ExtensionUtils.initTranslations();
} }
let _indicator; let _indicator;
/** */
function enable() { function enable() {
_indicator = new WorkspaceIndicator(); _indicator = new WorkspaceIndicator();
Main.panel.addToStatusArea('workspace-indicator', _indicator); Main.panel.addToStatusArea('workspace-indicator', _indicator);
} }
/** */
function disable() { function disable() {
_indicator.destroy(); _indicator.destroy();
} }
@@ -3,5 +3,6 @@ extension_data += configure_file(
output: metadata_name, output: metadata_name,
configuration: metadata_conf configuration: metadata_conf
) )
extension_data += files('stylesheet.css')
extension_sources += files('prefs.js') extension_sources += files('prefs.js')
+168 -118
View File
@@ -1,133 +1,163 @@
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*- // -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
/* exported init buildPrefsWidget */ /* exported init buildPrefsWidget */
const { Gio, GLib, GObject, Gtk, Pango } = imports.gi; const { Adw, Gio, GLib, GObject, Gtk, Pango } = imports.gi;
const ExtensionUtils = imports.misc.extensionUtils; const ExtensionUtils = imports.misc.extensionUtils;
const Me = ExtensionUtils.getCurrentExtension();
const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); const _ = ExtensionUtils.gettext;
const _ = Gettext.gettext;
const N_ = e => e; const N_ = e => e;
const WORKSPACE_SCHEMA = 'org.gnome.desktop.wm.preferences'; const WORKSPACE_SCHEMA = 'org.gnome.desktop.wm.preferences';
const WORKSPACE_KEY = 'workspace-names'; const WORKSPACE_KEY = 'workspace-names';
const WorkspaceSettingsWidget = GObject.registerClass( class NewItem extends GObject.Object {}
class WorkspaceSettingsWidget extends Gtk.ScrolledWindow { GObject.registerClass(NewItem);
_init() {
super._init({ class NewItemModel extends GObject.Object {
hscrollbar_policy: Gtk.PolicyType.NEVER, static [GObject.interfaces] = [Gio.ListModel];
static {
GObject.registerClass(this);
}
#item = new NewItem();
vfunc_get_item_type() {
return NewItem;
}
vfunc_get_n_items() {
return 1;
}
vfunc_get_item(_pos) {
return this.#item;
}
}
class WorkspacesList extends GObject.Object {
static [GObject.interfaces] = [Gio.ListModel];
static {
GObject.registerClass(this);
}
#settings = new Gio.Settings({ schema_id: WORKSPACE_SCHEMA });
#names = this.#settings.get_strv(WORKSPACE_KEY);
#items = Gtk.StringList.new(this.#names);
#changedId;
constructor() {
super();
this.#changedId =
this.#settings.connect(`changed::${WORKSPACE_KEY}`, () => {
const removed = this.#names.length;
this.#names = this.#settings.get_strv(WORKSPACE_KEY);
this.#items.splice(0, removed, this.#names);
this.items_changed(0, removed, this.#names.length);
});
}
append() {
const name = _('Workspace %d').format(this.#names.length + 1);
this.#names.push(name);
this.#settings.block_signal_handler(this.#changedId);
this.#settings.set_strv(WORKSPACE_KEY, this.#names);
this.#settings.unblock_signal_handler(this.#changedId);
const pos = this.#items.get_n_items();
this.#items.append(name);
this.items_changed(pos, 0, 1);
}
remove(name) {
const pos = this.#names.indexOf(name);
if (pos < 0)
return;
this.#names.splice(pos, 1);
this.#settings.block_signal_handler(this.#changedId);
this.#settings.set_strv(WORKSPACE_KEY, this.#names);
this.#settings.unblock_signal_handler(this.#changedId);
this.#items.remove(pos);
this.items_changed(pos, 1, 0);
}
rename(oldName, newName) {
const pos = this.#names.indexOf(oldName);
if (pos < 0)
return;
this.#names.splice(pos, 1, newName);
this.#items.splice(pos, 1, [newName]);
this.#settings.block_signal_handler(this.#changedId);
this.#settings.set_strv(WORKSPACE_KEY, this.#names);
this.#settings.unblock_signal_handler(this.#changedId);
}
vfunc_get_item_type() {
return Gtk.StringObject;
}
vfunc_get_n_items() {
return this.#items.get_n_items();
}
vfunc_get_item(pos) {
return this.#items.get_item(pos);
}
}
class WorkspaceSettingsWidget extends Adw.PreferencesGroup {
static {
GObject.registerClass(this);
this.install_action('workspaces.add', null,
self => self._workspaces.append());
this.install_action('workspaces.remove', 's',
(self, name, param) => self._workspaces.remove(param.unpack()));
this.install_action('workspaces.rename', '(ss)',
(self, name, param) => self._workspaces.rename(...param.deepUnpack()));
}
constructor() {
super({
title: _('Workspace Names'),
}); });
const box = new Gtk.Box({ this._workspaces = new WorkspacesList();
orientation: Gtk.Orientation.VERTICAL,
halign: Gtk.Align.CENTER,
spacing: 12,
margin_top: 36,
margin_bottom: 36,
margin_start: 36,
margin_end: 36,
});
this.set_child(box);
box.append(new Gtk.Label({ const store = new Gio.ListStore({ item_type: Gio.ListModel });
label: '<b>%s</b>'.format(_('Workspace Names')), const listModel = new Gtk.FlattenListModel({ model: store });
use_markup: true, store.append(this._workspaces);
halign: Gtk.Align.START, store.append(new NewItemModel());
}));
this._list = new Gtk.ListBox({ this._list = new Gtk.ListBox({
selection_mode: Gtk.SelectionMode.NONE, selection_mode: Gtk.SelectionMode.NONE,
valign: Gtk.Align.START, css_classes: ['boxed-list'],
show_separators: true,
}); });
this._list.connect('row-activated', (l, row) => row.edit()); this._list.connect('row-activated', (l, row) => row.edit());
box.append(this._list); this.add(this._list);
const context = this._list.get_style_context(); this._list.bind_model(listModel, item => {
const cssProvider = new Gtk.CssProvider(); return item instanceof NewItem
cssProvider.load_from_data( ? new NewWorkspaceRow()
'list { min-width: 25em; }'); : new WorkspaceRow(item.string);
context.add_provider(cssProvider,
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION);
context.add_class('frame');
this._list.append(new NewWorkspaceRow());
this._actionGroup = new Gio.SimpleActionGroup();
this._list.insert_action_group('workspaces', this._actionGroup);
let action;
action = new Gio.SimpleAction({ name: 'add' });
action.connect('activate', () => {
const names = this._settings.get_strv(WORKSPACE_KEY);
this._settings.set_strv(WORKSPACE_KEY, [
...names,
_('Workspace %d').format(names.length + 1),
]);
});
this._actionGroup.add_action(action);
action = new Gio.SimpleAction({
name: 'remove',
parameter_type: new GLib.VariantType('s'),
});
action.connect('activate', (a, param) => {
const removed = param.deepUnpack();
this._settings.set_strv(WORKSPACE_KEY,
this._settings.get_strv(WORKSPACE_KEY)
.filter(name => name !== removed));
});
this._actionGroup.add_action(action);
action = new Gio.SimpleAction({ name: 'update' });
action.connect('activate', () => {
const names = this._getWorkspaceRows().map(row => row.name);
this._settings.set_strv(WORKSPACE_KEY, names);
});
this._actionGroup.add_action(action);
this._settings = new Gio.Settings({
schema_id: WORKSPACE_SCHEMA,
});
this._settings.connect(`changed::${WORKSPACE_KEY}`,
this._sync.bind(this));
this._sync();
}
_getWorkspaceRows() {
return [...this._list].filter(row => row.name);
}
_sync() {
const rows = this._getWorkspaceRows();
const oldNames = rows.map(row => row.name);
const newNames = this._settings.get_strv(WORKSPACE_KEY);
const removed = oldNames.filter(n => !newNames.includes(n));
const added = newNames.filter(n => !oldNames.includes(n));
removed.forEach(n => this._list.remove(rows.find(r => r.name === n)));
added.forEach(n => {
this._list.insert(new WorkspaceRow(n), newNames.indexOf(n));
}); });
} }
}); }
const WorkspaceRow = GObject.registerClass( class WorkspaceRow extends Adw.PreferencesRow {
class WorkspaceRow extends Gtk.ListBoxRow { static {
_init(name) { GObject.registerClass(this);
super._init({ name }); }
const controller = new Gtk.ShortcutController(); constructor(name) {
controller.add_shortcut(new Gtk.Shortcut({ super({ name });
trigger: Gtk.ShortcutTrigger.parse_string('Escape'),
action: Gtk.CallbackAction.new(this._stopEdit.bind(this)),
}));
this.add_controller(controller);
const box = new Gtk.Box({ const box = new Gtk.Box({
spacing: 12, spacing: 12,
@@ -149,21 +179,39 @@ class WorkspaceRow extends Gtk.ListBoxRow {
const button = new Gtk.Button({ const button = new Gtk.Button({
action_name: 'workspaces.remove', action_name: 'workspaces.remove',
action_target: new GLib.Variant('s', name),
icon_name: 'edit-delete-symbolic', icon_name: 'edit-delete-symbolic',
has_frame: false,
}); });
box.append(button); box.append(button);
this.bind_property_full('name',
button, 'action-target',
GObject.BindingFlags.SYNC_CREATE,
(bind, target) => [true, new GLib.Variant('s', target)],
null);
this._entry = new Gtk.Entry({ this._entry = new Gtk.Entry({
max_width_chars: 25, max_width_chars: 25,
}); });
const controller = new Gtk.ShortcutController();
controller.add_shortcut(new Gtk.Shortcut({
trigger: Gtk.ShortcutTrigger.parse_string('Escape'),
action: Gtk.CallbackAction.new(() => {
this._stopEdit();
return true;
}),
}));
this._entry.add_controller(controller);
this._stack = new Gtk.Stack(); this._stack = new Gtk.Stack();
this._stack.add_named(box, 'display'); this._stack.add_named(box, 'display');
this._stack.add_named(this._entry, 'edit'); this._stack.add_named(this._entry, 'edit');
this.child = this._stack; this.child = this._stack;
this._entry.connect('activate', () => { this._entry.connect('activate', () => {
this.activate_action('workspaces.rename',
new GLib.Variant('(ss)', [this.name, this._entry.text]));
this.name = this._entry.text; this.name = this._entry.text;
this._stopEdit(); this._stopEdit();
}); });
@@ -172,11 +220,6 @@ class WorkspaceRow extends Gtk.ListBoxRow {
return; return;
this._stopEdit(); this._stopEdit();
}); });
this.connect('notify::name', () => {
button.action_target = new GLib.Variant('s', this.name);
this.activate_action('workspaces.update', null);
});
} }
edit() { edit() {
@@ -189,12 +232,15 @@ class WorkspaceRow extends Gtk.ListBoxRow {
this.grab_focus(); this.grab_focus();
this._stack.visible_child_name = 'display'; this._stack.visible_child_name = 'display';
} }
}); }
const NewWorkspaceRow = GObject.registerClass( class NewWorkspaceRow extends Adw.PreferencesRow {
class NewWorkspaceRow extends Gtk.ListBoxRow { static {
_init() { GObject.registerClass(this);
super._init({ }
constructor() {
super({
action_name: 'workspaces.add', action_name: 'workspaces.add',
child: new Gtk.Image({ child: new Gtk.Image({
icon_name: 'list-add-symbolic', icon_name: 'list-add-symbolic',
@@ -208,12 +254,16 @@ class NewWorkspaceRow extends Gtk.ListBoxRow {
this.update_property( this.update_property(
[Gtk.AccessibleProperty.LABEL], [_('Add Workspace')]); [Gtk.AccessibleProperty.LABEL], [_('Add Workspace')]);
} }
}); }
/** */
function init() { function init() {
ExtensionUtils.initTranslations(); ExtensionUtils.initTranslations();
} }
/**
* @returns {Gtk.Widget} - the prefs widget
*/
function buildPrefsWidget() { function buildPrefsWidget() {
return new WorkspaceSettingsWidget(); return new WorkspaceSettingsWidget();
} }
+39 -6
View File
@@ -1,8 +1,11 @@
--- ---
# SPDX-License-Identifier: MIT OR LGPL-2.0-or-later # SPDX-License-Identifier: MIT OR LGPL-2.0-or-later
# SPDX-FileCopyrightText: 2018 Claudio André <claudioandre.br@gmail.com>
env: env:
es6: true es2021: true
extends: 'eslint:recommended' extends: 'eslint:recommended'
plugins:
- jsdoc
rules: rules:
array-bracket-newline: array-bracket-newline:
- error - error
@@ -60,6 +63,17 @@ rules:
- 'CallExpression[callee.object.name=GObject][callee.property.name=registerClass] > ClassExpression:first-child' - 'CallExpression[callee.object.name=GObject][callee.property.name=registerClass] > ClassExpression:first-child'
# Allow dedenting chained member expressions # Allow dedenting chained member expressions
MemberExpression: 'off' MemberExpression: 'off'
jsdoc/check-alignment: error
jsdoc/check-param-names: error
jsdoc/check-tag-names: error
jsdoc/check-types: error
jsdoc/implements-on-classes: error
jsdoc/newline-after-description: error
jsdoc/require-jsdoc: error
jsdoc/require-param: error
jsdoc/require-param-description: error
jsdoc/require-param-name: error
jsdoc/require-param-type: error
key-spacing: key-spacing:
- error - error
- beforeColon: false - beforeColon: false
@@ -71,7 +85,10 @@ rules:
linebreak-style: linebreak-style:
- error - error
- unix - unix
lines-between-class-members: error lines-between-class-members:
- error
- always
- exceptAfterSingleLine: true
max-nested-callbacks: error max-nested-callbacks: error
max-statements-per-line: error max-statements-per-line: error
new-parens: error new-parens: error
@@ -107,8 +124,15 @@ rules:
no-octal-escape: error no-octal-escape: error
no-proto: error no-proto: error
no-prototype-builtins: 'off' no-prototype-builtins: 'off'
no-restricted-globals: [error, window]
no-restricted-properties: no-restricted-properties:
- error - error
- object: imports
property: format
message: Use template strings
- object: pkg
property: initFormat
message: Use template strings
- object: Lang - object: Lang
property: copyProperties property: copyProperties
message: Use Object.assign() message: Use Object.assign()
@@ -167,6 +191,7 @@ rules:
object-curly-newline: object-curly-newline:
- error - error
- consistent: true - consistent: true
multiline: true
object-curly-spacing: error object-curly-spacing: error
object-shorthand: error object-shorthand: error
operator-assignment: error operator-assignment: error
@@ -214,14 +239,14 @@ rules:
template-curly-spacing: error template-curly-spacing: error
template-tag-spacing: error template-tag-spacing: error
unicode-bom: error unicode-bom: error
valid-jsdoc:
- error
- requireReturn: false
wrap-iife: wrap-iife:
- error - error
- inside - inside
yield-star-spacing: error yield-star-spacing: error
yoda: error yoda: error
settings:
jsdoc:
mode: typescript
globals: globals:
ARGV: readonly ARGV: readonly
Debugger: readonly Debugger: readonly
@@ -233,5 +258,13 @@ globals:
logError: readonly logError: readonly
print: readonly print: readonly
printerr: readonly printerr: readonly
window: readonly
TextEncoder: readonly
TextDecoder: readonly
console: readonly
setTimeout: readonly
setInterval: readonly
clearTimeout: readonly
clearInterval: readonly
parserOptions: parserOptions:
ecmaVersion: 2020 ecmaVersion: 2022
+10 -2
View File
@@ -1,6 +1,6 @@
project('gnome-shell-extensions', project('gnome-shell-extensions',
version: '40.4', version: '42.3',
meson_version: '>= 0.44.0', meson_version: '>= 0.53.0',
license: 'GPL2+' license: 'GPL2+'
) )
@@ -20,6 +20,7 @@ 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')
xsessiondir = join_paths(datadir, 'xsessions') xsessiondir = join_paths(datadir, 'xsessions')
wlsessiondir = join_paths(datadir, 'wayland-sessions')
ver_arr = meson.project_version().split('.') ver_arr = meson.project_version().split('.')
shell_version = ver_arr[0] shell_version = ver_arr[0]
@@ -83,9 +84,16 @@ endforeach
if classic_mode_enabled if classic_mode_enabled
subdir('data') subdir('data')
meson.add_install_script(
'meson/session-post-install.py',
join_paths(get_option('prefix'), datadir)
)
endif endif
subdir('extensions') subdir('extensions')
subdir('po') subdir('po')
meson.add_dist_script('meson/generate-stylesheets.py') meson.add_dist_script('meson/generate-stylesheets.py')
meson.add_dist_script('meson/check-version.py',
meson.project_version(),
'NEWS')
+32
View File
@@ -0,0 +1,32 @@
#!/usr/bin/env python3
import os, sys
from pathlib import Path
import argparse, subprocess
def check_version(version, file, type='news'):
if type == 'news':
line = file.open().readline()
ok = line.startswith(version)
print("{}: {}".format(file, "OK" if ok else "FAILED"))
if not ok:
raise Exception("{} does not start with {}".format(file, version))
elif type == 'metainfo':
subprocess.run(['appstream-util', 'validate-version', file, version],
check=True)
else:
raise Exception('Not implemented')
parser = argparse.ArgumentParser(description='Check release version information.')
parser.add_argument('--type', choices=['metainfo','news'], default='news')
parser.add_argument('version', help='the version to check for')
parser.add_argument('files', nargs='+', help='files to check')
args = parser.parse_args()
distroot = os.environ.get('MESON_DIST_ROOT', './')
try:
for file in args.files:
check_version(args.version, Path(distroot, file), args.type)
except:
sys.exit(1)
+1 -1
View File
@@ -10,4 +10,4 @@ distroot = os.environ.get('MESON_DIST_ROOT')
stylesheet_path = PurePath('data/gnome-classic.css') stylesheet_path = PurePath('data/gnome-classic.css')
src = PurePath(sourceroot, stylesheet_path.with_suffix('.scss')) src = PurePath(sourceroot, stylesheet_path.with_suffix('.scss'))
dst = PurePath(distroot, stylesheet_path) dst = PurePath(distroot, stylesheet_path)
subprocess.call(['sassc', '-a', src, dst]) subprocess.run(['sassc', '-a', src, dst], check=True)
+20
View File
@@ -0,0 +1,20 @@
#!/usr/bin/env python3
import os
import shutil
import sys
if os.environ.get('DESTDIR'):
install_root = os.environ.get('DESTDIR') + os.path.abspath(sys.argv[1])
else:
install_root = sys.argv[1]
# FIXME: Meson is unable to copy a generated target file:
# https://groups.google.com/forum/#!topic/mesonbuild/3iIoYPrN4P0
dst_dir = os.path.join(install_root, 'wayland-sessions')
if not os.path.exists(dst_dir):
os.makedirs(dst_dir)
src = os.path.join(install_root, 'xsessions', 'gnome-classic.desktop')
dst = os.path.join(dst_dir, 'gnome-classic.desktop')
shutil.copyfile(src, dst)
+2
View File
@@ -1,3 +1,4 @@
ab
af af
an an
ar ar
@@ -32,6 +33,7 @@ id
is is
it it
ja ja
ka
kab kab
kk kk
km km
+2
View File
@@ -1,4 +1,6 @@
data/gnome-classic.desktop.in data/gnome-classic.desktop.in
data/gnome-classic-wayland.desktop.in
data/gnome-classic-xorg.desktop.in
extensions/apps-menu/extension.js extensions/apps-menu/extension.js
extensions/auto-move-windows/extension.js extensions/auto-move-windows/extension.js
extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml
+261
View File
@@ -0,0 +1,261 @@
# Abkhazian translation for gnome-shell-extensions.
# Copyright (C) 2022 gnome-shell-extensions's COPYRIGHT HOLDER
# This file is distributed under the same license as the gnome-shell-extensions package.
# Нанба Наала <naala-nanba@rambler.ru>, 2022.
#
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell-extensions main\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/"
"issues\n"
"POT-Creation-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"
"Language-Team: Abkhazian <ab@li.org>\n"
"Language: ab\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: data/gnome-classic.desktop.in:3
msgid "GNOME Classic"
msgstr "Аклассикатә GNOME"
#: data/gnome-classic.desktop.in:4 data/gnome-classic-wayland.desktop.in:4
#: data/gnome-classic-xorg.desktop.in:4
msgid "This session logs you into GNOME Classic"
msgstr "Ари асеанс аклассикатә усуратә еишәа GNOME хархәагас иамоуп "
#: 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:112
msgid "Favorites"
msgstr "Иалкаау"
#: extensions/apps-menu/extension.js:370
msgid "Applications"
msgstr "Аԥшьқәа"
#: extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml:6
msgid "Application and workspace list"
msgstr "Аԥшьи аусуратә ҵакырақәа рыхьӡынҵеи"
#: extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml:7
msgid ""
"A list of strings, each containing an application id (desktop file name), "
"followed by a colon and the workspace number"
msgstr "Ацәаҳәақәа рыхьӡынҵа аиԥшрагәаҭага аԥшьы (desktop-фаил ахьӡ )"
"змоу, зашьҭахь ҩ-кәаԥки аусуратә ҭыԥ аномери гылоу "
#: extensions/auto-move-windows/prefs.js:19
msgid "Workspace Rules"
msgstr "Аусуратә ҵакыра аԥҟаррақәа"
#: extensions/auto-move-windows/prefs.js:245
msgid "Add Rule"
msgstr "Аԥҟара ацҵара"
#. TRANSLATORS: %s is the filesystem name
#: extensions/drive-menu/extension.js:123
#: extensions/places-menu/placeDisplay.js:210
#, javascript-format
msgid "Ejecting drive “%s” failed:"
msgstr "Адиск «%s» аҭыгара залымшахеит:"
#: extensions/drive-menu/extension.js:139
msgid "Removable devices"
msgstr "Иаҿыҵуа аиҿартәырақәа"
#: extensions/drive-menu/extension.js:161
msgid "Open Files"
msgstr "Афаил аартра"
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:5
msgid "Use more screen for windows"
msgstr "Изыцҵоу аекран аҵакыра аԥенџьырқәа рзы ахархәара"
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:6
msgid ""
"Try to use more screen for placing window thumbnails by adapting to screen "
"aspect ratio, and consolidating them further to reduce the bounding box. "
"This setting applies only with the natural placement strategy."
msgstr "Шәхы иашәырхәа изыцҵоу аекран аҵакыра аминиатиура атыԥаркразы"
"аекран аганқәа реизышәара ԥсахуа аҭыԥыркра шәыржәпала, анаҩс адаԥа ҳәаақәызҵо ашәагаа архәыҷразы"
"ари ахышәара ахархәара аиуоит аминиатиура «natural» аҭыԥыркра алгоритм ахархәараан"
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:11
msgid "Place window captions on top"
msgstr " Аԥенџьырқәа рыхқәа хыхь рҭыԥыркра"
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:12
msgid ""
"If true, place window captions on top the respective thumbnail, overriding "
"shell default of placing it at the bottom. Changing this setting requires "
"restarting the shell to have any effect."
msgstr "Иалхзар, ахқәа аминиатиура хыхьтәи ахәҭаҟны аҭыԥ ааныркылалоит"
"(ишыҟоу еиԥш ахқәа ҵаҟатәи аҭыԥ ааныркылоит).Ари ахышәара аԥсахраан,"
"уи аус аура иалагарцазы, иаҭахуп Shell аиҭарура."
#: extensions/places-menu/extension.js:88
#: extensions/places-menu/extension.js:91
msgid "Places"
msgstr "Аҭыԥқәа"
#: extensions/places-menu/placeDisplay.js:49
#, javascript-format
msgid "Failed to launch “%s”"
msgstr " «%s» аус арура залшом"
#: extensions/places-menu/placeDisplay.js:64
#, javascript-format
msgid "Failed to mount volume for “%s”"
msgstr "Иамоуӡит атом аибыҭара «%s» азы"
#: extensions/places-menu/placeDisplay.js:125
#: extensions/places-menu/placeDisplay.js:148
msgid "Computer"
msgstr "Акомпиутер"
#: extensions/places-menu/placeDisplay.js:336
msgid "Home"
msgstr "Аҩнытәи аҭаӡ"
#: extensions/places-menu/placeDisplay.js:381
msgid "Browse Network"
msgstr "Аҳа алаԥшхагара"
#: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:7
msgid "Cycle Screenshot Sizes"
msgstr "Аекран аҭыхымҭа ашәагаақәа рыԥсахра"
#: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:11
msgid "Cycle Screenshot Sizes Backward"
msgstr "Аекран аҭыхымҭа ашәагаақәа шьҭахьҟатәи ахырхарҭала рыԥсахра"
#: extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml:5
msgid "Theme name"
msgstr "Атема ахьӡ"
#: extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml:6
msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell"
msgstr "~/.themes/name/gnome-shell аҟынтә иҭагалоу атема ахьӡ "
#: extensions/window-list/extension.js:72
msgid "Close"
msgstr "Аркра"
#: extensions/window-list/extension.js:92
msgid "Unminimize"
msgstr "Архынҳәра"
#: extensions/window-list/extension.js:92
msgid "Minimize"
msgstr "Аиҟәырҳәра"
#: extensions/window-list/extension.js:99
msgid "Unmaximize"
msgstr "Аиҭашьақәыргылара"
#: extensions/window-list/extension.js:99
msgid "Maximize"
msgstr "Аиҵыхра"
#: extensions/window-list/extension.js:434
msgid "Minimize all"
msgstr "Зегьы реиҟәырҳәра"
#: extensions/window-list/extension.js:440
msgid "Unminimize all"
msgstr "Зегьы рырхынҳәра"
#: extensions/window-list/extension.js:446
msgid "Maximize all"
msgstr "Зегьы реиҵыхра"
#: extensions/window-list/extension.js:454
msgid "Unmaximize all"
msgstr "Зегьы реиҭашьақәыргылара"
#: extensions/window-list/extension.js:462
msgid "Close all"
msgstr "Зегьы рыркра"
#: extensions/window-list/extension.js:741
msgid "Window List"
msgstr "Аԥенџьырқәа рыхьӡынҵа"
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:12
msgid "When to group windows"
msgstr "Аԥенџьырқәа аидыргәыԥлара анаҭаху"
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:13
msgid ""
"Decides when to group windows from the same application on the window list. "
"Possible values are “never”, “auto” and “always”."
msgstr "Иҳәаақәнаҵоит, ианаҭаху ԥшьык иаҵанакуа аԥенџьырқәа реидыргәыԥлара, аԥенџьырқәа рыхьӡынҵаҟны"
" Иҟалар зылшо аҵакқәа : «never» — ахаан; «auto» — автоматла; «always» — есқьынгьы"
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20
#: extensions/window-list/prefs.js:76
msgid "Show windows from all workspaces"
msgstr "Аҵакырақәа зегьы рҟынтә аԥенџьырқәа раарԥшра"
#: 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."
msgstr
"Аԥенџьырқәа рыхьӡынҵа аусуратә ҵакырақәа зегь рҟынтә акәу,мамзар уажәтәи аҟынтә акәу ишаарԥшлатәу"
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:27
msgid "Show the window list on all monitors"
msgstr "Аԥенџьырқәа рыхьӡынҵа амониторқәа зегьы рҟны рырбара"
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:28
msgid ""
"Whether to show the window list on all connected monitors or only on the "
"primary one."
msgstr
"Аԥенџьырқәа рыхьӡынҵа иаҿаку амониторқәа зегьы рыҟноума иахьаарԥшлатәу , мамзар ихадоу аҟны акәу."
#: extensions/window-list/prefs.js:32
msgid "Window Grouping"
msgstr "Аԥенџьырқәа реидыргәыԥлара"
#: extensions/window-list/prefs.js:37
msgid "Never group windows"
msgstr "Ахаангьы аԥенџьырқәа реидмыргәыԥлара"
#: extensions/window-list/prefs.js:38
msgid "Group windows when space is limited"
msgstr "Аҭыԥ маҷхазар, аԥенџьырқәа еидшәыргәыԥла"
#: extensions/window-list/prefs.js:39
msgid "Always group windows"
msgstr "Еснагь аԥенџьырқәа реидыргәыԥлара"
#: extensions/window-list/prefs.js:63
msgid "Show on all monitors"
msgstr "Амониторқәа зегьы рҟны рырбара"
#: extensions/window-list/workspaceIndicator.js:249
#: extensions/workspace-indicator/extension.js:254
msgid "Workspace Indicator"
msgstr "Аусуратә ҵакыра аиндикатор"
#: extensions/workspace-indicator/prefs.js:18
msgid "Workspace Names"
msgstr "Аусуратә ҵакырақәа рыхьӡқәа"
#: extensions/workspace-indicator/prefs.js:39
#, javascript-format
msgid "Workspace %d"
msgstr "Аусуратә ҵакыра %d"
#: extensions/workspace-indicator/prefs.js:184
msgid "Add Workspace"
msgstr "Аусуратә ҵакыра ацҵара"
+272 -359
View File
@@ -1,359 +1,272 @@
# Bulgarian translation for gnome-shell-extensions po-file. # Bulgarian translation for gnome-shell-extensions po-file.
# Copyright (C) 2014, 2015, 2017 Free Software Foundation, Inc. # Copyright (C) 2014, 2015, 2017 Free Software Foundation, Inc.
# This file is distributed under the same license as the gnome-shell-extensions package. # Copyright (C) 2021, 2022 Alexander Shopov <ash@kambanaria.org>.
# Ivaylo Valkov <ivaylo@e-valkov.org>, 2014. # This file is distributed under the same license as the gnome-shell-extensions package.
# Alexander Shopov <ash@kambanaria.org>, 2014, 2015. # Ivaylo Valkov <ivaylo@e-valkov.org>, 2014.
# Lyubomir Vasilev <lyubomirv@abv.bg>, 2017. # Alexander Shopov <ash@kambanaria.org>, 2014, 2015, 2021, 2022.
msgid "" # Lyubomir Vasilev <lyubomirv@abv.bg>, 2017.
msgstr "" msgid ""
"Project-Id-Version: gnome-shell-extensions master\n" msgstr ""
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "Project-Id-Version: gnome-shell-extensions master\n"
"shell&keywords=I18N+L10N&component=extensions\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/"
"POT-Creation-Date: 2017-09-09 15:20+0000\n" "issues\n"
"PO-Revision-Date: 2017-09-08 08:47+0300\n" "POT-Creation-Date: 2022-02-12 20:25+0000\n"
"Last-Translator: Lyubomir Vasilev <lyubomirv@abv.bg>\n" "PO-Revision-Date: 2022-02-13 11:40+0100\n"
"Language-Team: Bulgarian <dict@fsa-bg.org>\n" "Last-Translator: Alexander Shopov <ash@kambanaria.org>\n"
"Language: bg\n" "Language-Team: Bulgarian <dict@fsa-bg.org>\n"
"MIME-Version: 1.0\n" "Language: bg\n"
"Content-Type: text/plain; charset=UTF-8\n" "MIME-Version: 1.0\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Type: text/plain; charset=UTF-8\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: data/gnome-classic.desktop.in:3 data/gnome-classic.session.desktop.in:3
msgid "GNOME Classic" #: data/gnome-classic.desktop.in:3
msgstr "Класически GNOME" msgid "GNOME Classic"
msgstr "Класически GNOME"
#: data/gnome-classic.desktop.in:4
msgid "This session logs you into GNOME Classic" #: data/gnome-classic.desktop.in:4 data/gnome-classic-wayland.desktop.in:4
msgstr "Работната среда изглежда като класическия GNOME (2.x)" #: data/gnome-classic-xorg.desktop.in:4
msgid "This session logs you into GNOME Classic"
#: data/org.gnome.shell.extensions.classic-overrides.gschema.xml:7 msgstr "Работната среда изглежда като класическия GNOME (2.x)"
msgid "Attach modal dialog to the parent window"
msgstr "Прикрепяне на модалните прозорци към родителските им прозорци" #: data/gnome-classic-wayland.desktop.in:3
msgid "GNOME Classic on Wayland"
#: data/org.gnome.shell.extensions.classic-overrides.gschema.xml:8 msgstr "Класически GNOME в Wayland"
#: data/org.gnome.shell.extensions.classic-overrides.gschema.xml:25
#: data/org.gnome.shell.extensions.classic-overrides.gschema.xml:33 #: data/gnome-classic-xorg.desktop.in:3
#: data/org.gnome.shell.extensions.classic-overrides.gschema.xml:41 msgid "GNOME Classic on Xorg"
msgid "" msgstr "Класически GNOME в Xorg"
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
msgstr "" #: extensions/apps-menu/extension.js:112
"Този ключ при е с по-голям приоритет от „org.gnome.mutter“ при изпълнението " msgid "Favorites"
"на обвивката на GNOME." msgstr "Любими"
#: data/org.gnome.shell.extensions.classic-overrides.gschema.xml:16 #: extensions/apps-menu/extension.js:370
msgid "Arrangement of buttons on the titlebar" msgid "Applications"
msgstr одредба на бутоните на заглавната лента" msgstr рограми"
#: data/org.gnome.shell.extensions.classic-overrides.gschema.xml:17 #: extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml:6
msgid "" msgid "Application and workspace list"
"This key overrides the key in org.gnome.desktop.wm.preferences when running " msgstr "Списък с програмите и работните плотове"
"GNOME Shell."
msgstr "" #: extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml:7
"Този ключ при е с по-голям приоритет от „org.gnome.desktop.wm.preferences“ " msgid ""
"при изпълнението на обвивката на GNOME." "A list of strings, each containing an application id (desktop file name), "
"followed by a colon and the workspace number"
#: data/org.gnome.shell.extensions.classic-overrides.gschema.xml:24 msgstr ""
msgid "Enable edge tiling when dropping windows on screen edges" "Списък от низове. Всеки съдържа идентификатор на програма (име на файл „."
msgstr "" "desktop“), следван от знака „:“ и номер на работен плот"
"Включване на специална подредба при приближаване на прозорец до ръбовете на "
"екрана" #: extensions/auto-move-windows/prefs.js:19
msgid "Workspace Rules"
#: data/org.gnome.shell.extensions.classic-overrides.gschema.xml:32 msgstr "Правила за работните плотове"
msgid "Workspaces only on primary monitor"
msgstr "Работни плотове само на основния екран" #: extensions/auto-move-windows/prefs.js:245
msgid "Add Rule"
#: data/org.gnome.shell.extensions.classic-overrides.gschema.xml:40 msgstr "Добавяне на правило"
msgid "Delay focus changes in mouse mode until the pointer stops moving"
msgstr "Забавяне на смяната на фокуса до спирането на движението на показалеца" #. TRANSLATORS: %s is the filesystem name
#: extensions/drive-menu/extension.js:123
#: extensions/alternate-tab/prefs.js:20 #: extensions/places-menu/placeDisplay.js:210
msgid "Thumbnail only" #, javascript-format
msgstr "Само миниатюри" msgid "Ejecting drive “%s” failed:"
msgstr "Неуспешно изваждане на устройство „%s“:"
#: extensions/alternate-tab/prefs.js:21
msgid "Application icon only" #: extensions/drive-menu/extension.js:139
msgstr "Само икони на приложенията" msgid "Removable devices"
msgstr "Преносими медии"
#: extensions/alternate-tab/prefs.js:22
msgid "Thumbnail and application icon" #: extensions/drive-menu/extension.js:161
msgstr "Миниатюри и икони на приложенията" msgid "Open Files"
msgstr "Отваряне на файлове"
#: extensions/alternate-tab/prefs.js:38
msgid "Present windows as" #: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:5
msgstr "Показване на прозорците като" msgid "Use more screen for windows"
msgstr "Повече пространство за прозорците"
#: extensions/alternate-tab/prefs.js:69
msgid "Show only windows in the current workspace" #: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:6
msgstr "Да се показват само прозорците на текущия работен плот" msgid ""
"Try to use more screen for placing window thumbnails by adapting to screen "
#: extensions/apps-menu/extension.js:41 "aspect ratio, and consolidating them further to reduce the bounding box. "
msgid "Activities Overview" "This setting applies only with the natural placement strategy."
msgstr "Показване на програмите" msgstr ""
"Използване на по-голяма част от екрана за поставянето на мини изображения "
#: extensions/apps-menu/extension.js:141 "чрез промяна на съотношението на страните и допълнително обединяване за "
msgid "Favorites" "смаляване на обхващащия ги правоъгълник. Тази настройка се прилага само при "
msgstr "Любими" "естествената стратегия за поставяне на прозорците."
#: extensions/apps-menu/extension.js:436 #: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:11
msgid "Applications" msgid "Place window captions on top"
msgstr "Програми" msgstr "Заглавия на прозорците отгоре"
#: extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml:6 #: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:12
msgid "Application and workspace list" msgid ""
msgstr "Списък с програмите и работните плотове" "If true, place window captions on top the respective thumbnail, overriding "
"shell default of placing it at the bottom. Changing this setting requires "
#: extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml:7 "restarting the shell to have any effect."
msgid "" msgstr ""
"A list of strings, each containing an application id (desktop file name), " "Ако е истина, заглавията на прозорците се поставят над мини изображенията "
"followed by a colon and the workspace number" "им, а не както е стандартно — отдолу. За прилагане на промяната на "
msgstr "" "настройката трябва да рестартирате обвивката на GNOME."
"Списък от низове. Всеки съдържа идентификатор на програма (име на файл „."
"desktop“ file name), следван от знака „:“ и номер на работен плот" #: extensions/places-menu/extension.js:88
#: extensions/places-menu/extension.js:91
#: extensions/auto-move-windows/prefs.js:60 msgid "Places"
msgid "Application" msgstr "Места"
msgstr "Програма"
#: extensions/places-menu/placeDisplay.js:49
#: extensions/auto-move-windows/prefs.js:69 #, javascript-format
#: extensions/auto-move-windows/prefs.js:127 msgid "Failed to launch “%s”"
msgid "Workspace" msgstr "Неуспешно стартиране на „%s“"
msgstr "Работен плот"
#: extensions/places-menu/placeDisplay.js:64
#: extensions/auto-move-windows/prefs.js:85 #, javascript-format
msgid "Add Rule" msgid "Failed to mount volume for “%s”"
msgstr "Добавяне на правило" msgstr "Неуспешно монтиране на тома „%s“"
#: extensions/auto-move-windows/prefs.js:106 #: extensions/places-menu/placeDisplay.js:125
msgid "Create new matching rule" #: extensions/places-menu/placeDisplay.js:148
msgstr "Създаване на правило за съвпадение" msgid "Computer"
msgstr "Компютър"
#: extensions/auto-move-windows/prefs.js:111
msgid "Add" #: extensions/places-menu/placeDisplay.js:336
msgstr "Добавяне" msgid "Home"
msgstr "Домашна папка"
#. TRANSLATORS: %s is the filesystem name
#: extensions/drive-menu/extension.js:107 #: extensions/places-menu/placeDisplay.js:381
#, javascript-format msgid "Browse Network"
msgid "Ejecting drive “%s” failed:" msgstr "Мрежа"
msgstr "Неуспешно изваждане на устройство „%s“:"
#: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:7
#: extensions/drive-menu/extension.js:125 msgid "Cycle Screenshot Sizes"
msgid "Removable devices" msgstr "Смяна на размерите на снимката на екрана"
msgstr "Преносими медии"
#: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:11
#: extensions/drive-menu/extension.js:150 msgid "Cycle Screenshot Sizes Backward"
msgid "Open Files" msgstr "Смяна на размерите на снимката на екрана наобратно"
msgstr "Отваряне на файлове"
#: extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml:5
#: extensions/example/extension.js:17 msgid "Theme name"
msgid "Hello, world!" msgstr "Име на темата"
msgstr "Здравей, свят!"
#: extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml:6
#: extensions/example/org.gnome.shell.extensions.example.gschema.xml:5 msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell"
msgid "Alternative greeting text." msgstr ""
msgstr "Друго приветстващо съобщение." "Името на темата, която да бъде заредена от „~/.themes/name/gnome-shell“"
#: extensions/example/org.gnome.shell.extensions.example.gschema.xml:6 #: extensions/window-list/extension.js:72
msgid "" msgid "Close"
"If not empty, it contains the text that will be shown when clicking on the " msgstr "Затваряне"
"panel."
msgstr "" #: extensions/window-list/extension.js:92
"Ако ключът не е празен, съдържанието му се извежда при натискането на панела." msgid "Unminimize"
msgstr "Деминимизиране"
#: extensions/example/prefs.js:30
msgid "Message" #: extensions/window-list/extension.js:92
msgstr "Съобщение" msgid "Minimize"
msgstr "Минимизиране"
#. TRANSLATORS: Example is the name of the extension, should not be
#. translated #: extensions/window-list/extension.js:99
#: extensions/example/prefs.js:43 msgid "Unmaximize"
msgid "" msgstr "Демаксимизиране"
"Example aims to show how to build well behaved extensions for the Shell and "
"as such it has little functionality on its own.\n" #: extensions/window-list/extension.js:99
"Nevertheless its possible to customize the greeting message." msgid "Maximize"
msgstr "" msgstr "Максимизиране"
"Това е пример за добре работещо разширение на обвивката на GNOME и има "
"минимална функционалност.\n" #: extensions/window-list/extension.js:434
"С него можете да промените приветстващото съобщение на панела." msgid "Minimize all"
msgstr "Минимизиране на всички"
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:5
msgid "Use more screen for windows" #: extensions/window-list/extension.js:440
msgstr "Повече пространство за прозорците" msgid "Unminimize all"
msgstr "Деминимизиране на всички"
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:6
msgid "" #: extensions/window-list/extension.js:446
"Try to use more screen for placing window thumbnails by adapting to screen " msgid "Maximize all"
"aspect ratio, and consolidating them further to reduce the bounding box. " msgstr "Максимизиране на всички"
"This setting applies only with the natural placement strategy."
msgstr "" #: extensions/window-list/extension.js:454
"Използване на по-голяма част от екрана за поставянето на мини изображения " msgid "Unmaximize all"
"чрез промяна на съотношението на страните и допълнително обединяване за " msgstr "Демаксимизиране на всички"
"смаляване на обхващащия ги правоъгълник. Тази настройка се прилага само при "
"естествената стратегия за поставяне на прозорците." #: extensions/window-list/extension.js:462
msgid "Close all"
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:11 msgstr "Затваряне на всички"
msgid "Place window captions on top"
msgstr "Заглавия на прозорците отгоре" #: extensions/window-list/extension.js:741
msgid "Window List"
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:12 msgstr "Списък на прозорците"
msgid ""
"If true, place window captions on top the respective thumbnail, overriding " #: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:12
"shell default of placing it at the bottom. Changing this setting requires " msgid "When to group windows"
"restarting the shell to have any effect." msgstr "Кога прозорците да се групират"
msgstr ""
"Ако е истина, заглавията на прозорците се поставят над мини изображенията " #: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:13
"им, а не както е стандартно — отдолу. За прилагане на промяната на " msgid ""
"настройката трябва да рестартирате обвивката на GNOME." "Decides when to group windows from the same application on the window list. "
"Possible values are “never”, “auto” and “always”."
#: extensions/places-menu/extension.js:78 msgstr ""
#: extensions/places-menu/extension.js:81 "Кога прозорците на една програма да се групират в списъка с прозорците. "
msgid "Places" "Възможните стойности са „never“ (никога), „auto“ (автоматично) и "
msgstr "Места" "„always“ (винаги)."
#: extensions/places-menu/placeDisplay.js:65 #: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20
#, javascript-format #: extensions/window-list/prefs.js:76
msgid "Failed to mount volume for “%s”" msgid "Show windows from all workspaces"
msgstr "Неуспешно монтиране на тома „%s“" msgstr "Да се показват прозорците от всички работни плотове"
#: extensions/places-menu/placeDisplay.js:78 #: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:21
#, javascript-format msgid "Whether to show windows from all workspaces or only the current one."
msgid "Failed to launch “%s”" msgstr ""
msgstr "Неуспешно стартиране на „%s“" "Дали да се показват прозорците от всички работни плотове или само от текущия."
#: extensions/places-menu/placeDisplay.js:137 #: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:27
#: extensions/places-menu/placeDisplay.js:160 msgid "Show the window list on all monitors"
msgid "Computer" msgstr "Извеждане на списъка с прозорци на всички монитори"
msgstr "Компютър"
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:28
#: extensions/places-menu/placeDisplay.js:303 msgid ""
msgid "Home" "Whether to show the window list on all connected monitors or only on the "
msgstr "Домашна папка" "primary one."
msgstr ""
#: extensions/places-menu/placeDisplay.js:347 "Дали списъкът с прозорци да се извежда на всички монитори или само на "
msgid "Browse Network" "основния"
msgstr "Мрежа"
#: extensions/window-list/prefs.js:32
#: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:7 msgid "Window Grouping"
msgid "Cycle Screenshot Sizes" msgstr "Групиране на прозорци"
msgstr "Смяна на размерите на снимката на екрана"
#: extensions/window-list/prefs.js:37
#: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:11 msgid "Never group windows"
msgid "Cycle Screenshot Sizes Backward" msgstr "Никога да не се групират"
msgstr "Смяна на размерите на снимката на екрана наобратно"
#: extensions/window-list/prefs.js:38
#: extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml:5 msgid "Group windows when space is limited"
msgid "Theme name" msgstr "Групиране при ограничено място"
msgstr "Име на темата"
#: extensions/window-list/prefs.js:39
#: extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml:6 msgid "Always group windows"
msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell" msgstr "Винаги да се групират"
msgstr ""
"Името на темата, която да бъде заредена от „~/.themes/name/gnome-shell“" #: extensions/window-list/prefs.js:63
msgid "Show on all monitors"
#: extensions/window-list/extension.js:110 msgstr "На всички монитори"
msgid "Close"
msgstr "Затваряне" #: extensions/window-list/workspaceIndicator.js:249
#: extensions/workspace-indicator/extension.js:254
#: extensions/window-list/extension.js:129 msgid "Workspace Indicator"
msgid "Unminimize" msgstr "Индикатор на работните плотове"
msgstr "Деминимизиране"
#: extensions/workspace-indicator/prefs.js:18
#: extensions/window-list/extension.js:130 msgid "Workspace Names"
msgid "Minimize" msgstr "Имена на работните плотове"
msgstr "Минимизиране"
#: extensions/workspace-indicator/prefs.js:39
#: extensions/window-list/extension.js:136 #, javascript-format
msgid "Unmaximize" msgid "Workspace %d"
msgstr "Демаксимизиране" msgstr "Работен плот %d"
#: extensions/window-list/extension.js:137 #: extensions/workspace-indicator/prefs.js:184
msgid "Maximize" msgid "Add Workspace"
msgstr "Максимизиране" msgstr "Добавяне на работен плот"
#: extensions/window-list/extension.js:420
msgid "Minimize all"
msgstr "Минимизиране на всички"
#: extensions/window-list/extension.js:428
msgid "Unminimize all"
msgstr "Деминимизиране на всички"
#: extensions/window-list/extension.js:436
msgid "Maximize all"
msgstr "Максимизиране на всички"
#: extensions/window-list/extension.js:445
msgid "Unmaximize all"
msgstr "Демаксимизиране на всички"
#: extensions/window-list/extension.js:454
msgid "Close all"
msgstr "Затваряне на всички"
#: extensions/window-list/extension.js:678
#: extensions/workspace-indicator/extension.js:30
msgid "Workspace Indicator"
msgstr "Индикатор на работните плотове"
#: extensions/window-list/extension.js:842
msgid "Window List"
msgstr "Списък на прозорците"
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:12
msgid "When to group windows"
msgstr "Кога да се групират прозорците"
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:13
msgid ""
"Decides when to group windows from the same application on the window list. "
"Possible values are “never”, “auto” and “always”."
msgstr ""
"Кога да се групират прозорците на една програма в списъка с прозорците. "
"Възможните стойности са „never“ (никога), „auto“ (автоматично) и "
"„always“ (винаги)."
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20
msgid "Show the window list on all monitors"
msgstr "Извеждане на списъка с прозорци на всички монитори"
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:21
msgid ""
"Whether to show the window list on all connected monitors or only on the "
"primary one."
msgstr ""
"Дали списъкът с прозорци да се извежда на всички монитори или само на "
"основния"
#: extensions/window-list/prefs.js:32
msgid "Window Grouping"
msgstr "Групиране на прозорци"
#: extensions/window-list/prefs.js:50
msgid "Never group windows"
msgstr "Никога да не се групират"
#: extensions/window-list/prefs.js:51
msgid "Group windows when space is limited"
msgstr "Групиране при ограничено място"
#: extensions/window-list/prefs.js:52
msgid "Always group windows"
msgstr "Винаги да се групират"
#: extensions/window-list/prefs.js:75
msgid "Show on all monitors"
msgstr "На всички монитори"
#: extensions/workspace-indicator/prefs.js:141
msgid "Workspace Names"
msgstr "Имена на работните плотове"
#: extensions/workspace-indicator/prefs.js:157
msgid "Name"
msgstr "Име"
#: extensions/workspace-indicator/prefs.js:198
#, javascript-format
msgid "Workspace %d"
msgstr "Работен плот %d"
+47 -39
View File
@@ -9,7 +9,7 @@ msgstr ""
"Project-Id-Version: gnome-shell-extensions\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: 2020-05-28 00:55+0000\n" "POT-Creation-Date: 2021-11-06 14:08+0000\n"
"PO-Revision-Date: 2017-07-08 13:29+0100\n" "PO-Revision-Date: 2017-07-08 13:29+0100\n"
"Last-Translator: Jordi Mas <jmas@softcatala.org>\n" "Last-Translator: Jordi Mas <jmas@softcatala.org>\n"
"Language-Team: Catalan <tradgnome@softcatala.org>\n" "Language-Team: Catalan <tradgnome@softcatala.org>\n"
@@ -19,19 +19,28 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n" "Plural-Forms: nplurals=2; plural=n != 1;\n"
#: data/gnome-classic.desktop.in:3 data/gnome-classic.session.desktop.in:3 #: data/gnome-classic.desktop.in:3
msgid "GNOME Classic" msgid "GNOME Classic"
msgstr "GNOME clàssic" msgstr "GNOME clàssic"
#: 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 "Aquesta sessió us permet utilitzar el GNOME clàssic" msgstr "Aquesta sessió us permet utilitzar el GNOME clàssic"
#: extensions/apps-menu/extension.js:113 #: data/gnome-classic-wayland.desktop.in:3
msgid "GNOME Classic on Wayland"
msgstr "GNOME clàssic amb Wayland"
#: data/gnome-classic-xorg.desktop.in:3
msgid "GNOME Classic on Xorg"
msgstr "GNOME clàssic amb Xorg"
#: extensions/apps-menu/extension.js:112
msgid "Favorites" msgid "Favorites"
msgstr "Preferides" msgstr "Preferides"
#: extensions/apps-menu/extension.js:369 #: extensions/apps-menu/extension.js:366
msgid "Applications" msgid "Applications"
msgstr "Aplicacions" msgstr "Aplicacions"
@@ -48,26 +57,26 @@ msgstr ""
"d'aplicació (nom del fitxer de l'escriptori), seguit de dos punts i el " "d'aplicació (nom del fitxer de l'escriptori), seguit de dos punts i el "
"número de l'espai de treball" "número de l'espai de treball"
#: extensions/auto-move-windows/prefs.js:35 #: extensions/auto-move-windows/prefs.js:34
msgid "Workspace Rules" msgid "Workspace Rules"
msgstr "Regles dels espais de treball" msgstr "Regles dels espais de treball"
#: extensions/auto-move-windows/prefs.js:243 #: extensions/auto-move-windows/prefs.js:236
msgid "Add Rule" msgid "Add Rule"
msgstr "Afegeix una regla" msgstr "Afegeix una regla"
#. TRANSLATORS: %s is the filesystem name #. TRANSLATORS: %s is the filesystem name
#: extensions/drive-menu/extension.js:112 #: extensions/drive-menu/extension.js:133
#: extensions/places-menu/placeDisplay.js:233 #: extensions/places-menu/placeDisplay.js:233
#, javascript-format #, javascript-format
msgid "Ejecting drive “%s” failed:" msgid "Ejecting drive “%s” failed:"
msgstr "Ha fallat l'expulsió de la unitat «%s»:" msgstr "Ha fallat l'expulsió de la unitat «%s»:"
#: extensions/drive-menu/extension.js:128 #: extensions/drive-menu/extension.js:149
msgid "Removable devices" msgid "Removable devices"
msgstr "Dispositius extraïbles" msgstr "Dispositius extraïbles"
#: extensions/drive-menu/extension.js:155 #: extensions/drive-menu/extension.js:171
msgid "Open Files" msgid "Open Files"
msgstr "Obre els fitxers" msgstr "Obre els fitxers"
@@ -81,10 +90,10 @@ msgid ""
"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 ""
"Intenta utilitzar més espai de la pantalla per a posicionar les miniatures de " "Intenta utilitzar més espai de la pantalla per a posicionar les miniatures "
"les finestres adaptant-les a la ràtio d'aspecte de la pantalla, consolidant-" "de les finestres adaptant-les a la ràtio d'aspecte de la pantalla, "
"les més per a reduir la caixa que les envolta. Aquest paràmetre de " "consolidant-les més per a reduir la caixa que les envolta. Aquest paràmetre "
"configuració només s'aplica a l'estratègia de posicionament de finestres " "de configuració només s'aplica a l'estratègia de posicionament de finestres "
"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
@@ -102,8 +111,8 @@ msgstr ""
"posicionar-lo a baix. Cal reiniciar el Shell per tal que aquest canvi tingui " "posicionar-lo a baix. Cal reiniciar el Shell per tal que aquest canvi tingui "
"efecte." "efecte."
#: extensions/places-menu/extension.js:89 #: extensions/places-menu/extension.js:88
#: extensions/places-menu/extension.js:93 #: extensions/places-menu/extension.js:91
msgid "Places" msgid "Places"
msgstr "Llocs" msgstr "Llocs"
@@ -146,47 +155,47 @@ msgstr "Nom del tema"
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 "El nom del tema que es carregarà des de ~/.themes/name/gnome-shell" msgstr "El nom del tema que es carregarà des de ~/.themes/name/gnome-shell"
#: extensions/window-list/extension.js:98 #: extensions/window-list/extension.js:72
msgid "Close" msgid "Close"
msgstr "Tanca" msgstr "Tanca"
#: extensions/window-list/extension.js:118 #: extensions/window-list/extension.js:92
msgid "Unminimize" msgid "Unminimize"
msgstr "Desminimitza" msgstr "Desminimitza"
#: extensions/window-list/extension.js:118 #: extensions/window-list/extension.js:92
msgid "Minimize" msgid "Minimize"
msgstr "Minimitza" msgstr "Minimitza"
#: extensions/window-list/extension.js:125 #: extensions/window-list/extension.js:99
msgid "Unmaximize" msgid "Unmaximize"
msgstr "Desmaximitza" msgstr "Desmaximitza"
#: extensions/window-list/extension.js:125 #: extensions/window-list/extension.js:99
msgid "Maximize" msgid "Maximize"
msgstr "Maximitza" msgstr "Maximitza"
#: extensions/window-list/extension.js:428 #: extensions/window-list/extension.js:434
msgid "Minimize all" msgid "Minimize all"
msgstr "Minimitza-ho tot" msgstr "Minimitza-ho tot"
#: extensions/window-list/extension.js:434 #: extensions/window-list/extension.js:440
msgid "Unminimize all" msgid "Unminimize all"
msgstr "Desminimitza-ho tot" msgstr "Desminimitza-ho tot"
#: extensions/window-list/extension.js:440 #: extensions/window-list/extension.js:446
msgid "Maximize all" msgid "Maximize all"
msgstr "Maximitza-ho tot" msgstr "Maximitza-ho tot"
#: extensions/window-list/extension.js:448 #: extensions/window-list/extension.js:454
msgid "Unmaximize all" msgid "Unmaximize all"
msgstr "Desmaximitza-ho tot" msgstr "Desmaximitza-ho tot"
#: extensions/window-list/extension.js:456 #: extensions/window-list/extension.js:462
msgid "Close all" msgid "Close all"
msgstr "Tanca-ho tot" msgstr "Tanca-ho tot"
#: extensions/window-list/extension.js:734 #: extensions/window-list/extension.js:741
msgid "Window List" msgid "Window List"
msgstr "Llista de finestres" msgstr "Llista de finestres"
@@ -204,7 +213,7 @@ msgstr ""
"«auto» (automàticament) i «always» (sempre)." "«auto» (automàticament) i «always» (sempre)."
#: 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:86
msgid "Show windows from all workspaces" msgid "Show windows from all workspaces"
msgstr "Mostra les finestres de tots els espais de treball" msgstr "Mostra les finestres de tots els espais de treball"
@@ -226,41 +235,40 @@ msgstr ""
"Si es mostra la llista de finestres en tots els monitors connectats o només " "Si es mostra la llista de finestres en tots els monitors connectats o només "
"al primari." "al primari."
#: extensions/window-list/prefs.js:29 #: extensions/window-list/prefs.js:39
msgid "Window Grouping" msgid "Window Grouping"
msgstr "Agrupació de finestres" msgstr "Agrupació de finestres"
#: extensions/window-list/prefs.js:58 #: extensions/window-list/prefs.js:63
msgid "Never group windows" msgid "Never group windows"
msgstr "Mai agrupis les finestres" msgstr "Mai agrupis les finestres"
#: extensions/window-list/prefs.js:59 #: extensions/window-list/prefs.js:64
msgid "Group windows when space is limited" msgid "Group windows when space is limited"
msgstr "Agrupa les finestres quan l'espai estigui limitat" msgstr "Agrupa les finestres quan l'espai estigui limitat"
#: extensions/window-list/prefs.js:60 #: extensions/window-list/prefs.js:65
msgid "Always group windows" msgid "Always group windows"
msgstr "Agrupa les finestres sempre" msgstr "Agrupa les finestres sempre"
#: extensions/window-list/prefs.js:94 #: extensions/window-list/prefs.js:81
msgid "Show on all monitors" msgid "Show on all monitors"
msgstr "Mostra a tots els monitors" msgstr "Mostra a tots els monitors"
#: extensions/window-list/workspaceIndicator.js:207 #: extensions/window-list/workspaceIndicator.js:249
#: extensions/workspace-indicator/extension.js:213 #: extensions/workspace-indicator/extension.js:254
msgid "Workspace Indicator" msgid "Workspace Indicator"
msgstr "Indicador de l'espai de treball" msgstr "Indicador de l'espai de treball"
#: extensions/workspace-indicator/prefs.js:34 #: extensions/workspace-indicator/prefs.js:33
msgid "Workspace Names" msgid "Workspace Names"
msgstr "Noms dels espais de treball" msgstr "Noms dels espais de treball"
#: extensions/workspace-indicator/prefs.js:67 #: extensions/workspace-indicator/prefs.js:66
#, javascript-format #, javascript-format
msgid "Workspace %d" msgid "Workspace %d"
msgstr "Espai de treball %d" msgstr "Espai de treball %d"
#: extensions/workspace-indicator/prefs.js:218 #: extensions/workspace-indicator/prefs.js:207
msgid "Add Workspace" msgid "Add Workspace"
msgstr "Afegeix un espai de treball" msgstr "Afegeix un espai de treball"
+45 -36
View File
@@ -2,15 +2,15 @@
# Copyright (C) 2011 gnome-shell-extensions's COPYRIGHT HOLDER # Copyright (C) 2011 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.
# Petr Kovar <pknbe@volny.cz>, 2013. # Petr Kovar <pknbe@volny.cz>, 2013.
# Marek Černocký <marek@manet.cz>, 2011, 2012, 2013, 2014, 2015, 2017, 2019, 2020. # Marek Černocký <marek@manet.cz>, 2011, 2012, 2013, 2014, 2015, 2017, 2019, 2020, 2022.
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell-extensions\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: 2020-05-28 00:55+0000\n" "POT-Creation-Date: 2021-11-06 14:08+0000\n"
"PO-Revision-Date: 2020-08-28 22:18+0200\n" "PO-Revision-Date: 2022-02-16 09:58+0100\n"
"Last-Translator: Marek Černocký <marek@manet.cz>\n" "Last-Translator: Marek Černocký <marek@manet.cz>\n"
"Language-Team: Czech <gnome-cs-list@gnome.org>\n" "Language-Team: Czech <gnome-cs-list@gnome.org>\n"
"Language: cs\n" "Language: cs\n"
@@ -20,19 +20,28 @@ msgstr ""
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
"X-Generator: Gtranslator 2.91.6\n" "X-Generator: Gtranslator 2.91.6\n"
#: data/gnome-classic.desktop.in:3 data/gnome-classic.session.desktop.in:3 #: data/gnome-classic.desktop.in:3
msgid "GNOME Classic" msgid "GNOME Classic"
msgstr "GNOME klasik" msgstr "GNOME klasik"
#: data/gnome-classic.desktop.in:4 #: data/gnome-classic.desktop.in:4 data/gnome-classic-wayland.desktop.in:4
#: data/gnome-classic-xorg.desktop.in:4
msgid "This session logs you into GNOME Classic" msgid "This session logs you into GNOME Classic"
msgstr "Toto sezení vás přihlásí do GNOME klasik" msgstr "Toto sezení vás přihlásí do GNOME klasik"
#: extensions/apps-menu/extension.js:113 #: data/gnome-classic-wayland.desktop.in:3
msgid "GNOME Classic on Wayland"
msgstr "GNOME klasik na Waylandu"
#: data/gnome-classic-xorg.desktop.in:3
msgid "GNOME Classic on Xorg"
msgstr "GNOME klasik na Xorg"
#: extensions/apps-menu/extension.js:112
msgid "Favorites" msgid "Favorites"
msgstr "Oblíbené" msgstr "Oblíbené"
#: extensions/apps-menu/extension.js:369 #: extensions/apps-menu/extension.js:366
msgid "Applications" msgid "Applications"
msgstr "Aplikace" msgstr "Aplikace"
@@ -48,26 +57,26 @@ msgstr ""
"Seznam řetězců, z nichž každý obsahuje ID aplikace (název souboru pracovní " "Seznam řetězců, z nichž každý obsahuje ID aplikace (název souboru pracovní "
"plochy), následovaný dvojtečkou a číslem pracovní plochy" "plochy), následovaný dvojtečkou a číslem pracovní plochy"
#: extensions/auto-move-windows/prefs.js:35 #: extensions/auto-move-windows/prefs.js:34
msgid "Workspace Rules" msgid "Workspace Rules"
msgstr "Pravidla pracovních ploch" msgstr "Pravidla pracovních ploch"
#: extensions/auto-move-windows/prefs.js:243 #: extensions/auto-move-windows/prefs.js:236
msgid "Add Rule" msgid "Add Rule"
msgstr "Přidat pravidlo" msgstr "Přidat pravidlo"
#. TRANSLATORS: %s is the filesystem name #. TRANSLATORS: %s is the filesystem name
#: extensions/drive-menu/extension.js:112 #: extensions/drive-menu/extension.js:133
#: extensions/places-menu/placeDisplay.js:233 #: extensions/places-menu/placeDisplay.js:233
#, javascript-format #, javascript-format
msgid "Ejecting drive “%s” failed:" msgid "Ejecting drive “%s” failed:"
msgstr "Vysunutí disku „%s“ selhalo:" msgstr "Vysunutí disku „%s“ selhalo:"
#: extensions/drive-menu/extension.js:128 #: extensions/drive-menu/extension.js:149
msgid "Removable devices" msgid "Removable devices"
msgstr "Výměnná zařízení" msgstr "Výměnná zařízení"
#: extensions/drive-menu/extension.js:155 #: extensions/drive-menu/extension.js:171
msgid "Open Files" msgid "Open Files"
msgstr "Otevřít soubory" msgstr "Otevřít soubory"
@@ -99,8 +108,8 @@ msgstr ""
"přepíše výchozí chování shellu, který jej umisťuje dolů. Změna tohoto " "přepíše výchozí chování shellu, který jej umisťuje dolů. Změna tohoto "
"nastavení vyžaduje restart shellu, aby se projevila." "nastavení vyžaduje restart shellu, aby se projevila."
#: extensions/places-menu/extension.js:89 #: extensions/places-menu/extension.js:88
#: extensions/places-menu/extension.js:93 #: extensions/places-menu/extension.js:91
msgid "Places" msgid "Places"
msgstr "Místa" msgstr "Místa"
@@ -143,47 +152,47 @@ msgstr "Název motivu"
msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell" msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell"
msgstr "Název motivu, který se má načíst z ~/.themes/name/gnome-shell" msgstr "Název motivu, který se má načíst z ~/.themes/name/gnome-shell"
#: extensions/window-list/extension.js:98 #: extensions/window-list/extension.js:72
msgid "Close" msgid "Close"
msgstr "Zavřít" msgstr "Zavřít"
#: extensions/window-list/extension.js:118 #: extensions/window-list/extension.js:92
msgid "Unminimize" msgid "Unminimize"
msgstr "Zrušit minimalizaci" msgstr "Zrušit minimalizaci"
#: extensions/window-list/extension.js:118 #: extensions/window-list/extension.js:92
msgid "Minimize" msgid "Minimize"
msgstr "Minimalizovat" msgstr "Minimalizovat"
#: extensions/window-list/extension.js:125 #: extensions/window-list/extension.js:99
msgid "Unmaximize" msgid "Unmaximize"
msgstr "Zrušit maximalizaci" msgstr "Zrušit maximalizaci"
#: extensions/window-list/extension.js:125 #: extensions/window-list/extension.js:99
msgid "Maximize" msgid "Maximize"
msgstr "Maximalizovat" msgstr "Maximalizovat"
#: extensions/window-list/extension.js:428 #: extensions/window-list/extension.js:434
msgid "Minimize all" msgid "Minimize all"
msgstr "Minimalizovat všechna" msgstr "Minimalizovat všechna"
#: extensions/window-list/extension.js:434 #: extensions/window-list/extension.js:440
msgid "Unminimize all" msgid "Unminimize all"
msgstr "Zrušit minimalizaci všech" msgstr "Zrušit minimalizaci všech"
#: extensions/window-list/extension.js:440 #: extensions/window-list/extension.js:446
msgid "Maximize all" msgid "Maximize all"
msgstr "Maximalizovat všechna" msgstr "Maximalizovat všechna"
#: extensions/window-list/extension.js:448 #: extensions/window-list/extension.js:454
msgid "Unmaximize all" msgid "Unmaximize all"
msgstr "Zrušit maximalizaci všech" msgstr "Zrušit maximalizaci všech"
#: extensions/window-list/extension.js:456 #: extensions/window-list/extension.js:462
msgid "Close all" msgid "Close all"
msgstr "Zavřít všechna" msgstr "Zavřít všechna"
#: extensions/window-list/extension.js:734 #: extensions/window-list/extension.js:741
msgid "Window List" msgid "Window List"
msgstr "Seznam oken" msgstr "Seznam oken"
@@ -200,7 +209,7 @@ msgstr ""
"hodnoty jsou „never“ (nikdy), „auto“ (automaticky) a „always“ (vždy)." "hodnoty jsou „never“ (nikdy), „auto“ (automaticky) a „always“ (vždy)."
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20 #: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20
#: extensions/window-list/prefs.js:100 #: extensions/window-list/prefs.js:86
msgid "Show windows from all workspaces" msgid "Show windows from all workspaces"
msgstr "Zobrazovat okna ze všech pracovních ploch" msgstr "Zobrazovat okna ze všech pracovních ploch"
@@ -220,40 +229,40 @@ msgstr ""
"Zda zobrazovat seznam oken na všech připojených monitorech nebo jen na " "Zda zobrazovat seznam oken na všech připojených monitorech nebo jen na "
"hlavním." "hlavním."
#: extensions/window-list/prefs.js:29 #: extensions/window-list/prefs.js:39
msgid "Window Grouping" msgid "Window Grouping"
msgstr "Seskupování oken" msgstr "Seskupování oken"
#: extensions/window-list/prefs.js:58 #: extensions/window-list/prefs.js:63
msgid "Never group windows" msgid "Never group windows"
msgstr "Nikdy neseskupovat okna" msgstr "Nikdy neseskupovat okna"
#: extensions/window-list/prefs.js:59 #: extensions/window-list/prefs.js:64
msgid "Group windows when space is limited" msgid "Group windows when space is limited"
msgstr "Seskupovat okna při nedostatku místa" msgstr "Seskupovat okna při nedostatku místa"
#: extensions/window-list/prefs.js:60 #: extensions/window-list/prefs.js:65
msgid "Always group windows" msgid "Always group windows"
msgstr "Vždy seskupovat okna" msgstr "Vždy seskupovat okna"
#: extensions/window-list/prefs.js:94 #: extensions/window-list/prefs.js:81
msgid "Show on all monitors" msgid "Show on all monitors"
msgstr "Zobrazovat na všech monitorech" msgstr "Zobrazovat na všech monitorech"
#: extensions/window-list/workspaceIndicator.js:207 #: extensions/window-list/workspaceIndicator.js:249
#: extensions/workspace-indicator/extension.js:213 #: extensions/workspace-indicator/extension.js:254
msgid "Workspace Indicator" msgid "Workspace Indicator"
msgstr "Ukazatel pracovní plochy" msgstr "Ukazatel pracovní plochy"
#: extensions/workspace-indicator/prefs.js:34 #: extensions/workspace-indicator/prefs.js:33
msgid "Workspace Names" msgid "Workspace Names"
msgstr "Názvy pracovních ploch" msgstr "Názvy pracovních ploch"
#: extensions/workspace-indicator/prefs.js:67 #: extensions/workspace-indicator/prefs.js:66
#, javascript-format #, javascript-format
msgid "Workspace %d" msgid "Workspace %d"
msgstr "Pracovní plocha %d" msgstr "Pracovní plocha %d"
#: extensions/workspace-indicator/prefs.js:218 #: extensions/workspace-indicator/prefs.js:207
msgid "Add Workspace" msgid "Add Workspace"
msgstr "Přidat pracovní plochu" msgstr "Přidat pracovní plochu"
+44 -35
View File
@@ -11,8 +11,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: 2021-11-06 14:08+0000\n"
"PO-Revision-Date: 2020-09-07 18:36+0200\n" "PO-Revision-Date: 2022-02-27 13:21+0100\n"
"Last-Translator: Alan Mortensen <alanmortensen.am@gmail.com>\n" "Last-Translator: Alan Mortensen <alanmortensen.am@gmail.com>\n"
"Language-Team: Danish <dansk@dansk-gruppen.dk>\n" "Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
"Language: da\n" "Language: da\n"
@@ -22,19 +22,28 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.3\n" "X-Generator: Poedit 2.3\n"
#: data/gnome-classic.desktop.in:3 data/gnome-classic.session.desktop.in:3 #: data/gnome-classic.desktop.in:3
msgid "GNOME Classic" 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 "Denne session logger dig ind i GNOME Classic" msgstr "Denne session logger dig ind i GNOME Classic"
#: extensions/apps-menu/extension.js:113 #: data/gnome-classic-wayland.desktop.in:3
msgid "GNOME Classic on Wayland"
msgstr "GNOME Classic på Wayland"
#: data/gnome-classic-xorg.desktop.in:3
msgid "GNOME Classic on Xorg"
msgstr "GNOME Classic på Xorg"
#: extensions/apps-menu/extension.js:112
msgid "Favorites" msgid "Favorites"
msgstr "Favoritter" msgstr "Favoritter"
#: extensions/apps-menu/extension.js:369 #: extensions/apps-menu/extension.js:366
msgid "Applications" msgid "Applications"
msgstr "Programmer" msgstr "Programmer"
@@ -50,26 +59,26 @@ msgstr ""
"En liste over strenge, som hver indeholder et program-id " "En liste over strenge, som hver indeholder et program-id "
"(skrivebordsfilnavn), efterfulgt af et kolon og arbejdsområdets nummer" "(skrivebordsfilnavn), efterfulgt af et kolon og arbejdsområdets nummer"
#: extensions/auto-move-windows/prefs.js:35 #: extensions/auto-move-windows/prefs.js:34
msgid "Workspace Rules" msgid "Workspace Rules"
msgstr "Regler for arbejdsområde" msgstr "Regler for arbejdsområde"
#: extensions/auto-move-windows/prefs.js:243 #: extensions/auto-move-windows/prefs.js:236
msgid "Add Rule" msgid "Add Rule"
msgstr "Tilføj regel" msgstr "Tilføj regel"
#. TRANSLATORS: %s is the filesystem name #. TRANSLATORS: %s is the filesystem name
#: extensions/drive-menu/extension.js:112 #: extensions/drive-menu/extension.js:133
#: extensions/places-menu/placeDisplay.js:233 #: extensions/places-menu/placeDisplay.js:233
#, javascript-format #, javascript-format
msgid "Ejecting drive “%s” failed:" msgid "Ejecting drive “%s” failed:"
msgstr "Udskubning af drevet “%s” mislykkedes:" msgstr "Udskubning af drevet “%s” mislykkedes:"
#: extensions/drive-menu/extension.js:128 #: extensions/drive-menu/extension.js:149
msgid "Removable devices" msgid "Removable devices"
msgstr "Flytbare enheder" msgstr "Flytbare enheder"
#: extensions/drive-menu/extension.js:155 #: extensions/drive-menu/extension.js:171
msgid "Open Files" msgid "Open Files"
msgstr "Åbn filer" msgstr "Åbn filer"
@@ -103,8 +112,8 @@ msgstr ""
"Ændring af denne indstilling kræver at shell'en genstartes for at træde i " "Ændring af denne indstilling kræver at shell'en genstartes for at træde i "
"kraft." "kraft."
#: extensions/places-menu/extension.js:89 #: extensions/places-menu/extension.js:88
#: extensions/places-menu/extension.js:93 #: extensions/places-menu/extension.js:91
msgid "Places" msgid "Places"
msgstr "Steder" msgstr "Steder"
@@ -147,47 +156,47 @@ msgstr "Temanavn"
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 "Navnet på temaet, som indlæses fra ~/.themes/name/gnome-shell" msgstr "Navnet på temaet, som indlæses fra ~/.themes/name/gnome-shell"
#: extensions/window-list/extension.js:98 #: extensions/window-list/extension.js:72
msgid "Close" msgid "Close"
msgstr "Luk" msgstr "Luk"
#: extensions/window-list/extension.js:118 #: extensions/window-list/extension.js:92
msgid "Unminimize" msgid "Unminimize"
msgstr "Afminimér" msgstr "Afminimér"
#: extensions/window-list/extension.js:118 #: extensions/window-list/extension.js:92
msgid "Minimize" msgid "Minimize"
msgstr "Minimér" msgstr "Minimér"
#: extensions/window-list/extension.js:125 #: extensions/window-list/extension.js:99
msgid "Unmaximize" msgid "Unmaximize"
msgstr "Afmaksimér" msgstr "Afmaksimér"
#: extensions/window-list/extension.js:125 #: extensions/window-list/extension.js:99
msgid "Maximize" msgid "Maximize"
msgstr "Maksimér" msgstr "Maksimér"
#: extensions/window-list/extension.js:428 #: extensions/window-list/extension.js:434
msgid "Minimize all" msgid "Minimize all"
msgstr "Minimér" msgstr "Minimér"
#: extensions/window-list/extension.js:434 #: extensions/window-list/extension.js:440
msgid "Unminimize all" msgid "Unminimize all"
msgstr "Afminimér alle" msgstr "Afminimér alle"
#: extensions/window-list/extension.js:440 #: extensions/window-list/extension.js:446
msgid "Maximize all" msgid "Maximize all"
msgstr "Maksimér alle" msgstr "Maksimér alle"
#: extensions/window-list/extension.js:448 #: extensions/window-list/extension.js:454
msgid "Unmaximize all" msgid "Unmaximize all"
msgstr "Afmaksimér alle" msgstr "Afmaksimér alle"
#: extensions/window-list/extension.js:456 #: extensions/window-list/extension.js:462
msgid "Close all" msgid "Close all"
msgstr "Luk alle" msgstr "Luk alle"
#: extensions/window-list/extension.js:734 #: extensions/window-list/extension.js:741
msgid "Window List" msgid "Window List"
msgstr "Vinduesliste" msgstr "Vinduesliste"
@@ -204,7 +213,7 @@ msgstr ""
"Mulige værdier er “never” (aldrig), “auto” (automatisk) og “always” (altid)." "Mulige værdier er “never” (aldrig), “auto” (automatisk) og “always” (altid)."
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20 #: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20
#: extensions/window-list/prefs.js:100 #: extensions/window-list/prefs.js:86
msgid "Show windows from all workspaces" msgid "Show windows from all workspaces"
msgstr "Vis vinduer fra alle arbejdsområder" msgstr "Vis vinduer fra alle arbejdsområder"
@@ -225,41 +234,41 @@ msgstr ""
"Om vindueslisten skal vise på alle tilsluttede skærme, eller kun på den " "Om vindueslisten skal vise på alle tilsluttede skærme, eller kun på den "
"primære." "primære."
#: extensions/window-list/prefs.js:29 #: extensions/window-list/prefs.js:39
msgid "Window Grouping" msgid "Window Grouping"
msgstr "Vinduesgruppering" msgstr "Vinduesgruppering"
#: extensions/window-list/prefs.js:58 #: extensions/window-list/prefs.js:63
msgid "Never group windows" msgid "Never group windows"
msgstr "Gruppér aldrig vinduer" msgstr "Gruppér aldrig vinduer"
#: extensions/window-list/prefs.js:59 #: extensions/window-list/prefs.js:64
msgid "Group windows when space is limited" msgid "Group windows when space is limited"
msgstr "Gruppér vinduer når pladsen er begrænset" msgstr "Gruppér vinduer når pladsen er begrænset"
#: extensions/window-list/prefs.js:60 #: extensions/window-list/prefs.js:65
msgid "Always group windows" msgid "Always group windows"
msgstr "Gruppér altid vinduer" msgstr "Gruppér altid vinduer"
#: extensions/window-list/prefs.js:94 #: extensions/window-list/prefs.js:81
msgid "Show on all monitors" msgid "Show on all monitors"
msgstr "Vis på alle skærme" msgstr "Vis på alle skærme"
#: extensions/window-list/workspaceIndicator.js:207 #: extensions/window-list/workspaceIndicator.js:249
#: extensions/workspace-indicator/extension.js:213 #: extensions/workspace-indicator/extension.js:254
msgid "Workspace Indicator" msgid "Workspace Indicator"
msgstr "Arbejdsområdeindikator" msgstr "Arbejdsområdeindikator"
#: extensions/workspace-indicator/prefs.js:34 #: extensions/workspace-indicator/prefs.js:33
msgid "Workspace Names" msgid "Workspace Names"
msgstr "Navne på arbejdsområder" msgstr "Navne på arbejdsområder"
#: extensions/workspace-indicator/prefs.js:67 #: extensions/workspace-indicator/prefs.js:66
#, javascript-format #, javascript-format
msgid "Workspace %d" msgid "Workspace %d"
msgstr "Arbejdsområde %d" msgstr "Arbejdsområde %d"
#: extensions/workspace-indicator/prefs.js:218 #: extensions/workspace-indicator/prefs.js:207
msgid "Add Workspace" msgid "Add Workspace"
msgstr "Tilføj arbejdsområde" msgstr "Tilføj arbejdsområde"
+57 -47
View File
@@ -2,41 +2,51 @@
# Copyright (C) 2011 gnome-shell-extensions's COPYRIGHT HOLDER # Copyright (C) 2011 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.
# Mario Blättermann <mario.blaettermann@gmail.com>, 2011-2013, 2017. # Mario Blättermann <mario.blaettermann@gmail.com>, 2011-2013, 2017.
# Christian Kirbach <Christian.Kirbach@googlemail.com>, 2011, 2012. # Christian Kirbach <Christian.Kirbach@googlemail.com>, 2011, 2012, 2022.
# Benjamin Steinwender <b@stbe.at>, 2013. # Benjamin Steinwender <b@stbe.at>, 2013.
# Wolfgang Stöggl <c72578@yahoo.de>, 2014. # Wolfgang Stöggl <c72578@yahoo.de>, 2014.
# Paul Seyfert <pseyfert@mathphys.fsk.uni-heidelberg.de>, 2017. # Paul Seyfert <pseyfert@mathphys.fsk.uni-heidelberg.de>, 2017.
# Tim Sabsch <tim@sabsch.com>, 2019-2020. # Tim Sabsch <tim@sabsch.com>, 2019-2020.
# Philipp Kiemle <philipp.kiemle@gmail.com>, 2022.
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell-extensions master\n" "Project-Id-Version: gnome-shell-extensions master\n"
"Report-Msgid-Bugs-To: https://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: 2022-03-07 15:35+0000\n"
"PO-Revision-Date: 2020-09-08 20:20+0200\n" "PO-Revision-Date: 2022-03-10 22:26+0100\n"
"Last-Translator: Tim Sabsch <tim@sabsch.com>\n" "Last-Translator: Christian Kirbach <christian.kirbach@gmail.com>\n"
"Language-Team: Deutsch <gnome-de@gnome.org>\n" "Language-Team: Deutsch <gnome-de@gnome.org>\n"
"Language: de\n" "Language: de\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.4.1\n" "X-Generator: Poedit 3.0.1\n"
#: data/gnome-classic.desktop.in:3 data/gnome-classic.session.desktop.in:3 #: data/gnome-classic.desktop.in:3
msgid "GNOME Classic" msgid "GNOME Classic"
msgstr "GNOME 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 "Diese Sitzung meldet Sie in GNOME Classic an" msgstr "Diese Sitzung meldet Sie in GNOME Classic an"
#: extensions/apps-menu/extension.js:113 #: data/gnome-classic-wayland.desktop.in:3
msgid "GNOME Classic on Wayland"
msgstr "GNOME Classic unter Wayland"
#: data/gnome-classic-xorg.desktop.in:3
msgid "GNOME Classic on Xorg"
msgstr "GNOME Classic unter Xorg"
#: extensions/apps-menu/extension.js:118
msgid "Favorites" msgid "Favorites"
msgstr "Favoriten" msgstr "Favoriten"
#: extensions/apps-menu/extension.js:369 #: extensions/apps-menu/extension.js:379
msgid "Applications" msgid "Applications"
msgstr "Anwendungen" msgstr "Anwendungen"
@@ -53,26 +63,26 @@ msgstr ""
"Datei) enthält, gefolgt von einem Doppelpunkt und der Nummer der " "Datei) enthält, gefolgt von einem Doppelpunkt und der Nummer der "
"Arbeitsfläche" "Arbeitsfläche"
#: extensions/auto-move-windows/prefs.js:35 #: extensions/auto-move-windows/prefs.js:152
msgid "Workspace Rules" msgid "Workspace Rules"
msgstr "Arbeitsfläche-Regeln" msgstr "Arbeitsfläche-Regeln"
#: extensions/auto-move-windows/prefs.js:243 #: extensions/auto-move-windows/prefs.js:306
msgid "Add Rule" msgid "Add Rule"
msgstr "Regel hinzufügen" msgstr "Regel hinzufügen"
#. 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 "Auswerfen von Laufwerk »%s« schlug fehl:" msgstr "Auswerfen von Laufwerk »%s« schlug fehl:"
#: extensions/drive-menu/extension.js:128 #: extensions/drive-menu/extension.js:145
msgid "Removable devices" msgid "Removable devices"
msgstr "Wechseldatenträger" msgstr "Wechseldatenträger"
#: extensions/drive-menu/extension.js:155 #: extensions/drive-menu/extension.js:167
msgid "Open Files" msgid "Open Files"
msgstr "Dateien öffnen" msgstr "Dateien öffnen"
@@ -106,31 +116,31 @@ msgstr ""
"Vorschaubild platziert und damit die Voreinstellung der Shell übergangen. " "Vorschaubild platziert und damit die Voreinstellung der Shell übergangen. "
"Eine Änderungseinstellung tritt erst mit einem Neustart der Shell in Kraft." "Eine Änderungseinstellung tritt erst mit einem Neustart der Shell in Kraft."
#: 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 "Orte" msgstr "Orte"
#: 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 "Starten von »%s« fehlgeschlagen" msgstr "Starten von »%s« fehlgeschlagen"
#: 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 "Datenträger für »%s« konnte nicht eingebunden werden" msgstr "Datenträger für »%s« konnte nicht eingebunden werden"
#: 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 "Rechner" msgstr "Rechner"
#: extensions/places-menu/placeDisplay.js:359 #: extensions/places-menu/placeDisplay.js:336
msgid "Home" msgid "Home"
msgstr "Persönlicher Ordner" msgstr "Persönlicher Ordner"
#: extensions/places-menu/placeDisplay.js:404 #: extensions/places-menu/placeDisplay.js:381
msgid "Browse Network" msgid "Browse Network"
msgstr "Netzwerk durchsuchen" msgstr "Netzwerk durchsuchen"
@@ -152,47 +162,47 @@ msgstr ""
"Der Name des Themas, welches aus ~/.themes/name/gnome-shell geladen werden " "Der Name des Themas, welches aus ~/.themes/name/gnome-shell geladen werden "
"soll" "soll"
#: extensions/window-list/extension.js:98 #: extensions/window-list/extension.js:72
msgid "Close" msgid "Close"
msgstr "Schließen" msgstr "Schließen"
#: extensions/window-list/extension.js:118 #: extensions/window-list/extension.js:92
msgid "Unminimize" msgid "Unminimize"
msgstr "Minimieren rückgängig" msgstr "Minimieren rückgängig"
#: extensions/window-list/extension.js:118 #: extensions/window-list/extension.js:92
msgid "Minimize" msgid "Minimize"
msgstr "Minimieren" msgstr "Minimieren"
#: extensions/window-list/extension.js:125 #: extensions/window-list/extension.js:99
msgid "Unmaximize" msgid "Unmaximize"
msgstr "Maximieren rückgängig" msgstr "Maximieren rückgängig"
#: extensions/window-list/extension.js:125 #: extensions/window-list/extension.js:99
msgid "Maximize" msgid "Maximize"
msgstr "Maximieren" msgstr "Maximieren"
#: extensions/window-list/extension.js:428 #: extensions/window-list/extension.js:441
msgid "Minimize all" msgid "Minimize all"
msgstr "Alle minimieren" msgstr "Alle minimieren"
#: extensions/window-list/extension.js:434 #: extensions/window-list/extension.js:447
msgid "Unminimize all" msgid "Unminimize all"
msgstr "Alle minimieren rückgängig" msgstr "Alle minimieren rückgängig"
#: extensions/window-list/extension.js:440 #: extensions/window-list/extension.js:453
msgid "Maximize all" msgid "Maximize all"
msgstr "Alle maximieren" msgstr "Alle maximieren"
#: extensions/window-list/extension.js:448 #: extensions/window-list/extension.js:461
msgid "Unmaximize all" msgid "Unmaximize all"
msgstr "Alle maximieren rückgängig" msgstr "Alle maximieren rückgängig"
#: extensions/window-list/extension.js:456 #: extensions/window-list/extension.js:469
msgid "Close all" msgid "Close all"
msgstr "Alle schließen" msgstr "Alle schließen"
#: extensions/window-list/extension.js:734 #: extensions/window-list/extension.js:753
msgid "Window List" msgid "Window List"
msgstr "Fensterliste" msgstr "Fensterliste"
@@ -210,7 +220,7 @@ msgstr ""
"»always« (immer)." "»always« (immer)."
#: 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 "Fenster von allen Arbeitsflächen anzeigen" msgstr "Fenster von allen Arbeitsflächen anzeigen"
@@ -232,41 +242,41 @@ msgstr ""
"Legt fest, ob die Fensterliste auf allen angeschlossenen Bildschirmen " "Legt fest, ob die Fensterliste auf allen angeschlossenen Bildschirmen "
"angezeigt wird oder nur auf dem Primären." "angezeigt wird oder nur auf dem Primären."
#: extensions/window-list/prefs.js:29 #: extensions/window-list/prefs.js:35
msgid "Window Grouping" msgid "Window Grouping"
msgstr "Fenstergruppierung" msgstr "Fenstergruppierung"
#: extensions/window-list/prefs.js:58 #: extensions/window-list/prefs.js:40
msgid "Never group windows" msgid "Never group windows"
msgstr "Fenster niemals gruppieren" msgstr "Fenster niemals gruppieren"
#: 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 "Fenster bei Platzmangel gruppieren" msgstr "Fenster bei Platzmangel gruppieren"
#: extensions/window-list/prefs.js:60 #: extensions/window-list/prefs.js:42
msgid "Always group windows" msgid "Always group windows"
msgstr "Fenster immer gruppieren" msgstr "Fenster immer gruppieren"
#: extensions/window-list/prefs.js:94 #: extensions/window-list/prefs.js:66
msgid "Show on all monitors" msgid "Show on all monitors"
msgstr "Auf allen Bildschirmen anzeigen" msgstr "Auf allen Bildschirmen anzeigen"
#: 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 "Arbeitsflächenindikator" msgstr "Arbeitsflächenindikator"
#: extensions/workspace-indicator/prefs.js:34 #: extensions/workspace-indicator/prefs.js:62
msgid "Workspace Names"
msgstr "Namen der Arbeitsflächen"
#: extensions/workspace-indicator/prefs.js:67
#, javascript-format #, javascript-format
msgid "Workspace %d" msgid "Workspace %d"
msgstr "Arbeitsfläche %d" msgstr "Arbeitsfläche %d"
#: extensions/workspace-indicator/prefs.js:218 #: extensions/workspace-indicator/prefs.js:129
msgid "Workspace Names"
msgstr "Namen der Arbeitsflächen"
#: extensions/workspace-indicator/prefs.js:255
msgid "Add Workspace" msgid "Add Workspace"
msgstr "Arbeitsfläche hinzufügen" msgstr "Arbeitsfläche hinzufügen"

Some files were not shown because too many files have changed in this diff Show More