Compare commits

..

57 Commits

Author SHA1 Message Date
2a2634439c Bump version to 3.36.2
Update NEWS.
2020-04-29 22:39:21 +02:00
0d2d8cf623 Revert "endSessionDialog: apply updates by default"
Turns out it's not that clear in which cases we want to apply updates
and in which ones we shouldn't. For example one case is when the device
is running on battery, where we currently display a warning, but still
install updates by default.

So let's revert that again for now and hopefully work out a proper
concept for updates in the future.

This reverts commit ddb85c03c3.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1228
2020-04-29 19:51:05 +00:00
d64b1e6efb main: Unset the right prevFocus actor after the focus stack got shifted
When a modal that's not on top of the modalActorFocusStack gets popped,
we shift the focus stack as described in popModal() to ensure the chain
remains correct. That however destroys the association of a modal actor
and its prevFocus actor on the focus stack, because the prevFocus actors
are now moved to different entries of the stack.

Now when a prevFocus actor gets destroyed, we don't handle that case
correctly and search for the modal actor that was associated with the
prevFocus actor before the stack was shifted, which means we end up
unsetting the wrong prevFocus actor.

So fix that and search the stack for the prevFocus actor which is being
destroyed instead to unset the correct entry.

Thanks to Florian Müllner for figuring out the actual issue and
proposing this fix.

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


(cherry picked from commit d3880c0bff)
2020-04-29 17:36:06 +00:00
bbf3a09e2a shell Always draw the cursor ourself when capturing stage
Mutter changed to never draw the cursor with the used API, as it can't
be done in a predictable manner, so always draw it ourself.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1224
2020-04-29 12:38:01 +00:00
e57a4e0937 st/theme-context: Also remove theme nodes on stylesheet changes
StThemeNodes are built around the assumption that they're "immutable",
that means they are created once with certain parameters (that resolve
to certain css properties) and then replaced with new ones in case those
parameters changed.

Changes to the internal information stored by theme nodes (i.e. the css
properties, font names or the cached scale-factor) are not all handled
the same though: For changes to the font or the scale-factor we remove
all theme nodes from the cache and let the widgets which are on stage
generate new theme nodes. For changes to the css properties/the
stylesheet, we invalidate the properties of all theme nodes but keep
them in the cache using `_st_theme_node_reset_for_stylesheet_change()`.

So be a bit more consistent and handle changes to the css-properties/the
stylesheet stored by StThemeNodes the same way as changes to the font or
scale-factor.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1218


(cherry picked from commit 4dfa39457e)
2020-04-28 20:11:15 +00:00
443d615edf st/entry: Allow hint actor to shrink
We currently always ignore the minimum width of the hint actor and
request/allocate the preferred width. This can be problematic with
labels with long text, where we should rather ellipsize the text
than allow the entry to grow indefinively.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2607


(cherry picked from commit 7d7a15f978)
2020-04-28 20:05:23 +00:00
006d0e8521 theme: tone down weekend with events
Fixes https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2588


(cherry picked from commit e8f5a842b1)
2020-04-28 20:04:18 +00:00
1a5a01622a systemActions: include ASCII alternatives in search index
With this change, "eteindre" matches "éteindre" (the French translation
for "power off"), consistent with search for applications where "e"
matches "é".

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2688


(cherry picked from commit 3199620a83)
2020-04-28 20:03:44 +00:00
38e31b9f0d st: Ensure to reset all widget theme nodes
Theme node invalidation stops at unmapped widgets, and widgets
that forget to chain up to the default ::style-changed implementation.
This may leave stale nodes that were invalidated on
StThemeContext::changed, but are still set on widgets, and maybe
used for CSS property lookups.

Make sure that theme node invalidation happens always by moving
propagation outside the vfunc, and ensure the theme nodes are reset
across the full actor tree. Emission of ::style-changed, and obtaining
a new theme node may be delayed till when the actor is mapped.

The theme node is also cleared after unparenting an actor to avoid
stale references.

This ensures that all widgets get their theme node cleared after
stylesheet changes, instead of maybe being left with a theme node
that's been cleared of all its properties.

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

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1223

(cherry picked from commit 325ff73c5b)
2020-04-28 22:00:32 +02:00
fb7e70d562 authPrompt: Grab key focus when making entry sensitive
We currently let the entry of the autoPrompt grab the key focus inside
setQuestion(), which is called from _onAskQuestion(), which is the
callback of the "ask-question" signal.

It seems that the "ask-question" signal isn't emitted again right after
the password-check failed, but a few seconds after that. Since we get
the "verification-failed" signal earlier than "ask-question" (right
after we know the check failed) and we also get a hint whether the entry
should be usable again with the canRetry argument, we can also grab key
focus to in the same step.

So do that by grabbing key focus when making the entry sensitive.

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


(cherry picked from commit 8d139bbd95)
2020-04-28 16:45:27 +00:00
63a6c0d6f9 unlockDialog: Call AuthPrompt.addCharacter() directly
The additional function UnlockDialog.addCharacter() is only used at one
place, so we can simply remove it and call AuthPrompt.addCharacter()
directly. The AuthPrompt is shown right before that anyway.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1209


(cherry picked from commit fb1bb291eb)
2020-04-28 16:45:08 +00:00
05c1a6dce6 Update Czech translation 2020-04-28 16:37:25 +00:00
4097f7943f altTab: Set allocation before allocating children
Just as with the last commit, we should not break the assumption made by
Clutter that parents have their allocation set before their children get
allocated, so fix that here, too.

In this case we have to fix it by chaining up to the parent vfunc
override and updating the allocation once more before allocating the
`this._label` child.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/1615


(cherry picked from commit 49d6db34b7)
2020-04-28 16:24:25 +00:00
802c2fe532 boxpointer: Call set_allocation before allocating child
It's important to update the allocation of the parent before allocating
its children, it's an assumption we make in a lot of places.

This broke resource scale calculation for boxpointers and their
children when multiple monitors with different scales are used and the
primary monitor is not positioned at x=0, y=0.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/1615


(cherry picked from commit 63a0e521fd)
2020-04-28 16:24:05 +00:00
9497ddd68a overviewControls: Remove transitions before updating adjustment value
The workspace switcher blocks state updates while the indicator is
animating. Since commit 9c1940ef9d the indicator is considered to
be animating when the workspace adjustment's value doesn't equal the
active workspace.

There is one case though where this breaks badly: When a workspace
is inserted before the active one, the adjustment's upper and value
properties are changed without transitions. But if that change happens
while there's an ongoing transition to the previously active workspace,
the value gets out of sync with the active workspace and we end up
blocking state updates indefinitely.

Fix this by removing any transitions before setting the adjustment
value.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2625

(cherry picked from commit 2e80995f19)
2020-04-28 10:14:16 +02:00
890f5b591f keyboard: Add missing setter
We override the :visible property for the keyboard actor, but don't
provide a corresponding setter. The property is therefore read-only
on the javascript level, and any attempt to set it will fail.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2691


(cherry picked from commit 3ba4304da9)
2020-04-27 22:04:16 +00:00
5b0d013229 Update Czech translation 2020-04-22 12:51:51 +00:00
60ee6ab4b7 Update Brazilian Portuguese translation 2020-04-22 12:32:56 +00:00
18a5c74362 authPrompt: Fix spinner alignment
We want the spinner to be centered with regard to the entry, but
constraining the height breaks that:

 1. clutter_actor_allocate() is called with the available size
 2. clutter_actor_update_constraints() then adjusts that according
    to the constraints
 3. clutter_actor_adjust_allocation() applies the margin/expand/align
    properties.

The issue there is that 2. reduces the allocation to the desired size,
so there is no more extra space to distribute in 3.

We can fix this by either constraining everything (and rely on the
cancel button's alignment) or limit the constraint to the width. The
latter seems more appropriate, given that the constraint is only used
to center the entry horizontally.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2628


(cherry picked from commit b191e9ef91)
2020-04-17 22:59:00 +00:00
4895032054 windowManager: Fix ngettext() call
We don't pass the number that allows gettext to decide on the
correct string, whoops.

Spotted by Alexandre Franke.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2649


(cherry picked from commit 5ec5978d4a)
2020-04-17 22:36:04 +00:00
6b24ab572c polkitAgent: Reset the session request timeout when removing it
When handing the resetDialog request we're leaving a source ID alive,
leading this error:

(gnome-shell:22464): GLib-CRITICAL **: 17:46:11.065: Source ID 12934 was not
found when attempting to remove it:

== Stack trace for context 0x55c9246916c0 ==
#0 55c9249151b8 i   js/ui/components/polkitAgent.js:391 (11f71fd544c0 @ 100)
#1 7ffc55140aa0 b   self-hosted:1009 (3062ba49af88 @ 423)
#2 55c924915120 i   js/ui/modalDialog.js:167 (1c9e50ae9880 @ 62)
#3 55c924915098 i   js/ui/modalDialog.js:186 (1c9e50ae9970 @ 12)
#4 55c924915008 i   js/ui/environment.js:75 (1c9e50a8d5b0 @ 98)
#5 55c924914f78 i   js/ui/environment.js:149 (1c9e50a8d9e8 @ 14)

So, reset the source handle to avoid trying to remove it.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1203


(cherry picked from commit f4d90bc127)
2020-04-17 16:59:38 +00:00
35a3320851 appDisplay: Look up directory- instead of category translations
Translations are provided by .directory files, so trying to look
up a category name without the suffix will always fail.

Commit 343b3351f1 tried to fix this previously by changing the
saved keys, but that broke existing translatable folders.

Appending the .directory suffix for the lookup instead fixes the
issue without regressing non-custom folders.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2623


(cherry picked from commit 3fac0632a8)
2020-04-13 15:05:18 +00:00
156e05fe90 Revert "app-cache: Fix cache for folder translations"
Existing folders as created by gnome-software (including the
default ones) all have the .directory suffix, so dropping
the suffix from the keys broke those folders.

This reverts commit 343b3351f1.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2623


(cherry picked from commit c2b518929d)
2020-04-13 15:04:31 +00:00
cc0fac895c Update Finnish translation 2020-04-13 15:03:18 +00:00
a6783692c5 animation: Set size through CSS
Pretty much the same case of the previous commit: we want this size
to be scale-dependant, and using the width and height properties of
ClutterActor doesn't automatically update.

Use CSS to set the width and height.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1176
2020-04-06 14:37:35 -03:00
1c27b68bcc appDisplay: Set the folder icon geometry through CSS
The CSS engine is scale-aware, whereas simply setting the
width and height properties directly isn't.

Use CSS to set the folder icon.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1176
2020-04-06 14:37:35 -03:00
717c05a288 st/theme-node: Use the node's scale factor
Each node stores the scale factor in place when it was created.
Creating nodes with the same style, but with different scale
factors, yields different nodes.

Use the node's scale factor instead of retrieving the context's
one.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1176
2020-04-06 14:37:35 -03:00
e68604b1aa st/theme-node: Consider scale factor when comparing
The CSS engine of St is scale-aware, which means every length
and size it produces is multiplied by the current scale factor.

However, the individual nodes aren't aware of the scale factor
when they compare to each other.

Store and compare the scale factors in the nodes themselves.

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

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1176
2020-04-06 14:37:35 -03:00
0368ad29e9 st/theme-context: Add a getter for the scale-factor property
Will be used by the next commit to avoid going through the GObject
machinery when retrieving the scale factor.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1176
2020-04-06 14:37:35 -03:00
b982ce394e shell-app: Use container widget for fallback X11 app icons
Just like StIcon does, we should use a container widget for the fallback
app icon that we get using the cairo surface property. It's needed
because the widget returned by shell_app_create_icon_texture() can be
resized freely, while we want the aspect ratio of the actual texture to
remain the same.

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


(cherry picked from commit 85846d88f0)
2020-04-06 15:00:05 +00:00
025647f585 st/theme-context: Also invalidate root node on stylesheet changes
Since commit 6a42d77261 we invalidate the
cached properties for each theme node on stylesheet changes by iterating
over the hashtable of the theme context instead of listening to the
signal in each individual theme node.

That commit forgot one particular node though that's not stored in the
hashtable, but using the `priv->root_node` property instead: The theme
node that belongs to the stage.

So make sure we also invalidate the cached properties of the stage theme
node on stylesheet changes. This fixes various crashes that happened
with extensions providing custom stylesheets (emitting the
"custom-stylesheets-changed" signal on every extension enable/disable),
trying to access an already freed CSS property of the stage.

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


(cherry picked from commit bc973b80d7)
2020-04-06 14:59:45 +00:00
7125b726ad data: Add extension-portal desktop file
Now that the extension preference dialog is opened by a separate
D-Bus service rather than the Extensions app, it can be opened
without a parent window that provides name and icon.

Fix this by adding back a hidden .desktop file.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2562


(cherry picked from commit 6b7c85b079)
2020-04-05 13:48:39 +00:00
aebfab7207 extensions-app: Add category in .desktop file
Predefined categories aren't a great way for organizing installed
applications, but they have their use in "stores" like Software
or flathub.

Not listing any category means we fall through the cracks, so
pick the (hopefully) least inappropriate one ...

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1160


(cherry picked from commit 360f5b1642)
2020-04-05 12:46:11 +00:00
698bd5b3a9 st/icon: Use a static GIcon for the missing-image icon
Don't create a new GIcon for the "missing-image" texture but simply
create it once statically instead and always use that.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1179


(cherry picked from commit 1ca39e8586)
2020-04-04 19:40:10 +00:00
51e9f19f2f st/icon: Always show empty texture if both gicons are NULL
Commit 7ff7fb5d3b forgot to clear the
`priv->icon_texture` actor when returning from st_icon_update(), which
means we don't always switch to an empty icon if both gicon properties
are set to NULL.

Fix this and destroy the actor before returning early from
st_icon_update().

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1178


(cherry picked from commit 07deda593a)
2020-04-04 19:30:49 +00:00
6d38a4a7b3 Update Latvian translation 2020-04-04 16:14:40 +00:00
dfcc5ffb1e screenShield: Wake up on deactivate()
Usually the screen is woken up before the shield is deactivated, but
it is also possible to unlock the session programmatically via the
org.gnome.ScreenSaver D-Bus API.

The intention is very likely not to unlock a turned off screen in
that case. Nor does it seem like a good idea to change the lock
state without any indication.

Waking up the screen is more likely to meet expectations and is
more reasonable too, so do that.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1158


(cherry picked from commit fbe2e30f38)
2020-04-03 15:09:24 +00:00
8b80a4cf4d screenShield: Switch lightboxes off before unlock transition
There is no point in animating a transition with fullscreen black
rectangles stacked on top, so switch them off before rather than
after the transition.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1158


(cherry picked from commit fb6ead2881)
2020-04-03 15:08:58 +00:00
01e894c028 st/icon: Only load default fallback icon if an icon was set and failed to load
Commit c89d6a633 introduced a default fallback icon that would be displayed in
case the main gicon or the fallback gicon wasn't set or failed to load.

This broke the use case where a StIcon is created but no main icon or
fallback icon are set on purpose, for example the appindicator extension
which always creates a StIcon to represent icons in menu items but the
actual icons are only set if the application provides one, leaving the
menu showing the default fallback ("image-missing") icon for all menu
entries that don't actually have an icon provided by the application.

Fix that by only using the default fallback icon if the provided one
failed to load.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1173

(cherry picked from commit 7ff7fb5d3b)
2020-04-03 17:00:30 +02:00
856adfd1f1 extensionUtils: Add openPrefs() convenience method
Opening their own preferences is a reasonable desire for extensions,
so make up for breaking it by adding a convenience method for that
action.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1163

(cherry picked from commit 8030d9ad32)
2020-04-03 17:00:07 +02:00
efee3aa749 extensionSystem: Add method for opening extension prefs
Extension that want to expose their own preferences (for example as menu
items) do that by passing their UUID to gnome-shell-extension-prefs.

But since 3.36.1 the app is optional and no longer accepts arguments on
the command line. To adjust, extensions now need to make a D-Bus call
the extensions portal, just like the app and gnome-shell.

We will add a convenience method for that purpose, so it makes
sense to share the existing code. As it's extension-related, the
extension manager looks like the right place ...

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1163

(cherry picked from commit 45bc850715)
2020-04-03 16:58:15 +02:00
15e72da648 workspace: Fix chaining up
Gah, accidentally dropped the 'vfunc' prefix :-(

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1172
2020-04-03 15:47:01 +02:00
3f8bd1db25 extensions-app: Do not expand headerbar switch
https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2563
2020-04-03 15:47:01 +02:00
3a863ee341 js: Account for promisified call() method
A promisified method expects the callback parameter to be either
a function (in which case the original method is called normally)
or omitted altogether (in which case a Promise is returned).

The call to open application details in Software does neither and
passes null instead, which will result in a warning (because no
function argument means a promise will be used, but not omitting
the parameter means we end up with too many arguments).

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2551
2020-04-03 02:03:18 +00:00
654a7af929 environment: Move g_dbus_connection_call() promisification
Commit 83c6b2ab promisified the method in endSessionDialog, which means
that after the module is imported, every caller will get the promisifed
version. That can be a bit surprising in completely unrelated modules,
so commit 764527c8 (on master) moved the promisification of more common
methods into environment, as that's initialized early and expected to be
shared between anything else.

Do the same for the call() method on the stable branch.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2551
2020-04-03 02:03:18 +00:00
8dd9cbac7f app-cache: Fix cache for folder translations
The app-cache code currently stores the folder translations in a hash
that can be accessed via shell_util_get_translated_folder_name().
This hash uses the filename (inc. extension) for the "desktop-directory"
as key which causes an issue when trying to find the translation
on AppDisplay._findBestFolderName() which gets categories (folder names)
from the app info which doesn't contain the ".directory" extension.

Fix that by storing the filename without extension as the hash key for
the cached folder translations.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1168


(cherry picked from commit 343b3351f1)
2020-04-03 00:40:34 +00:00
331db650dd appDisplay: Don't clear signal handler id before emitting
Otherwise we won't clear the 'view-loaded' handler after it was emitted.

Also move field initialization to the correct place, i.e. the init
function of the base class.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1169


(cherry picked from commit a9df4e7516)
2020-04-02 21:10:30 +00:00
428d38179d Update Serbian translation 2020-04-02 19:43:03 +00:00
fe9708ebd8 Update Basque translation 2020-04-02 16:15:32 +00:00
8398769321 Update Finnish translation 2020-04-02 09:44:36 +00:00
768c08ba9d main: Don't override DesktopAppInfo desktop if already GNOME
During the shell initialization we call the (deprecated) function to
override the Desktop environment in Gio DesktopAppInfo to make sure that
applications are correctly shown (as per commit b2fbf5a2), however this
might break the cases in which $XDG_CURRENT_DESKTOP is already set and
contains GNOME (given that is now a list).

In Ubuntu this is in fact set to: ubuntu:GNOME.
Now, if an application contains NotShowIn=ubuntu, the key will be ignored by
the shell, and the application is still listed everywhere.

So, override the DesktopAppInfo desktop environment only in the case that
the current desktop is not already GNOME.

At the current date I think we could just safely get rid of this override at
all, but there could be still cases where it still might be useful, like when
running as nested in some other environment, so keeping it.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/1156


(cherry picked from commit a0def23940)
2020-04-01 03:58:56 +00:00
69426cbfda Update Persian translation 2020-04-01 01:42:46 +00:00
9f968e7378 appDisplay: Clear animateLater callbacks when unmapping
In some situations we could end up not with lingering 'view-loaded'
handler. This could result in delayed spring animate-in being initiated,
e.g. after a minute after the activities overview was already closed.

Fix this by removing any lingering signal or later handlers when
unmapping.

Fixes: 5c33fe4a0a

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1155


(cherry picked from commit f49b58cf97)
2020-03-31 17:12:35 +00:00
1ab5e6973a Update Chinese (Taiwan) translation 2020-03-31 16:07:19 +00:00
1dea3341ec Update Friulian translation 2020-03-31 11:14:15 +00:00
8fda054dc5 Bump version to 3.36.1
Update NEWS.
2020-03-31 00:27:47 +02:00
e989684602 extensions-app/metainfo: Point screenshots to stable branch 2020-03-30 21:32:17 +02:00
64 changed files with 2194 additions and 1928 deletions

86
NEWS
View File

@ -1,3 +1,89 @@
3.36.2
======
* Add openPrefs() convenience method for extensions [Florian; !1163]
* Bring back support for empty StIcons [Andre, Jonas D.; !1173, !1178]
* Wake up screen when unlocking programmatically [Florian; !1158]
* Improve handling of scale-factor changes [Georges; !1176]
* Fix translations of folder names [Florian; #2623]
* Fix delay on lock screen after entering wrong password [Jonas D.; #2655]
* Match ASCII alternatives of system actions [Will; #2688]
* Tone down weekend days with events in calendar [Jakub; #2588]
* Fix area screenshots on multi-monitor systems [Jonas Å; !1224]
* Fix stuck lock screen after unlock [Jonas D., Florian; #2446]
* Fixed crashes [Jonas D., Florian, Carlos; #2584, #2625, !1223, !1218]
* Misc. bug fixes and cleanups [Jonas Å., Marco, Andre, Florian, Jonas D.;
!1155, !1156, !1169, !1168, #2551, #2563, !1172, !1179, !1160, #2562, #2578,
!1203, #2649, #2628, #2691, #1615, #2607, !1228]
Contributors:
Marco Trevisan (Treviño), Jonas Dreßler, Carlos Garnacho,
Andre Moreira Magalhaes, Florian Müllner, Georges Basile Stavracas Neto,
Jakub Steiner, Will Thompson, Jonas Ådahl
Translators:
Fabio Tomat [fur], Cheng-Chia Tseng [zh_TW], Danial Behzadi [fa],
Jiri Grönroos [fi], Ibai Oihanguren Sala [eu], Марко Костић [sr],
Rūdolfs Mazurs [lv], Rafael Fontenelle [pt_BR], Petr Kovář [cs],
Daniel Rusek [cs]
3.36.1
======
* Improve app folders [Jonas D.; !1011]
* Fix launching ibus daemon [Alynx; !1080]
* Do not shutdown ibus/xsettings on X11 compositor restart [Carlos; #2329]
* Hide hint text in entries when preedit is used [Carlos; !1084]
* Do not load app infos on main thread [Christian; #2282]
* Don't expose FDO Notifications interface on main bus name [Florian; !547]
* Fix icon of mobile broadband connections [Cosimo, Reik; !1097, !1105]
* Fix high-contrast/symbolic icon mix-up [Florian; #2414]
* Don't ellipsize times in world clock [Florian; !1090]
* Only check for extension updates if there are any extensions [Florian; !1100]
* Fix crash when trying to update removed extensions [Florian; #2343]
* Make Extensions app available as flatpak [Florian; !1081, !1106, !1087, !1133]
* Display fractional timezones as hours:minutes [Jonas D.; #2438]
* Fix assigning pad keybindings [Carlos; #2451]
* Handle embedded newlines in lock screen notifications [Florian; #2463]
* Fix OSK layout fallback for unsupported variants [Florian; #2471]
* Do not apply text color to color glyphs (emojis) [Carlos; #850]
* Check "Install pending software updates" by default [Michael; #2427]
* Do not warn about missing GDM on each login [Florian; #2432]
* Fix telepathy chat notifications [Marco; !1112]
* Fix offline updates support in end session dialog [Michael; #2276]
* Fix activating notifications by keyboard [Florian; #2319]
* Remove handling of 'blacklisted' extensions [Florian; !1132]
* Only update extensions if Extensions app is installed [Florian; #2346]
* Improve Norwegian on-screen-keyboard layout [Bjørn; !1073]
* Fix IM support for deleting surrounding text [Takao; !477]
* Fix blur effect with fractional scaling [Jonas D.; !1000]
* Use better location name in weather section [Florian; #2468]
* Fix glitch in sound feedback on volume changes [Florian; !1147]
* Fix on-screen keyboard regressions [Jonas D.; !1142]
* Improve screen-reader support [Luke; #2508, #2517]
* Fix password entry resize on login/lock screen [Florian; #2423]
* Fix crash when opening app picker [Jonas Å.; !1154]
* Misc. bug fixes and cleanups [Florian, Sebastian, Jan, Daniel, Philip, Mario,
Ray, Marco, Jonas D., Carlos, Georges; #2298, #2305, !1078, !1077, #2334,
#2381, !1093, !1098, #2386, !1108, !1109, !1114, !1076, !1072, !1115, !1088,
!1101, #2467, !1121, !1122, #2476, !1123, !1117, !1129, !1113, !1102, !1127,
#2238, !1131, !1135, !1136, !849, #2504, #2371, !1146, !1141, #2510, !1150]
Contributors:
Marco Trevisan (Treviño), Michael Catanzaro, Cosimo Cecchi, Jonas Dreßler,
Takao Fujiwara, Carlos Garnacho, Christian Hergert, Sebastian Keller,
Reik Keutterling, Bjørn Lie, Florian Müllner, Jwtiyar Nariman,
Georges Basile Stavracas Neto, Mario Sanchez Prada, Ray Strode, Jan Tojnar,
Daniel van Vugt, Philip Withnall, Luke Yelavich, Alynx Zhou, Jonas Ådahl
Translators:
Марко Костић [sr], Jordi Mas [ca], sicklylife [ja], Marek Černocký [cs],
Daniel Rusek [cs], Kjartan Maraas [nb], Tim Sabsch [de], Stas Solovey [ru],
Peter Mráz [sk], Rafael Fontenelle [pt_BR], Piotr Drąg [pl],
Milo Casagrande [it], Anders Jonsson [sv], Yuri Chornoivan [uk],
Kukuh Syafaat [id], Guillaume Bernard [fr], Daniel Mustieles [es],
Danial Behzadi [fa], Goran Vidović [hr], Yosef Or Boczko [he],
Emin Tufan Çetin [tr], Wolfgang Stöggl [de], Ibai Oihanguren Sala [eu],
Jwtiyar Nariman [ckb], Aurimas Černius [lt]
3.36.0
======
* Fix off-by-1900 error in date conversions [Florian; !1061]

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.1 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M6.5 1.031c-.371 0-.742-.035-1.11.016-.367.05-.73.203-.972.476-.125.141-.215.309-.266.485-.047.18-.054.367-.02.55.032.184.102.356.192.516.09.164.203.309.317.457L5 4H2a1.8 1.8 0 00-.41.035.791.791 0 00-.36.195.791.791 0 00-.195.36C1 4.723 1 4.863 1 5v2.75l.77-.344c.265-.117.542-.23.832-.242.289-.016.586.074.812.254.227.18.383.441.465.723.082.277.101.57.121.859.02.316.04.637-.016.95-.058.312-.199.616-.43.831a1.264 1.264 0 01-.874.32c-.317-.007-.618-.128-.91-.257L1 10.5V14c0 .137.004.277.035.41a.791.791 0 00.195.36c.098.097.227.16.36.195.133.035.273.035.41.035h3l-.328-.68c-.14-.293-.274-.597-.29-.922-.015-.32.095-.652.31-.894.214-.242.523-.39.84-.453.316-.067.644-.059.968-.059.324 0 .652-.008.969.059.316.062.625.21.84.453.214.242.324.574.308.894-.015.325-.148.63-.289.922L8 15h3a1.8 1.8 0 00.41-.035.791.791 0 00.36-.195.791.791 0 00.195-.36C12 14.277 12 14.137 12 14v-3.563l.703.297c.29.125.59.239.902.246.313.004.63-.101.864-.308.238-.203.386-.496.46-.8C15 9.565 15 9.25 15 8.937c0-.313 0-.63-.07-.934-.075-.305-.223-.598-.461-.8a1.288 1.288 0 00-.864-.31c-.312.008-.613.122-.902.247L12 7.437V5a1.8 1.8 0 00-.035-.41.791.791 0 00-.195-.36.791.791 0 00-.36-.195C11.277 4 11.137 4 11 4H8l.36-.469c.113-.148.226-.293.316-.457.09-.16.16-.332.191-.515a1.248 1.248 0 00-.02-.551 1.256 1.256 0 00-.265-.485c-.242-.273-.605-.425-.973-.476-.367-.05-.738-.016-1.109-.016zm0 0" fill="#474747"/></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

1
data/icons/meson.build Normal file
View File

@ -0,0 +1 @@
install_subdir('hicolor', install_dir: icondir)

View File

@ -1,5 +1,6 @@
desktop_files = [
'org.gnome.Shell.desktop',
'org.gnome.Shell.Extensions.desktop',
]
service_files = []
@ -42,6 +43,7 @@ endforeach
subdir('dbus-interfaces')
subdir('icons')
subdir('theme')
data_resources = [

View File

@ -0,0 +1,10 @@
[Desktop Entry]
Type=Application
# Keep in sync with subprojects/extensions-app
Name=Extensions
# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
Icon=org.gnome.Shell.Extensions
# Never launch this, just provide name+icon to portal dialog
Exec=false
OnlyShowIn=GNOME;
NoDisplay=true

View File

@ -153,9 +153,11 @@
}
.calendar-day-with-events {
color: lighten($fg_color,10%);
font-weight: bold;
background-image: url("resource:///org/gnome/shell/theme/calendar-today.svg");
&.calendar-work-day {
color: lighten($fg_color,10%);
font-weight: bold;
}
}
.calendar-other-month-day {

View File

@ -184,7 +184,7 @@ var AuthPrompt = GObject.registerClass({
});
this._defaultButtonWell.add_constraint(new Clutter.BindConstraint({
source: this.cancelButton,
coordinate: Clutter.BindCoordinate.SIZE,
coordinate: Clutter.BindCoordinate.WIDTH,
}));
this._mainBox.add_child(this._defaultButtonWell);
@ -424,7 +424,13 @@ var AuthPrompt = GObject.registerClass({
}
updateSensitivity(sensitive) {
if (this._entry.reactive === sensitive)
return;
this._entry.reactive = sensitive;
if (sensitive)
this._entry.grab_key_focus();
}
vfunc_hide() {

View File

@ -2,7 +2,7 @@
/* exported BANNER_MESSAGE_KEY, BANNER_MESSAGE_TEXT_KEY, LOGO_KEY,
DISABLE_USER_LIST_KEY, fadeInActor, fadeOutActor, cloneAndFadeOutActor */
const { Clutter, Gdm, Gio, GLib } = imports.gi;
const { Clutter, Gio, GLib } = imports.gi;
const Signals = imports.signals;
const Batch = imports.gdm.batch;
@ -12,15 +12,6 @@ const Main = imports.ui.main;
const Params = imports.misc.params;
const SmartcardManager = imports.misc.smartcardManager;
Gio._promisify(Gdm.Client.prototype,
'open_reauthentication_channel', 'open_reauthentication_channel_finish');
Gio._promisify(Gdm.Client.prototype,
'get_user_verifier', 'get_user_verifier_finish');
Gio._promisify(Gdm.UserVerifierProxy.prototype,
'call_begin_verification_for_user', 'call_begin_verification_for_user_finish');
Gio._promisify(Gdm.UserVerifierProxy.prototype,
'call_begin_verification', 'call_begin_verification_finish');
var PASSWORD_SERVICE_NAME = 'gdm-password';
var FINGERPRINT_SERVICE_NAME = 'gdm-fingerprint';
var SMARTCARD_SERVICE_NAME = 'gdm-smartcard';
@ -177,12 +168,14 @@ var ShellUserVerifier = class {
this._checkForFingerprintReader();
// If possible, reauthenticate an already running session,
// so any session specific credentials get updated appropriately
if (userName)
this._openReauthenticationChannel(userName);
else
this._getUserVerifier();
if (userName) {
// If possible, reauthenticate an already running session,
// so any session specific credentials get updated appropriately
this._client.open_reauthentication_channel(userName, this._cancellable,
this._reauthenticationChannelOpened.bind(this));
} else {
this._client.get_user_verifier(this._cancellable, this._userVerifierGot.bind(this));
}
}
cancel() {
@ -346,11 +339,10 @@ var ShellUserVerifier = class {
this._verificationFailed(false);
}
async _openReauthenticationChannel(userName) {
_reauthenticationChannelOpened(client, result) {
try {
this._clearUserVerifier();
this._userVerifier = await this._client.open_reauthentication_channel(
userName, this._cancellable);
this._userVerifier = client.open_reauthentication_channel_finish(result);
} catch (e) {
if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
return;
@ -359,7 +351,8 @@ var ShellUserVerifier = class {
// Gdm emits org.freedesktop.DBus.Error.AccessDenied when there
// is no session to reauthenticate. Fall back to performing
// verification from this login session
this._getUserVerifier();
client.get_user_verifier(this._cancellable,
this._userVerifierGot.bind(this));
return;
}
@ -373,11 +366,10 @@ var ShellUserVerifier = class {
this._hold.release();
}
async _getUserVerifier() {
_userVerifierGot(client, result) {
try {
this._clearUserVerifier();
this._userVerifier =
await this._client.get_user_verifier(this._cancellable);
this._userVerifier = client.get_user_verifier_finish(result);
} catch (e) {
if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
return;
@ -429,25 +421,35 @@ var ShellUserVerifier = class {
}
}
async _startService(serviceName) {
_startService(serviceName) {
this._hold.acquire();
try {
if (this._userName) {
await this._userVerifier.call_begin_verification_for_user(
serviceName, this._userName, this._cancellable);
} else {
await this._userVerifier.call_begin_verification(
serviceName, this._cancellable);
}
} catch (e) {
if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
return;
this._reportInitError(this._userName
? 'Failed to start verification for user'
: 'Failed to start verification', e);
return;
if (this._userName) {
this._userVerifier.call_begin_verification_for_user(serviceName, this._userName, this._cancellable, (obj, result) => {
try {
obj.call_begin_verification_for_user_finish(result);
} catch (e) {
if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
return;
this._reportInitError('Failed to start verification for user', e);
return;
}
this._hold.release();
});
} else {
this._userVerifier.call_begin_verification(serviceName, this._cancellable, (obj, result) => {
try {
obj.call_begin_verification_finish(result);
} catch (e) {
if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
return;
this._reportInitError('Failed to start verification', e);
return;
}
this._hold.release();
});
}
this._hold.release();
}
_beginVerification() {

View File

@ -6,15 +6,6 @@ const Signals = imports.signals;
const IBusCandidatePopup = imports.ui.ibusCandidatePopup;
Gio._promisify(IBus.Bus.prototype,
'list_engines_async', 'list_engines_async_finish');
Gio._promisify(IBus.Bus.prototype,
'request_name_async', 'request_name_async_finish');
Gio._promisify(IBus.Bus.prototype,
'get_global_engine_async', 'get_global_engine_async_finish');
Gio._promisify(IBus.Bus.prototype,
'set_global_engine_async', 'set_global_engine_async_finish');
// Ensure runtime version matches
_checkIBusVersion(1, 5, 2);
@ -111,14 +102,16 @@ var IBusManager = class {
_onConnected() {
this._cancellable = new Gio.Cancellable();
this._initEngines();
this._initPanelService();
this._ibus.list_engines_async(-1, this._cancellable,
this._initEngines.bind(this));
this._ibus.request_name_async(IBus.SERVICE_PANEL,
IBus.BusNameFlag.REPLACE_EXISTING, -1, this._cancellable,
this._initPanelService.bind(this));
}
async _initEngines() {
_initEngines(ibus, result) {
try {
const enginesList =
await this._ibus.list_engines_async(-1, this._cancellable);
let enginesList = this._ibus.list_engines_async_finish(result);
for (let i = 0; i < enginesList.length; ++i) {
let name = enginesList[i].get_name();
this._engines.set(name, enginesList[i]);
@ -133,10 +126,9 @@ var IBusManager = class {
}
}
async _initPanelService() {
_initPanelService(ibus, result) {
try {
await this._ibus.request_name_async(IBus.SERVICE_PANEL,
IBus.BusNameFlag.REPLACE_EXISTING, -1, this._cancellable);
this._ibus.request_name_async_finish(result);
} catch (e) {
if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) {
logError(e);
@ -171,15 +163,19 @@ var IBusManager = class {
this._panelService.connect('set-content-type', this._setContentType.bind(this));
} catch (e) {
}
try {
// If an engine is already active we need to get its properties
const engine =
await this._ibus.get_global_engine_async(-1, this._cancellable);
// If an engine is already active we need to get its properties
this._ibus.get_global_engine_async(-1, this._cancellable, (_bus, res) => {
let engine;
try {
engine = this._ibus.get_global_engine_async_finish(res);
if (!engine)
return;
} catch (e) {
return;
}
this._engineChanged(this._ibus, engine.get_name());
this._updateReadiness();
} catch (e) {
}
});
this._updateReadiness();
}
_updateReadiness() {
@ -227,7 +223,7 @@ var IBusManager = class {
return this._engines.get(id);
}
async setEngine(id, callback) {
setEngine(id, callback) {
// Send id even if id == this._currentEngineName
// because 'properties-registered' signal can be emitted
// while this._ibusSources == null on a lock screen.
@ -237,16 +233,18 @@ var IBusManager = class {
return;
}
try {
await this._ibus.set_global_engine_async(id,
this._MAX_INPUT_SOURCE_ACTIVATION_TIME,
this._cancellable);
} catch (e) {
if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
logError(e);
}
if (callback)
callback();
this._ibus.set_global_engine_async(id,
this._MAX_INPUT_SOURCE_ACTIVATION_TIME,
this._cancellable, (_bus, res) => {
try {
this._ibus.set_global_engine_async_finish(res);
} catch (e) {
if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
logError(e);
}
if (callback)
callback();
});
}
preloadEngines(ids) {

View File

@ -4,9 +4,6 @@ const { Clutter, GLib, Gio, GObject, IBus } = imports.gi;
const Keyboard = imports.ui.status.keyboard;
Gio._promisify(IBus.Bus.prototype,
'create_input_context_async', 'create_input_context_async_finish');
var HIDE_PANEL_TIME = 50;
var InputMethod = GObject.registerClass(
@ -49,11 +46,15 @@ class InputMethod extends Clutter.InputMethod {
this._currentSource = this._inputSourceManager.currentSource;
}
async _onConnected() {
_onConnected() {
this._cancellable = new Gio.Cancellable();
this._ibus.create_input_context_async('gnome-shell', -1,
this._cancellable, this._setContext.bind(this));
}
_setContext(bus, res) {
try {
this._context = await this._ibus.create_input_context_async(
'gnome-shell', -1, this._cancellable);
this._context = this._ibus.create_input_context_async_finish(res);
} catch (e) {
if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) {
logError(e);

View File

@ -50,22 +50,25 @@ function canLock() {
}
async function registerSessionWithGDM() {
function registerSessionWithGDM() {
log("Registering session with GDM");
try {
await Gio.DBus.system.call(
'org.gnome.DisplayManager',
'/org/gnome/DisplayManager/Manager',
'org.gnome.DisplayManager.Manager',
'RegisterSession',
GLib.Variant.new('(a{sv})', [{}]), null,
Gio.DBusCallFlags.NONE, -1, null);
} catch (e) {
if (!e.matches(Gio.DBusError, Gio.DBusError.UNKNOWN_METHOD))
log(`Error registering session with GDM: ${e.message}`);
else
log('Not calling RegisterSession(): method not exported, GDM too old?');
}
Gio.DBus.system.call('org.gnome.DisplayManager',
'/org/gnome/DisplayManager/Manager',
'org.gnome.DisplayManager.Manager',
'RegisterSession',
GLib.Variant.new('(a{sv})', [{}]), null,
Gio.DBusCallFlags.NONE, -1, null,
(source, result) => {
try {
source.call_finish(result);
} catch (e) {
if (!e.matches(Gio.DBusError, Gio.DBusError.UNKNOWN_METHOD))
log(`Error registering session with GDM: ${e.message}`);
else
log("Not calling RegisterSession(): method not exported, GDM too old?");
}
}
);
}
let _loginManager = null;
@ -171,19 +174,24 @@ var LoginManagerSystemd = class {
this._proxy.SuspendRemote(true);
}
async inhibit(reason, callback) {
try {
const inVariant = new GLib.Variant('(ssss)',
['sleep', 'GNOME Shell', reason, 'delay']);
const [outVariant_, fdList] =
await this._proxy.call_with_unix_fd_list('Inhibit',
inVariant, 0, -1, null, null);
const [fd] = fdList.steal_fds();
callback(new Gio.UnixInputStream({ fd }));
} catch (e) {
logError(e, 'Error getting systemd inhibitor');
callback(null);
}
inhibit(reason, callback) {
let inVariant = GLib.Variant.new('(ssss)',
['sleep',
'GNOME Shell',
reason,
'delay']);
this._proxy.call_with_unix_fd_list('Inhibit', inVariant, 0, -1, null, null,
(proxy, result) => {
let fd = -1;
try {
let [outVariant_, fdList] = proxy.call_with_unix_fd_list_finish(result);
fd = fdList.steal_fds()[0];
callback(new Gio.UnixInputStream({ fd }));
} catch (e) {
logError(e, "Error getting systemd inhibitor");
callback(null);
}
});
}
_prepareForSleep(proxy, sender, [aboutToSuspend]) {

View File

@ -57,7 +57,9 @@ var ObjectManager = class {
// Start out inhibiting load until at least the proxy
// manager is loaded and the remote objects are fetched
this._numLoadInhibitors = 1;
this._initManagerProxy();
this._managerProxy.init_async(GLib.PRIORITY_DEFAULT,
this._cancellable,
this._onManagerProxyLoaded.bind(this));
}
_tryToCompleteLoad() {
@ -71,7 +73,7 @@ var ObjectManager = class {
}
}
async _addInterface(objectPath, interfaceName, onFinished) {
_addInterface(objectPath, interfaceName, onFinished) {
let info = this._interfaceInfos[interfaceName];
if (!info) {
@ -87,38 +89,40 @@ var ObjectManager = class {
g_interface_info: info,
g_flags: Gio.DBusProxyFlags.DO_NOT_AUTO_START });
try {
await proxy.init_async(GLib.PRIORITY_DEFAULT, this._cancellable);
} catch (e) {
logError(e, `could not initialize proxy for interface ${interfaceName}`);
proxy.init_async(GLib.PRIORITY_DEFAULT, this._cancellable, (initable, result) => {
try {
initable.init_finish(result);
} catch (e) {
logError(e, `could not initialize proxy for interface ${interfaceName}`);
if (onFinished)
onFinished();
return;
}
let isNewObject;
if (!this._objects[objectPath]) {
this._objects[objectPath] = {};
isNewObject = true;
} else {
isNewObject = false;
}
this._objects[objectPath][interfaceName] = proxy;
if (!this._interfaces[interfaceName])
this._interfaces[interfaceName] = [];
this._interfaces[interfaceName].push(proxy);
if (isNewObject)
this.emit('object-added', objectPath);
this.emit('interface-added', interfaceName, proxy);
if (onFinished)
onFinished();
return;
}
let isNewObject;
if (!this._objects[objectPath]) {
this._objects[objectPath] = {};
isNewObject = true;
} else {
isNewObject = false;
}
this._objects[objectPath][interfaceName] = proxy;
if (!this._interfaces[interfaceName])
this._interfaces[interfaceName] = [];
this._interfaces[interfaceName].push(proxy);
if (isNewObject)
this.emit('object-added', objectPath);
this.emit('interface-added', interfaceName, proxy);
if (onFinished)
onFinished();
});
}
_removeInterface(objectPath, interfaceName) {
@ -147,10 +151,9 @@ var ObjectManager = class {
}
}
async _initManagerProxy() {
_onManagerProxyLoaded(initable, result) {
try {
await this._managerProxy.init_async(
GLib.PRIORITY_DEFAULT, this._cancellable);
initable.init_finish(result);
} catch (e) {
logError(e, `could not initialize object manager for object ${this._serviceName}`);

View File

@ -83,13 +83,17 @@ const SystemActions = GObject.registerClass({
this._canHavePowerOff = true;
this._canHaveSuspend = true;
function tokenizeKeywords(keywords) {
return keywords.split(';').map(keyword => GLib.str_tokenize_and_fold(keyword, null)).flat(2);
}
this._actions = new Map();
this._actions.set(POWER_OFF_ACTION_ID, {
// Translators: The name of the power-off action in search
name: C_("search-result", "Power Off"),
iconName: 'system-shutdown-symbolic',
// Translators: A list of keywords that match the power-off action, separated by semicolons
keywords: _('power off;shutdown;reboot;restart;halt;stop').split(/[; ]/),
keywords: tokenizeKeywords(_('power off;shutdown;reboot;restart;halt;stop')),
available: false,
});
this._actions.set(LOCK_SCREEN_ACTION_ID, {
@ -97,7 +101,7 @@ const SystemActions = GObject.registerClass({
name: C_("search-result", "Lock Screen"),
iconName: 'system-lock-screen-symbolic',
// Translators: A list of keywords that match the lock screen action, separated by semicolons
keywords: _("lock screen").split(/[; ]/),
keywords: tokenizeKeywords(_('lock screen')),
available: false,
});
this._actions.set(LOGOUT_ACTION_ID, {
@ -105,7 +109,7 @@ const SystemActions = GObject.registerClass({
name: C_("search-result", "Log Out"),
iconName: 'application-exit-symbolic',
// Translators: A list of keywords that match the logout action, separated by semicolons
keywords: _("logout;log out;sign off").split(/[; ]/),
keywords: tokenizeKeywords(_('logout;log out;sign off')),
available: false,
});
this._actions.set(SUSPEND_ACTION_ID, {
@ -113,7 +117,7 @@ const SystemActions = GObject.registerClass({
name: C_("search-result", "Suspend"),
iconName: 'media-playback-pause-symbolic',
// Translators: A list of keywords that match the suspend action, separated by semicolons
keywords: _("suspend;sleep").split(/[; ]/),
keywords: tokenizeKeywords(_('suspend;sleep')),
available: false,
});
this._actions.set(SWITCH_USER_ACTION_ID, {
@ -121,14 +125,14 @@ const SystemActions = GObject.registerClass({
name: C_("search-result", "Switch User"),
iconName: 'system-switch-user-symbolic',
// Translators: A list of keywords that match the switch user action, separated by semicolons
keywords: _("switch user").split(/[; ]/),
keywords: tokenizeKeywords(_('switch user')),
available: false,
});
this._actions.set(LOCK_ORIENTATION_ACTION_ID, {
name: '',
iconName: '',
// Translators: A list of keywords that match the lock orientation action, separated by semicolons
keywords: _("lock orientation;unlock orientation;screen;rotation").split(/[; ]/),
keywords: tokenizeKeywords(_('lock orientation;unlock orientation;screen;rotation')),
available: false,
});
@ -277,7 +281,7 @@ const SystemActions = GObject.registerClass({
getMatchingActions(terms) {
// terms is a list of strings
terms = terms.map(term => term.toLowerCase());
terms = terms.map(term => GLib.str_tokenize_and_fold(term, null)[0]);
let results = [];

View File

@ -7,8 +7,6 @@ const PermissionStore = imports.misc.permissionStore;
const { loadInterfaceXML } = imports.misc.fileUtils;
Gio._promisify(Geoclue.Simple, 'new', 'new_finish');
const WeatherIntegrationIface = loadInterfaceXML('org.gnome.Shell.WeatherIntegration');
const WEATHER_BUS_NAME = 'org.gnome.Weather';
@ -81,7 +79,16 @@ var WeatherClient = class {
this._weatherApp = null;
this._weatherProxy = null;
this._createWeatherProxy();
let nodeInfo = Gio.DBusNodeInfo.new_for_xml(WeatherIntegrationIface);
Gio.DBusProxy.new(
Gio.DBus.session,
Gio.DBusProxyFlags.DO_NOT_AUTO_START | Gio.DBusProxyFlags.GET_INVALIDATED_PROPERTIES,
nodeInfo.lookup_interface(WEATHER_INTEGRATION_IFACE),
WEATHER_BUS_NAME,
WEATHER_OBJECT_PATH,
WEATHER_INTEGRATION_IFACE,
null,
this._onWeatherProxyReady.bind(this));
this._settings = new Gio.Settings({
schema_id: 'org.gnome.shell.weather',
@ -139,17 +146,9 @@ var WeatherClient = class {
(!this._needsAuth || this._weatherAuthorized);
}
async _createWeatherProxy() {
const nodeInfo = Gio.DBusNodeInfo.new_for_xml(WeatherIntegrationIface);
_onWeatherProxyReady(o, res) {
try {
this._weatherProxy = await Gio.DBusProxy.new(
Gio.DBus.session,
Gio.DBusProxyFlags.DO_NOT_AUTO_START | Gio.DBusProxyFlags.GET_INVALIDATED_PROPERTIES,
nodeInfo.lookup_interface(WEATHER_INTEGRATION_IFACE),
WEATHER_BUS_NAME,
WEATHER_OBJECT_PATH,
WEATHER_INTEGRATION_IFACE,
null);
this._weatherProxy = Gio.DBusProxy.new_finish(res);
} catch (e) {
log(`Failed to create GNOME Weather proxy: ${e}`);
return;
@ -240,23 +239,25 @@ var WeatherClient = class {
}
}
async _startGClueService() {
_startGClueService() {
if (this._gclueStarting)
return;
this._gclueStarting = true;
try {
this._gclueService = await Geoclue.Simple.new(
'org.gnome.Shell', Geoclue.AccuracyLevel.CITY, null);
} catch (e) {
log(`Failed to connect to Geoclue2 service: ${e.message}`);
this._setLocation(this._mostRecentLocation);
return;
}
this._gclueStarted = true;
this._gclueService.get_client().distance_threshold = 100;
this._updateLocationMonitoring();
Geoclue.Simple.new('org.gnome.Shell', Geoclue.AccuracyLevel.CITY, null,
(o, res) => {
try {
this._gclueService = Geoclue.Simple.new_finish(res);
} catch (e) {
log(`Failed to connect to Geoclue2 service: ${e.message}`);
this._setLocation(this._mostRecentLocation);
return;
}
this._gclueStarted = true;
this._gclueService.get_client().distance_threshold = 100;
this._updateLocationMonitoring();
});
}
_onGClueLocationChanged() {

View File

@ -1060,25 +1060,25 @@ class WindowSwitcher extends SwitcherPopup.SwitcherList {
vfunc_allocate(box, flags) {
let themeNode = this.get_theme_node();
let contentBox = themeNode.get_content_box(box);
const labelHeight = this._label.height;
const totalLabelHeight =
labelHeight + themeNode.get_padding(St.Side.BOTTOM);
let childBox = new Clutter.ActorBox();
childBox.x1 = contentBox.x1;
childBox.x2 = contentBox.x2;
childBox.y2 = contentBox.y2;
childBox.y1 = childBox.y2 - this._label.height;
this._label.allocate(childBox, flags);
let totalLabelHeight = this._label.height + themeNode.get_padding(St.Side.BOTTOM);
childBox.x1 = box.x1;
childBox.x2 = box.x2;
childBox.y1 = box.y1;
childBox.y2 = box.y2 - totalLabelHeight;
super.vfunc_allocate(childBox, flags);
box.y2 -= totalLabelHeight;
super.vfunc_allocate(box, flags);
// Hooking up the parent vfunc will call this.set_allocation() with
// the height without the label height, so call it again with the
// correct size here.
box.y2 += totalLabelHeight;
this.set_allocation(box, flags);
const childBox = new Clutter.ActorBox();
childBox.x1 = contentBox.x1;
childBox.x2 = contentBox.x2;
childBox.y2 = contentBox.y2;
childBox.y1 = childBox.y2 - labelHeight;
this._label.allocate(childBox, flags);
}
highlight(index, justOutline) {

View File

@ -15,8 +15,7 @@ class Animation extends St.Bin {
const themeContext = St.ThemeContext.get_for_stage(global.stage);
super._init({
width: width * themeContext.scale_factor,
height: height * themeContext.scale_factor,
style: `width: ${width}px; height: ${height}px;`,
});
this.connect('destroy', this._onDestroy.bind(this));

View File

@ -114,7 +114,8 @@ function _findBestFolderName(apps) {
}, commonCategories);
for (let category of commonCategories) {
let translated = Shell.util_get_translated_folder_name(category);
const directory = '%s.directory'.format(category);
const translated = Shell.util_get_translated_folder_name(directory);
if (translated !== null)
return translated;
}
@ -2551,18 +2552,19 @@ var AppIconMenu = class AppIconMenu extends PopupMenu.PopupMenu {
if (Shell.AppSystem.get_default().lookup_app('org.gnome.Software.desktop')) {
this._appendSeparator();
let item = this._appendMenuItem(_("Show Details"));
item.connect('activate', async () => {
item.connect('activate', () => {
let id = this._source.app.get_id();
let args = GLib.Variant.new('(ss)', [id, '']);
const bus = await Gio.DBus.get(Gio.BusType.SESSION, null);
bus.call(
'org.gnome.Software',
'/org/gnome/Software',
'org.gtk.Actions', 'Activate',
new GLib.Variant.new(
'(sava{sv})', ['details', [args], null]),
null, 0, -1, null);
Main.overview.hide();
Gio.DBus.get(Gio.BusType.SESSION, null, (o, res) => {
let bus = Gio.DBus.get_finish(res);
bus.call('org.gnome.Software',
'/org/gnome/Software',
'org.gtk.Actions', 'Activate',
GLib.Variant.new('(sava{sv})',
['details', [args], null]),
null, 0, -1, null);
Main.overview.hide();
});
});
}
}

View File

@ -197,6 +197,11 @@ var BoxPointer = GObject.registerClass({
}
vfunc_allocate(box, flags) {
if (this._sourceActor && this._sourceActor.mapped) {
this._reposition(box);
this._updateFlip(box);
}
this.set_allocation(box, flags);
let themeNode = this.get_theme_node();
@ -230,12 +235,6 @@ var BoxPointer = GObject.registerClass({
break;
}
this.bin.allocate(childBox, flags);
if (this._sourceActor && this._sourceActor.mapped) {
this._reposition(box);
this._updateFlip(box);
this.set_allocation(box, flags);
}
}
_drawBorder(area) {

View File

@ -199,47 +199,46 @@ class DBusEventSource extends EventSourceBase {
this._initialized = false;
this._dbusProxy = new CalendarServer();
this._initProxy();
}
this._dbusProxy.init_async(GLib.PRIORITY_DEFAULT, null, (object, result) => {
let loaded = false;
async _initProxy() {
let loaded = false;
try {
await this._dbusProxy.init_async(GLib.PRIORITY_DEFAULT, null);
loaded = true;
} catch (e) {
// Ignore timeouts and install signals as normal, because with high
// probability the service will appear later on, and we will get a
// NameOwnerChanged which will finish loading
//
// (But still _initialized to false, because the proxy does not know
// about the HasCalendars property and would cause an exception trying
// to read it)
if (!e.matches(Gio.DBusError, Gio.DBusError.TIMED_OUT)) {
log('Error loading calendars: %s'.format(e.message));
return;
try {
this._dbusProxy.init_finish(result);
loaded = true;
} catch (e) {
if (e.matches(Gio.DBusError, Gio.DBusError.TIMED_OUT)) {
// Ignore timeouts and install signals as normal, because with high
// probability the service will appear later on, and we will get a
// NameOwnerChanged which will finish loading
//
// (But still _initialized to false, because the proxy does not know
// about the HasCalendars property and would cause an exception trying
// to read it)
} else {
log('Error loading calendars: %s'.format(e.message));
return;
}
}
}
this._dbusProxy.connectSignal('Changed', this._onChanged.bind(this));
this._dbusProxy.connectSignal('Changed', this._onChanged.bind(this));
this._dbusProxy.connect('notify::g-name-owner', () => {
if (this._dbusProxy.g_name_owner)
this._dbusProxy.connect('notify::g-name-owner', () => {
if (this._dbusProxy.g_name_owner)
this._onNameAppeared();
else
this._onNameVanished();
});
this._dbusProxy.connect('g-properties-changed', () => {
this.notify('has-calendars');
});
this._initialized = loaded;
if (loaded) {
this.notify('has-calendars');
this._onNameAppeared();
else
this._onNameVanished();
}
});
this._dbusProxy.connect('g-properties-changed', () => {
this.notify('has-calendars');
});
this._initialized = loaded;
if (loaded) {
this.notify('has-calendars');
this._onNameAppeared();
}
}
destroy() {

View File

@ -10,7 +10,6 @@ const MessageTray = imports.ui.messageTray;
const ModalDialog = imports.ui.modalDialog;
const ShellEntry = imports.ui.shellEntry;
Gio._promisify(Shell.NetworkAgent.prototype, 'init_async', 'init_finish');
Gio._promisify(Shell.NetworkAgent.prototype,
'search_vpn_plugin', 'search_vpn_plugin_finish');
@ -483,37 +482,39 @@ var VPNRequestHandler = class {
}
}
async _readStdoutOldStyle() {
const [line, len_] =
await this._dataStdout.read_line_async(GLib.PRIORITY_DEFAULT, null);
_readStdoutOldStyle() {
this._dataStdout.read_line_async(GLib.PRIORITY_DEFAULT, null, (stream, result) => {
let [line, len_] = this._dataStdout.read_line_finish_utf8(result);
if (line === null) {
// end of file
this._stdout.close(null);
return;
}
if (line == null) {
// end of file
this._stdout.close(null);
return;
}
this._vpnChildProcessLineOldStyle(line);
this._vpnChildProcessLineOldStyle(line);
// try to read more!
this._readStdoutOldStyle();
// try to read more!
this._readStdoutOldStyle();
});
}
async _readStdoutNewStyle() {
const cnt =
await this._dataStdout.fill_async(-1, GLib.PRIORITY_DEFAULT, null);
_readStdoutNewStyle() {
this._dataStdout.fill_async(-1, GLib.PRIORITY_DEFAULT, null, (stream, result) => {
let cnt = this._dataStdout.fill_finish(result);
if (cnt === 0) {
// end of file
this._showNewStyleDialog();
if (cnt == 0) {
// end of file
this._showNewStyleDialog();
this._stdout.close(null);
return;
}
this._stdout.close(null);
return;
}
// Try to read more
this._dataStdout.set_buffer_size(2 * this._dataStdout.get_buffer_size());
this._readStdoutNewStyle();
// Try to read more
this._dataStdout.set_buffer_size(2 * this._dataStdout.get_buffer_size());
this._readStdoutNewStyle();
});
}
_showNewStyleDialog() {
@ -620,17 +621,15 @@ var NetworkAgent = class {
this._native.connect('cancel-request', this._cancelRequest.bind(this));
this._initialized = false;
this._initNative();
}
async _initNative() {
try {
await this._native.init_async(GLib.PRIORITY_DEFAULT, null);
this._initialized = true;
} catch (e) {
this._native = null;
logError(e, 'error initializing the NetworkManager Agent');
}
this._native.init_async(GLib.PRIORITY_DEFAULT, null, (o, res) => {
try {
this._native.init_finish(res);
this._initialized = true;
} catch (e) {
this._native = null;
logError(e, 'error initializing the NetworkManager Agent');
}
});
}
enable() {

View File

@ -327,6 +327,8 @@ var AuthenticationDialog = GObject.registerClass({
}
let resetDialog = () => {
this._sessionRequestTimeoutId = 0;
if (this.state != ModalDialog.State.OPENED)
return;

View File

@ -7,14 +7,6 @@ var Tpl = null;
var Tp = null;
try {
({ TelepathyGLib: Tp, TelepathyLogger: Tpl } = imports.gi);
Gio._promisify(Tp.Channel.prototype, 'close_async', 'close_finish');
Gio._promisify(Tp.Channel.prototype,
'send_message_async', 'send_message_finish');
Gio._promisify(Tp.ChannelDispatchOperation.prototype,
'claim_with_async', 'claim_with_finish');
Gio._promisify(Tpl.LogManager.prototype,
'get_filtered_events_async', 'get_filtered_events_finish');
} catch (e) {
log('Telepathy is not available, chat integration will be disabled.');
}
@ -223,7 +215,7 @@ class TelepathyClient extends Tp.BaseClient {
// We can only handle text channel, so close any other channel
if (!(channel instanceof Tp.TextChannel)) {
channel.close_async();
channel.close_async(null);
continue;
}
@ -269,7 +261,7 @@ class TelepathyClient extends Tp.BaseClient {
}
}
async _approveTextChannel(account, conn, channel, dispatchOp, context) {
_approveTextChannel(account, conn, channel, dispatchOp, context) {
let [targetHandle_, targetHandleType] = channel.get_handle();
if (targetHandleType != Tp.HandleType.CONTACT) {
@ -278,15 +270,17 @@ class TelepathyClient extends Tp.BaseClient {
return;
}
context.accept();
// Approve private text channels right away as we are going to handle it
try {
await dispatchOp.claim_with_async(this);
this._handlingChannels(account, conn, [channel], false);
} catch (err) {
log('Failed to Claim channel: %s'.format(err.toString()));
}
dispatchOp.claim_with_async(this, (o, result) => {
try {
dispatchOp.claim_with_finish(result);
this._handlingChannels(account, conn, [channel], false);
} catch (err) {
log('Failed to Claim channel: %s'.format(err.toString()));
}
});
context.accept();
}
_delegatedChannelsCb(_client, _channels) {
@ -447,14 +441,17 @@ class ChatSource extends MessageTray.Source {
}
}
async _getLogMessages() {
_getLogMessages() {
let logManager = Tpl.LogManager.dup_singleton();
let entity = Tpl.Entity.new_from_tp_contact(this._contact, Tpl.EntityType.CONTACT);
const [events] = await logManager.get_filtered_events_async(
this._account, entity,
Tpl.EventTypeMask.TEXT, SCROLLBACK_HISTORY_LINES,
null);
logManager.get_filtered_events_async(this._account, entity,
Tpl.EventTypeMask.TEXT, SCROLLBACK_HISTORY_LINES,
null, this._displayPendingMessages.bind(this));
}
_displayPendingMessages(logManager, result) {
let [success_, events] = logManager.get_filtered_events_finish(result);
let logMessages = events.map(e => ChatMessage.newFromTplTextEvent(e));
this._ensureNotification();
@ -512,7 +509,9 @@ class ChatSource extends MessageTray.Source {
this._ackMessages();
// The chat box has been destroyed so it can't
// handle the channel any more.
this._channel.close_async();
this._channel.close_async((channel, result) => {
channel.close_finish(result);
});
} else {
// Don't indicate any unread messages when the notification
// that represents them has been destroyed.
@ -610,7 +609,9 @@ class ChatSource extends MessageTray.Source {
}
let msg = Tp.ClientMessage.new_text(type, text);
this._channel.send_message_async(msg, 0);
this._channel.send_message_async(msg, 0, (src, result) => {
this._channel.send_message_finish(result);
});
}
setChatState(state) {

View File

@ -278,7 +278,7 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/SessionManager/EndSessionDialog');
}
async _onPkOfflineProxyCreated(proxy, error) {
_onPkOfflineProxyCreated(proxy, error) {
if (error) {
log(error.message);
return;
@ -293,12 +293,15 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
}
// It only makes sense to check for this permission if PackageKit is available.
try {
this._updatesPermission = await Polkit.Permission.new(
'org.freedesktop.packagekit.trigger-offline-update', null, null);
} catch (e) {
log('No permission to trigger offline updates: %s'.format(e.toString()));
}
Polkit.Permission.new(
'org.freedesktop.packagekit.trigger-offline-update', null, null,
(source, res) => {
try {
this._updatesPermission = Polkit.Permission.new_finish(res);
} catch (e) {
log('No permission to trigger offline updates: %s'.format(e.toString()));
}
});
}
_onDestroy() {
@ -677,7 +680,7 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
_setCheckBoxLabel(this._checkBox, dialogContent.checkBoxText || '');
this._checkBox.visible = dialogContent.checkBoxText && updatePrepared && updatesAllowed;
this._checkBox.checked = this._checkBox.visible;
this._checkBox.checked = updatePrepared && updateTriggered;
// We show the warning either together with the checkbox, or when
// updates have already been triggered, but the user doesn't have

View File

@ -10,20 +10,11 @@ imports.gi.versions.Gtk = '3.0';
imports.gi.versions.TelepathyGLib = '0.12';
imports.gi.versions.TelepathyLogger = '0.2';
const { Clutter, Gio, GLib, GObject, Meta, Polkit, Shell, St } = imports.gi;
const { Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi;
const Gettext = imports.gettext;
const System = imports.system;
Gio._promisify(Gio.DataInputStream.prototype, 'fill_async', 'fill_finish');
Gio._promisify(Gio.DataInputStream.prototype,
'read_line_async', 'read_line_finish');
Gio._promisify(Gio.DBus, 'get', 'get_finish');
Gio._promisify(Gio.DBusConnection.prototype, 'call', 'call_finish');
Gio._promisify(Gio.DBusProxy, 'new', 'new_finish');
Gio._promisify(Gio.DBusProxy.prototype, 'init_async', 'init_finish');
Gio._promisify(Gio.DBusProxy.prototype,
'call_with_unix_fd_list', 'call_with_unix_fd_list_finish');
Gio._promisify(Polkit.Permission, 'new', 'new_finish');
let _localTimeZone = null;

View File

@ -229,7 +229,8 @@ var ExtensionManager = class {
null,
Gio.DBusCallFlags.NONE,
-1,
null);
null,
(conn, res) => conn.call_finish(res));
return true;
}

View File

@ -114,11 +114,8 @@ class BaseIcon extends St.Bin {
if (this._setSizeManually) {
size = this.iconSize;
} else {
const { scaleFactor } =
St.ThemeContext.get_for_stage(global.stage);
let [found, len] = node.lookup_length('icon-size', false);
size = found ? len / scaleFactor : ICON_SIZE;
size = found ? len : ICON_SIZE;
}
if (this.iconSize == size && this._iconBin.child)

View File

@ -1257,6 +1257,10 @@ class Keyboard extends St.BoxLayout {
return this._keyboardVisible && super.visible;
}
set visible(visible) {
super.visible = visible;
}
_onFocusPositionChanged(focusTracker) {
let rect = focusTracker.getCurrentRect();
this.setCursorLocation(focusTracker.currentWindow, rect.x, rect.y, rect.width, rect.height);

View File

@ -521,7 +521,9 @@ function pushModal(actor, params) {
let prevFocusDestroyId;
if (prevFocus != null) {
prevFocusDestroyId = prevFocus.connect('destroy', () => {
let index = _findModal(actor);
const index = modalActorFocusStack.findIndex(
record => record.prevFocus === prevFocus);
if (index >= 0)
modalActorFocusStack[index].prevFocus = null;
});

View File

@ -473,6 +473,7 @@ class ControlsManager extends St.Widget {
// A workspace might have been inserted or removed before the active
// one, causing the adjustment to go out of sync, so update the value
this._workspaceAdjustment.remove_transition('value');
this._workspaceAdjustment.value = activeIndex;
}

View File

@ -90,16 +90,18 @@ class AppMenu extends PopupMenu.PopupMenu {
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this._detailsItem = this.addAction(_('Show Details'), async () => {
this._detailsItem = this.addAction(_("Show Details"), () => {
let id = this._app.get_id();
let args = GLib.Variant.new('(ss)', [id, '']);
const bus = await Gio.DBus.get(Gio.BusType.SESSION, null);
bus.call(
'org.gnome.Software',
'/org/gnome/Software',
'org.gtk.Actions', 'Activate',
new GLib.Variant('(sava{sv})', ['details', [args], null]),
null, 0, -1, null);
Gio.DBus.get(Gio.BusType.SESSION, null, (o, res) => {
let bus = Gio.DBus.get_finish(res);
bus.call('org.gnome.Software',
'/org/gnome/Software',
'org.gtk.Actions', 'Activate',
GLib.Variant.new('(sava{sv})',
['details', [args], null]),
null, 0, -1, null);
});
});
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());

View File

@ -204,7 +204,7 @@ var RemoteSearchProvider = class {
g_interface_info: proxyInfo,
g_interface_name: proxyInfo.name,
gFlags });
this.proxy.init_async(GLib.PRIORITY_DEFAULT, null);
this.proxy.init_async(GLib.PRIORITY_DEFAULT, null, null);
this.appInfo = appInfo;
this.id = appInfo.get_id();

View File

@ -7,13 +7,6 @@ const GrabHelper = imports.ui.grabHelper;
const Lightbox = imports.ui.lightbox;
const Main = imports.ui.main;
Gio._promisify(Shell.Screenshot.prototype, 'pick_color', 'pick_color_finish');
Gio._promisify(Shell.Screenshot.prototype, 'screenshot', 'screenshot_finish');
Gio._promisify(Shell.Screenshot.prototype,
'screenshot_window', 'screenshot_window_finish');
Gio._promisify(Shell.Screenshot.prototype,
'screenshot_area', 'screenshot_area_finish');
const { loadInterfaceXML } = imports.misc.fileUtils;
const ScreenshotIface = loadInterfaceXML('org.gnome.Shell.Screenshot');
@ -163,7 +156,7 @@ var ScreenshotService = class {
return [x, y, width, height];
}
async ScreenshotAreaAsync(params, invocation) {
ScreenshotAreaAsync(params, invocation) {
let [x, y, width, height, flash, filename] = params;
[x, y, width, height] = this._scaleArea(x, y, width, height);
if (!this._checkArea(x, y, width, height)) {
@ -180,17 +173,21 @@ var ScreenshotService = class {
if (!stream)
return;
try {
let [area] =
await screenshot.screenshot_area(x, y, width, height, stream);
this._onScreenshotComplete(area, stream, file, flash, invocation);
} catch (e) {
this._removeShooterForSender(invocation.get_sender());
invocation.return_value(new GLib.Variant('(bs)', [false, '']));
}
screenshot.screenshot_area(x, y, width, height, stream,
(o, res) => {
try {
let [success_, area] =
screenshot.screenshot_area_finish(res);
this._onScreenshotComplete(
area, stream, file, flash, invocation);
} catch (e) {
this._removeShooterForSender(invocation.get_sender());
invocation.return_value(new GLib.Variant('(bs)', [false, '']));
}
});
}
async ScreenshotWindowAsync(params, invocation) {
ScreenshotWindowAsync(params, invocation) {
let [includeFrame, includeCursor, flash, filename] = params;
let screenshot = this._createScreenshot(invocation);
if (!screenshot)
@ -200,17 +197,21 @@ var ScreenshotService = class {
if (!stream)
return;
try {
let [area] =
await screenshot.screenshot_window(includeFrame, includeCursor, stream);
this._onScreenshotComplete(area, stream, file, flash, invocation);
} catch (e) {
this._removeShooterForSender(invocation.get_sender());
invocation.return_value(new GLib.Variant('(bs)', [false, '']));
}
screenshot.screenshot_window(includeFrame, includeCursor, stream,
(o, res) => {
try {
let [success_, area] =
screenshot.screenshot_window_finish(res);
this._onScreenshotComplete(
area, stream, file, flash, invocation);
} catch (e) {
this._removeShooterForSender(invocation.get_sender());
invocation.return_value(new GLib.Variant('(bs)', [false, '']));
}
});
}
async ScreenshotAsync(params, invocation) {
ScreenshotAsync(params, invocation) {
let [includeCursor, flash, filename] = params;
let screenshot = this._createScreenshot(invocation);
if (!screenshot)
@ -220,13 +221,18 @@ var ScreenshotService = class {
if (!stream)
return;
try {
let [area] = await screenshot.screenshot(includeCursor, stream);
this._onScreenshotComplete(area, stream, file, flash, invocation);
} catch (e) {
this._removeShooterForSender(invocation.get_sender());
invocation.return_value(new GLib.Variant('(bs)', [false, '']));
}
screenshot.screenshot(includeCursor, stream,
(o, res) => {
try {
let [success_, area] =
screenshot.screenshot_finish(res);
this._onScreenshotComplete(
area, stream, file, flash, invocation);
} catch (e) {
this._removeShooterForSender(invocation.get_sender());
invocation.return_value(new GLib.Variant('(bs)', [false, '']));
}
});
}
async SelectAreaAsync(params, invocation) {
@ -267,17 +273,19 @@ var ScreenshotService = class {
if (!screenshot)
return;
const [color] = await screenshot.pick_color(coords.x, coords.y);
const { red, green, blue } = color;
const retval = GLib.Variant.new('(a{sv})', [{
color: GLib.Variant.new('(ddd)', [
red / 255.0,
green / 255.0,
blue / 255.0,
]),
}]);
this._removeShooterForSender(invocation.get_sender());
invocation.return_value(retval);
screenshot.pick_color(coords.x, coords.y, (_o, res) => {
let [success_, color] = screenshot.pick_color_finish(res);
let { red, green, blue } = color;
let retval = GLib.Variant.new('(a{sv})', [{
color: GLib.Variant.new('(ddd)', [
red / 255.0,
green / 255.0,
blue / 255.0,
]),
}]);
this._removeShooterForSender(invocation.get_sender());
invocation.return_value(retval);
});
} catch (e) {
invocation.return_error_literal(
Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED,

View File

@ -72,45 +72,46 @@ class Indicator extends PanelMenu.SystemIndicator {
return null;
}
_getDeviceInfos(adapter) {
// nDevices is the number of devices setup for the current default
// adapter if one exists and is powered. If unpowered or unavailable,
// nDevice is "1" if it had setup devices associated to it the last
// time it was seen, and "-1" if not.
//
// nConnectedDevices is the number of devices connected to the default
// adapter if one exists and is powered, or -1 if it's not available.
_getNDevices() {
let adapter = this._getDefaultAdapter();
if (!adapter)
return [];
return [this._hadSetupDevices ? 1 : -1, -1];
let deviceInfos = [];
let nConnectedDevices = 0;
let nDevices = 0;
let [ret, iter] = this._model.iter_children(adapter);
while (ret) {
const isPaired = this._model.get_value(iter,
GnomeBluetooth.Column.PAIRED);
const isTrusted = this._model.get_value(iter,
GnomeBluetooth.Column.TRUSTED);
if (isPaired || isTrusted) {
deviceInfos.push({
connected: this._model.get_value(iter,
GnomeBluetooth.Column.CONNECTED),
name: this._model.get_value(iter,
GnomeBluetooth.Column.ALIAS),
});
}
let isConnected = this._model.get_value(iter,
GnomeBluetooth.Column.CONNECTED);
if (isConnected)
nConnectedDevices++;
let isPaired = this._model.get_value(iter,
GnomeBluetooth.Column.PAIRED);
let isTrusted = this._model.get_value(iter,
GnomeBluetooth.Column.TRUSTED);
if (isPaired || isTrusted)
nDevices++;
ret = this._model.iter_next(iter);
}
if (this._hadSetupDevices !== (deviceInfos.length > 0)) {
if (this._hadSetupDevices != (nDevices > 0)) {
this._hadSetupDevices = !this._hadSetupDevices;
global.settings.set_boolean(HAD_BLUETOOTH_DEVICES_SETUP, this._hadSetupDevices);
}
return deviceInfos;
return [nDevices, nConnectedDevices];
}
_sync() {
let adapter = this._getDefaultAdapter();
let devices = this._getDeviceInfos(adapter);
const connectedDevices = devices.filter(dev => dev.connected);
const nConnectedDevices = connectedDevices.length;
const nDevices = devices.length;
let [nDevices, nConnectedDevices] = this._getNDevices();
let sensitive = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter;
this.menu.setSensitive(sensitive);
@ -123,16 +124,14 @@ class Indicator extends PanelMenu.SystemIndicator {
else
this._item.visible = this._proxy.BluetoothHasAirplaneMode && !this._proxy.BluetoothAirplaneMode;
if (nConnectedDevices > 1)
if (nConnectedDevices > 0)
/* Translators: this is the number of connected bluetooth devices */
this._item.label.text = ngettext('%d Connected", "%d Connected', nConnectedDevices).format(nConnectedDevices);
else if (nConnectedDevices === 1)
this._item.label.text = connectedDevices[0].name;
else if (adapter === null)
this._item.label.text = _('Bluetooth Off');
this._item.label.text = ngettext("%d Connected", "%d Connected", nConnectedDevices).format(nConnectedDevices);
else if (nConnectedDevices == -1)
this._item.label.text = _("Off");
else
this._item.label.text = _('Bluetooth On');
this._item.label.text = _("On");
this._toggleItem.label.text = this._proxy.BluetoothAirplaneMode ? _('Turn On') : _('Turn Off');
this._toggleItem.label.text = this._proxy.BluetoothAirplaneMode ? _("Turn On") : _("Turn Off");
}
});

View File

@ -199,36 +199,36 @@ var InputSourceSystemSettings = class extends InputSourceSettings {
this._reload.bind(this));
}
async _reload() {
let props;
try {
const result = await Gio.DBus.system.call(
this._BUS_NAME,
this._BUS_PATH,
this._BUS_PROPS_IFACE,
'GetAll',
new GLib.Variant('(s)', [this._BUS_IFACE]),
null, Gio.DBusCallFlags.NONE, -1, null);
[props] = result.deep_unpack();
} catch (e) {
log('Could not get properties from %s'.format(this._BUS_NAME));
return;
}
_reload() {
Gio.DBus.system.call(this._BUS_NAME,
this._BUS_PATH,
this._BUS_PROPS_IFACE,
'GetAll',
new GLib.Variant('(s)', [this._BUS_IFACE]),
null, Gio.DBusCallFlags.NONE, -1, null,
(conn, result) => {
let props;
try {
props = conn.call_finish(result).deep_unpack()[0];
} catch (e) {
log('Could not get properties from %s'.format(this._BUS_NAME));
return;
}
let layouts = props['X11Layout'].unpack();
let variants = props['X11Variant'].unpack();
let options = props['X11Options'].unpack();
const layouts = props['X11Layout'].unpack();
const variants = props['X11Variant'].unpack();
const options = props['X11Options'].unpack();
if (layouts !== this._layouts ||
variants !== this._variants) {
this._layouts = layouts;
this._variants = variants;
this._emitInputSourcesChanged();
}
if (options !== this._options) {
this._options = options;
this._emitKeyboardOptionsChanged();
}
if (layouts != this._layouts ||
variants != this._variants) {
this._layouts = layouts;
this._variants = variants;
this._emitInputSourcesChanged();
}
if (options != this._options) {
this._options = options;
this._emitKeyboardOptionsChanged();
}
});
}
get inputSources() {

View File

@ -15,10 +15,6 @@ const Util = imports.misc.util;
const { loadInterfaceXML } = imports.misc.fileUtils;
Gio._promisify(NM.Client, 'new_async', 'new_finish');
Gio._promisify(NM.Client.prototype,
'check_connectivity_async', 'check_connectivity_finish');
const NMConnectionCategory = {
INVALID: 'invalid',
WIRED: 'wired',
@ -1631,11 +1627,11 @@ class Indicator extends PanelMenu.SystemIndicator {
this._ctypes[NM.SETTING_GSM_SETTING_NAME] = NMConnectionCategory.WWAN;
this._ctypes[NM.SETTING_VPN_SETTING_NAME] = NMConnectionCategory.VPN;
this._getClient();
NM.Client.new_async(null, this._clientGot.bind(this));
}
async _getClient() {
this._client = await NM.Client.new_async(null);
_clientGot(obj, result) {
this._client = NM.Client.new_finish(result);
this._activeConnections = [];
this._connections = [];
@ -1986,7 +1982,7 @@ class Indicator extends PanelMenu.SystemIndicator {
}
}
async _portalHelperDone(proxy, emitter, parameters) {
_portalHelperDone(proxy, emitter, parameters) {
let [path, result] = parameters;
if (result == PortalHelperResult.CANCELLED) {
@ -1997,11 +1993,13 @@ class Indicator extends PanelMenu.SystemIndicator {
} else if (result == PortalHelperResult.COMPLETED) {
this._closeConnectivityCheck(path);
} else if (result == PortalHelperResult.RECHECK) {
try {
const state = await this._client.check_connectivity_async(null);
if (state >= NM.ConnectivityState.FULL)
this._closeConnectivityCheck(path);
} catch (e) { }
this._client.check_connectivity_async(null, (client, res) => {
try {
let state = client.check_connectivity_finish(res);
if (state >= NM.ConnectivityState.FULL)
this._closeConnectivityCheck(path);
} catch (e) { }
});
} else {
log('Invalid result from portal helper: %s'.format(result));
}

View File

@ -52,21 +52,22 @@ const BOLT_DBUS_PATH = '/org/freedesktop/bolt';
var Client = class {
constructor() {
this._proxy = null;
let nodeInfo = Gio.DBusNodeInfo.new_for_xml(BoltClientInterface);
Gio.DBusProxy.new(Gio.DBus.system,
Gio.DBusProxyFlags.DO_NOT_AUTO_START,
nodeInfo.lookup_interface(BOLT_DBUS_CLIENT_IFACE),
BOLT_DBUS_NAME,
BOLT_DBUS_PATH,
BOLT_DBUS_CLIENT_IFACE,
null,
this._onProxyReady.bind(this));
this.probing = false;
this._getProxy();
}
async _getProxy() {
let nodeInfo = Gio.DBusNodeInfo.new_for_xml(BoltClientInterface);
_onProxyReady(o, res) {
try {
this._proxy = await Gio.DBusProxy.new(
Gio.DBus.system,
Gio.DBusProxyFlags.DO_NOT_AUTO_START,
nodeInfo.lookup_interface(BOLT_DBUS_CLIENT_IFACE),
BOLT_DBUS_NAME,
BOLT_DBUS_PATH,
BOLT_DBUS_CLIENT_IFACE,
null);
this._proxy = Gio.DBusProxy.new_finish(res);
} catch (e) {
log('error creating bolt proxy: %s'.format(e.message));
return;
@ -242,15 +243,14 @@ class Indicator extends PanelMenu.SystemIndicator {
this._source = null;
this._perm = null;
this._createPermission();
}
async _createPermission() {
try {
this._perm = await Polkit.Permission.new('org.freedesktop.bolt.enroll', null, null);
} catch (e) {
log('Failed to get PolKit permission: %s'.format(e.toString()));
}
Polkit.Permission.new('org.freedesktop.bolt.enroll', null, null, (source, res) => {
try {
this._perm = Polkit.Permission.new_finish(res);
} catch (e) {
log('Failed to get PolKit permission: %s'.format(e.toString()));
}
});
}
_onDestroy() {

View File

@ -605,7 +605,7 @@ var UnlockDialog = GObject.registerClass({
this._showPrompt();
if (GLib.unichar_isgraph(unichar))
this.addCharacter(unichar);
this._authPrompt.addCharacter(unichar);
return Clutter.EVENT_PROPAGATE;
}
@ -835,11 +835,6 @@ var UnlockDialog = GObject.registerClass({
this._authPrompt.cancel();
}
addCharacter(unichar) {
this._showPrompt();
this._authPrompt.addCharacter(unichar);
}
finish(onComplete) {
this._ensureAuthPrompt();
this._authPrompt.finish(onComplete);

View File

@ -82,8 +82,10 @@ class DisplayChangeDialog extends ModalDialog.ModalDialog {
}
_formatCountDown() {
let fmt = ngettext("Settings changes will revert in %d second",
"Settings changes will revert in %d seconds");
const fmt = ngettext(
'Settings changes will revert in %d second',
'Settings changes will revert in %d seconds',
this._countDown);
return fmt.format(this._countDown);
}

View File

@ -1,5 +1,5 @@
project('gnome-shell', 'c',
version: '3.37.0',
version: '3.36.2',
meson_version: '>= 0.47.0',
license: 'GPLv2+'
)

457
po/cs.po
View File

@ -3,7 +3,7 @@
# This file is distributed under the same license as the gnome-shell package.
#
# Andre Klapper <ak-47@gmx.net>, 2009.
# Petr Kovar <pknbe@volny.cz>, 2009, 2010, 2011, 2012, 2014, 2015.
# Petr Kovar <pknbe@volny.cz>, 2009, 2010, 2011, 2012, 2014, 2015, 2020.
# Adam Matoušek <adamatousek@gmail.com>, 2012, 2013.
# Marek Černocký <marek@manet.cz>, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020.
#
@ -11,8 +11,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2020-03-09 12:45+0000\n"
"PO-Revision-Date: 2020-03-09 14:56+0100\n"
"POT-Creation-Date: 2020-04-22 12:52+0000\n"
"PO-Revision-Date: 2020-04-27 16:42+0200\n"
"Last-Translator: Daniel Rusek <mail@asciiwolf.com>\n"
"Language-Team: čeština <gnome-cs-list@gnome.org>\n"
"Language: cs\n"
@ -47,15 +47,6 @@ msgstr "Zobrazit všechny aplikace"
msgid "Open the application menu"
msgstr "Otevřít nabídku aplikací"
#: data/org.gnome.Extensions.desktop.in.in:4 js/extensionPrefs/main.js:218
#: js/extensionPrefs/ui/extensions-window.ui:61
msgid "Extensions"
msgstr "Rozšíření"
#: data/org.gnome.Extensions.desktop.in.in:7
msgid "Configure GNOME Shell Extensions"
msgstr "Nastavit rozšíření pro GNOME Shell"
#: data/org.gnome.Shell.desktop.in.in:4
msgid "GNOME Shell"
msgstr "GNOME Shell"
@ -249,7 +240,7 @@ msgstr "Klávesová zkratka otevírající přehled"
#: data/org.gnome.shell.gschema.xml.in:135
msgid "Keybinding to open the Activities Overview."
msgstr "Klávesová zkratka sloužící k otevření přehledu činností"
msgstr "Klávesová zkratka sloužící k otevření přehledu činností."
#: data/org.gnome.shell.gschema.xml.in:141
msgid "Keybinding to toggle the visibility of the notification list"
@ -306,7 +297,7 @@ msgstr "Přepnout do aplikace 9"
#: data/org.gnome.shell.gschema.xml.in:196
#: data/org.gnome.shell.gschema.xml.in:223
msgid "Limit switcher to current workspace."
msgstr "Omezit přepínání jen na aktuální plochu"
msgstr "Omezit přepínání jen na aktuální plochu."
#: data/org.gnome.shell.gschema.xml.in:197
msgid ""
@ -318,7 +309,7 @@ msgstr ""
#: data/org.gnome.shell.gschema.xml.in:214
msgid "The application icon mode."
msgstr "Režim ikon aplikací"
msgstr "Režim ikon aplikací."
#: data/org.gnome.shell.gschema.xml.in:215
msgid ""
@ -373,7 +364,7 @@ msgstr "Modální dialogová okna připojovat k rodičovskému oknu"
#: data/org.gnome.shell.gschema.xml.in:300
msgid ""
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
msgstr "Když běží GNOME Shell, tento klíč přepíše klíč v org.gnome.mutter"
msgstr "Když běží GNOME Shell, tento klíč přepíše klíč v org.gnome.mutter."
#: data/org.gnome.shell.gschema.xml.in:275
msgid "Enable edge tiling when dropping windows on screen edges"
@ -395,44 +386,12 @@ msgstr "Se změnou zaměření v režimu myši čekat na zastavení pohybu ukaza
msgid "Network Login"
msgstr "Přihlášení do sítě"
#: js/extensionPrefs/main.js:140
#, javascript-format
msgid "Remove “%s”?"
msgstr "Odebrat „%s“?"
#: js/extensionPrefs/main.js:141
msgid ""
"If you remove the extension, you need to return to download it if you want "
"to enable it again"
msgstr ""
"Pokud rozšíření odeberete a budete jej chtít znovu povolit, budete se muset "
"vrátit k jeho stažení."
#: js/extensionPrefs/main.js:144 js/gdm/authPrompt.js:135
#: js/ui/audioDeviceSelection.js:57 js/ui/components/networkAgent.js:107
#: js/ui/components/polkitAgent.js:139 js/ui/endSessionDialog.js:374
#: js/ui/extensionDownloader.js:165 js/ui/shellMountOperation.js:376
#: js/ui/shellMountOperation.js:386 js/ui/status/network.js:913
msgid "Cancel"
msgstr "Zrušit"
#: js/extensionPrefs/main.js:145
msgid "Remove"
msgstr "Odebrat"
#: js/extensionPrefs/main.js:217
msgid "translator-credits"
msgstr "Marek Černocký <marek@manet.cz>"
#: js/extensionPrefs/main.js:219
msgid "Manage your GNOME Extensions"
msgstr "Správa vašich rozšíření GNOME"
#: js/extensionPrefs/main.js:261 js/extensionPrefs/ui/extensions-window.ui:222
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:36
#: subprojects/extensions-app/data/ui/extensions-window.ui:224
msgid "Somethings gone wrong"
msgstr "Něco se stalo špatně"
#: js/extensionPrefs/main.js:268
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:48
msgid ""
"Were very sorry, but theres been a problem: the settings for this "
"extension cant be displayed. We recommend that you report the issue to the "
@ -441,112 +400,31 @@ msgstr ""
"Omlouváme se, ale vyskytl se problém: nastavení pro toto rozšíření nelze "
"zobrazit. Doporučujeme problém nahlásit autorovi rozšíření."
#: js/extensionPrefs/main.js:275
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:82
msgid "Technical Details"
msgstr "Technické podrobnosti"
#: js/extensionPrefs/main.js:310
msgid "Copy Error"
msgstr "Zkopírovat chybu"
#: js/extensionPrefs/main.js:337
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:165
msgid "Homepage"
msgstr "Domovská stránka"
#: js/extensionPrefs/main.js:338
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:166
msgid "Visit extension homepage"
msgstr "Navštívit domovskou stránku rozšíření"
#: js/extensionPrefs/main.js:449
#, javascript-format
msgid "%d extension will be updated on next login."
msgid_plural "%d extensions will be updated on next login."
msgstr[0] "Při příštím přihlášení bude aktualizováno %d rozšíření."
msgstr[1] "Při příštím přihlášení budou aktualizována %d rozšíření."
msgstr[2] "Při příštím přihlášení bude aktualizováno %d rozšíření."
#: js/extensionPrefs/ui/extension-row.ui:100
#: subprojects/extensions-tool/src/command-create.c:211
#: subprojects/extensions-tool/src/main.c:173
msgid "Description"
msgstr "Popis"
#: js/extensionPrefs/ui/extension-row.ui:123
#: subprojects/extensions-tool/src/main.c:185
msgid "Version"
msgstr "Verze"
#: js/extensionPrefs/ui/extension-row.ui:151
msgid "Author"
msgstr "Autor"
#: js/extensionPrefs/ui/extension-row.ui:175
msgid "Website"
msgstr "Webové stránky"
#: js/extensionPrefs/ui/extension-row.ui:192
msgid "Remove…"
msgstr "Odebrat…"
#: js/extensionPrefs/ui/extensions-window.ui:8
msgid "Help"
msgstr "Nápověda"
#: js/extensionPrefs/ui/extensions-window.ui:12
msgid "About Extensions"
msgstr "O rozšířeních"
#: js/extensionPrefs/ui/extensions-window.ui:27
msgid ""
"To find and add extensions, visit <a href=\"https://extensions.gnome.org"
"\">extensions.gnome.org</a>."
msgstr ""
"Jestli chcete vyhledat a nainstalovat rozšíření, navštivte stránku <a href="
"\"https://extensions.gnome.org\">extensions.gnome.org</a>."
#: js/extensionPrefs/ui/extensions-window.ui:35
msgid "Warning"
msgstr "Varování"
#: js/extensionPrefs/ui/extensions-window.ui:46
msgid ""
"Extensions can cause system issues, including performance problems. If you "
"encounter problems with your system, it is recommended to disable all "
"extensions."
msgstr ""
"Rozšíření mohou způsobit problémy se systémem, včetně výkonnostních "
"problémů. Pokud ve svém systému narazíte na problémy, doporučujeme zkusit "
"zakázat všechna rozšíření."
#: js/extensionPrefs/ui/extensions-window.ui:133
msgid "Manually Installed"
msgstr "Ručně nainstalované"
#: js/extensionPrefs/ui/extensions-window.ui:157
msgid "Built-In"
msgstr "Vestavěné"
#: js/extensionPrefs/ui/extensions-window.ui:198
msgid "No Installed Extensions"
msgstr "Není nainstalované žádné rozšíření"
#: js/extensionPrefs/ui/extensions-window.ui:234
msgid ""
"Were very sorry, but it was not possible to get the list of installed "
"extensions. Make sure you are logged into GNOME and try again."
msgstr ""
"Bohužel, ale není možné získat seznam nainstalovaných rozšíření. Ujistěte "
"se, že jste přihlášení do GNOME, a zkuste to znovu."
#: js/extensionPrefs/ui/extensions-window.ui:287
msgid "Log Out…"
msgstr "Odhlásit se…"
#: js/gdm/authPrompt.js:135 js/ui/audioDeviceSelection.js:57
#: js/ui/components/networkAgent.js:109 js/ui/components/polkitAgent.js:139
#: js/ui/endSessionDialog.js:372 js/ui/extensionDownloader.js:181
#: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386
#: js/ui/status/network.js:913 subprojects/extensions-app/js/main.js:148
msgid "Cancel"
msgstr "Zrušit"
#. Cisco LEAP
#: js/gdm/authPrompt.js:237 js/ui/components/networkAgent.js:202
#: js/ui/components/networkAgent.js:218 js/ui/components/networkAgent.js:242
#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:283
#: js/ui/components/networkAgent.js:293 js/ui/components/polkitAgent.js:277
#: js/gdm/authPrompt.js:237 js/ui/components/networkAgent.js:204
#: js/ui/components/networkAgent.js:220 js/ui/components/networkAgent.js:244
#: js/ui/components/networkAgent.js:265 js/ui/components/networkAgent.js:285
#: js/ui/components/networkAgent.js:295 js/ui/components/polkitAgent.js:277
#: js/ui/shellMountOperation.js:326
msgid "Password"
msgstr "Heslo"
@ -569,8 +447,8 @@ msgstr "(např. uživatel nebo %s)"
#. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one)
#: js/gdm/loginDialog.js:917 js/ui/components/networkAgent.js:238
#: js/ui/components/networkAgent.js:261 js/ui/components/networkAgent.js:279
#: js/gdm/loginDialog.js:917 js/ui/components/networkAgent.js:240
#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281
msgid "Username"
msgstr "Uživatelské jméno"
@ -840,44 +718,44 @@ msgstr "Zamítnout přístup"
msgid "Grant Access"
msgstr "Schválit přístup"
#: js/ui/appDisplay.js:910
#: js/ui/appDisplay.js:938
msgid "Unnamed Folder"
msgstr "Nepojmenovaná složka"
#: js/ui/appDisplay.js:933
#: js/ui/appDisplay.js:961
msgid "Frequently used applications will appear here"
msgstr "Zde se objeví často používané aplikace"
#: js/ui/appDisplay.js:1068
#: js/ui/appDisplay.js:1096
msgid "Frequent"
msgstr "Časté"
#: js/ui/appDisplay.js:1075
#: js/ui/appDisplay.js:1103
msgid "All"
msgstr "Všechny"
#. Translators: This is the heading of a list of open windows
#: js/ui/appDisplay.js:2458 js/ui/panel.js:75
#: js/ui/appDisplay.js:2479 js/ui/panel.js:75
msgid "Open Windows"
msgstr "Otevřená okna"
#: js/ui/appDisplay.js:2478 js/ui/panel.js:82
#: js/ui/appDisplay.js:2499 js/ui/panel.js:82
msgid "New Window"
msgstr "Nové okno"
#: js/ui/appDisplay.js:2489
#: js/ui/appDisplay.js:2510
msgid "Launch using Dedicated Graphics Card"
msgstr "Spustit pomocí vyhrazené grafické karty"
#: js/ui/appDisplay.js:2517 js/ui/dash.js:239
#: js/ui/appDisplay.js:2538 js/ui/dash.js:239
msgid "Remove from Favorites"
msgstr "Odstranit z oblíbených"
#: js/ui/appDisplay.js:2523
#: js/ui/appDisplay.js:2544
msgid "Add to Favorites"
msgstr "Přidat mezi oblíbené"
#: js/ui/appDisplay.js:2533 js/ui/panel.js:93
#: js/ui/appDisplay.js:2554 js/ui/panel.js:93
msgid "Show Details"
msgstr "Zobrazit podrobnosti"
@ -907,7 +785,7 @@ msgstr "Sluchátka"
msgid "Headset"
msgstr "Sluchátka s mikrofonem"
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:269
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:270
msgid "Microphone"
msgstr "Mikrofon"
@ -1025,30 +903,30 @@ msgid "All Day"
msgstr "Celý den"
#. Translators: Shown on calendar heading when selected day occurs on current year
#: js/ui/calendar.js:867
#: js/ui/calendar.js:868
msgctxt "calendar heading"
msgid "%A, %B %-d"
msgstr "%A, %e. %B"
#. Translators: Shown on calendar heading when selected day occurs on different year
#: js/ui/calendar.js:870
#: js/ui/calendar.js:871
msgctxt "calendar heading"
msgid "%A, %B %-d, %Y"
msgstr "%A, %e. %B %Y"
#: js/ui/calendar.js:1096
#: js/ui/calendar.js:1100
msgid "No Notifications"
msgstr "Nejsou žádná upozornění"
#: js/ui/calendar.js:1099
#: js/ui/calendar.js:1103
msgid "No Events"
msgstr "Nejsou žádné události"
#: js/ui/calendar.js:1153
#: js/ui/calendar.js:1157
msgid "Do Not Disturb"
msgstr "Nevyrušovat"
#: js/ui/calendar.js:1167
#: js/ui/calendar.js:1176
msgid "Clear"
msgstr "Vymazat"
@ -1095,38 +973,38 @@ msgstr "Nainstalovaná verze udisks nepodporuje nastavení PIM"
msgid "Open with %s"
msgstr "Otevřít pomocí %s"
#: js/ui/components/networkAgent.js:89
#: js/ui/components/networkAgent.js:91
msgid ""
"Alternatively you can connect by pushing the “WPS” button on your router."
msgstr "Případně se můžete připojit zmáčknutím tlačítka „WPS“ na směrovači."
#: js/ui/components/networkAgent.js:101 js/ui/status/network.js:223
#: js/ui/components/networkAgent.js:103 js/ui/status/network.js:223
#: js/ui/status/network.js:314 js/ui/status/network.js:916
msgid "Connect"
msgstr "Připojit"
#: js/ui/components/networkAgent.js:208
#: js/ui/components/networkAgent.js:210
msgid "Key"
msgstr "Klíč"
#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:269
#: js/ui/components/networkAgent.js:248 js/ui/components/networkAgent.js:271
msgid "Private key password"
msgstr "Heslo soukromého klíče"
#: js/ui/components/networkAgent.js:267
#: js/ui/components/networkAgent.js:269
msgid "Identity"
msgstr "Identita"
#: js/ui/components/networkAgent.js:281
#: js/ui/components/networkAgent.js:283
msgid "Service"
msgstr "Služba"
#: js/ui/components/networkAgent.js:310 js/ui/components/networkAgent.js:338
#: js/ui/components/networkAgent.js:685 js/ui/components/networkAgent.js:706
#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:340
#: js/ui/components/networkAgent.js:679 js/ui/components/networkAgent.js:700
msgid "Authentication required"
msgstr "Je požadováno ověření"
#: js/ui/components/networkAgent.js:311 js/ui/components/networkAgent.js:686
#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:680
#, javascript-format
msgid ""
"Passwords or encryption keys are required to access the wireless network "
@ -1135,42 +1013,42 @@ msgstr ""
"Pro přístup k bezdrátové síti „%s“ jsou vyžadována hesla nebo šifrovací "
"klíče."
#: js/ui/components/networkAgent.js:315 js/ui/components/networkAgent.js:690
#: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:684
msgid "Wired 802.1X authentication"
msgstr "Ověření připojení po drátu 802.1X"
#: js/ui/components/networkAgent.js:317
#: js/ui/components/networkAgent.js:319
msgid "Network name"
msgstr "Název sítě"
#: js/ui/components/networkAgent.js:322 js/ui/components/networkAgent.js:694
#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:688
msgid "DSL authentication"
msgstr "Ověření DSL"
#: js/ui/components/networkAgent.js:329 js/ui/components/networkAgent.js:699
#: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:693
msgid "PIN code required"
msgstr "Požadován kód PIN"
#: js/ui/components/networkAgent.js:330 js/ui/components/networkAgent.js:700
#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:694
msgid "PIN code is needed for the mobile broadband device"
msgstr "Pro mobilní širokopásmové zařízení je vyžadován kód PIN"
#: js/ui/components/networkAgent.js:331
#: js/ui/components/networkAgent.js:333
msgid "PIN"
msgstr "PIN"
#: js/ui/components/networkAgent.js:339 js/ui/components/networkAgent.js:691
#: js/ui/components/networkAgent.js:695 js/ui/components/networkAgent.js:707
#: js/ui/components/networkAgent.js:711
#: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:685
#: js/ui/components/networkAgent.js:689 js/ui/components/networkAgent.js:701
#: js/ui/components/networkAgent.js:705
#, javascript-format
msgid "A password is required to connect to “%s”."
msgstr "Pro připojení k „%s“ je vyžadováno heslo."
#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1691
#: js/ui/components/networkAgent.js:668 js/ui/status/network.js:1691
msgid "Network Manager"
msgstr "Network Manager"
#: js/ui/components/networkAgent.js:710
#: js/ui/components/networkAgent.js:704
msgid "VPN password"
msgstr "Heslo k VPN"
@ -1196,7 +1074,7 @@ msgstr "Ověření bohužel nebylo úspěšné. Zkuste to prosím znovu."
#. Translators: this is the other person changing their old IM name to their new
#. IM name.
#: js/ui/components/telepathyClient.js:787
#: js/ui/components/telepathyClient.js:823
#, javascript-format
msgid "%s is now known as %s"
msgstr "%s je teď znám jako %s"
@ -1242,23 +1120,23 @@ msgstr "Přidat světový čas…"
msgid "World Clocks"
msgstr "Světové hodiny"
#: js/ui/dateMenu.js:276
#: js/ui/dateMenu.js:289
msgid "Weather"
msgstr "Počasí"
#: js/ui/dateMenu.js:391
#: js/ui/dateMenu.js:418
msgid "Select a location…"
msgstr "Vybrat místo…"
#: js/ui/dateMenu.js:404
#: js/ui/dateMenu.js:426
msgid "Loading…"
msgstr "Načítá se…"
#: js/ui/dateMenu.js:414
#: js/ui/dateMenu.js:436
msgid "Go online for weather information"
msgstr "Připojit se kvůli informacím o počasí"
#: js/ui/dateMenu.js:416
#: js/ui/dateMenu.js:438
msgid "Weather information is currently unavailable"
msgstr "Informace o počasí nejsou nyní dostupné"
@ -1407,35 +1285,35 @@ msgid "Other users are logged in"
msgstr "Jsou přihlášeni jiní uživatelé"
#. Translators: Remote here refers to a remote session, like a ssh login
#: js/ui/endSessionDialog.js:588
#: js/ui/endSessionDialog.js:586
#, javascript-format
msgid "%s (remote)"
msgstr "%s (vzdálený)"
#. Translators: Console here refers to a tty like a VT console
#: js/ui/endSessionDialog.js:591
#: js/ui/endSessionDialog.js:589
#, javascript-format
msgid "%s (console)"
msgstr "%s (konzola)"
#: js/ui/extensionDownloader.js:169
#: js/ui/extensionDownloader.js:185
msgid "Install"
msgstr "Nainstalovat"
#: js/ui/extensionDownloader.js:175
#: js/ui/extensionDownloader.js:191
msgid "Install Extension"
msgstr "Instalace rozšíření"
#: js/ui/extensionDownloader.js:176
#: js/ui/extensionDownloader.js:192
#, javascript-format
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "Stáhnout a nainstalovat „%s“ z extensions.gnome.org?"
#: js/ui/extensionSystem.js:228
#: js/ui/extensionSystem.js:252
msgid "Extension Updates Available"
msgstr "Jsou dostupné aktualizace rozšíření"
#: js/ui/extensionSystem.js:229
#: js/ui/extensionSystem.js:253
msgid "Extension updates are ready to be installed."
msgstr "Aktualizace rozšíření jsou připravené k instalaci."
@ -1584,11 +1462,11 @@ msgstr "Zobrazit zdroj"
msgid "Web Page"
msgstr "Webová stránka"
#: js/ui/main.js:269
#: js/ui/main.js:279
msgid "Logged in as a privileged user"
msgstr "Přihlášeni jako privilegovaný uživatel"
#: js/ui/main.js:270
#: js/ui/main.js:280
msgid ""
"Running a session as a privileged user should be avoided for security "
"reasons. If possible, you should log in as a normal user."
@ -1597,15 +1475,15 @@ msgstr ""
"bezpečnostních důvodů vyhýbat. Pokud je to možné, přihlaste se jako běžný "
"uživatel."
#: js/ui/main.js:276
#: js/ui/main.js:319
msgid "Screen Lock disabled"
msgstr "Zamykání obrazovky zakázáno"
#: js/ui/main.js:277
#: js/ui/main.js:320
msgid "Screen Locking requires the GNOME display manager."
msgstr "Zamykání obrazovky vyžaduje správce displejů GNOME."
#: js/ui/messageTray.js:1554
#: js/ui/messageTray.js:1551
msgid "System Information"
msgstr "Informace o systému"
@ -1725,11 +1603,11 @@ msgstr "GNOME potřebuje uzamknout obrazovku"
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: js/ui/screenShield.js:244 js/ui/screenShield.js:598
#: js/ui/screenShield.js:244 js/ui/screenShield.js:601
msgid "Unable to lock"
msgstr "Nelze uzamknout obrazovku"
#: js/ui/screenShield.js:245 js/ui/screenShield.js:599
#: js/ui/screenShield.js:245 js/ui/screenShield.js:602
msgid "Lock was blocked by an application"
msgstr "Zamknutí bylo zablokováno některou z aplikací"
@ -1813,13 +1691,13 @@ msgid "The PIM must be a number or empty."
msgstr "PIM musí být číslo nebo prázdné."
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:469
#: js/ui/shellMountOperation.js:465
#, javascript-format
msgid "Unable to start %s"
msgstr "Nelze spustit %s"
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:471
#: js/ui/shellMountOperation.js:467
#, javascript-format
msgid "Couldnt find the %s application"
msgstr "Nezdařilo se najít aplikaci %s"
@ -2297,11 +2175,11 @@ msgstr "Chyba ověření Thunderbolt"
msgid "Could not authorize the Thunderbolt device: %s"
msgstr "Nezdařilo se provést ověření zařízení Thunderbolt: %s"
#: js/ui/status/volume.js:150
#: js/ui/status/volume.js:151
msgid "Volume changed"
msgstr "Hlasitost změněna"
#: js/ui/status/volume.js:221
#: js/ui/status/volume.js:222
msgid "Volume"
msgstr "Hlasitost"
@ -2335,23 +2213,23 @@ msgstr "Jen vestavěné"
#. Translators: This is a time format for a date in
#. long format
#: js/ui/unlockDialog.js:370
#: js/ui/unlockDialog.js:371
msgid "%A %B %-d"
msgstr "%A, %e. %B"
#: js/ui/unlockDialog.js:376
#: js/ui/unlockDialog.js:377
msgid "Swipe up to unlock"
msgstr "Odemkněte máchnutím"
#: js/ui/unlockDialog.js:377
#: js/ui/unlockDialog.js:378
msgid "Click or press a key to unlock"
msgstr "Odemkněte kliknutím nebo zmáčknutím zámku"
#: js/ui/unlockDialog.js:549
#: js/ui/unlockDialog.js:550
msgid "Unlock Window"
msgstr "Odemykací okno"
#: js/ui/unlockDialog.js:558
#: js/ui/unlockDialog.js:559
msgid "Log in as another user"
msgstr "Přihlásit se jako jiný uživatel"
@ -2384,7 +2262,7 @@ msgstr "Obnovit původní"
msgid "Keep Changes"
msgstr "Zachovat"
#: js/ui/windowManager.js:85
#: js/ui/windowManager.js:86
#, javascript-format
msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds"
@ -2394,7 +2272,7 @@ msgstr[2] "Nastavení se obnoví na původní za %d sekund"
#. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height.
#: js/ui/windowManager.js:544
#: js/ui/windowManager.js:546
#, javascript-format
msgid "%d × %d"
msgstr "%d×%d"
@ -2471,28 +2349,28 @@ msgstr "Zavřít"
msgid "Evolution Calendar"
msgstr "Kalendář Evolution"
#: src/main.c:460 subprojects/extensions-tool/src/main.c:249
#: src/main.c:458 subprojects/extensions-tool/src/main.c:249
msgid "Print version"
msgstr "Vypsat verzi"
#: src/main.c:466
#: src/main.c:464
msgid "Mode used by GDM for login screen"
msgstr "Režim použitý GDM pro přihlašovací obrazovku"
#: src/main.c:472
#: src/main.c:470
msgid "Use a specific mode, e.g. “gdm” for login screen"
msgstr "Použít pro přihlašovací obrazovku zadaný režim, např. „gdm“"
#: src/main.c:478
#: src/main.c:476
msgid "List possible modes"
msgstr "Vypsat možné režimy"
#: src/shell-app.c:279
#: src/shell-app.c:286
msgctxt "program"
msgid "Unknown"
msgstr "Neznámé"
#: src/shell-app.c:530
#: src/shell-app.c:537
#, c-format
msgid "Failed to launch “%s”"
msgstr "Nelze spustit „%s“"
@ -2509,6 +2387,136 @@ msgstr "Heslo nemůže být prázdné."
msgid "Authentication dialog was dismissed by the user"
msgstr "Dialogové okno ověření bylo uživatelem zrušeno"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:5
#: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:4
#: subprojects/extensions-app/js/main.js:182
#: subprojects/extensions-app/data/ui/extensions-window.ui:61
msgid "Extensions"
msgstr "Rozšíření"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:6
#: subprojects/extensions-app/js/main.js:183
msgid "Manage your GNOME Extensions"
msgstr "Správa vašich rozšíření GNOME"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:35
msgid ""
"GNOME Extensions handles updating extensions, configuring extension "
"preferences and removing or disabling unwanted extensions."
msgstr ""
"Aplikace Rozšíření GNOME umožňuje aktualizaci a nastavení předvoleb "
"rozšíření a odstranění nebo vypnutí nechtěných rozšíření."
#: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:7
msgid "Configure GNOME Shell Extensions"
msgstr "Nastavit rozšíření pro GNOME Shell"
#: subprojects/extensions-app/js/main.js:144
#, javascript-format
msgid "Remove “%s”?"
msgstr "Odebrat „%s“?"
#: subprojects/extensions-app/js/main.js:145
msgid ""
"If you remove the extension, you need to return to download it if you want "
"to enable it again"
msgstr ""
"Pokud rozšíření odeberete a budete jej chtít znovu povolit, budete se muset "
"vrátit k jeho stažení"
#: subprojects/extensions-app/js/main.js:149
msgid "Remove"
msgstr "Odebrat"
#: subprojects/extensions-app/js/main.js:181
msgid "translator-credits"
msgstr "Marek Černocký <marek@manet.cz>"
#: subprojects/extensions-app/js/main.js:316
#, javascript-format
msgid "%d extension will be updated on next login."
msgid_plural "%d extensions will be updated on next login."
msgstr[0] "Při příštím přihlášení bude aktualizováno %d rozšíření."
msgstr[1] "Při příštím přihlášení budou aktualizována %d rozšíření."
msgstr[2] "Při příštím přihlášení bude aktualizováno %d rozšíření."
#: subprojects/extensions-app/data/ui/extension-row.ui:100
#: subprojects/extensions-tool/src/command-create.c:211
#: subprojects/extensions-tool/src/main.c:173
msgid "Description"
msgstr "Popis"
#: subprojects/extensions-app/data/ui/extension-row.ui:123
#: subprojects/extensions-tool/src/main.c:185
msgid "Version"
msgstr "Verze"
#: subprojects/extensions-app/data/ui/extension-row.ui:151
msgid "Author"
msgstr "Autor"
#: subprojects/extensions-app/data/ui/extension-row.ui:175
msgid "Website"
msgstr "Webové stránky"
#: subprojects/extensions-app/data/ui/extension-row.ui:192
msgid "Remove…"
msgstr "Odebrat…"
#: subprojects/extensions-app/data/ui/extensions-window.ui:8
msgid "Help"
msgstr "Nápověda"
#: subprojects/extensions-app/data/ui/extensions-window.ui:12
msgid "About Extensions"
msgstr "O aplikaci Rozšíření"
#: subprojects/extensions-app/data/ui/extensions-window.ui:27
msgid ""
"To find and add extensions, visit <a href=\"https://extensions.gnome.org"
"\">extensions.gnome.org</a>."
msgstr ""
"Jestli chcete vyhledat a nainstalovat rozšíření, navštivte stránku <a href="
"\"https://extensions.gnome.org\">extensions.gnome.org</a>."
#: subprojects/extensions-app/data/ui/extensions-window.ui:35
msgid "Warning"
msgstr "Varování"
#: subprojects/extensions-app/data/ui/extensions-window.ui:46
msgid ""
"Extensions can cause system issues, including performance problems. If you "
"encounter problems with your system, it is recommended to disable all "
"extensions."
msgstr ""
"Rozšíření mohou způsobit problémy se systémem, včetně výkonnostních "
"problémů. Pokud ve svém systému narazíte na problémy, doporučujeme zkusit "
"zakázat všechna rozšíření."
#: subprojects/extensions-app/data/ui/extensions-window.ui:135
msgid "Manually Installed"
msgstr "Ručně nainstalované"
#: subprojects/extensions-app/data/ui/extensions-window.ui:159
msgid "Built-In"
msgstr "Vestavěné"
#: subprojects/extensions-app/data/ui/extensions-window.ui:200
msgid "No Installed Extensions"
msgstr "Není nainstalované žádné rozšíření"
#: subprojects/extensions-app/data/ui/extensions-window.ui:236
msgid ""
"Were very sorry, but it was not possible to get the list of installed "
"extensions. Make sure you are logged into GNOME and try again."
msgstr ""
"Bohužel, ale není možné získat seznam nainstalovaných rozšíření. Ujistěte "
"se, že jste přihlášení do GNOME, a zkuste to znovu."
#: subprojects/extensions-app/data/ui/extensions-window.ui:289
msgid "Log Out…"
msgstr "Odhlásit se…"
#. Translators: a file path to an extension directory
#: subprojects/extensions-tool/src/command-create.c:125
#, c-format
@ -2771,7 +2779,7 @@ msgstr "[ARGUMENTY…]"
#: subprojects/extensions-tool/src/main.c:247
msgid "Commands:"
msgstr "Příkazy"
msgstr "Příkazy:"
#: subprojects/extensions-tool/src/main.c:248
msgid "Print help"
@ -2846,3 +2854,6 @@ msgstr[2] "%u vstupů"
#: subprojects/gvc/gvc-mixer-control.c:2766
msgid "System Sounds"
msgstr "Systémové zvuky"
#~ msgid "Copy Error"
#~ msgstr "Zkopírovat chybu"

View File

@ -25,8 +25,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2020-03-31 07:15+0000\n"
"PO-Revision-Date: 2020-04-02 12:43+0300\n"
"POT-Creation-Date: 2020-04-02 09:45+0000\n"
"PO-Revision-Date: 2020-04-13 18:02+0300\n"
"Last-Translator: Jiri Grönroos <jiri.gronroos+l10n@iki.fi>\n"
"Language-Team: suomi <lokalisointi-lista@googlegroups.com>\n"
"Language: fi\n"
@ -736,44 +736,44 @@ msgstr "Estä pääsy"
msgid "Grant Access"
msgstr "Salli pääsy"
#: js/ui/appDisplay.js:932
#: js/ui/appDisplay.js:937
msgid "Unnamed Folder"
msgstr "Nimetön kansio"
#: js/ui/appDisplay.js:955
#: js/ui/appDisplay.js:960
msgid "Frequently used applications will appear here"
msgstr "Usein käytetyt sovellukset ilmestyvät tänne"
#: js/ui/appDisplay.js:1090
#: js/ui/appDisplay.js:1095
msgid "Frequent"
msgstr "Käytetyimmät"
#: js/ui/appDisplay.js:1097
#: js/ui/appDisplay.js:1102
msgid "All"
msgstr "Kaikki"
#. Translators: This is the heading of a list of open windows
#: js/ui/appDisplay.js:2473 js/ui/panel.js:75
#: js/ui/appDisplay.js:2478 js/ui/panel.js:75
msgid "Open Windows"
msgstr "Avoimet ikkunat"
#: js/ui/appDisplay.js:2493 js/ui/panel.js:82
#: js/ui/appDisplay.js:2498 js/ui/panel.js:82
msgid "New Window"
msgstr "Uusi ikkuna"
#: js/ui/appDisplay.js:2504
#: js/ui/appDisplay.js:2509
msgid "Launch using Dedicated Graphics Card"
msgstr "Käynnistä erillisnäytönohjainta käyttäen"
#: js/ui/appDisplay.js:2532 js/ui/dash.js:239
#: js/ui/appDisplay.js:2537 js/ui/dash.js:239
msgid "Remove from Favorites"
msgstr "Poista suosikeista"
#: js/ui/appDisplay.js:2538
#: js/ui/appDisplay.js:2543
msgid "Add to Favorites"
msgstr "Lisää suosikkeihin"
#: js/ui/appDisplay.js:2548 js/ui/panel.js:93
#: js/ui/appDisplay.js:2553 js/ui/panel.js:93
msgid "Show Details"
msgstr "Näytä tiedot"
@ -1472,11 +1472,11 @@ msgstr "Näytä lähde"
msgid "Web Page"
msgstr "Verkkosivusto"
#: js/ui/main.js:277
#: js/ui/main.js:279
msgid "Logged in as a privileged user"
msgstr "Kirjautuneena etuoikeutettuna käyttäjänä"
#: js/ui/main.js:278
#: js/ui/main.js:280
msgid ""
"Running a session as a privileged user should be avoided for security "
"reasons. If possible, you should log in as a normal user."
@ -1484,11 +1484,11 @@ msgstr ""
"Istunnon suorittamista etuoikeutettuna käyttäjänä tulisi välttää "
"tietoturvasyistä. Jos mahdollista, kirjaudu tavallisena käyttäjänä."
#: js/ui/main.js:317
#: js/ui/main.js:319
msgid "Screen Lock disabled"
msgstr "Näytön lukitus pois käytöstä"
#: js/ui/main.js:318
#: js/ui/main.js:320
msgid "Screen Locking requires the GNOME display manager."
msgstr "Näytön lukitus vaatii Gnomen kirjautumishallinnan."
@ -2407,6 +2407,9 @@ msgid ""
"GNOME Extensions handles updating extensions, configuring extension "
"preferences and removing or disabling unwanted extensions."
msgstr ""
"Gnomen laajennussovellus Laajennukset käsittelee laajennusten päivitykset, "
"niiden asetukset ja sen avulla voi poistaa laajennuksia käytöstä tai "
"kokonaan järjestelmästä."
#: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:7
msgid "Configure GNOME Shell Extensions"

1850
po/lv.po

File diff suppressed because it is too large Load Diff

View File

@ -24,8 +24,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2020-03-19 14:34+0000\n"
"PO-Revision-Date: 2020-03-19 11:36-0300\n"
"POT-Creation-Date: 2020-03-31 07:15+0000\n"
"PO-Revision-Date: 2020-04-22 09:30-0300\n"
"Last-Translator: Rafael Fontenelle <rafaelff@gnome.org>\n"
"Language-Team: Brazilian Portuguese <gnome-pt_br-list@gnome.org>\n"
"Language: pt_BR\n"
@ -413,66 +413,12 @@ msgstr "Atrasar foco altera o modo do mouse até o ponteiro parar de mover"
msgid "Network Login"
msgstr "Sessão de Rede"
#: js/extensionPrefs/data/metainfo/org.gnome.Extensions.metainfo.xml.in:5
#: js/extensionPrefs/data/org.gnome.Extensions.desktop.in.in:4
#: js/extensionPrefs/js/main.js:242
#: js/extensionPrefs/data/ui/extensions-window.ui:61
msgid "Extensions"
msgstr "Extensões"
#: js/extensionPrefs/data/metainfo/org.gnome.Extensions.metainfo.xml.in:6
#: js/extensionPrefs/js/main.js:243
msgid "Manage your GNOME Extensions"
msgstr "Gerenciar suas extensões do GNOME"
#: js/extensionPrefs/data/metainfo/org.gnome.Extensions.metainfo.xml.in:35
msgid ""
"GNOME Extensions handles updating extensions, configuring extension "
"preferences and removing or disabling unwanted extensions."
msgstr ""
"GNOME Extensões lida com a atualização da extensões, configuração das "
"preferências de extensões e remoção ou desabilitação de extensões "
"indesejadas."
#: js/extensionPrefs/data/org.gnome.Extensions.desktop.in.in:7
msgid "Configure GNOME Shell Extensions"
msgstr "Configurar extensões do Shell do GNOME"
#: js/extensionPrefs/js/main.js:164
#, javascript-format
msgid "Remove “%s”?"
msgstr "Remover “%s”?"
#: js/extensionPrefs/js/main.js:165
msgid ""
"If you remove the extension, you need to return to download it if you want "
"to enable it again"
msgstr ""
"Se você remover a extensão, você precisa voltar a baixá-la se você quiser "
"habilitá-la novamente"
#: js/extensionPrefs/js/main.js:168 js/gdm/authPrompt.js:135
#: js/ui/audioDeviceSelection.js:57 js/ui/components/networkAgent.js:109
#: js/ui/components/polkitAgent.js:139 js/ui/endSessionDialog.js:374
#: js/ui/extensionDownloader.js:177 js/ui/shellMountOperation.js:376
#: js/ui/shellMountOperation.js:386 js/ui/status/network.js:913
msgid "Cancel"
msgstr "Cancelar"
#: js/extensionPrefs/js/main.js:169
msgid "Remove"
msgstr "Remover"
#: js/extensionPrefs/js/main.js:241
msgid "translator-credits"
msgstr "Rafael Fontenelle <rafaelff@gnome.org>"
#: js/extensionPrefs/js/main.js:285
#: js/extensionPrefs/data/ui/extensions-window.ui:223
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:36
#: subprojects/extensions-app/data/ui/extensions-window.ui:223
msgid "Somethings gone wrong"
msgstr "Algo deu errado"
#: js/extensionPrefs/js/main.js:292
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:48
msgid ""
"Were very sorry, but theres been a problem: the settings for this "
"extension cant be displayed. We recommend that you report the issue to the "
@ -482,105 +428,25 @@ msgstr ""
"ser exibidas. Recomendamos que você relate o problema aos autores da "
"extensão."
#: js/extensionPrefs/js/main.js:299
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:82
msgid "Technical Details"
msgstr "Detalhes técnicos"
#: js/extensionPrefs/js/main.js:334
msgid "Copy Error"
msgstr "Copiar erro"
#: js/extensionPrefs/js/main.js:361
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:165
msgid "Homepage"
msgstr "Site"
#: js/extensionPrefs/js/main.js:362
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:166
msgid "Visit extension homepage"
msgstr "Visita a página web da extensão"
#: js/extensionPrefs/js/main.js:479
#, javascript-format
msgid "%d extension will be updated on next login."
msgid_plural "%d extensions will be updated on next login."
msgstr[0] "%d extensão será atualizada na próxima sessão."
msgstr[1] "%d extensões serão atualizadas na próxima sessão."
#: js/extensionPrefs/data/ui/extension-row.ui:100
#: subprojects/extensions-tool/src/command-create.c:211
#: subprojects/extensions-tool/src/main.c:173
msgid "Description"
msgstr "Descrição"
#: js/extensionPrefs/data/ui/extension-row.ui:123
#: subprojects/extensions-tool/src/main.c:185
msgid "Version"
msgstr "Versão"
#: js/extensionPrefs/data/ui/extension-row.ui:151
msgid "Author"
msgstr "Autor"
#: js/extensionPrefs/data/ui/extension-row.ui:175
msgid "Website"
msgstr "Site"
#: js/extensionPrefs/data/ui/extension-row.ui:192
msgid "Remove…"
msgstr "Remover…"
#: js/extensionPrefs/data/ui/extensions-window.ui:8
msgid "Help"
msgstr "Ajuda"
#: js/extensionPrefs/data/ui/extensions-window.ui:12
msgid "About Extensions"
msgstr "Sobre as Extensões"
#: js/extensionPrefs/data/ui/extensions-window.ui:27
msgid ""
"To find and add extensions, visit <a href=\"https://extensions.gnome.org"
"\">extensions.gnome.org</a>."
msgstr ""
"Para encontrar e adicionar extensões, visite <a href=\"https://extensions."
"gnome.org\">extensions.gnome.org</a>."
#: js/extensionPrefs/data/ui/extensions-window.ui:35
msgid "Warning"
msgstr "Aviso"
#: js/extensionPrefs/data/ui/extensions-window.ui:46
msgid ""
"Extensions can cause system issues, including performance problems. If you "
"encounter problems with your system, it is recommended to disable all "
"extensions."
msgstr ""
"Extensões podem causar problemas no sistema, incluindo problemas de "
"desempenho. Se você encontrar problemas com o seu sistema, é recomendável "
"desativar todas as extensões."
#: js/extensionPrefs/data/ui/extensions-window.ui:134
msgid "Manually Installed"
msgstr "Instalada manualmente"
#: js/extensionPrefs/data/ui/extensions-window.ui:158
msgid "Built-In"
msgstr "Interna"
#: js/extensionPrefs/data/ui/extensions-window.ui:199
msgid "No Installed Extensions"
msgstr "Nenhuma extensão instalada"
#: js/extensionPrefs/data/ui/extensions-window.ui:235
msgid ""
"Were very sorry, but it was not possible to get the list of installed "
"extensions. Make sure you are logged into GNOME and try again."
msgstr ""
"Sentimos muito, mas não foi possível obter a lista de extensões instaladas. "
"Certifique-se de estar em uma sessão do GNOME e tente novamente."
#: js/extensionPrefs/data/ui/extensions-window.ui:288
msgid "Log Out…"
msgstr "Encerrar sessão…"
#: js/gdm/authPrompt.js:135 js/ui/audioDeviceSelection.js:57
#: js/ui/components/networkAgent.js:109 js/ui/components/polkitAgent.js:139
#: js/ui/endSessionDialog.js:374 js/ui/extensionDownloader.js:181
#: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386
#: js/ui/status/network.js:913 subprojects/extensions-app/js/main.js:148
msgid "Cancel"
msgstr "Cancelar"
#. Cisco LEAP
#: js/gdm/authPrompt.js:237 js/ui/components/networkAgent.js:204
@ -862,44 +728,44 @@ msgstr "Negar acesso"
msgid "Grant Access"
msgstr "Conceder acesso"
#: js/ui/appDisplay.js:898
#: js/ui/appDisplay.js:932
msgid "Unnamed Folder"
msgstr "Pasta sem nome"
#: js/ui/appDisplay.js:921
#: js/ui/appDisplay.js:955
msgid "Frequently used applications will appear here"
msgstr "Aplicativos usados frequentemente vão aparecer aqui"
#: js/ui/appDisplay.js:1056
#: js/ui/appDisplay.js:1090
msgid "Frequent"
msgstr "Frequente"
#: js/ui/appDisplay.js:1063
#: js/ui/appDisplay.js:1097
msgid "All"
msgstr "Todos"
#. Translators: This is the heading of a list of open windows
#: js/ui/appDisplay.js:2446 js/ui/panel.js:75
#: js/ui/appDisplay.js:2473 js/ui/panel.js:75
msgid "Open Windows"
msgstr "Janelas abertas"
#: js/ui/appDisplay.js:2466 js/ui/panel.js:82
#: js/ui/appDisplay.js:2493 js/ui/panel.js:82
msgid "New Window"
msgstr "Nova janela"
#: js/ui/appDisplay.js:2477
#: js/ui/appDisplay.js:2504
msgid "Launch using Dedicated Graphics Card"
msgstr "Inicia usando placa de vídeo dedicada"
#: js/ui/appDisplay.js:2505 js/ui/dash.js:239
#: js/ui/appDisplay.js:2532 js/ui/dash.js:239
msgid "Remove from Favorites"
msgstr "Remover dos favoritos"
#: js/ui/appDisplay.js:2511
#: js/ui/appDisplay.js:2538
msgid "Add to Favorites"
msgstr "Adicionar aos favoritos"
#: js/ui/appDisplay.js:2521 js/ui/panel.js:93
#: js/ui/appDisplay.js:2548 js/ui/panel.js:93
msgid "Show Details"
msgstr "Mostrar detalhes"
@ -929,7 +795,7 @@ msgstr "Fones de ouvido"
msgid "Headset"
msgstr "Fone de ouvido com microfone"
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:269
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:270
msgid "Microphone"
msgstr "Microfone"
@ -1070,7 +936,7 @@ msgstr "Nenhum evento"
msgid "Do Not Disturb"
msgstr "Não perturbe"
#: js/ui/calendar.js:1171
#: js/ui/calendar.js:1176
msgid "Clear"
msgstr "Limpar"
@ -1220,7 +1086,7 @@ msgstr "Desculpe, isto não funcionou. Por favor, tente novamente."
#. Translators: this is the other person changing their old IM name to their new
#. IM name.
#: js/ui/components/telepathyClient.js:787
#: js/ui/components/telepathyClient.js:823
#, javascript-format
msgid "%s is now known as %s"
msgstr "%s agora é conhecido como %s"
@ -1264,106 +1130,106 @@ msgstr "Adicionar relógios mundiais…"
msgid "World Clocks"
msgstr "Relógios mundiais"
#: js/ui/dateMenu.js:279
#: js/ui/dateMenu.js:289
msgid "Weather"
msgstr "Meteorologia"
#: js/ui/dateMenu.js:394
#: js/ui/dateMenu.js:418
msgid "Select a location…"
msgstr "Selecione uma localização…"
#: js/ui/dateMenu.js:407
#: js/ui/dateMenu.js:426
msgid "Loading…"
msgstr "Carregando…"
#: js/ui/dateMenu.js:417
#: js/ui/dateMenu.js:436
msgid "Go online for weather information"
msgstr "Conecte-se à internet para obter as informações meteorológicas"
#: js/ui/dateMenu.js:419
#: js/ui/dateMenu.js:438
msgid "Weather information is currently unavailable"
msgstr "No momento as informações meteorológicas não estão disponíveis"
#: js/ui/endSessionDialog.js:37
#: js/ui/endSessionDialog.js:39
#, javascript-format
msgctxt "title"
msgid "Log Out %s"
msgstr "Encerrar sessão de %s"
#: js/ui/endSessionDialog.js:38
#: js/ui/endSessionDialog.js:40
msgctxt "title"
msgid "Log Out"
msgstr "Encerrar sessão"
#: js/ui/endSessionDialog.js:40
#: js/ui/endSessionDialog.js:42
#, javascript-format
msgid "%s will be logged out automatically in %d second."
msgid_plural "%s will be logged out automatically in %d seconds."
msgstr[0] "%s encerrará a sessão automaticamente em %d segundo."
msgstr[1] "%s encerrará a sessão automaticamente em %d segundos."
#: js/ui/endSessionDialog.js:45
#: js/ui/endSessionDialog.js:47
#, javascript-format
msgid "You will be logged out automatically in %d second."
msgid_plural "You will be logged out automatically in %d seconds."
msgstr[0] "Sua sessão será encerrada automaticamente em %d segundo."
msgstr[1] "Sua sessão será encerrada automaticamente em %d segundos."
#: js/ui/endSessionDialog.js:51
#: js/ui/endSessionDialog.js:53
msgctxt "button"
msgid "Log Out"
msgstr "Encerrar sessão"
#: js/ui/endSessionDialog.js:56
#: js/ui/endSessionDialog.js:58
msgctxt "title"
msgid "Power Off"
msgstr "Desligar"
#: js/ui/endSessionDialog.js:57
#: js/ui/endSessionDialog.js:59
msgctxt "title"
msgid "Install Updates & Power Off"
msgstr "Instalar atualizações & desligar"
#: js/ui/endSessionDialog.js:59
#: js/ui/endSessionDialog.js:61
#, javascript-format
msgid "The system will power off automatically in %d second."
msgid_plural "The system will power off automatically in %d seconds."
msgstr[0] "O sistema será desligado automaticamente em %d segundo."
msgstr[1] "O sistema será desligado automaticamente em %d segundos."
#: js/ui/endSessionDialog.js:63
#: js/ui/endSessionDialog.js:65
msgctxt "checkbox"
msgid "Install pending software updates"
msgstr "Instalar atualizações de software pendentes"
#: js/ui/endSessionDialog.js:66 js/ui/endSessionDialog.js:82
#: js/ui/endSessionDialog.js:68 js/ui/endSessionDialog.js:84
msgctxt "button"
msgid "Restart"
msgstr "Reiniciar"
#: js/ui/endSessionDialog.js:68
#: js/ui/endSessionDialog.js:70
msgctxt "button"
msgid "Power Off"
msgstr "Desligar"
#: js/ui/endSessionDialog.js:74
#: js/ui/endSessionDialog.js:76
msgctxt "title"
msgid "Restart"
msgstr "Reiniciar"
#: js/ui/endSessionDialog.js:76
#: js/ui/endSessionDialog.js:78
#, javascript-format
msgid "The system will restart automatically in %d second."
msgid_plural "The system will restart automatically in %d seconds."
msgstr[0] "O sistema irá reiniciar automaticamente em %d segundo."
msgstr[1] "O sistema irá reiniciar automaticamente em %d segundos."
#: js/ui/endSessionDialog.js:89
#: js/ui/endSessionDialog.js:91
msgctxt "title"
msgid "Restart & Install Updates"
msgstr "Reiniciar & instalar atualizações"
#: js/ui/endSessionDialog.js:91
#: js/ui/endSessionDialog.js:93
#, javascript-format
msgid "The system will automatically restart and install updates in %d second."
msgid_plural ""
@ -1375,22 +1241,22 @@ msgstr[1] ""
"O sistema irá reiniciar e instalar atualizações automaticamente em %d "
"segundos."
#: js/ui/endSessionDialog.js:97 js/ui/endSessionDialog.js:116
#: js/ui/endSessionDialog.js:99 js/ui/endSessionDialog.js:118
msgctxt "button"
msgid "Restart &amp; Install"
msgstr "Reiniciar &amp; instalar"
#: js/ui/endSessionDialog.js:98
#: js/ui/endSessionDialog.js:100
msgctxt "button"
msgid "Install &amp; Power Off"
msgstr "Instalar &amp; desligar"
#: js/ui/endSessionDialog.js:99
#: js/ui/endSessionDialog.js:101
msgctxt "checkbox"
msgid "Power off after updates are installed"
msgstr "Desligar após atualizações serem instaladas"
#: js/ui/endSessionDialog.js:106
#: js/ui/endSessionDialog.js:108
msgctxt "title"
msgid "Restart & Install Upgrade"
msgstr "Reiniciar & instalar atualizações"
@ -1398,7 +1264,7 @@ msgstr "Reiniciar & instalar atualizações"
#. Translators: This is the text displayed for system upgrades in the
#. shut down dialog. First %s gets replaced with the distro name and
#. second %s with the distro version to upgrade to
#: js/ui/endSessionDialog.js:111
#: js/ui/endSessionDialog.js:113
#, javascript-format
msgid ""
"%s %s will be installed after restart. Upgrade installation can take a long "
@ -1408,16 +1274,16 @@ msgstr ""
"pode levar um longo tempo: certifique-se de que fez cópia de segurança (back "
"up) e que o computador esteja ligado na tomada."
#: js/ui/endSessionDialog.js:259
#: js/ui/endSessionDialog.js:261
msgid "Running on battery power: Please plug in before installing updates."
msgstr ""
"Funcionando na bateria: conecte na tomada antes de instalar atualizações."
#: js/ui/endSessionDialog.js:268
#: js/ui/endSessionDialog.js:270
msgid "Some applications are busy or have unsaved work"
msgstr "Alguns aplicativos estão ocupados ou possuem trabalhos não salvos"
#: js/ui/endSessionDialog.js:273
#: js/ui/endSessionDialog.js:275
msgid "Other users are logged in"
msgstr "Outros usuários estão com sessão aberta"
@ -1433,24 +1299,24 @@ msgstr "%s (remoto)"
msgid "%s (console)"
msgstr "%s (console)"
#: js/ui/extensionDownloader.js:181
#: js/ui/extensionDownloader.js:185
msgid "Install"
msgstr "Instalar"
#: js/ui/extensionDownloader.js:187
#: js/ui/extensionDownloader.js:191
msgid "Install Extension"
msgstr "Instalar extensão"
#: js/ui/extensionDownloader.js:188
#: js/ui/extensionDownloader.js:192
#, javascript-format
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "Baixar e instalar “%s” de extensions.gnome.org?"
#: js/ui/extensionSystem.js:228
#: js/ui/extensionSystem.js:233
msgid "Extension Updates Available"
msgstr "Atualizações de extensões disponíveis"
#: js/ui/extensionSystem.js:229
#: js/ui/extensionSystem.js:234
msgid "Extension updates are ready to be installed."
msgstr "Atualizações de extensões estão prontas para serem instaladas."
@ -1599,11 +1465,11 @@ msgstr "Ver fonte"
msgid "Web Page"
msgstr "Página web"
#: js/ui/main.js:274
#: js/ui/main.js:277
msgid "Logged in as a privileged user"
msgstr "Sessão aberta como um usuário privilegiado"
#: js/ui/main.js:275
#: js/ui/main.js:278
msgid ""
"Running a session as a privileged user should be avoided for security "
"reasons. If possible, you should log in as a normal user."
@ -1611,15 +1477,15 @@ msgstr ""
"Usar uma sessão como um usuário privilegiado deve ser evitado por motivos de "
"segurança. Se possível, você deve abrir uma sessão como um usuário normal."
#: js/ui/main.js:281
#: js/ui/main.js:317
msgid "Screen Lock disabled"
msgstr "Bloqueio de tela desabilitado"
#: js/ui/main.js:282
#: js/ui/main.js:318
msgid "Screen Locking requires the GNOME display manager."
msgstr "O bloqueio de tela requer o gerenciador de exibição do GNOME."
#: js/ui/messageTray.js:1554
#: js/ui/messageTray.js:1551
msgid "System Information"
msgstr "Informações do sistema"
@ -1826,13 +1692,13 @@ msgid "The PIM must be a number or empty."
msgstr "O PIM deve ser um número ou vazio."
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:469
#: js/ui/shellMountOperation.js:465
#, javascript-format
msgid "Unable to start %s"
msgstr "Não foi possível iniciar o %s"
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:471
#: js/ui/shellMountOperation.js:467
#, javascript-format
msgid "Couldnt find the %s application"
msgstr "Não foi possível localizar o aplicativo %s"
@ -1985,13 +1851,13 @@ msgstr "<desconhecido>"
#: js/ui/status/network.js:420 js/ui/status/network.js:1317
#, javascript-format
msgid "%s Off"
msgstr "%s desligado"
msgstr "%s desligada"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:423
#, javascript-format
msgid "%s Connected"
msgstr "Conectado a %s"
msgstr "Conectado à %s"
# Não gerenciável para transmitir a ideia que o Networkmanager não consegue gerenciar o dispositivo --Enrico
#. Translators: this is for network devices that are physically present but are not
@ -2012,7 +1878,7 @@ msgstr "Desconectando de %s"
#: js/ui/status/network.js:438 js/ui/status/network.js:1309
#, javascript-format
msgid "%s Connecting"
msgstr "Conectando a %s"
msgstr "Conectando à %s"
#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier
#: js/ui/status/network.js:441
@ -2309,11 +2175,11 @@ msgstr "Erro de autorização de thunderbolt"
msgid "Could not authorize the Thunderbolt device: %s"
msgstr "Não foi possível autorizar o dispositivo Thunderbolt: %s"
#: js/ui/status/volume.js:150
#: js/ui/status/volume.js:151
msgid "Volume changed"
msgstr "Volume alterado"
#: js/ui/status/volume.js:221
#: js/ui/status/volume.js:222
msgid "Volume"
msgstr "Volume"
@ -2347,23 +2213,23 @@ msgstr "Interna apenas"
#. Translators: This is a time format for a date in
#. long format
#: js/ui/unlockDialog.js:370
#: js/ui/unlockDialog.js:371
msgid "%A %B %-d"
msgstr "%A, %-d de %B"
#: js/ui/unlockDialog.js:376
#: js/ui/unlockDialog.js:377
msgid "Swipe up to unlock"
msgstr "Deslize para desbloquear"
#: js/ui/unlockDialog.js:377
#: js/ui/unlockDialog.js:378
msgid "Click or press a key to unlock"
msgstr "Clique ou pressione uma tecla para desbloquear"
#: js/ui/unlockDialog.js:549
#: js/ui/unlockDialog.js:550
msgid "Unlock Window"
msgstr "Desbloquear janela"
#: js/ui/unlockDialog.js:558
#: js/ui/unlockDialog.js:559
msgid "Log in as another user"
msgstr "Iniciar sessão como outro usuário"
@ -2523,6 +2389,136 @@ msgstr "A senha não pode estar em branco"
msgid "Authentication dialog was dismissed by the user"
msgstr "O diálogo de autenticação foi descartado pelo usuário"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:5
#: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:4
#: subprojects/extensions-app/js/main.js:182
#: subprojects/extensions-app/data/ui/extensions-window.ui:61
msgid "Extensions"
msgstr "Extensões"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:6
#: subprojects/extensions-app/js/main.js:183
msgid "Manage your GNOME Extensions"
msgstr "Gerenciar suas extensões do GNOME"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:35
msgid ""
"GNOME Extensions handles updating extensions, configuring extension "
"preferences and removing or disabling unwanted extensions."
msgstr ""
"GNOME Extensões lida com a atualização da extensões, configuração das "
"preferências de extensões e remoção ou desabilitação de extensões "
"indesejadas."
#: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:7
msgid "Configure GNOME Shell Extensions"
msgstr "Configurar extensões do Shell do GNOME"
#: subprojects/extensions-app/js/main.js:144
#, javascript-format
msgid "Remove “%s”?"
msgstr "Remover “%s”?"
#: subprojects/extensions-app/js/main.js:145
msgid ""
"If you remove the extension, you need to return to download it if you want "
"to enable it again"
msgstr ""
"Se você remover a extensão, você precisa voltar a baixá-la se você quiser "
"habilitá-la novamente"
#: subprojects/extensions-app/js/main.js:149
msgid "Remove"
msgstr "Remover"
#: subprojects/extensions-app/js/main.js:181
msgid "translator-credits"
msgstr "Rafael Fontenelle <rafaelff@gnome.org>"
#: subprojects/extensions-app/js/main.js:316
#, javascript-format
msgid "%d extension will be updated on next login."
msgid_plural "%d extensions will be updated on next login."
msgstr[0] "%d extensão será atualizada na próxima sessão."
msgstr[1] "%d extensões serão atualizadas na próxima sessão."
#: subprojects/extensions-app/data/ui/extension-row.ui:100
#: subprojects/extensions-tool/src/command-create.c:211
#: subprojects/extensions-tool/src/main.c:173
msgid "Description"
msgstr "Descrição"
#: subprojects/extensions-app/data/ui/extension-row.ui:123
#: subprojects/extensions-tool/src/main.c:185
msgid "Version"
msgstr "Versão"
#: subprojects/extensions-app/data/ui/extension-row.ui:151
msgid "Author"
msgstr "Autor"
#: subprojects/extensions-app/data/ui/extension-row.ui:175
msgid "Website"
msgstr "Site"
#: subprojects/extensions-app/data/ui/extension-row.ui:192
msgid "Remove…"
msgstr "Remover…"
#: subprojects/extensions-app/data/ui/extensions-window.ui:8
msgid "Help"
msgstr "Ajuda"
#: subprojects/extensions-app/data/ui/extensions-window.ui:12
msgid "About Extensions"
msgstr "Sobre as Extensões"
#: subprojects/extensions-app/data/ui/extensions-window.ui:27
msgid ""
"To find and add extensions, visit <a href=\"https://extensions.gnome.org"
"\">extensions.gnome.org</a>."
msgstr ""
"Para encontrar e adicionar extensões, visite <a href=\"https://extensions."
"gnome.org\">extensions.gnome.org</a>."
#: subprojects/extensions-app/data/ui/extensions-window.ui:35
msgid "Warning"
msgstr "Aviso"
#: subprojects/extensions-app/data/ui/extensions-window.ui:46
msgid ""
"Extensions can cause system issues, including performance problems. If you "
"encounter problems with your system, it is recommended to disable all "
"extensions."
msgstr ""
"Extensões podem causar problemas no sistema, incluindo problemas de "
"desempenho. Se você encontrar problemas com o seu sistema, é recomendável "
"desativar todas as extensões."
#: subprojects/extensions-app/data/ui/extensions-window.ui:134
msgid "Manually Installed"
msgstr "Instalada manualmente"
#: subprojects/extensions-app/data/ui/extensions-window.ui:158
msgid "Built-In"
msgstr "Interna"
#: subprojects/extensions-app/data/ui/extensions-window.ui:199
msgid "No Installed Extensions"
msgstr "Nenhuma extensão instalada"
#: subprojects/extensions-app/data/ui/extensions-window.ui:235
msgid ""
"Were very sorry, but it was not possible to get the list of installed "
"extensions. Make sure you are logged into GNOME and try again."
msgstr ""
"Sentimos muito, mas não foi possível obter a lista de extensões instaladas. "
"Certifique-se de estar em uma sessão do GNOME e tente novamente."
#: subprojects/extensions-app/data/ui/extensions-window.ui:288
msgid "Log Out…"
msgstr "Encerrar sessão…"
#. Translators: a file path to an extension directory
#: subprojects/extensions-tool/src/command-create.c:125
#, c-format
@ -2860,6 +2856,9 @@ msgstr[1] "%u entradas"
msgid "System Sounds"
msgstr "Sons do sistema"
#~ msgid "Copy Error"
#~ msgstr "Copiar erro"
#~| msgid "Username: "
#~ msgid "Username…"
#~ msgstr "Nome de usuário…"

View File

@ -109,17 +109,11 @@ load_folder (GHashTable *folders,
while ((name = g_dir_read_name (dir)))
{
g_autofree gchar *stripped_name = NULL;
g_autofree gchar *filename = NULL;
g_autoptr(GKeyFile) keyfile = NULL;
if (!g_str_has_suffix (name, ".directory"))
continue;
stripped_name = g_strndup (name, strlen (name) - strlen (".directory"));
/* First added wins */
if (g_hash_table_contains (folders, stripped_name))
if (g_hash_table_contains (folders, name))
continue;
filename = g_build_filename (path, name, NULL);
@ -134,8 +128,7 @@ load_folder (GHashTable *folders,
NULL, NULL);
if (translated != NULL)
g_hash_table_insert (folders, g_steal_pointer (&stripped_name),
translated);
g_hash_table_insert (folders, g_strdup (name), translated);
}
}
}

View File

@ -218,10 +218,17 @@ window_backed_app_get_icon (ShellApp *app,
if (meta_window_get_client_type (window) == META_WINDOW_CLIENT_TYPE_X11)
{
widget = st_texture_cache_bind_cairo_surface_property (st_texture_cache_get_default (),
G_OBJECT (window),
"icon",
scaled_size);
StWidget *texture_actor;
texture_actor =
st_texture_cache_bind_cairo_surface_property (st_texture_cache_get_default (),
G_OBJECT (window),
"icon",
scaled_size);
widget = g_object_new (ST_TYPE_BIN,
"child", texture_actor,
NULL);
}
else
{

View File

@ -476,9 +476,8 @@ recorder_record_frame (ShellRecorder *recorder,
* by clutter before glSwapBuffers() makes it visible to the user.
*/
static void
recorder_on_stage_paint (ClutterActor *actor,
ClutterPaintContext *paint_context,
ShellRecorder *recorder)
recorder_on_stage_after_paint (ClutterActor *actor,
ShellRecorder *recorder)
{
if (recorder->state == RECORDER_STATE_RECORDING)
recorder_record_frame (recorder, FALSE);
@ -612,8 +611,8 @@ recorder_connect_stage_callbacks (ShellRecorder *recorder)
{
g_signal_connect (recorder->stage, "destroy",
G_CALLBACK (recorder_on_stage_destroy), recorder);
g_signal_connect_after (recorder->stage, "paint",
G_CALLBACK (recorder_on_stage_paint), recorder);
g_signal_connect_after (recorder->stage, "after-paint",
G_CALLBACK (recorder_on_stage_after_paint), recorder);
g_signal_connect (recorder->stage, "notify::width",
G_CALLBACK (recorder_on_stage_notify_size), recorder);
g_signal_connect (recorder->stage, "notify::height",
@ -629,7 +628,7 @@ recorder_disconnect_stage_callbacks (ShellRecorder *recorder)
(void *)recorder_on_stage_destroy,
recorder);
g_signal_handlers_disconnect_by_func (recorder->stage,
(void *)recorder_on_stage_paint,
(void *)recorder_on_stage_after_paint,
recorder);
g_signal_handlers_disconnect_by_func (recorder->stage,
(void *)recorder_on_stage_notify_size,

View File

@ -163,23 +163,6 @@ do_grab_screenshot (ShellScreenshot *screenshot,
g_free (captures);
}
static gboolean
should_draw_cursor_image (ShellScreenshotMode mode)
{
if (mode == SHELL_SCREENSHOT_WINDOW || !meta_is_wayland_compositor ())
{
StSettings *settings = st_settings_get ();
gboolean magnifier_active = FALSE;
g_object_get (settings, "magnifier-active", &magnifier_active, NULL);
if (!magnifier_active)
return TRUE;
}
return FALSE;
}
static void
draw_cursor_image (cairo_surface_t *surface,
cairo_rectangle_int_t area)
@ -468,7 +451,6 @@ shell_screenshot_screenshot (ShellScreenshot *screenshot,
{
ClutterActor *stage;
ShellScreenshotPrivate *priv;
gboolean use_paint_signal = FALSE;
GTask *result;
g_return_if_fail (SHELL_IS_SCREENSHOT (screenshot));
@ -493,32 +475,15 @@ shell_screenshot_screenshot (ShellScreenshot *screenshot,
g_task_set_source_tag (result, shell_screenshot_screenshot);
priv->stream = g_object_ref (stream);
priv->include_cursor = FALSE;
priv->include_cursor = include_cursor;
stage = CLUTTER_ACTOR (shell_global_get_stage (priv->global));
meta_disable_unredirect_for_display (shell_global_get_display (priv->global));
if (include_cursor)
{
if (should_draw_cursor_image (SHELL_SCREENSHOT_SCREEN))
priv->include_cursor = TRUE;
else
use_paint_signal = TRUE;
}
if (use_paint_signal)
{
g_signal_connect_after (stage, "paint",
G_CALLBACK (on_paint),
result);
}
else
{
g_signal_connect_after (stage, "actors-painted",
G_CALLBACK (on_actors_painted),
result);
}
g_signal_connect_after (stage, "actors-painted",
G_CALLBACK (on_actors_painted),
result);
clutter_actor_queue_redraw (stage);
}
@ -696,8 +661,7 @@ shell_screenshot_screenshot_window (ShellScreenshot *screenshot,
priv->stream = g_object_ref (stream);
priv->include_frame = include_frame;
priv->include_cursor = include_cursor &&
should_draw_cursor_image (SHELL_SCREENSHOT_WINDOW);
priv->include_cursor = include_cursor;
stage = CLUTTER_ACTOR (shell_global_get_stage (priv->global));

View File

@ -314,7 +314,7 @@ st_entry_get_preferred_width (ClutterActor *actor,
{
StEntryPrivate *priv = ST_ENTRY_PRIV (actor);
StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (actor));
gfloat hint_w, icon_w;
gfloat hint_w, hint_min_w, icon_w;
st_theme_node_adjust_for_height (theme_node, &for_height);
@ -324,10 +324,11 @@ st_entry_get_preferred_width (ClutterActor *actor,
if (priv->hint_actor)
{
clutter_actor_get_preferred_width (priv->hint_actor, -1, NULL, &hint_w);
clutter_actor_get_preferred_width (priv->hint_actor, -1,
&hint_min_w, &hint_w);
if (min_width_p && hint_w > *min_width_p)
*min_width_p = hint_w;
if (min_width_p && hint_min_w > *min_width_p)
*min_width_p = hint_min_w;
if (natural_width_p && hint_w > *natural_width_p)
*natural_width_p = hint_w;
@ -422,7 +423,7 @@ st_entry_allocate (ClutterActor *actor,
StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (actor));
ClutterActorBox content_box, child_box, icon_box, hint_box;
gfloat icon_w, icon_h;
gfloat hint_w, hint_h;
gfloat hint_w, hint_min_w, hint_h;
gfloat entry_h, min_h, pref_h, avail_h;
ClutterActor *left_icon, *right_icon;
gboolean is_rtl;
@ -488,9 +489,11 @@ st_entry_allocate (ClutterActor *actor,
/* now allocate the hint actor */
hint_box = child_box;
clutter_actor_get_preferred_width (priv->hint_actor, -1, NULL, &hint_w);
clutter_actor_get_preferred_width (priv->hint_actor, -1, &hint_min_w, &hint_w);
clutter_actor_get_preferred_height (priv->hint_actor, -1, NULL, &hint_h);
hint_w = CLAMP (hint_w, hint_min_w, child_box.x2 - child_box.x1);
if (is_rtl)
hint_box.x1 = hint_box.x2 - hint_w;
else

View File

@ -59,7 +59,6 @@ struct _StIconPrivate
gint theme_icon_size; /* icon size from theme node */
gint icon_size; /* icon size we are using */
GIcon *fallback_gicon;
GIcon *default_gicon;
CoglPipeline *shadow_pipeline;
StShadow *shadow_spec;
@ -73,6 +72,8 @@ static gboolean st_icon_update_icon_size (StIcon *icon);
static void st_icon_update_shadow_pipeline (StIcon *icon);
static void st_icon_clear_shadow_pipeline (StIcon *icon);
static GIcon *default_gicon = NULL;
#define IMAGE_MISSING_ICON_NAME "image-missing"
#define DEFAULT_ICON_SIZE 48
@ -168,7 +169,6 @@ st_icon_dispose (GObject *gobject)
g_clear_object (&priv->gicon);
g_clear_object (&priv->fallback_gicon);
g_clear_object (&priv->default_gicon);
g_clear_pointer (&priv->shadow_pipeline, cogl_object_unref);
g_clear_pointer (&priv->shadow_spec, st_shadow_unref);
@ -295,14 +295,15 @@ st_icon_init (StIcon *self)
{
ClutterLayoutManager *layout_manager;
if (G_UNLIKELY (default_gicon == NULL))
default_gicon = g_themed_icon_new (IMAGE_MISSING_ICON_NAME);
self->priv = st_icon_get_instance_private (self);
layout_manager = clutter_bin_layout_new (CLUTTER_BIN_ALIGNMENT_FILL,
CLUTTER_BIN_ALIGNMENT_FILL);
clutter_actor_set_layout_manager (CLUTTER_ACTOR (self), layout_manager);
self->priv->default_gicon = g_themed_icon_new (IMAGE_MISSING_ICON_NAME);
self->priv->icon_size = DEFAULT_ICON_SIZE;
self->priv->prop_icon_size = -1;
@ -419,7 +420,10 @@ st_icon_update (StIcon *icon)
}
if (priv->gicon == NULL && priv->fallback_gicon == NULL)
return;
{
g_clear_pointer (&priv->icon_texture, clutter_actor_destroy);
return;
}
if (!st_widget_get_resource_scale (ST_WIDGET (icon), &resource_scale))
return;
@ -453,7 +457,7 @@ st_icon_update (StIcon *icon)
if (priv->pending_texture == NULL)
priv->pending_texture = st_texture_cache_load_gicon (cache,
theme_node,
priv->default_gicon,
default_gicon,
priv->icon_size,
paint_scale,
resource_scale);

View File

@ -1619,18 +1619,3 @@ st_texture_cache_rescan_icon_theme (StTextureCache *cache)
return gtk_icon_theme_rescan_if_needed (priv->icon_theme);
}
/**
* st_texture_cache_invalidate:
* @cache: a #StTextureCache
*
* Invalidates the texture cache, and evicts all icons.
*/
void
st_texture_cache_invalidate (StTextureCache *cache)
{
g_return_if_fail (ST_IS_TEXTURE_CACHE (cache));
st_texture_cache_evict_icons (cache);
}

View File

@ -115,6 +115,4 @@ CoglTexture * st_texture_cache_load (StTextureCache *cache,
gboolean st_texture_cache_rescan_icon_theme (StTextureCache *cache);
void st_texture_cache_invalidate (StTextureCache *cache);
#endif /* __ST_TEXTURE_CACHE_H__ */

View File

@ -176,11 +176,7 @@ st_theme_context_set_property (GObject *object,
int scale_factor = g_value_get_int (value);
if (scale_factor != context->scale_factor)
{
StTextureCache *cache = st_texture_cache_get_default ();
context->scale_factor = scale_factor;
st_texture_cache_invalidate (cache);
st_theme_context_changed (context);
}
@ -294,19 +290,6 @@ on_icon_theme_changed (StTextureCache *cache,
g_source_set_name_by_id (id, "[gnome-shell] changed_idle");
}
static void
on_custom_stylesheets_changed (StTheme *theme,
StThemeContext *context)
{
GHashTableIter iter;
StThemeNode *node;
g_hash_table_iter_init (&iter, context->nodes);
while (g_hash_table_iter_next (&iter, (gpointer *) &node, NULL))
_st_theme_node_reset_for_stylesheet_change (node);
}
/**
* st_theme_context_get_for_stage:
* @stage: a #ClutterStage
@ -359,9 +342,10 @@ st_theme_context_set_theme (StThemeContext *context,
if (context->theme)
{
context->stylesheets_changed_id =
g_signal_connect (context->theme, "custom-stylesheets-changed",
G_CALLBACK (on_custom_stylesheets_changed),
context);
g_signal_connect_swapped (context->theme,
"custom-stylesheets-changed",
G_CALLBACK (st_theme_context_changed),
context);
}
st_theme_context_changed (context);
@ -470,3 +454,19 @@ st_theme_context_intern_node (StThemeContext *context,
g_hash_table_add (context->nodes, g_object_ref (node));
return node;
}
/**
* st_theme_context_get_scale_factor:
* @context: a #StThemeContext
*
* Return the current scale factor of @context.
*
* Return value: a scale factor
*/
int
st_theme_context_get_scale_factor (StThemeContext *context)
{
g_return_val_if_fail (ST_IS_THEME_CONTEXT (context), -1);
return context->scale_factor;
}

View File

@ -58,6 +58,8 @@ StThemeNode * st_theme_context_get_root_node (StThemeContext
StThemeNode * st_theme_context_intern_node (StThemeContext *context,
StThemeNode *node);
int st_theme_context_get_scale_factor (StThemeContext *context);
G_END_DECLS
#endif /* __ST_THEME_CONTEXT_H__ */

View File

@ -643,15 +643,13 @@ create_cairo_pattern_of_background_image (StThemeNode *node,
gdouble background_image_width, background_image_height;
gdouble x, y;
gdouble scale_w, scale_h;
int scale_factor;
file = st_theme_node_get_background_image (node);
texture_cache = st_texture_cache_get_default ();
g_object_get (node->context, "scale-factor", &scale_factor, NULL);
surface = st_texture_cache_load_file_to_cairo_surface (texture_cache, file,
scale_factor,
node->cached_scale_factor,
resource_scale);
if (surface == NULL)
@ -1374,7 +1372,6 @@ st_theme_node_load_border_image (StThemeNode *node,
{
StBorderImage *border_image;
GFile *file;
int scale_factor;
border_image = st_theme_node_get_border_image (node);
if (border_image == NULL)
@ -1382,10 +1379,9 @@ st_theme_node_load_border_image (StThemeNode *node,
file = st_border_image_get_file (border_image);
g_object_get (node->context, "scale-factor", &scale_factor, NULL);
node->border_slices_texture = st_texture_cache_load_file_to_cogl_texture (st_texture_cache_get_default (),
file, scale_factor,
file,
node->cached_scale_factor,
resource_scale);
if (node->border_slices_texture == NULL)
goto out;
@ -1413,17 +1409,15 @@ st_theme_node_load_background_image (StThemeNode *node,
{
GFile *background_image;
StShadow *background_image_shadow_spec;
int scale_factor;
background_image = st_theme_node_get_background_image (node);
if (background_image == NULL)
goto out;
g_object_get (node->context, "scale-factor", &scale_factor, NULL);
background_image_shadow_spec = st_theme_node_get_background_image_shadow (node);
node->background_texture = st_texture_cache_load_file_to_cogl_texture (st_texture_cache_get_default (),
background_image, scale_factor,
background_image,
node->cached_scale_factor,
resource_scale);
if (node->background_texture == NULL)
goto out;

View File

@ -118,14 +118,13 @@ struct _StThemeNode {
StThemeNodePaintState cached_state;
int scale_factor;
int cached_scale_factor;
};
void _st_theme_node_ensure_background (StThemeNode *node);
void _st_theme_node_ensure_geometry (StThemeNode *node);
void _st_theme_node_apply_margins (StThemeNode *node,
ClutterActor *actor);
void _st_theme_node_reset_for_stylesheet_change (StThemeNode *node);
G_END_DECLS

View File

@ -77,13 +77,6 @@ maybe_free_properties (StThemeNode *node)
}
}
void
_st_theme_node_reset_for_stylesheet_change (StThemeNode *node)
{
maybe_free_properties (node);
node->properties_computed = FALSE;
}
static void
st_theme_node_dispose (GObject *gobject)
{
@ -219,14 +212,13 @@ st_theme_node_new (StThemeContext *context,
if (theme == NULL && parent_node != NULL)
theme = parent_node->theme;
g_object_get (context, "scale-factor", &node->scale_factor, NULL);
g_set_object (&node->theme, theme);
node->element_type = element_type;
node->element_id = g_strdup (element_id);
node->element_classes = split_on_whitespace (element_class);
node->pseudo_classes = split_on_whitespace (pseudo_class);
node->inline_style = g_strdup (inline_style);
node->cached_scale_factor = st_theme_context_get_scale_factor (context);
return node;
}
@ -347,7 +339,7 @@ st_theme_node_equal (StThemeNode *node_a, StThemeNode *node_b)
node_a->context != node_b->context ||
node_a->theme != node_b->theme ||
node_a->element_type != node_b->element_type ||
node_a->scale_factor != node_b->scale_factor ||
node_a->cached_scale_factor != node_b->cached_scale_factor ||
g_strcmp0 (node_a->element_id, node_b->element_id) ||
g_strcmp0 (node_a->inline_style, node_b->inline_style))
return FALSE;
@ -399,7 +391,7 @@ st_theme_node_hash (StThemeNode *node)
hash = hash * 33 + GPOINTER_TO_UINT (node->context);
hash = hash * 33 + GPOINTER_TO_UINT (node->theme);
hash = hash * 33 + ((guint) node->element_type);
hash = hash * 33 + ((guint) node->scale_factor);
hash = hash * 33 + ((guint) node->cached_scale_factor);
if (node->element_id != NULL)
hash = hash * 33 + g_str_hash (node->element_id);
@ -994,7 +986,7 @@ get_length_from_term (StThemeNode *node,
{
case NUM_LENGTH_PX:
type = ABSOLUTE;
multiplier = 1 * node->scale_factor;
multiplier = 1 * node->cached_scale_factor;
break;
case NUM_LENGTH_PT:
type = POINTS;
@ -1128,7 +1120,7 @@ get_length_from_term_int (StThemeNode *node,
result = get_length_from_term (node, term, use_parent_font, &value);
if (result == VALUE_FOUND)
*length = (int) ((value / node->scale_factor) + 0.5) * node->scale_factor;
*length = (int) ((value / node->cached_scale_factor) + 0.5) * node->cached_scale_factor;
return result;
}
@ -3122,7 +3114,7 @@ st_theme_node_get_border_image (StThemeNode *node)
node->border_image = st_border_image_new (file,
border_top, border_right, border_bottom, border_left,
node->scale_factor);
node->cached_scale_factor);
g_object_unref (file);
@ -3963,7 +3955,7 @@ st_theme_node_geometry_equal (StThemeNode *node,
g_return_val_if_fail (ST_IS_THEME_NODE (other), FALSE);
if (node->scale_factor != other->scale_factor)
if (node->cached_scale_factor != other->cached_scale_factor)
return FALSE;
_st_theme_node_ensure_geometry (node);

View File

@ -455,17 +455,12 @@ st_widget_parent_set (ClutterActor *widget,
{
StWidget *self = ST_WIDGET (widget);
ClutterActorClass *parent_class;
ClutterActor *new_parent;
parent_class = CLUTTER_ACTOR_CLASS (st_widget_parent_class);
if (parent_class->parent_set)
parent_class->parent_set (widget, old_parent);
new_parent = clutter_actor_get_parent (widget);
/* don't send the style changed signal if we no longer have a parent actor */
if (new_parent)
st_widget_style_changed (self);
st_widget_style_changed (self);
}
static void
@ -510,7 +505,6 @@ static void
st_widget_real_style_changed (StWidget *self)
{
clutter_actor_queue_redraw ((ClutterActor *) self);
notify_children_of_style_change ((ClutterActor *) self);
}
void
@ -530,6 +524,11 @@ st_widget_style_changed (StWidget *widget)
if (clutter_actor_is_mapped (CLUTTER_ACTOR (widget)))
st_widget_recompute_style (widget, old_theme_node);
/* Descend through all children. If the actor is not mapped,
* children will clear their theme node without recomputing style.
*/
notify_children_of_style_change (CLUTTER_ACTOR (widget));
if (old_theme_node)
g_object_unref (old_theme_node);
}
@ -1772,8 +1771,6 @@ st_widget_recompute_style (StWidget *widget,
if (!paint_equal || !geometry_equal)
g_signal_emit (widget, signals[STYLE_CHANGED], 0);
else
notify_children_of_style_change ((ClutterActor *) widget);
priv->is_style_dirty = FALSE;
}
@ -1795,7 +1792,10 @@ st_widget_ensure_style (StWidget *widget)
priv = st_widget_get_instance_private (widget);
if (priv->is_style_dirty)
st_widget_recompute_style (widget, NULL);
{
st_widget_recompute_style (widget, NULL);
notify_children_of_style_change (CLUTTER_ACTOR (widget));
}
}
/**

View File

@ -38,18 +38,20 @@
</description>
<releases>
<release version="3.37.0" date="2020-03-31"/>
<release version="3.36.2" date="2020-04-29"/>
<release version="3.36.1" date="2020-03-29"/>
<release version="3.36.0" date="2020-03-07"/>
</releases>
<screenshots>
<screenshot type="default">
<image>https://gitlab.gnome.org/GNOME/gnome-shell/raw/master/subprojects/extensions-app/data/metainfo/extensions-main.png</image>
<image>https://gitlab.gnome.org/GNOME/gnome-shell/raw/gnome-3-36/subprojects/extensions-app/data/metainfo/extensions-main.png</image>
</screenshot>
<screenshot>
<image>https://gitlab.gnome.org/GNOME/gnome-shell/raw/master/subprojects/extensions-app/data/metainfo/extensions-update.png</image>
<image>https://gitlab.gnome.org/GNOME/gnome-shell/raw/gnome-3-36/subprojects/extensions-app/data/metainfo/extensions-update.png</image>
</screenshot>
<screenshot>
<image>https://gitlab.gnome.org/GNOME/gnome-shell/raw/master/subprojects/extensions-app/data/metainfo/extensions-remove.png</image>
<image>https://gitlab.gnome.org/GNOME/gnome-shell/raw/gnome-3-36/subprojects/extensions-app/data/metainfo/extensions-remove.png</image>
</screenshot>
</screenshots>
</component>

View File

@ -6,5 +6,5 @@ Icon=@app_id@
Comment=Configure GNOME Shell Extensions
Exec=@bindir@/@prgname@
DBusActivatable=true
Categories=GNOME;GTK;
Categories=GNOME;GTK;Utility;
OnlyShowIn=GNOME;

View File

@ -201,7 +201,10 @@ var ExtensionsWindow = GObject.registerClass({
null,
Gio.DBusCallFlags.NONE,
-1,
null);
null,
(o, res) => {
o.call_finish(res);
});
}
_sortList(row1, row2) {

View File

@ -1,5 +1,5 @@
project('gnome-extensions-app',
version: '3.37.0',
version: '3.36.2',
meson_version: '>= 0.47.0',
license: 'GPLv2+'
)

View File

@ -1,5 +1,5 @@
project('gnome-extensions-tool', 'c',
version: '3.37.0',
version: '3.36.2',
meson_version: '>= 0.47.0',
license: 'GPLv2+'
)

View File

@ -1,5 +1,5 @@
project('shew', 'c',
version: '3.37.0',
version: '3.36.2',
meson_version: '>= 0.47.0',
license: 'LGPLv2+',
)