Compare commits

..

34 Commits

Author SHA1 Message Date
Carlos Garnacho
6bb5c1feec shell: Ignore non-toplevels for ShellWindowTracker::tracked-windows-changed
Popups and other override-redirect windows are meaningless to everything
that depends on the ShellWindowTracker. Ignoring those windows will result
in less ShellApp::windows-changed signal emissions, and less activity in
the AppMenuButton and everything else that depends on them.

Reduces gnome-shell CPU activity while typing on the Epiphany addressbar,
as the pop up animation there results in a number of xdg_popup being
created and destroyed.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/642
https://gitlab.gnome.org/GNOME/mutter/issues/556


(cherry picked from commit db9a7ea7a9)
2019-08-21 19:29:31 +00:00
Sveinn í Felli
40db793230 Update Icelandic translation 2019-08-12 07:47:19 +00:00
Daniel Mustieles
1c6abf3785 Updated Spanish translation 2019-07-24 09:53:58 +02:00
Cosimo Cecchi
2483b60386 shell-global: don't warn when unsetting non-existent state
If the state we're trying to delete does not exist, do not log an
error.
Prevents this journal warning at startup:

gnome-shell[1082]: Could not delete runtime/persistent state file: Error removing file /run/user/1000/gnome-shell/runtime-state-LE.:0/screenShield.locked: No such file or directory

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/555
2019-07-17 16:17:16 +02:00
Cosimo Cecchi
b118c874da keyring-prompt: relax NULL check in remove_mnemonics()
Instead of considering a GValue containing a NULL string to be a
programmer error, simply return NULL.
remove_mnemonics() is in fact called on the value of the
"choice-label" property as well, which has NULL as its default
value.

This prevents triggering the following gnome-shell warning:

gnome-shell[1082]: remove_mnemonics: assertion 'label != NULL' failed

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/555
2019-07-17 16:17:10 +02:00
Cosimo Cecchi
80cf412e83 modemManager: improve check for CDMA system identifier
Upon construction of the CDMA modem proxy, _reloadCdmaOperatorName()
is called and the value of the Sid property is read.
That property is defined as UINT32 in the D-Bus interface, but the
value may not be loaded yet after the proxy is constructed, in which
case its value will be null.

In _findProviderForSid(), we'll end up calling lookup_cdma_sid(null)
which fails with the following assertion:

gnome-shell[1082]: nma_mobile_providers_database_lookup_cdma_sid: assertion 'sid > 0' failed

This commit changes the (sid == 0) check in _findProviderForSid()
to (!sid) which will also catch the null case.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/555
2019-07-17 16:17:05 +02:00
Cosimo Cecchi
e8ddb23b3a windowAttentionHandler: disconnect signals before destruction
The 'destroy' signal is emitted at the end of the destroy() method.
However the implementation of destroy() can end up emitting one of the
signals we connect to on the window, causing us to re-enter destroy
from its callback.
That will in turn lead to some objects getting disposed twice, which
produces a stack trace like the following one.

This commit fixes the issue by overriding the destroy() method instead
of connecting to the signal, which allows us to disconnect the signal
handlers from the window at an earlier time and avoid re-entrancy.

--

gnome-shell[1082]: Object Gio.Settings (0x7f0af8143f00), has been already deallocated — impossible to access it. This might be caused by the object having been destroyed from C code using something such as destroy(), dispose(), or remove() vfuncs.
org.gnome.Shell.desktop[1082]: == Stack trace for context 0x5627f7d1e220 ==
org.gnome.Shell.desktop[1082]: #0   5627f9e801a8 i   resource:///org/gnome/shell/ui/messageTray.js:238 (7f0aefa9eca0 @ 22)
org.gnome.Shell.desktop[1082]: #1   5627f9e80108 i   resource:///org/gnome/shell/ui/messageTray.js:802 (7f0aefaa2ee0 @ 28)
org.gnome.Shell.desktop[1082]: #2   5627f9e80070 i   resource:///org/gnome/shell/ui/windowAttentionHandler.js:79 (7f0aef7b29d0 @ 62)
org.gnome.Shell.desktop[1082]: #3   7fffa69fbfc0 b   self-hosted:979 (7f0aefa515e0 @ 440)
org.gnome.Shell.desktop[1082]: #4   5627f9e7ffe0 i   resource:///org/gnome/shell/ui/messageTray.js:121 (7f0aefa9e1f0 @ 71)
org.gnome.Shell.desktop[1082]: #5   5627f9e7ff38 i   resource:///org/gnome/shell/ui/messageTray.js:1408 (7f0aefaa58b0 @ 22)
org.gnome.Shell.desktop[1082]: #6   5627f9e7fe80 i   resource:///org/gnome/shell/ui/messageTray.js:1237 (7f0aefaa51f0 @ 729)
org.gnome.Shell.desktop[1082]: #7   5627f9e7fde8 i   resource:///org/gnome/shell/ui/messageTray.js:1055 (7f0aefaa3d30 @ 124)
org.gnome.Shell.desktop[1082]: #8   7fffa69ff8e0 b   self-hosted:979 (7f0aefa515e0 @ 440)
org.gnome.Shell.desktop[1082]: #9   7fffa69ff9d0 b   resource:///org/gnome/gjs/modules/signals.js:142 (7f0aefccb670 @ 386)
org.gnome.Shell.desktop[1082]: #10   5627f9e7fd58 i   resource:///org/gnome/shell/ui/messageTray.js:479 (7f0aefaa0940 @ 50)
org.gnome.Shell.desktop[1082]: #11   5627f9e7fcb8 i   resource:///org/gnome/shell/ui/messageTray.js:808 (7f0aefaa2ee0 @ 99)
org.gnome.Shell.desktop[1082]: #12   5627f9e7fc28 i   resource:///org/gnome/shell/ui/windowAttentionHandler.js:69 (7f0aef7b28b0 @ 13)
org.gnome.Shell.desktop[1082]: #13   5627f9e7fb80 i   resource:///org/gnome/shell/ui/main.js:566 (7f0aefcd8820 @ 216)
org.gnome.Shell.desktop[1082]: #14   5627f9e7fad0 i   resource:///org/gnome/shell/ui/windowAttentionHandler.js:103 (7f0aef7b2c10 @ 27)
org.gnome.Shell.desktop[1082]: #15   5627f9e7fa58 i   resource:///org/gnome/shell/ui/windowAttentionHandler.js:43 (7f0aef7b2700 @ 17)
org.gnome.Shell.desktop[1082]: #16   7fffa6a03350 b   resource:///org/gnome/gjs/modules/signals.js:142 (7f0aefccb670 @ 386)
org.gnome.Shell.desktop[1082]: #17   5627f9e7f9d0 i   resource:///org/gnome/shell/ui/messageTray.js:471 (7f0aefaa08b0 @ 22)
org.gnome.Shell.desktop[1082]: #18   5627f9e7f950 i   resource:///org/gnome/shell/ui/calendar.js:752 (7f0aefaabdc0 @ 22)
org.gnome.Shell.desktop[1082]: #19   7fffa6a048f0 b   self-hosted:979 (7f0aefa515e0 @ 440)
org.gnome.Shell.desktop[1082]: == Stack trace for context 0x5627f7d1e220 ==
org.gnome.Shell.desktop[1082]: #0   5627f9e801a8 i   resource:///org/gnome/shell/ui/messageTray.js:239 (7f0aefa9eca0 @ 42)
org.gnome.Shell.desktop[1082]: #1   5627f9e80108 i   resource:///org/gnome/shell/ui/messageTray.js:802 (7f0aefaa2ee0 @ 28)
org.gnome.Shell.desktop[1082]: #2   5627f9e80070 i   resource:///org/gnome/shell/ui/windowAttentionHandler.js:79 (7f0aef7b29d0 @ 62)
org.gnome.Shell.desktop[1082]: #3   7fffa69fbfc0 b   self-hosted:979 (7f0aefa515e0 @ 440)
org.gnome.Shell.desktop[1082]: #4   5627f9e7ffe0 i   resource:///org/gnome/shell/ui/messageTray.js:121 (7f0aefa9e1f0 @ 71)
org.gnome.Shell.desktop[1082]: #5   5627f9e7ff38 i   resource:///org/gnome/shell/ui/messageTray.js:1408 (7f0aefaa58b0 @ 22)
org.gnome.Shell.desktop[1082]: #6   5627f9e7fe80 i   resource:///org/gnome/shell/ui/messageTray.js:1237 (7f0aefaa51f0 @ 729)
org.gnome.Shell.desktop[1082]: #7   5627f9e7fde8 i   resource:///org/gnome/shell/ui/messageTray.js:1055 (7f0aefaa3d30 @ 124)
org.gnome.Shell.desktop[1082]: #8   7fffa69ff8e0 b   self-hosted:979 (7f0aefa515e0 @ 440)
org.gnome.Shell.desktop[1082]: #9   7fffa69ff9d0 b   resource:///org/gnome/gjs/modules/signals.js:142 (7f0aefccb670 @ 386)
org.gnome.Shell.desktop[1082]: #10   5627f9e7fd58 i   resource:///org/gnome/shell/ui/messageTray.js:479 (7f0aefaa0940 @ 50)
org.gnome.Shell.desktop[1082]: #11   5627f9e7fcb8 i   resource:///org/gnome/shell/ui/messageTray.js:808 (7f0aefaa2ee0 @ 99)
org.gnome.Shell.desktop[1082]: #12   5627f9e7fc28 i   resource:///org/gnome/shell/ui/windowAttentionHandler.js:69 (7f0aef7b28b0 @ 13)
org.gnome.Shell.desktop[1082]: #13   5627f9e7fb80 i   resource:///org/gnome/shell/ui/main.js:566 (7f0aefcd8820 @ 216)
org.gnome.Shell.desktop[1082]: #14   5627f9e7fad0 i   resource:///org/gnome/shell/ui/windowAttentionHandler.js:103 (7f0aef7b2c10 @ 27)
org.gnome.Shell.desktop[1082]: #15   5627f9e7fa58 i   resource:///org/gnome/shell/ui/windowAttentionHandler.js:43 (7f0aef7b2700 @ 17)
org.gnome.Shell.desktop[1082]: #16   7fffa6a03350 b   resource:///org/gnome/gjs/modules/signals.js:142 (7f0aefccb670 @ 386)
org.gnome.Shell.desktop[1082]: #17   5627f9e7f9d0 i   resource:///org/gnome/shell/ui/messageTray.js:471 (7f0aefaa08b0 @ 22)
org.gnome.Shell.desktop[1082]: #18   5627f9e7f950 i   resource:///org/gnome/shell/ui/calendar.js:752 (7f0aefaabdc0 @ 22)
org.gnome.Shell.desktop[1082]: #19   7fffa6a048f0 b   self-hosted:979 (7f0aefa515e0 @ 440)
gnome-shell[1082]: g_object_run_dispose: assertion 'G_IS_OBJECT (object)' failed
gnome-shell[1082]: Object Gio.Settings (0x7f0af8161750), has been already deallocated — impossible to access it. This might be caused by the object having been destroyed from C code using something such as destroy(), dispose(), or remove() vfuncs.
gnome-shell[1082]: g_object_run_dispose: assertion 'G_IS_OBJECT (object)' failed

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/555
2019-07-17 16:16:58 +02:00
Illya Klymov
8b98740897 shell-recorder: Restore cursor recording
Due to changes introduced in 5357e0a1 cursor recording interaction with
magnifier was reversed. This fix restores original correct behavior
Related issue: https://gitlab.gnome.org/GNOME/gnome-shell/issues/1208


(cherry picked from commit 55b036170b)
2019-07-08 22:23:44 +00:00
Jonas Dreßler
ae05679498 altTab: Remove get_preferred_width override of AppIcon
This vfunc override has been introduced to ensure app icons are always
squared, but since the container of the AppIcon gets a square allocation
anyway if the 'square' property of the SwitcherButton is set, there's
no need to return a special width here.

Without the override we can also stop setting the size of the iconBin
manually. And since shell_app_create_icon_texture() uses logical pixels
but clutter_actor_set_size() uses screen pixels, that means we now no
longer set the size of the icon back to the unscaled value after it was
already correct.

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


(cherry picked from commit 074129682b)
2019-07-01 21:00:28 +00:00
Jonas Dreßler
f3680306b2 altTab: Fix a wrong variable name
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/587


(cherry picked from commit c67460a1e3)
2019-07-01 21:00:08 +00:00
Jonas Dreßler
ea51a7c657 altTab: Ensure style of this._list before calculating icon sizes
We're calculating icon sizes for the alt tab switcher early and at a
point where the style attributes of this._list are not loaded yet. To
make sure the value of this._list.spacing is correct, call
ensure_style() on this._list before accessing the spacing.

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


(cherry picked from commit eab320dab5)
2019-07-01 20:59:36 +00:00
Marco Trevisan (Treviño)
95e353fdb4 boxpointer: Unset the sourceActor on destruction
A boxpointer sourceActor could be destroyed before the boxpointer itself.
In such case, unset the sourceActor reference, connecting to 'destroy' signal.

Fixes: https://gitlab.gnome.org/GNOME/gnome-shell/issues/1295
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/576


(cherry picked from commit 2fd120162f)
2019-06-17 23:20:37 +00:00
Florian Müllner
24cb1c1aab texture-cache: Keep aspect ratio for content images
Images are loaded either with a supplied fixed size, or using the "native"
dimensions of the file. When creating a content image from the loaded data,
we currently simply apply this directly to the preferred size.

This works usually fine: GdkPixbuf will always keep the aspect ratio, so
if only one dimension is provided, the other will be adjusted accordingly:

Loading a 200x200 image with a requested size of (100, -1) will result in
a 100x100 content image.

There is a catch though: GdkPixbuf will only scale *down* to the requested
size, no up. That is, loading a 100x100 image with a requested size of
(200, -1) will result in a 100x100 pixbuf. But as we assume that the pixbuf
size matches the requested size, the image content ends up with 200x100.

Fix this by explicitly handling the case where only one size was supplied,
and make the other dimension take the aspect ratio into account

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/525
2019-06-03 15:37:37 +02:00
Florian Müllner
3a060d755d Bump version to 3.32.2
Update NEWS.
2019-05-14 15:42:36 +00:00
Florian Müllner
e43c8f6364 st: Delay handling of :first/:last-child changes
Updating the :first/:last-child pseudo classes can result in a lot
of unnecessary style changes when bulk-adding children to a container,
as every child ends up as the new last child.

Address this by deferring the style change to an idle, so we only do
the work once for the actual first and last child.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/529
2019-05-14 15:42:36 +00:00
Florian Müllner
e65bd48062 Revert "st: Only emit ::style-changed on actual changes"
This reverts commit f662864ada.
2019-05-14 15:42:24 +00:00
Tim Sabsch
1c5f926a70 Update German translation 2019-05-12 10:38:15 +00:00
Florian Müllner
92f1e88e06 dashSpacer: Don't trigger allocations from size negotiations
If an actor's allocation is outdated, clutter_actor_get_allocation_box()
will queue a relayout. That's why it's advised to not use the function
unless the allocation is known to be valid (namely during paint), but
in particular not from within get_preferred_width/height vfuncs.

Using the :allocation property (which may be outdated) would be better,
but in this case we can simply delegate the request to the correct actor.

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


(cherry picked from commit d5ebd8c816)
2019-05-09 19:41:54 +00:00
Carlos Garnacho
5100458c1b keyboard: Destroy old layout actors when regenerating keyboard groups
We were cleaning up self._groups, but the actors for all previous
groups/layers/modes would remain attached to the aspect container,
simply hidden.

Under some circumstances this can really make the amount of actors
in the shell stage to quickly ramp up, it's not just a "leak" but
also has potential side effects on performance.

We should destroy all child actors of this._aspectContainer, except
the static ones (emoji and keypad).

While at it, fix this._groups re-initialization, as it's actually an
object, not an array.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/523
Closes?: https://gitlab.gnome.org/GNOME/mutter/issues/556


(cherry picked from commit ed999ce926)
2019-05-09 15:48:51 +00:00
Carlos Garnacho
5150166336 workspacesView: sync gesture enabled state after setting it up completely
At the point it is disabled, it has got signal handlers connected but
this._workspacesView is uninitialized. This triggers:

(gnome-shell:3993): Gjs-WARNING **: 18:49:53.281: JS ERROR: Exception in callback for signal: cancel: TypeError: this._workspacesViews is undefined
_endTouchGesture@resource:///org/gnome/shell/ui/workspacesView.js:527:25
_emit@resource:///org/gnome/gjs/modules/signals.js:142:27
set enabled@resource:///org/gnome/shell/ui/windowManager.js:478:13
WorkspacesDisplay<@resource:///org/gnome/shell/ui/workspacesView.js:482:9
ViewSelector<@resource:///org/gnome/shell/ui/viewSelector.js:167:35
ControlsManager<@resource:///org/gnome/shell/ui/overviewControls.js:405:29
init@resource:///org/gnome/shell/ui/overview.js:234:26
_initializeUI@resource:///org/gnome/shell/ui/main.js:184:5
start@resource:///org/gnome/shell/ui/main.js:124:5
@<main>:1:31

On startup. Shuffling these two lines prevent this from happening.

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


(cherry picked from commit 59edea4bb4)
2019-05-08 21:20:21 +00:00
Dingzhong Chen
d0d9c249de Update Chinese (China) translation 2019-05-08 18:14:50 +08:00
Fabrice Bellet
2d9ed18668 network: Handle interface name changes
The interface name when a device is added may not be the final one. For
example when using USB tethering, it will first appear as 'usb0' before
being renamed to something like 'enp0s20f0u1' depending on the port the
phone is plugged in.

As a result, we will ignore the new interface name in that case and fail
to associate the correct connection with the device: Instead of the
correct "USB Ethernet" (or user-customized name), it will show up as
"Ethernet".

Fix this by updating names and connections when a device's interface
property changes.

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


(cherry picked from commit d9bfa16f05)
2019-05-07 15:22:39 +00:00
Florian Müllner
a1af8b94fd worldClocks: Ignore locations with unknown timezone
We currently assume that every location has an associated timezone.
While this is sound in the real world, in practise it depends on
whether or not libgweather can find a corresponding timezone DB
entry.

This used to be a fringe case, but has become more likely when commit
https://gitlab.gnome.org/GNOME/libgweather/commit/d7682676ac9 moved
weather stations from cities to countries - the station itself is un-
likely to have a timezone entry, and the country may be part of more
than a single timezone.

It would be good for libgweather to return a timezone for those
locations again, but we should defend against the case anyway.
We cannot tell what time it is at a particular location without
knowing the timezone, so simply filter them out.

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


(cherry picked from commit 50b7739076)
2019-05-07 09:25:46 +00:00
Marco Trevisan (Treviño)
0539efc8df dialog: Really set ellipsize mode in subtitle and body
Dialog's subtitle or body could not be properly wrapped, while it's ellipsized
when the text's width doesn't exceed the container size.

Clutter text has an `ellipsize` property, however in dialog's subtitle and body
we have been setting the `ellipsize-mode` property to Pango.EllipsizeMode.NONE
that is not present in the underlying GObject.

Not being an error in javascript, gjs didn't warn us about this, while at the
same time the St.Label's default Pango.EllipsizeMode.END was used.

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

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


(cherry picked from commit 3121c9aa29)
2019-05-03 21:00:05 +00:00
Florian Müllner
059c729da0 panel: Don't chain up to parent's allocate
The top bar handles allocating all its children itself, so there's
little value in chaining up to st_widget_allocate() and get the
default layout manager allocating all children again (and possibly
differently).

If this happens, we end up with an infinite allocation cycle with
corresponding performance penalty. Fix this by just doing and what
Shell.GenericContainer did before commit 286ffbe2b6 replaced it,
and not chain up to StWidget.

Thanks to Robert Mader for debugging the issue.

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


(cherry picked from commit d57234bec9)
2019-04-29 19:20:22 +00:00
Carlos Garnacho
2d0e84469e padOsd: Use non-deprecated librsvg API to create handle
On one hand, we were using a path instead of an URI on
rsvg_handle_set_base_uri(). This broke at some point in librsvg
(presumably for the best, handling paths there sounds non-standard)
leaving a blank svg (As the base image wouldn't be accessed).

On the other hand, we use this with the deprecated rsvg_handle_write()
which we should drift away from.

Using rsvg_handle_new_from_stream_sync() neatly solves both. We use
newer API based on input streams and GFiles, and it internally does
the right thing, bringing the pad OSD back to life.

Closes: https://gitlab.gnome.org/GNOME/gnome-shell/issues/1220
2019-04-27 15:46:11 +02:00
Florian Müllner
59559d5fc2 ci: Improve script output
git-fetch's -q flag doesn't suppress warnings, so it's not a full
replacement of the redirection that was removed in commit 8cefd919.
Shut up the cryptic warning and replace it with a clearer log message
instead.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/511
2019-04-26 20:41:02 +02:00
Florian Müllner
c062be25d6 ci: Try harder to find a matching mutter branch
Depending on how gitlab's CI checks out gnome-shell, the shell branch
may not have a local reference like "gnome-3-32", but only a remote
one like "remotes/origin/gnome-3-32".

Consider that case as well when looking for a corresponding mutter branch.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/511
2019-04-25 23:35:49 +02:00
Florian Müllner
e5cfdf9f48 ci: Handle merge requests for non-master branches
If we don't find a branch that matches the branch used in the merge
request, we currently fall back to the non-merge-request matching,
i.e. first try the current shell branch, then fall back to master.

This should work for commits to upstream branches, but not for merge
requests to a stable branch. For those, the target branch name is
a better fallback.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/509
2019-04-25 19:57:05 +00:00
Florian Müllner
6db9f51bda ci: Fix checking out mutter for stable branches
Remote branches always start with the remote itself, so just looking
for "gnome-3-32" etc. won't produce a match.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/509
2019-04-25 19:57:05 +00:00
Florian Müllner
8cefd91933 ci: Silence some warnings
... as suggested by Jonas in mutter!548.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/509
2019-04-25 19:57:05 +00:00
Carlos Garnacho
435d9ed750 ci: Ensure we clone a deep enough history for commit review
It seems gitlab changed something recently in the default clone depth
which made MRs with >10 commits to obscurely fail in the review stage.
As per https://docs.gitlab.com/ee/ci/yaml/#shallow-cloning, bump it
to 100 to allow bigger MRs.

https://gitlab.gnome.org/GNOME/mutter/merge_requests/551
2019-04-24 13:31:41 +02:00
Simon McVittie
78d6ccd804 ShellApp: Use g_signal_connect_object for window signals
A window being unmanaged can cause the ShellApp to be removed from
the ShellAppSystem, which if we are unlucky is the app's last
reference, causing it to be disposed and freed. It would be bad if this
happened before we finished handling the signal.

Use g_signal_connect_object to ensure that a reference is held to
the ShellApp for the duration of the signal handler, delaying its
last-unref.

In particular, when a signal handler calls _shell_app_remove_window(),
there is a brief period for which ShellApp breaks the intended
invariant (see !497) that app->running_state is non-NULL if and only if
app->running_state->windows is also non-NULL (non-empty). Freeing the
ShellApp at this point would cause a crash. This seems likely to be the
root cause of <https://gitlab.gnome.org/GNOME/gnome-shell/issues/750>,
<https://gitlab.gnome.org/GNOME/gnome-shell/issues/822> and
<https://bugs.debian.org/926212>.

Signed-off-by: Simon McVittie <smcv@debian.org>


(cherry picked from commit 0f531d8c44)
2019-04-23 13:10:32 +00:00
Carlos Garnacho
f662864ada st: Only emit ::style-changed on actual changes
Compare painting/geometry of old and new paint nodes, so it's ensured to
be only emitted on actual style changes. Emission still must be propagated
through to children, though.

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


(cherry picked from commit f74c07b9ac)
2019-04-22 18:09:26 +00:00
127 changed files with 4192 additions and 5164 deletions

View File

@@ -15,7 +15,7 @@ variables:
- merge_requests - merge_requests
check_commit_log: check_commit_log:
image: registry.gitlab.gnome.org/gnome/mutter/master:v2 image: registry.gitlab.gnome.org/gnome/mutter/master:v1
stage: review stage: review
variables: variables:
GIT_DEPTH: "100" GIT_DEPTH: "100"
@@ -40,7 +40,7 @@ js_check:
when: on_failure when: on_failure
build: build:
image: registry.gitlab.gnome.org/gnome/mutter/master:v2 image: registry.gitlab.gnome.org/gnome/gnome-shell/master:v1
stage: build stage: build
before_script: before_script:
- .gitlab-ci/checkout-mutter.sh - .gitlab-ci/checkout-mutter.sh
@@ -58,7 +58,7 @@ build:
- build - build
test: test:
image: registry.gitlab.gnome.org/gnome/mutter/master:v2 image: registry.gitlab.gnome.org/gnome/gnome-shell/master:v1
stage: test stage: test
before_script: before_script:
- ninja -C mutter/build install - ninja -C mutter/build install
@@ -72,7 +72,7 @@ test:
when: on_failure when: on_failure
test-pot: test-pot:
image: registry.gitlab.gnome.org/gnome/mutter/master:v2 image: registry.gitlab.gnome.org/gnome/gnome-shell/master:v1
stage: test stage: test
before_script: before_script:
- ninja -C mutter/build install - ninja -C mutter/build install

19
.gitlab-ci/Dockerfile Normal file
View File

@@ -0,0 +1,19 @@
FROM registry.gitlab.gnome.org/gnome/mutter/master:v1
RUN dnf -y update && dnf -y upgrade && \
dnf install -y 'dnf-command(copr)' && \
dnf copr enable -y fmuellner/gnome-shell-ci && \
dnf builddep -y gnome-shell --setopt=install_weak_deps=False && \
# bt only exports HAVE_BLUETOOTH to js, rest are outdated build-requires
dnf remove -y gnome-bluetooth-libs-devel dbus-glib-devel \
upower-devel python3-devel && \
# We'll build mutter ourselves
dnf remove -y --noautoremove mutter mutter-devel && \
# Needed for tests
dnf install -y '*/xvfb-run' gdm-lib accountsservice-libs && \
dnf clean all && \
rm -rf /var/cache/dnf

68
NEWS
View File

@@ -1,75 +1,21 @@
3.33.3 3.32.2
====== ======
* Prepare for optional X11 [Carlos; !378]
* Fix opening window menu [Marco; !557]
* Reload search providers when installed applications change [Cosimo; !562]
* Implement locate-pointer accessibility feature [Olivier; #981]
* Allow to disable window menus via session mode [Cosimo; !569]
* Implement mouse accessibility [Olivier; !474]
* Call GDM's RegisterSession() after startup [Iain; !570]
* Fix extended keys popups being hidden by on-screen keyboard [Marco; !583]
* Fix top bar being hidden by lock screen [Jonas; !571]
* Update theme to better match GTK's Adwaita [Frederik; #841]
* Set up GJS profiler when GJS_TRACE_FD is set [Christian; !573]
* Misc. bug fixes and cleanups [Jonas, Cosimo, Robert, Florian, Marco, Simon,
Laurent, Niels, Will; !551, !555, !464, #1333, !565, !572, !568, !558, #1205,
#1336, !579, !576, #1392, !582, !586, #1406, #1351]
Contributors:
Laurent Bigonville, Cosimo Cecchi, Piotr Drąg, Jonas Dreßler,
Frederik Feichtmeier, Olivier Fourdan, Carlos Garnacho, Niels De Graef,
Christian Hergert, Iain Lane, Robert Mader, Florian Müllner, Simon Schampijer,
Jakub Steiner, Will Thompson, Marco Trevisan (Treviño)
Translators:
Kukuh Syafaat [id], Balázs Meskó [hu], Daniel Mustieles [es],
Fabio Tomat [fur], Nathan Follens [nl], Goran Vidović [hr], Jordi Mas [ca]
3.33.2
======
* Fix keeping actors visible in scrollviews [Marco; #1061]
* Move some chrome above popup windows [Jonas D.; !358]
* Include 'sandboxed-app-id' in winodw introspection info [Florian; #1289]
* Port to libecal-2.0 [Milan; !501]
* Support TCRYPT in mount password dialog [segfault; !126]
* Misc. bug fixes and cleanups [Florian, Marco, Veerasamy; !517, #745, !499,
!510, !515, !546, !549]
Contributors:
Cosimo Cecchi, Milan Crha, Jonas Dreßler, Florian Müllner, segfault,
Veerasamy Sevagen, Marco Trevisan (Treviño)
Translators:
Daniel Mustieles [es]
3.33.1
======
* Refine the app menu [Florian; #968]
* Refine window preview style [Feichtmeier; !461]
* Only emit ::style-changed on actual changes [Carlos; #1153]
* Disable emoji on-screen keyboard support on X11 [Florian; #1172]
* Fix tablet button mapping overlay [Carlos; #1220] * Fix tablet button mapping overlay [Carlos; #1220]
* Don't crash for world clock locations with no timezone [Florian; #1062]
* Don't leak old on-screen keyboard layout groups [Carlos; mutter#556]
* Fix ellipsization in dialog subtitles/bodies [Marco; !531] * Fix ellipsization in dialog subtitles/bodies [Marco; !531]
* Fix glitch of fullscreen window in workspace switch animation [Jonas D.; !322] * Don't crash for world clock locations with no timezone<Paste> [Florian; #1062]
* Fix distortion of some image contents [Florian; !525]
* Allow dragging unfocused tiled/maximized windows from top bar [Dylan; #679290]
* Handle network interface name changes [Fabrice; !534] * Handle network interface name changes [Fabrice; !534]
* Don't leak old on-screen keyboard layout groups [Carlos; mutter#556]
* Avoid unnecessary style changes when computing :first/:last-child * Avoid unnecessary style changes when computing :first/:last-child
[Florian; !529] [Florian; !529]
* Misc. bug fixes and cleanups [Florian, Marco, Robert, Georges, Carlos, Simon, * Misc. bug fixes [Simon, Carlos, Florian; #822, !551, !509,
Jonas D.; !487, !441, !502, !503, !504, !506, #822, !551, !512, !509, !511, !511, #1054, !506, #1065]
#1054, !524, #1065, !331, !540]
Contributors: Contributors:
Fabrice Bellet, Jonas Dreßler, Feichtmeier, Carlos Garnacho, Robert Mader, Fabrice Bellet, Carlos Garnacho, Simon McVittie, Florian Müllner,
Dylan McCall, Simon McVittie, Florian Müllner, Georges Basile Stavracas Neto,
Marco Trevisan (Treviño) Marco Trevisan (Treviño)
Translators: Translators:
Daniel Mustieles [es], Kukuh Syafaat [id], Fabio Tomat [fur], Dingzhong Chen [zh_CN], Tim Sabsch [de]
Carmen Bianca BAKKER [eo], Dingzhong Chen [zh_CN], Tim Sabsch [de]
3.32.1 3.32.1
====== ======

View File

@@ -20,16 +20,10 @@
<file>no-notifications.svg</file> <file>no-notifications.svg</file>
<file>noise-texture.png</file> <file>noise-texture.png</file>
<file>pad-osd.css</file> <file>pad-osd.css</file>
<file alias="icons/pointer-double-click-symbolic.svg">pointer-double-click-symbolic.svg</file>
<file alias="icons/pointer-drag-symbolic.svg">pointer-drag-symbolic.svg</file>
<file alias="icons/pointer-primary-click-symbolic.svg">pointer-primary-click-symbolic.svg</file>
<file alias="icons/pointer-secondary-click-symbolic.svg">pointer-secondary-click-symbolic.svg</file>
<file>process-working.svg</file> <file>process-working.svg</file>
<file>toggle-off.svg</file> <file>toggle-off-intl.svg</file>
<file>toggle-off-dark.svg</file>
<file>toggle-off-hc.svg</file> <file>toggle-off-hc.svg</file>
<file>toggle-on.svg</file> <file>toggle-on-intl.svg</file>
<file>toggle-on-dark.svg</file>
<file>toggle-on-hc.svg</file> <file>toggle-on-hc.svg</file>
</gresource> </gresource>
</gresources> </gresources>

View File

@@ -1,5 +1,3 @@
$variant: 'light';
@import "gnome-shell-sass/_high-contrast-colors"; //use gtk colors @import "gnome-shell-sass/_high-contrast-colors"; //use gtk colors
@import "gnome-shell-sass/_drawing"; @import "gnome-shell-sass/_drawing";
@import "gnome-shell-sass/_common"; @import "gnome-shell-sass/_common";

View File

@@ -3,11 +3,11 @@
$base_color: if($variant == 'light', #ffffff, lighten(desaturate(#241f31, 20%), 2%)); $base_color: if($variant == 'light', #ffffff, lighten(desaturate(#241f31, 20%), 2%));
$bg_color: if($variant == 'light', #f6f5f4, darken(desaturate(#3d3846, 100%), 4%)); $bg_color: if($variant == 'light', #f6f5f4, desaturate(#3d3846, 10%));
$fg_color: if($variant == 'light', #2e3436, #eeeeec); $fg_color: if($variant == 'light', #2e3436, #eeeeec);
$selected_fg_color: #ffffff; $selected_fg_color: #ffffff;
$selected_bg_color: if($variant == 'light', #3584e4, darken(#3584e4, 10%)); $selected_bg_color: if($variant == 'light', #3584e4, darken(#3584e4, 20%));
$selected_borders_color: if($variant== 'light', darken($selected_bg_color, 15%), darken($selected_bg_color, 30%)); $selected_borders_color: if($variant== 'light', darken($selected_bg_color, 15%), darken($selected_bg_color, 30%));
$borders_color: if($variant == 'light', darken($bg_color, 18%), darken($bg_color, 10%)); $borders_color: if($variant == 'light', darken($bg_color, 18%), darken($bg_color, 10%));
$borders_edge: if($variant == 'light', transparentize(white, 0.2), transparentize($fg_color, 0.93)); $borders_edge: if($variant == 'light', transparentize(white, 0.2), transparentize($fg_color, 0.93));
@@ -21,15 +21,11 @@ $success_color: if($variant == 'light', #33d17a, darken(#33d17a, 10%));
$destructive_color: if($variant == 'light', #e01b24, darken(#e01b24, 10%)); $destructive_color: if($variant == 'light', #e01b24, darken(#e01b24, 10%));
$osd_fg_color: #eeeeec; $osd_fg_color: #eeeeec;
$osd_text_color: white; $osd_bg_color: #2e3436;
$osd_bg_color: transparentize(darken(desaturate(#3d3846, 100%), 12%),0.04);
$osd_insensitive_bg_color: transparentize(mix($osd_fg_color, opacify($osd_bg_color, 1), 10%), 0.5);
$osd_insensitive_fg_color: mix($osd_fg_color, opacify($osd_bg_color, 1), 50%);
$osd_borders_color: transparentize(black, 0.3); $osd_borders_color: transparentize(black, 0.3);
$osd_outer_borders_color: transparentize(white, 0.84); $osd_outer_borders_color: transparentize(white, 0.9);
$tooltip_borders_color: $osd_outer_borders_color; $tooltip_borders_color: $osd_outer_borders_color;
$shadow_color: transparentize(black, 0.9);
//insensitive state derived colors //insensitive state derived colors
$insensitive_fg_color: mix($fg_color, $bg_color, 50%); $insensitive_fg_color: mix($fg_color, $bg_color, 50%);

File diff suppressed because it is too large Load Diff

View File

@@ -37,13 +37,16 @@
// possible $t values: // possible $t values:
// normal, focus, insensitive // normal, focus, insensitive
// //
$_inner_shadows: inset 0 2px 4px transparentize(black, 0.6);
@if $t==normal { @if $t==normal {
background-color: $base_color; background-color: $base_color;
border-color: $borders_color; border-color: $borders_color;
@include _shadows($_inner_shadows);
} }
@if $t==focus { @if $t==focus {
@include _shadows($_inner_shadows);
border-color: if($fc==$selected_bg_color, border-color: if($fc==$selected_bg_color,
$selected_borders_color, $selected_borders_color,
darken($fc,35%)); darken($fc,35%));
@@ -108,7 +111,7 @@
} }
} }
@mixin button($t, $c:$bg_color, $tc:$fg_color, $edge: $borders_edge) { @mixin button($t, $c:$osd_bg_color, $tc:$fg_color, $edge: $borders_edge) {
// //
// Button drawing function // Button drawing function
// //
@@ -127,39 +130,46 @@
$_hilight_color: _button_hilight_color($c); $_hilight_color: _button_hilight_color($c);
$_button_edge: if($edge == none, none, _widget_edge($edge)); $_button_edge: if($edge == none, none, _widget_edge($edge));
$_blank_edge: if($edge == none, none, _widget_edge(transparentize($edge,1))); $_blank_edge: if($edge == none, none, _widget_edge(transparentize($edge,1)));
$_button_shadow: 0 1px 2px transparentize($shadow_color, 0.03);
@if $t==normal { @if $t==normal {
// //
// normal button // normal button
// //
$_bg: if($c!=$osd_bg_color, transparentize($c, 0.5),
$osd_bg_color);
color: $tc; color: $osd_fg_color;
background-color: $c; background-color: $_bg;
border-color: $borders_color; border-color: $osd_borders_color;
box-shadow: $_button_shadow; box-shadow: inset 0 1px lighten($osd_bg_color,10%);
text-shadow: 0 1px black; text-shadow: 0 1px black;
icon-shadow: 0 1px black; icon-shadow: 0 1px black;
} }
@if $t==focus { @if $t==focus {
// //
// focused button // focused button
// //
color: $tc; $_bg: if($c!=$osd_bg_color, transparentize($c, 0.3),
lighten($osd_bg_color,3%));
color: $osd_fg_color;
text-shadow: 0 1px black; text-shadow: 0 1px black;
icon-shadow: 0 1px black; icon-shadow: 0 1px black;
box-shadow: inset 0px 0px 0px 2px $selected_bg_color; box-shadow: inset 0px 0px 0px 1px $selected_bg_color;
//border-color: $selected_bg_color;
} }
@else if $t==hover { @else if $t==hover {
// //
// active osd button // active osd button
// //
color: $tc; $_bg: if($c!=$osd_bg_color, transparentize($c, 0.3),
border-color: $borders_color; lighten($osd_bg_color,3%));
background-color: $c;
box-shadow: $_button_shadow; color: white;
border-color: $osd_borders_color;
background-color: $_bg;
box-shadow: inset 0 1px lighten($osd_bg_color,20%);
text-shadow: 0 1px black; text-shadow: 0 1px black;
icon-shadow: 0 1px black; icon-shadow: 0 1px black;
@@ -168,18 +178,27 @@
// //
// active osd button // active osd button
// //
color: $tc; $_bg: if($c!=$bg_color, $c, $osd_borders_color);
border-color: $borders_color;
background-color: $c; color: white;
border-color: $osd_borders_color;
background-color: $selected_bg_color;
// This should be none, but it's creating some issues with borders, so to
// workaround it for now, use inset wich goes through a different code path.
// see https://bugzilla.gnome.org/show_bug.cgi?id=752934
box-shadow: inset 0 0 black;
text-shadow: none; text-shadow: none;
icon-shadow: none; icon-shadow: none;
box-shadow: none;
} }
@else if $t==insensitive { @else if $t==insensitive {
//
// insensitive osd button
//
$_bg: transparentize(mix($insensitive_fg_color,$osd_bg_color,20%),0.3);
color: $insensitive_fg_color; color: $insensitive_fg_color;
border-color: $insensitive_borders_color; border-color: $osd_borders_color;
background-color: $insensitive_bg_color; background-color: $_bg;
box-shadow: none; box-shadow: none;
text-shadow: none; text-shadow: none;
icon-shadow: none; icon-shadow: none;

View File

@@ -26,7 +26,6 @@ $osd_borders_color: transparentize(black, 0.3);
$osd_outer_borders_color: transparentize(white, 0.9); $osd_outer_borders_color: transparentize(white, 0.9);
$tooltip_borders_color: $osd_outer_borders_color; $tooltip_borders_color: $osd_outer_borders_color;
$shadow_color: transparentize(black, 0.9);
//insensitive state derived colors //insensitive state derived colors
$insensitive_fg_color: mix($fg_color, $bg_color, 50%); $insensitive_fg_color: mix($fg_color, $bg_color, 50%);

View File

@@ -1,28 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="20"
height="20"
id="svg2">
<g
id="layer1"
style="display:inline">
<g
id="id1"
transform="translate(-19,-0.75)">
<path
style="color:#000000;shape-padding:0;clip-rule:nonzero;display:block;overflow:visible;visibility:visible;opacity:1;solid-color:#000000;solid-opacity:1;fill:#464646;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
d="m 19.855469,0.45507812 c 0,6.69466128 0,13.38932288 0,20.08398388 1.414713,-1.38151 2.829427,-2.763021 4.24414,-4.144531 0.5882,1.18866 1.158389,2.386561 1.758464,3.569127 1.108631,1.640259 4.157538,0.465128 3.89799,-1.495859 0.01057,-0.470226 -0.405577,-0.908445 -0.434651,-1.313638 0.259401,-0.25321 0.518802,-0.50642 0.778203,-0.75963 0.5882,1.18866 1.158389,2.386561 1.758464,3.569127 1.108631,1.640259 4.157538,0.465128 3.89799,-1.495859 -0.192325,-0.904303 -0.717854,-1.698026 -1.068629,-2.548967 -0.238908,-0.512658 -0.477817,-1.025315 -0.716725,-1.537973 1.755859,0 3.511719,0 5.267578,0 C 34.777352,9.738932 30.31641,5.0970051 25.855469,0.45507812 c 0,2.08138018 0,4.16276048 0,6.24414068 -2,-2.0813802 -4,-4.1627605 -6,-6.24414068 z m 1.5,3.72656248 c 2,2.0813801 4,4.1627603 6,6.2441404 0,-2.0813801 0,-4.1627603 0,-6.2441404 2.786458,2.8997395 5.572917,5.7994789 8.359375,8.6992184 -1.366537,0 -2.733073,0 -4.09961,0 0.883468,1.903435 1.781983,3.800273 2.656081,5.707817 0.0065,0.622781 -1.227555,0.980575 -1.325116,0.207118 -0.80433,-1.640251 -1.608661,-3.280501 -2.412991,-4.920752 -1.020182,0.995443 -2.040365,1.990885 -3.060547,2.986328 0.263642,0.608048 0.596803,1.192457 0.814693,1.816134 -0.182662,0.601037 -1.26833,0.8373 -1.365856,0.06795 -0.796094,-1.623456 -1.592189,-3.246912 -2.388284,-4.870368 -1.059245,1.033854 -2.118489,2.067708 -3.177734,3.101562 -4e-6,-4.265002 -7e-6,-8.5300036 -1.1e-5,-12.7950054 z"
id="path5565" />
</g>
<g
id="id2"
transform="translate(-25,-0.75)" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.5 KiB

View File

@@ -1,20 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="20"
height="20"
id="svg2">
<g
id="g835">
<path
style="color:#000000;shape-padding:0;clip-rule:nonzero;display:block;overflow:visible;visibility:visible;opacity:1;solid-color:#000000;solid-opacity:1;fill:#464646;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
d="M 10.705078 1.671875 C 9.8685536 1.7465699 8.886927 1.5353073 8.2578125 2.2480469 C 8.0785627 2.7511513 7.8667422 2.9777446 7.3125 2.8652344 C 6.5186841 2.8141575 5.6105879 2.9190179 5.125 3.6386719 C 4.5700923 4.4696324 4.8113194 5.4949043 4.7578125 6.4316406 L 4.7578125 7.9335938 C 4.2480917 7.6156216 3.6258927 7.8015358 3.0585938 7.7519531 C 2.6157606 7.7312277 2.1774807 7.7771069 1.7402344 7.84375 C 1.7971654 10.529678 1.813967 13.217089 1.8613281 15.902344 C 1.9550191 17.204635 3.0933719 18.307155 4.40625 18.326172 C 5.0391993 18.341272 5.8885801 18.332951 6.6308594 18.337891 C 9.8526764 18.325821 13.076973 18.38774 16.296875 18.28125 C 17.459088 18.161027 18.510143 17.092798 18.367188 15.884766 L 18.367188 6.4042969 C 17.660379 5.4636119 16.551912 4.623434 15.308594 4.8339844 C 15.009045 4.3804158 14.822476 3.3608651 14.082031 3.0351562 C 13.727176 2.744118 13.242443 2.9253873 12.822266 2.8730469 C 12.524824 2.8003648 11.966366 3.0655864 11.953125 2.6210938 C 11.795774 2.0995736 11.23789 1.7125276 10.705078 1.671875 z M 10.599609 3.1757812 C 10.764131 3.4472414 10.782382 3.9294982 10.818359 4.3007812 C 10.824915 4.3076775 10.838155 4.3066925 10.845703 4.3125 C 10.836598 4.3123268 10.827465 4.3126732 10.818359 4.3125 L 11.3125 10.212891 L 11.976562 4.3710938 L 13.322266 4.375 C 13.858345 4.7645492 13.735252 5.5154752 13.876953 6.0976562 C 13.865826 6.1651282 13.88335 6.1937019 13.892578 6.234375 C 13.891928 6.2343667 13.891276 6.2343833 13.890625 6.234375 L 13.902344 6.3203125 L 14.384766 10.185547 L 15.048828 6.265625 C 15.622863 6.228498 16.206517 6.3041365 16.607422 6.7675781 C 17.017062 6.9844433 16.823063 7.4565491 16.867188 7.8261719 L 16.867188 16.167969 C 16.530129 17.131654 15.267211 16.71624 14.492188 16.828125 C 11.121671 16.841205 7.7500508 16.861953 4.3808594 16.814453 C 3.4051926 16.786173 3.2389196 15.744474 3.3398438 14.972656 C 3.3282027 13.065594 3.2950998 11.158732 3.2617188 9.2519531 C 3.5880829 9.2584131 3.9376766 9.2391948 4.25 9.2617188 C 4.7438842 10.17694 4.7346154 11.262903 4.7578125 12.277344 C 5.2504494 12.270544 5.8011939 12.317174 6.2578125 12.277344 C 6.2669593 9.7577406 6.2393741 7.2373172 6.2714844 4.71875 C 6.3763823 4.198849 7.0022289 4.409587 7.3828125 4.3652344 L 8.0585938 4.3652344 L 8.546875 10.212891 L 9.2167969 4.3359375 L 9.2128906 4.3359375 C 9.2438386 3.9531035 9.0622615 3.4401006 9.4609375 3.2167969 L 10.599609 3.1757812 z "
id="path5630" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.3 KiB

View File

@@ -1,26 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="20"
height="20"
id="svg2"
version="1.1">
<g
id="layer1"
style="display:inline">
<g
id="id1"
transform="translate(-22.25,-0.75)">
<path
style="color:#000000;shape-padding:0;clip-rule:nonzero;display:block;overflow:visible;visibility:visible;opacity:1;solid-color:#000000;solid-opacity:1;fill:#464646;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
d="m 25.855469,0.45507812 c 0,6.69466128 0,13.38932288 0,20.08398388 1.414713,-1.380859 2.829427,-2.761719 4.24414,-4.142578 0.612408,1.215372 1.173049,2.460221 1.819709,3.656095 1.141947,1.476279 3.975266,0.389006 3.846009,-1.473608 -0.09413,-0.822519 -0.594755,-1.521423 -0.899969,-2.277599 -0.298869,-0.640171 -0.597739,-1.280342 -0.896608,-1.920513 1.75651,0 3.513021,0 5.269531,0 C 34.777344,9.738932 30.316406,5.0970051 25.855469,0.45507812 Z m 1.5,3.72656248 c 2.786458,2.8997395 5.572917,5.7994789 8.359375,8.6992184 -1.367188,0 -2.734375,0 -4.101563,0 0.885072,1.903196 1.781799,3.80152 2.659622,5.707744 0.0349,0.566084 -1.149057,0.988823 -1.282093,0.297971 -0.818567,-1.671162 -1.637133,-3.342323 -2.455699,-5.013485 -1.059896,1.034505 -2.119791,2.06901 -3.179687,3.103515 1.5e-5,-4.264988 3e-5,-8.5299756 4.5e-5,-12.7949634 z"
id="path5565" />
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -1,26 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="20"
height="20"
id="svg2">
<g
id="layer1"
style="display:inline;stroke-width:1.5;stroke-miterlimit:4;stroke-dasharray:none;stroke:#000000;stroke-opacity:1">
<g
transform="matrix(-1,0,0,1,42,-0.75)"
id="g5847"
style="stroke-width:1.5;stroke-miterlimit:4;stroke-dasharray:none;stroke:#000000;stroke-opacity:1">
<path
style="color:#000000;shape-padding:0;clip-rule:nonzero;display:block;overflow:visible;visibility:visible;opacity:1;solid-color:#000000;solid-opacity:1;fill:#464646;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
d="m 25.855469,0.45507812 c 0,6.69466128 0,13.38932288 0,20.08398388 1.414713,-1.380859 2.829427,-2.761719 4.24414,-4.142578 0.612408,1.215372 1.173049,2.460221 1.819709,3.656095 1.141947,1.476279 3.975266,0.389006 3.846009,-1.473608 -0.09413,-0.822519 -0.594755,-1.521423 -0.899969,-2.277599 -0.298869,-0.640171 -0.597739,-1.280342 -0.896608,-1.920513 1.75651,0 3.513021,0 5.269531,0 C 34.777344,9.738932 30.316406,5.0970051 25.855469,0.45507812 Z m 1.5,3.72656248 c 2.786458,2.8997395 5.572917,5.7994789 8.359375,8.6992184 -1.367188,0 -2.734375,0 -4.101563,0 0.885072,1.903196 1.781799,3.80152 2.659622,5.707744 0.0349,0.566084 -1.149057,0.988823 -1.282093,0.297971 -0.818567,-1.671162 -1.637133,-3.342323 -2.455699,-5.013485 -1.059896,1.034505 -2.119791,2.06901 -3.179687,3.103515 1.5e-5,-4.264988 3e-5,-8.5299756 4.5e-5,-12.7949634 z"
id="path5851" />
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.0 KiB

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="46" height="22"><defs><linearGradient id="a"><stop offset="0" stop-color="#39393a"/><stop offset="1" stop-color="#302f30"/></linearGradient><linearGradient xlink:href="#a" id="b" x1="53" y1="294.429" x2="53" y2="309.804" gradientUnits="userSpaceOnUse" gradientTransform="translate(-42.76)"/></defs><g transform="translate(0 -291.18)" stroke-width="1.085"><rect style="marker:none" width="44.446" height="20.911" x=".625" y="291.715" rx="10.455" ry="10.073" fill="#323233" stroke="#272728"/><rect ry="10.455" rx="10.455" y="291.715" x=".543" height="20.911" width="21.143" style="marker:none" fill="url(#b)" stroke="#151515"/></g></svg>

Before

Width:  |  Height:  |  Size: 725 B

View File

@@ -0,0 +1,103 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="46"
height="22"
viewBox="0 0 46 22"
version="1.1"
id="svg2751"
inkscape:version="0.92.4 5da689c313, 2019-01-14"
sodipodi:docname="toggle-off-intl.svg">
<defs
id="defs2745">
<linearGradient
inkscape:collect="always"
id="linearGradient3329">
<stop
style="stop-color:#39393a;stop-opacity:1;"
offset="0"
id="stop3325" />
<stop
style="stop-color:#302f30;stop-opacity:1"
offset="1"
id="stop3327" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3329"
id="linearGradient3331"
x1="53"
y1="294.42917"
x2="53"
y2="309.80417"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-42.760724)" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#535353"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="-19.436775"
inkscape:cy="-13.499723"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
units="px"
inkscape:pagecheckerboard="true"
borderlayer="true"
inkscape:showpageshadow="false"
showborder="false">
<inkscape:grid
type="xygrid"
id="grid3298" />
</sodipodi:namedview>
<metadata
id="metadata2748">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-291.17916)">
<rect
style="opacity:1;vector-effect:none;fill:#323233;fill-opacity:1;stroke:#272728;stroke-width:1.08532763;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
id="rect3296"
width="44.446434"
height="20.910645"
x="0.625"
y="291.71494"
rx="10.455324"
ry="10.073335" />
<rect
ry="10.455322"
rx="10.455322"
y="291.71494"
x="0.5428465"
height="20.910645"
width="21.142862"
id="rect3300"
style="opacity:1;vector-effect:none;fill:url(#linearGradient3331);fill-opacity:1;stroke:#151515;stroke-width:1.08532763;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="46" height="22"><g transform="translate(0 -291.18)"><rect style="marker:none;font-variant-east_asian:normal" width="44.446" height="20.911" x=".625" y="291.715" rx="10.455" ry="10.073" fill="#e1dedb" stroke="#cdc7c2" stroke-linecap="round" stroke-linejoin="round"/><rect ry="10.455" rx="10.455" y="291.715" x=".543" height="20.911" width="21.143" style="marker:none;font-variant-east_asian:normal" fill="#f8f7f7" stroke="#aa9f98" stroke-linecap="round" stroke-linejoin="round"/><g transform="matrix(.97148 0 0 1 1658.914 -2552.91)" stroke-width="1.015" stroke-linecap="round" stroke-linejoin="round"><rect ry="13.17" rx="13.556" y="1234.681" x="-1242.732" height="26" width="49.409" style="marker:none" fill="#e1dedb" stroke="#cdc7c2"/><rect style="marker:none" width="26.763" height="26" x="-1242.732" y="1234.769" rx="13.511" ry="13.126" fill="#f8f7f7" stroke="#aa9f98"/></g><g transform="matrix(.97148 0 0 1 1658.914 -2512.91)" stroke-width="1.015" stroke="#2b73cc"><rect style="marker:none" width="49.409" height="26" x="-1242.732" y="1234.681" rx="13.556" ry="13.17" fill="#3081e3"/><rect ry="13.126" rx="13.511" y="1234.769" x="-1220.086" height="26" width="26.763" style="marker:none" fill="#f8f7f7" stroke-linecap="round" stroke-linejoin="round"/></g></g></svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="46" height="22"><defs><linearGradient id="a"><stop offset="0" stop-color="#39393a"/><stop offset="1" stop-color="#302f30"/></linearGradient><linearGradient xlink:href="#a" id="b" x1="53" y1="294.429" x2="53" y2="309.804" gradientUnits="userSpaceOnUse" gradientTransform="translate(-19)"/></defs><g transform="translate(0 -291.18)" stroke="#030e1b" stroke-width="1.085"><rect style="marker:none" width="44.446" height="20.911" x=".625" y="291.715" rx="10.455" ry="10.073" fill="#15539e"/><rect ry="10.455" rx="10.455" y="291.715" x="24.304" height="20.911" width="21.143" style="marker:none" fill="url(#b)"/></g></svg>

Before

Width:  |  Height:  |  Size: 707 B

View File

@@ -0,0 +1,103 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="46"
height="22"
viewBox="0 0 46 22"
version="1.1"
id="svg2751"
inkscape:version="0.92.4 5da689c313, 2019-01-14"
sodipodi:docname="toggle-on-intl.svg">
<defs
id="defs2745">
<linearGradient
inkscape:collect="always"
id="linearGradient3329">
<stop
style="stop-color:#39393a;stop-opacity:1;"
offset="0"
id="stop3325" />
<stop
style="stop-color:#302f30;stop-opacity:1"
offset="1"
id="stop3327" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3329"
id="linearGradient3331"
x1="53"
y1="294.42917"
x2="53"
y2="309.80417"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-19)" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#535353"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="13.588971"
inkscape:cy="14.124546"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
units="px"
inkscape:pagecheckerboard="true"
borderlayer="true"
inkscape:showpageshadow="false"
showborder="false">
<inkscape:grid
type="xygrid"
id="grid3298" />
</sodipodi:namedview>
<metadata
id="metadata2748">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-291.17916)">
<rect
style="opacity:1;vector-effect:none;fill:#15539e;fill-opacity:1;stroke:#030e1b;stroke-width:1.08532763;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
id="rect3296"
width="44.446434"
height="20.910645"
x="0.625"
y="291.71494"
rx="10.455324"
ry="10.073335" />
<rect
ry="10.455322"
rx="10.455322"
y="291.71494"
x="24.30357"
height="20.910645"
width="21.142862"
id="rect3300"
style="opacity:1;vector-effect:none;fill:url(#linearGradient3331);fill-opacity:1;stroke:#030e1b;stroke-width:1.08532763;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="46" height="22"><g transform="translate(0 -291.18)" stroke="#2b73cc"><rect style="marker:none;font-variant-east_asian:normal" width="44.446" height="20.911" x=".625" y="291.715" rx="10.455" ry="10.073" fill="#3081e3"/><rect ry="10.455" rx="10.455" y="291.715" x="24.304" height="20.911" width="21.143" style="marker:none;font-variant-east_asian:normal" fill="#f8f7f7" stroke-linecap="round" stroke-linejoin="round"/></g></svg>

Before

Width:  |  Height:  |  Size: 473 B

View File

@@ -124,7 +124,7 @@ var Batch = class extends Task {
} }
process() { process() {
throw new GObject.NotImplementedError(`process in ${this.constructor.name}`); throw new Error('Not implemented');
} }
runTask() { runTask() {

View File

@@ -325,7 +325,7 @@ var SessionMenuButton = class {
this._button.remove_style_pseudo_class('active'); this._button.remove_style_pseudo_class('active');
}); });
this._manager = new PopupMenu.PopupMenuManager(this._button, this._manager = new PopupMenu.PopupMenuManager({ actor: this._button },
{ actionMode: Shell.ActionMode.NONE }); { actionMode: Shell.ActionMode.NONE });
this._manager.addMenu(this._menu); this._manager.addMenu(this._menu);
@@ -652,7 +652,7 @@ var LoginDialog = GObject.registerClass({
bannerAllocation.x2 = Math.floor(centerX - centerGap / 2); bannerAllocation.x2 = Math.floor(centerX - centerGap / 2);
bannerAllocation.x1 = Math.floor(bannerAllocation.x2 - wideBannerWidth); bannerAllocation.x1 = Math.floor(bannerAllocation.x2 - wideBannerWidth);
// figure out how tall it would like to be and try to accommodate // figure out how tall it would like to be and try to accomodate
// but don't let it get too close to the logo // but don't let it get too close to the logo
let [wideMinHeight, wideBannerHeight] = this._bannerView.get_preferred_height(wideBannerWidth); let [wideMinHeight, wideBannerHeight] = this._bannerView.get_preferred_height(wideBannerWidth);

View File

@@ -64,7 +64,6 @@
<file>ui/keyboard.js</file> <file>ui/keyboard.js</file>
<file>ui/layout.js</file> <file>ui/layout.js</file>
<file>ui/lightbox.js</file> <file>ui/lightbox.js</file>
<file>ui/locatePointer.js</file>
<file>ui/lookingGlass.js</file> <file>ui/lookingGlass.js</file>
<file>ui/magnifier.js</file> <file>ui/magnifier.js</file>
<file>ui/magnifierDBus.js</file> <file>ui/magnifierDBus.js</file>
@@ -82,11 +81,9 @@
<file>ui/pageIndicators.js</file> <file>ui/pageIndicators.js</file>
<file>ui/panel.js</file> <file>ui/panel.js</file>
<file>ui/panelMenu.js</file> <file>ui/panelMenu.js</file>
<file>ui/pointerA11yTimeout.js</file>
<file>ui/pointerWatcher.js</file> <file>ui/pointerWatcher.js</file>
<file>ui/popupMenu.js</file> <file>ui/popupMenu.js</file>
<file>ui/remoteSearch.js</file> <file>ui/remoteSearch.js</file>
<file>ui/ripples.js</file>
<file>ui/runDialog.js</file> <file>ui/runDialog.js</file>
<file>ui/screenShield.js</file> <file>ui/screenShield.js</file>
<file>ui/screencast.js</file> <file>ui/screencast.js</file>
@@ -123,7 +120,6 @@
<file>ui/status/accessibility.js</file> <file>ui/status/accessibility.js</file>
<file>ui/status/brightness.js</file> <file>ui/status/brightness.js</file>
<file>ui/status/dwellClick.js</file>
<file>ui/status/location.js</file> <file>ui/status/location.js</file>
<file>ui/status/keyboard.js</file> <file>ui/status/keyboard.js</file>
<file>ui/status/nightLight.js</file> <file>ui/status/nightLight.js</file>

View File

@@ -42,6 +42,8 @@ var IntrospectService = class {
} }
_isStandaloneApp(app) { _isStandaloneApp(app) {
let windows = app.get_windows();
return app.get_windows().some(w => w.transient_for == null); return app.get_windows().some(w => w.transient_for == null);
} }
@@ -53,11 +55,6 @@ var IntrospectService = class {
return APP_WHITELIST.includes(sender); return APP_WHITELIST.includes(sender);
} }
_getSandboxedAppId(app) {
let ids = app.get_windows().map(w => w.get_sandboxed_app_id());
return ids.find(id => id != null);
}
_syncRunningApplications() { _syncRunningApplications() {
let tracker = Shell.WindowTracker.get_default(); let tracker = Shell.WindowTracker.get_default();
let apps = this._appSystem.get_running(); let apps = this._appSystem.get_running();
@@ -79,10 +76,6 @@ var IntrospectService = class {
newActiveApplication = app.get_id(); newActiveApplication = app.get_id();
} }
let sandboxedAppId = this._getSandboxedAppId(app);
if (sandboxedAppId)
appInfo['sandboxed-app-id'] = new GLib.Variant('s', sandboxedAppId);
newRunningApplications[app.get_id()] = appInfo; newRunningApplications[app.get_id()] = appInfo;
} }
@@ -144,7 +137,6 @@ var IntrospectService = class {
let frameRect = window.get_frame_rect(); let frameRect = window.get_frame_rect();
let title = window.get_title(); let title = window.get_title();
let wmClass = window.get_wm_class(); let wmClass = window.get_wm_class();
let sandboxedAppId = window.get_sandboxed_app_id();
windowsList[windowId] = { windowsList[windowId] = {
'app-id': GLib.Variant.new('s', app.get_id()), 'app-id': GLib.Variant.new('s', app.get_id()),
@@ -161,10 +153,6 @@ var IntrospectService = class {
if (wmClass != null) if (wmClass != null)
windowsList[windowId]['wm-class'] = GLib.Variant.new('s', wmClass); windowsList[windowId]['wm-class'] = GLib.Variant.new('s', wmClass);
if (sandboxedAppId != null)
windowsList[windowId]['sandboxed-app-id'] =
GLib.Variant.new('s', sandboxedAppId);
} }
} }
invocation.return_value(new GLib.Variant('(a{ta{sv}})', [windowsList])); invocation.return_value(new GLib.Variant('(a{ta{sv}})', [windowsList]));

View File

@@ -48,28 +48,6 @@ function canLock() {
} }
} }
function registerSessionWithGDM() {
log("Registering session with GDM");
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; let _loginManager = null;
/** /**

View File

@@ -88,42 +88,42 @@ const SystemActions = GObject.registerClass({
name: C_("search-result", "Power Off"), name: C_("search-result", "Power Off"),
iconName: 'system-shutdown-symbolic', iconName: 'system-shutdown-symbolic',
// Translators: A list of keywords that match the power-off action, separated by semicolons // Translators: A list of keywords that match the power-off action, separated by semicolons
keywords: _("power off;shutdown;reboot;restart").split(/[; ]/), keywords: _("power off;shutdown;reboot;restart").split(';'),
available: false }); available: false });
this._actions.set(LOCK_SCREEN_ACTION_ID, this._actions.set(LOCK_SCREEN_ACTION_ID,
{ // Translators: The name of the lock screen action in search { // Translators: The name of the lock screen action in search
name: C_("search-result", "Lock Screen"), name: C_("search-result", "Lock Screen"),
iconName: 'system-lock-screen-symbolic', iconName: 'system-lock-screen-symbolic',
// Translators: A list of keywords that match the lock screen action, separated by semicolons // Translators: A list of keywords that match the lock screen action, separated by semicolons
keywords: _("lock screen").split(/[; ]/), keywords: _("lock screen").split(';'),
available: false }); available: false });
this._actions.set(LOGOUT_ACTION_ID, this._actions.set(LOGOUT_ACTION_ID,
{ // Translators: The name of the logout action in search { // Translators: The name of the logout action in search
name: C_("search-result", "Log Out"), name: C_("search-result", "Log Out"),
iconName: 'application-exit-symbolic', iconName: 'application-exit-symbolic',
// Translators: A list of keywords that match the logout action, separated by semicolons // Translators: A list of keywords that match the logout action, separated by semicolons
keywords: _("logout;log out;sign off").split(/[; ]/), keywords: _("logout;sign off").split(';'),
available: false }); available: false });
this._actions.set(SUSPEND_ACTION_ID, this._actions.set(SUSPEND_ACTION_ID,
{ // Translators: The name of the suspend action in search { // Translators: The name of the suspend action in search
name: C_("search-result", "Suspend"), name: C_("search-result", "Suspend"),
iconName: 'media-playback-pause-symbolic', iconName: 'media-playback-pause-symbolic',
// Translators: A list of keywords that match the suspend action, separated by semicolons // Translators: A list of keywords that match the suspend action, separated by semicolons
keywords: _("suspend;sleep").split(/[; ]/), keywords: _("suspend;sleep").split(';'),
available: false }); available: false });
this._actions.set(SWITCH_USER_ACTION_ID, this._actions.set(SWITCH_USER_ACTION_ID,
{ // Translators: The name of the switch user action in search { // Translators: The name of the switch user action in search
name: C_("search-result", "Switch User"), name: C_("search-result", "Switch User"),
iconName: 'system-switch-user-symbolic', iconName: 'system-switch-user-symbolic',
// Translators: A list of keywords that match the switch user action, separated by semicolons // Translators: A list of keywords that match the switch user action, separated by semicolons
keywords: _("switch user").split(/[; ]/), keywords: _("switch user").split(';'),
available: false }); available: false });
this._actions.set(LOCK_ORIENTATION_ACTION_ID, this._actions.set(LOCK_ORIENTATION_ACTION_ID,
{ // Translators: The name of the lock orientation action in search { // Translators: The name of the lock orientation action in search
name: C_("search-result", "Lock Orientation"), name: C_("search-result", "Lock Orientation"),
iconName: '', iconName: '',
// Translators: A list of keywords that match the lock orientation action, separated by semicolons // Translators: A list of keywords that match the lock orientation action, separated by semicolons
keywords: _("lock orientation;screen;rotation").split(/[; ]/), keywords: _("lock orientation;screen;rotation").split(';'),
available: false }); available: false });
this._loginScreenSettings = new Gio.Settings({ schema_id: LOGIN_SCREEN_SCHEMA }); this._loginScreenSettings = new Gio.Settings({ schema_id: LOGIN_SCREEN_SCHEMA });
@@ -262,7 +262,7 @@ const SystemActions = GObject.registerClass({
let results = []; let results = [];
for (let [key, {available, keywords}] of this._actions) for (let [key, {available, keywords}] of this._actions)
if (available && terms.every(t => keywords.some(k => k.startsWith(t)))) if (available && terms.every(t => keywords.some(k => (k.indexOf(t) >= 0))))
results.push(key); results.push(key);
return results; return results;

View File

@@ -366,7 +366,7 @@ class CloseButton extends St.Button {
} }
_computeBoxPointerOffset() { _computeBoxPointerOffset() {
if (!this._boxPointer || !this._boxPointer.get_stage()) if (!this._boxPointer || !this._boxPointer.actor.get_stage())
return 0; return 0;
let side = this._boxPointer.arrowSide; let side = this._boxPointer.arrowSide;

View File

@@ -1,4 +1,4 @@
const { Clutter, Gio, GLib, GObject, Shell } = imports.gi; const { Clutter, Gio, GLib, Shell } = imports.gi;
const CheckBox = imports.ui.checkBox; const CheckBox = imports.ui.checkBox;
const Dialog = imports.ui.dialog; const Dialog = imports.ui.dialog;
@@ -15,10 +15,9 @@ var DialogResponse = {
CLOSED: 2 CLOSED: 2
}; };
var AccessDialog = GObject.registerClass( var AccessDialog = class extends ModalDialog.ModalDialog {
class AccessDialog extends ModalDialog.ModalDialog { constructor(invocation, handle, title, subtitle, body, options) {
_init(invocation, handle, title, subtitle, body, options) { super({ styleClass: 'access-dialog' });
super._init({ styleClass: 'access-dialog' });
this._invocation = invocation; this._invocation = invocation;
this._handle = handle; this._handle = handle;
@@ -110,7 +109,7 @@ class AccessDialog extends ModalDialog.ModalDialog {
}); });
this.close(); this.close();
} }
}); };
var AccessDialogDBus = class { var AccessDialogDBus = class {
constructor() { constructor() {

View File

@@ -474,10 +474,12 @@ var CyclerList = GObject.registerClass({
} }
}); });
var CyclerPopup = GObject.registerClass({ var CyclerPopup = GObject.registerClass(
GTypeFlags: GObject.TypeFlags.ABSTRACT class CyclerPopup extends SwitcherPopup.SwitcherPopup {
}, class CyclerPopup extends SwitcherPopup.SwitcherPopup {
_init() { _init() {
if (new.target === CyclerPopup)
throw new TypeError('Cannot instantiate abstract class ' + new.target.name);
super._init(); super._init();
this._items = this._getWindows(); this._items = this._getWindows();
@@ -663,14 +665,6 @@ class AppIcon extends St.BoxLayout {
set_size(size) { set_size(size) {
this.icon = this.app.create_icon_texture(size); this.icon = this.app.create_icon_texture(size);
this._iconBin.child = this.icon; this._iconBin.child = this.icon;
this._iconBin.set_size(size, size);
}
vfunc_get_preferred_width(forHeight) {
let [minWidth, ] = super.vfunc_get_preferred_width(forHeight);
minWidth = Math.max(minWidth, forHeight);
return [minWidth, minWidth];
} }
}); });
@@ -728,11 +722,12 @@ class AppSwitcher extends SwitcherPopup.SwitcherList {
j++; j++;
} }
let themeNode = this._items[j].get_theme_node(); let themeNode = this._items[j].get_theme_node();
this._list.ensure_style();
let iconPadding = themeNode.get_horizontal_padding(); let iconPadding = themeNode.get_horizontal_padding();
let iconBorder = themeNode.get_border_width(St.Side.LEFT) + themeNode.get_border_width(St.Side.RIGHT); let iconBorder = themeNode.get_border_width(St.Side.LEFT) + themeNode.get_border_width(St.Side.RIGHT);
let [iconMinHeight, iconNaturalHeight] = this.icons[j].label.get_preferred_height(-1); let [, labelNaturalHeight] = this.icons[j].label.get_preferred_height(-1);
let iconSpacing = iconNaturalHeight + iconPadding + iconBorder; let iconSpacing = labelNaturalHeight + iconPadding + iconBorder;
let totalSpacing = this._list.spacing * (this._items.length - 1); let totalSpacing = this._list.spacing * (this._items.length - 1);
// We just assume the whole screen here due to weirdness happing with the passed width // We just assume the whole screen here due to weirdness happing with the passed width

View File

@@ -98,8 +98,8 @@ function clamp(value, min, max) {
class BaseAppView { class BaseAppView {
constructor(params, gridParams) { constructor(params, gridParams) {
if (this.constructor === BaseAppView) if (new.target === BaseAppView)
throw new TypeError(`Cannot instantiate abstract class ${this.constructor.name}`); throw new TypeError('Cannot instantiate abstract class ' + new.target.name);
gridParams = Params.parse(gridParams, { xAlign: St.Align.MIDDLE, gridParams = Params.parse(gridParams, { xAlign: St.Align.MIDDLE,
columnLimit: MAX_COLUMNS, columnLimit: MAX_COLUMNS,
@@ -414,7 +414,7 @@ var AllView = class AllView extends BaseAppView {
this._refilterApps(); this._refilterApps();
} }
// Overridden from BaseAppView // Overriden from BaseAppView
animate(animationDirection, onComplete) { animate(animationDirection, onComplete) {
this._scrollView.reactive = false; this._scrollView.reactive = false;
let completionFunc = () => { let completionFunc = () => {
@@ -632,9 +632,9 @@ var AllView = class AllView extends BaseAppView {
this._scrollView.get_effect('fade').fade_edges = true; this._scrollView.get_effect('fade').fade_edges = true;
if (this._availWidth != availWidth || this._availHeight != availHeight || oldNPages != this._grid.nPages()) { if (this._availWidth != availWidth || this._availHeight != availHeight || oldNPages != this._grid.nPages()) {
this._adjustment.value = 0;
this._grid.currentPage = 0;
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => {
this._adjustment.value = 0;
this._grid.currentPage = 0;
this._pageIndicators.setNPages(this._grid.nPages()); this._pageIndicators.setNPages(this._grid.nPages());
this._pageIndicators.setCurrentPage(0); this._pageIndicators.setCurrentPage(0);
}); });
@@ -1017,7 +1017,7 @@ var FolderView = class FolderView extends BaseAppView {
Util.ensureActorVisibleInScrollView(this.actor, actor); Util.ensureActorVisibleInScrollView(this.actor, actor);
} }
// Overridden from BaseAppView // Overriden from BaseAppView
animate(animationDirection) { animate(animationDirection) {
this._grid.animatePulse(animationDirection); this._grid.animatePulse(animationDirection);
} }
@@ -1081,7 +1081,7 @@ var FolderView = class FolderView extends BaseAppView {
let contentBox = this.actor.get_theme_node().get_content_box(pageBox); let contentBox = this.actor.get_theme_node().get_content_box(pageBox);
// We only can show icons inside the collection view boxPointer // We only can show icons inside the collection view boxPointer
// so we have to subtract the required padding etc of the boxpointer // so we have to substract the required padding etc of the boxpointer
return [(contentBox.x2 - contentBox.x1) - 2 * this._offsetForEachSide, (contentBox.y2 - contentBox.y1) - 2 * this._offsetForEachSide]; return [(contentBox.x2 - contentBox.x1) - 2 * this._offsetForEachSide, (contentBox.y2 - contentBox.y1) - 2 * this._offsetForEachSide];
} }
@@ -1301,16 +1301,16 @@ var AppFolderPopup = class AppFolderPopup {
x_expand: true, x_expand: true,
x_align: St.Align.START }); x_align: St.Align.START });
this._boxPointer.style_class = 'app-folder-popup'; this._boxPointer.actor.style_class = 'app-folder-popup';
this.actor.add_actor(this._boxPointer); this.actor.add_actor(this._boxPointer.actor);
this._boxPointer.bin.set_child(this._view.actor); this._boxPointer.bin.set_child(this._view.actor);
this.closeButton = Util.makeCloseButton(this._boxPointer); this.closeButton = Util.makeCloseButton(this._boxPointer);
this.closeButton.connect('clicked', this.popdown.bind(this)); this.closeButton.connect('clicked', this.popdown.bind(this));
this.actor.add_actor(this.closeButton); this.actor.add_actor(this.closeButton);
this._boxPointer.bind_property('opacity', this.closeButton, 'opacity', this._boxPointer.actor.bind_property('opacity', this.closeButton, 'opacity',
GObject.BindingFlags.SYNC_CREATE); GObject.BindingFlags.SYNC_CREATE);
global.focus_manager.add_group(this.actor); global.focus_manager.add_group(this.actor);
@@ -1479,7 +1479,7 @@ var AppIcon = class AppIcon {
this.actor.connect('popup-menu', this._onKeyboardPopupMenu.bind(this)); this.actor.connect('popup-menu', this._onKeyboardPopupMenu.bind(this));
this._menu = null; this._menu = null;
this._menuManager = new PopupMenu.PopupMenuManager(this.actor); this._menuManager = new PopupMenu.PopupMenuManager(this);
if (isDraggable) { if (isDraggable) {
this._draggable = DND.makeDraggable(this.actor); this._draggable = DND.makeDraggable(this.actor);
@@ -1707,20 +1707,25 @@ var AppIconMenu = class AppIconMenu extends PopupMenu.PopupMenu {
w => !w.skip_taskbar w => !w.skip_taskbar
); );
if (windows.length > 0) // Display the app windows menu items and the separator between windows
this.addMenuItem( // of the current desktop and other windows.
/* Translators: This is the heading of a list of open windows */ let workspaceManager = global.workspace_manager;
new PopupMenu.PopupSeparatorMenuItem(_("Open Windows")) let activeWorkspace = workspaceManager.get_active_workspace();
); let separatorShown = windows.length > 0 && windows[0].get_workspace() != activeWorkspace;
windows.forEach(window => { for (let i = 0; i < windows.length; i++) {
let window = windows[i];
if (!separatorShown && window.get_workspace() != activeWorkspace) {
this._appendSeparator();
separatorShown = true;
}
let title = window.title ? window.title let title = window.title ? window.title
: this._source.app.get_name(); : this._source.app.get_name();
let item = this._appendMenuItem(title); let item = this._appendMenuItem(title);
item.connect('activate', () => { item.connect('activate', () => {
this.emit('activate-window', window); this.emit('activate-window', window);
}); });
}); }
if (!this._source.app.is_window_backed()) { if (!this._source.app.is_window_backed()) {
this._appendSeparator(); this._appendSeparator();

View File

@@ -1,4 +1,4 @@
const { Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi; const { Clutter, Gio, GLib, Meta, Shell, St } = imports.gi;
const Main = imports.ui.main; const Main = imports.ui.main;
const ModalDialog = imports.ui.modalDialog; const ModalDialog = imports.ui.modalDialog;
@@ -13,11 +13,10 @@ var AudioDevice = {
const AudioDeviceSelectionIface = loadInterfaceXML('org.gnome.Shell.AudioDeviceSelection'); const AudioDeviceSelectionIface = loadInterfaceXML('org.gnome.Shell.AudioDeviceSelection');
var AudioDeviceSelectionDialog = GObject.registerClass({ var AudioDeviceSelectionDialog =
Signals: { 'device-selected': { param_types: [GObject.TYPE_UINT] } } class AudioDeviceSelectionDialog extends ModalDialog.ModalDialog {
}, class AudioDeviceSelectionDialog extends ModalDialog.ModalDialog { constructor(devices) {
_init(devices) { super({ styleClass: 'audio-device-selection-dialog' });
super._init({ styleClass: 'audio-device-selection-dialog' });
this._deviceItems = {}; this._deviceItems = {};
@@ -34,6 +33,10 @@ var AudioDeviceSelectionDialog = GObject.registerClass({
throw new Error('Too few devices for a selection'); throw new Error('Too few devices for a selection');
} }
destroy() {
super.destroy();
}
_buildLayout(devices) { _buildLayout(devices) {
let title = new St.Label({ style_class: 'audio-selection-title', let title = new St.Label({ style_class: 'audio-selection-title',
text: _("Select Audio Device"), text: _("Select Audio Device"),
@@ -122,7 +125,7 @@ var AudioDeviceSelectionDialog = GObject.registerClass({
Main.overview.hide(); Main.overview.hide();
app.activate(); app.activate();
} }
}); };
var AudioDeviceSelectionDBus = class AudioDeviceSelectionDBus { var AudioDeviceSelectionDBus = class AudioDeviceSelectionDBus {
constructor() { constructor() {

View File

@@ -257,15 +257,14 @@ var Background = class Background {
this._refreshAnimation(); this._refreshAnimation();
}); });
this._settingsChangedSignalId = this._settingsChangedSignalId = this._settings.connect('changed', () => {
this._settings.connect('changed', this._emitChangedSignal.bind(this)); this.emit('changed');
});
this._load(); this._load();
} }
destroy() { destroy() {
this.background = null;
this._cancellable.cancel(); this._cancellable.cancel();
this._removeAnimationTimeout(); this._removeAnimationTimeout();
@@ -289,22 +288,6 @@ var Background = class Background {
if (this._settingsChangedSignalId != 0) if (this._settingsChangedSignalId != 0)
this._settings.disconnect(this._settingsChangedSignalId); this._settings.disconnect(this._settingsChangedSignalId);
this._settingsChangedSignalId = 0; this._settingsChangedSignalId = 0;
if (this._changedIdleId) {
GLib.source_remove(this._changedIdleId);
this._changedIdleId = 0;
}
}
_emitChangedSignal() {
if (this._changedIdleId)
return;
this._changedIdleId = GLib.idle_add(GLib.PRIORITY_DEFAULT, () => {
this._changedIdleId = 0;
this.emit('changed');
return GLib.SOURCE_REMOVE;
});
} }
updateResolution() { updateResolution() {
@@ -360,7 +343,7 @@ var Background = class Background {
if (changedFile.equal(file)) { if (changedFile.equal(file)) {
let imageCache = Meta.BackgroundImageCache.get_default(); let imageCache = Meta.BackgroundImageCache.get_default();
imageCache.purge(changedFile); imageCache.purge(changedFile);
this._emitChangedSignal(); this.emit('changed');
} }
}); });
this._fileWatches[key] = signalId; this._fileWatches[key] = signalId;
@@ -716,6 +699,7 @@ var BackgroundManager = class BackgroundManager {
time: FADE_ANIMATION_TIME, time: FADE_ANIMATION_TIME,
transition: 'easeOutQuad', transition: 'easeOutQuad',
onComplete() { onComplete() {
oldBackgroundActor.background.run_dispose();
oldBackgroundActor.destroy(); oldBackgroundActor.destroy();
} }
}); });

View File

@@ -25,7 +25,7 @@ var BackgroundMenu = class BackgroundMenu extends PopupMenu.PopupMenu {
function addBackgroundMenu(actor, layoutManager) { function addBackgroundMenu(actor, layoutManager) {
actor.reactive = true; actor.reactive = true;
actor._backgroundMenu = new BackgroundMenu(layoutManager); actor._backgroundMenu = new BackgroundMenu(layoutManager);
actor._backgroundManager = new PopupMenu.PopupMenuManager(actor); actor._backgroundManager = new PopupMenu.PopupMenuManager({ actor: actor });
actor._backgroundManager.addMenu(actor._backgroundMenu); actor._backgroundManager.addMenu(actor._backgroundMenu);
function openMenu(x, y) { function openMenu(x, y) {

View File

@@ -33,6 +33,8 @@ var BoxPointer = GObject.registerClass({
_init(arrowSide, binProperties) { _init(arrowSide, binProperties) {
super._init(); super._init();
this.actor = this;
this.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS); this.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS);
this._arrowSide = arrowSide; this._arrowSide = arrowSide;
@@ -76,6 +78,36 @@ var BoxPointer = GObject.registerClass({
} }
} }
// BoxPointer.show() and BoxPointer.hide() are here for only compatibility
// purposes, and will be removed in 3.32.
show(animate, onComplete) {
if (animate !== undefined) {
try {
throw new Error('BoxPointer.show() has been moved to BoxPointer.open(), this code will break in the future.');
} catch(e) {
logError(e);
this.open(animate, onComplete);
return;
}
}
this.visible = true;
}
hide(animate, onComplete) {
if (animate !== undefined) {
try {
throw new Error('BoxPointer.hide() has been moved to BoxPointer.close(), this code will break in the future.');
} catch(e) {
logError(e);
this.close(animate, onComplete);
return;
}
}
this.visible = false;
}
open(animate, onComplete) { open(animate, onComplete) {
let themeNode = this.get_theme_node(); let themeNode = this.get_theme_node();
let rise = themeNode.get_length('-arrow-rise'); let rise = themeNode.get_length('-arrow-rise');
@@ -204,10 +236,13 @@ var BoxPointer = GObject.registerClass({
this.set_allocation(box, flags); this.set_allocation(box, flags);
let themeNode = this.get_theme_node(); let themeNode = this.get_theme_node();
box = themeNode.get_content_box(box);
let borderWidth = themeNode.get_length('-arrow-border-width'); let borderWidth = themeNode.get_length('-arrow-border-width');
let rise = themeNode.get_length('-arrow-rise'); let rise = themeNode.get_length('-arrow-rise');
let childBox = new Clutter.ActorBox(); let childBox = new Clutter.ActorBox();
let [availWidth, availHeight] = themeNode.get_content_box(box).get_size(); let availWidth = box.x2 - box.x1;
let availHeight = box.y2 - box.y1;
childBox.x1 = 0; childBox.x1 = 0;
childBox.y1 = 0; childBox.y1 = 0;
@@ -236,9 +271,8 @@ var BoxPointer = GObject.registerClass({
this.bin.allocate(childBox, flags); this.bin.allocate(childBox, flags);
if (this._sourceActor && this._sourceActor.mapped) { if (this._sourceActor && this._sourceActor.mapped) {
this._reposition(box); this._reposition();
this._updateFlip(box); this._updateFlip();
this.set_allocation(box, flags);
} }
} }
@@ -425,6 +459,10 @@ var BoxPointer = GObject.registerClass({
} }
setPosition(sourceActor, alignment) { setPosition(sourceActor, alignment) {
// We need to show it now to force an allocation,
// so that we can query the correct size.
this.show();
if (!this._sourceActor || sourceActor != this._sourceActor) { if (!this._sourceActor || sourceActor != this._sourceActor) {
if (this._sourceActorDestroyId) { if (this._sourceActorDestroyId) {
this._sourceActor.disconnect(this._sourceActorDestroyId); this._sourceActor.disconnect(this._sourceActorDestroyId);
@@ -440,10 +478,13 @@ var BoxPointer = GObject.registerClass({
}) })
} }
} }
this._arrowAlignment = alignment; this._arrowAlignment = alignment;
this.queue_relayout(); if (!this._sourceActor)
return;
this._reposition();
this._updateFlip();
} }
setSourceAlignment(alignment) { setSourceAlignment(alignment) {
@@ -455,7 +496,7 @@ var BoxPointer = GObject.registerClass({
this.setPosition(this._sourceActor, this._arrowAlignment); this.setPosition(this._sourceActor, this._arrowAlignment);
} }
_reposition(allocationBox) { _reposition() {
let sourceActor = this._sourceActor; let sourceActor = this._sourceActor;
let alignment = this._arrowAlignment; let alignment = this._arrowAlignment;
let monitorIndex = Main.layoutManager.findIndexForActor(sourceActor); let monitorIndex = Main.layoutManager.findIndexForActor(sourceActor);
@@ -569,7 +610,8 @@ var BoxPointer = GObject.registerClass({
} }
// Actually set the position // Actually set the position
allocationBox.set_origin(Math.floor(x), Math.floor(y)); this.x = Math.floor(x);
this.y = Math.floor(y);
} }
// @origin: Coordinate specifying middle of the arrow, along // @origin: Coordinate specifying middle of the arrow, along
@@ -623,11 +665,15 @@ var BoxPointer = GObject.registerClass({
return arrowSide; return arrowSide;
} }
_updateFlip(allocationBox) { _updateFlip() {
let arrowSide = this._calculateArrowSide(this._userArrowSide); let arrowSide = this._calculateArrowSide(this._userArrowSide);
if (this._arrowSide != arrowSide) { if (this._arrowSide != arrowSide) {
this._arrowSide = arrowSide; this._arrowSide = arrowSide;
this._reposition(allocationBox); this._reposition();
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => {
this.queue_relayout();
return false;
});
this.emit('arrow-side-changed'); this.emit('arrow-side-changed');
} }

View File

@@ -5,7 +5,6 @@ const Mainloop = imports.mainloop;
const Params = imports.misc.params; const Params = imports.misc.params;
const GnomeSession = imports.misc.gnomeSession; const GnomeSession = imports.misc.gnomeSession;
const Main = imports.ui.main;
const ShellMountOperation = imports.ui.shellMountOperation; const ShellMountOperation = imports.ui.shellMountOperation;
var GNOME_SESSION_AUTOMOUNT_INHIBIT = 16; var GNOME_SESSION_AUTOMOUNT_INHIBIT = 16;
@@ -200,20 +199,12 @@ var AutomountManager = class {
// error strings are not unique for the cases in the comments below. // error strings are not unique for the cases in the comments below.
if (e.message.includes('No key available with this passphrase') || // cryptsetup if (e.message.includes('No key available with this passphrase') || // cryptsetup
e.message.includes('No key available to unlock device') || // udisks (no password) e.message.includes('No key available to unlock device') || // udisks (no password)
// libblockdev wrong password opening LUKS device e.message.includes('Error unlocking')) { // udisks (wrong password)
e.message.includes('Failed to activate device: Incorrect passphrase') ||
// cryptsetup returns EINVAL in many cases, including wrong TCRYPT password/parameters
e.message.includes('Failed to load device\'s parameters: Invalid argument')) {
this._reaskPassword(volume); this._reaskPassword(volume);
} else { } else {
if (e.message.includes('Compiled against a version of libcryptsetup that does not support the VeraCrypt PIM setting')) {
Main.notifyError(_("Unable to unlock volume"),
_("The installed udisks version does not support the PIM setting"));
}
if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.FAILED_HANDLED)) if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.FAILED_HANDLED))
log('Unable to mount volume ' + volume.get_name() + ': ' + e.toString()); log('Unable to mount volume ' + volume.get_name() + ': ' + e.toString());
this._closeOperation(volume); this._closeOperation(volume);
} }
} }

View File

@@ -10,10 +10,9 @@ const CheckBox = imports.ui.checkBox;
var WORK_SPINNER_ICON_SIZE = 16; var WORK_SPINNER_ICON_SIZE = 16;
var KeyringDialog = GObject.registerClass( var KeyringDialog = class extends ModalDialog.ModalDialog {
class KeyringDialog extends ModalDialog.ModalDialog { constructor() {
_init() { super({ styleClass: 'prompt-dialog' });
super._init({ styleClass: 'prompt-dialog' });
this.prompt = new Shell.KeyringPrompt(); this.prompt = new Shell.KeyringPrompt();
this.prompt.connect('show-password', this._onShowPassword.bind(this)); this.prompt.connect('show-password', this._onShowPassword.bind(this));
@@ -24,8 +23,20 @@ class KeyringDialog extends ModalDialog.ModalDialog {
this._content = new Dialog.MessageDialogContent({ icon }); this._content = new Dialog.MessageDialogContent({ icon });
this.contentLayout.add(this._content); this.contentLayout.add(this._content);
// FIXME: Why does this break now?
/*
this.prompt.bind_property('message', this._content, 'title', GObject.BindingFlags.SYNC_CREATE); this.prompt.bind_property('message', this._content, 'title', GObject.BindingFlags.SYNC_CREATE);
this.prompt.bind_property('description', this._content, 'body', GObject.BindingFlags.SYNC_CREATE); this.prompt.bind_property('description', this._content, 'body', GObject.BindingFlags.SYNC_CREATE);
*/
this.prompt.connect('notify::message', () => {
this._content.title = this.prompt.message;
});
this._content.title = this.prompt.message;
this.prompt.connect('notify::description', () => {
this._content.body = this.prompt.description;
});
this._content.body = this.prompt.description;
this._workSpinner = null; this._workSpinner = null;
this._controlTable = null; this._controlTable = null;
@@ -213,7 +224,7 @@ class KeyringDialog extends ModalDialog.ModalDialog {
_onCancelButton() { _onCancelButton() {
this.prompt.cancel(); this.prompt.cancel();
} }
}); };
var KeyringDummyDialog = class { var KeyringDummyDialog = class {
constructor() { constructor() {

View File

@@ -1,6 +1,6 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const { Clutter, Gio, GLib, GObject, NM, Pango, Shell, St } = imports.gi; const { Clutter, Gio, GLib, NM, Pango, Shell, St } = imports.gi;
const Signals = imports.signals; const Signals = imports.signals;
const Config = imports.misc.config; const Config = imports.misc.config;
@@ -12,10 +12,9 @@ const ShellEntry = imports.ui.shellEntry;
const VPN_UI_GROUP = 'VPN Plugin UI'; const VPN_UI_GROUP = 'VPN Plugin UI';
var NetworkSecretDialog = GObject.registerClass( var NetworkSecretDialog = class extends ModalDialog.ModalDialog {
class NetworkSecretDialog extends ModalDialog.ModalDialog { constructor(agent, requestId, connection, settingName, hints, flags, contentOverride) {
_init(agent, requestId, connection, settingName, hints, flags, contentOverride) { super({ styleClass: 'prompt-dialog' });
super._init({ styleClass: 'prompt-dialog' });
this._agent = agent; this._agent = agent;
this._requestId = requestId; this._requestId = requestId;
@@ -348,7 +347,7 @@ class NetworkSecretDialog extends ModalDialog.ModalDialog {
return content; return content;
} }
}); };
var VPNRequestHandler = class { var VPNRequestHandler = class {
constructor(agent, requestId, authHelper, serviceType, connection, hints, flags) { constructor(agent, requestId, authHelper, serviceType, connection, hints, flags) {

View File

@@ -1,7 +1,7 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const { AccountsService, Clutter, Gio, GLib, const { AccountsService, Clutter, Gio, GLib,
GObject, Pango, PolkitAgent, Polkit, Shell, St } = imports.gi; Pango, PolkitAgent, Polkit, Shell, St } = imports.gi;
const Signals = imports.signals; const Signals = imports.signals;
const Animation = imports.ui.animation; const Animation = imports.ui.animation;
@@ -15,11 +15,9 @@ var DIALOG_ICON_SIZE = 48;
var WORK_SPINNER_ICON_SIZE = 16; var WORK_SPINNER_ICON_SIZE = 16;
var AuthenticationDialog = GObject.registerClass({ var AuthenticationDialog = class extends ModalDialog.ModalDialog {
Signals: { 'done': { param_types: [GObject.TYPE_BOOLEAN] } } constructor(actionId, body, cookie, userNames) {
}, class AuthenticationDialog extends ModalDialog.ModalDialog { super({ styleClass: 'prompt-dialog' });
_init(actionId, body, cookie, userNames) {
super._init({ styleClass: 'prompt-dialog' });
this.actionId = actionId; this.actionId = actionId;
this.message = body; this.message = body;
@@ -27,7 +25,7 @@ var AuthenticationDialog = GObject.registerClass({
this._wasDismissed = false; this._wasDismissed = false;
this._sessionUpdatedId = Main.sessionMode.connect('updated', () => { this._sessionUpdatedId = Main.sessionMode.connect('updated', () => {
this.visible = !Main.sessionMode.isLocked; this._group.visible = !Main.sessionMode.isLocked;
}); });
this.connect('closed', this._onDialogClosed.bind(this)); this.connect('closed', this._onDialogClosed.bind(this));
@@ -328,7 +326,8 @@ var AuthenticationDialog = GObject.registerClass({
this._destroySession(); this._destroySession();
} }
}); };
Signals.addSignalMethods(AuthenticationDialog.prototype);
var AuthenticationAgent = class { var AuthenticationAgent = class {
constructor() { constructor() {

View File

@@ -401,7 +401,7 @@ var ChatSource = class extends MessageTray.Source {
if (this._client.is_handling_channel(this._channel)) { if (this._client.is_handling_channel(this._channel)) {
// We are handling the channel, try to pass it to Empathy or Polari // We are handling the channel, try to pass it to Empathy or Polari
// (depending on the channel type) // (depending on the channel type)
// We don't check if either app is available - mission control will // We don't check if either app is availble - mission control will
// fallback to something else if activation fails // fallback to something else if activation fails
let target; let target;

View File

@@ -899,7 +899,7 @@ var Dash = class Dash {
favPos++; favPos++;
} }
// No drag placeholder means we don't want to favorite the app // No drag placeholder means we don't wan't to favorite the app
// and we are dragging it to its original position // and we are dragging it to its original position
if (!this._dragPlaceholder) if (!this._dragPlaceholder)
return true; return true;

View File

@@ -476,9 +476,10 @@ class DateMenuButton extends PanelMenu.Button {
box.add_actor(this._clockDisplay); box.add_actor(this._clockDisplay);
box.add_actor(this._indicator.actor); box.add_actor(this._indicator.actor);
this.label_actor = this._clockDisplay; this.actor.label_actor = this._clockDisplay;
this.add_actor(box); this.actor.add_actor(box);
this.add_style_class_name ('clock-display'); this.actor.add_style_class_name ('clock-display');
let layout = new FreezableBinLayout(); let layout = new FreezableBinLayout();
let bin = new St.Widget({ layout_manager: layout }); let bin = new St.Widget({ layout_manager: layout });

View File

@@ -177,8 +177,8 @@ var MessageDialogContent = GObject.registerClass({
let textProps = { ellipsize: Pango.EllipsizeMode.NONE, let textProps = { ellipsize: Pango.EllipsizeMode.NONE,
line_wrap: true }; line_wrap: true };
this._subtitle.clutter_text.set(textProps); Object.assign(this._subtitle.clutter_text, textProps);
this._body.clutter_text.set(textProps); Object.assign(this._body.clutter_text, textProps);
if (!params.hasOwnProperty('style_class')) if (!params.hasOwnProperty('style_class'))
params.style_class = 'message-dialog-main-layout'; params.style_class = 'message-dialog-main-layout';

View File

@@ -19,7 +19,7 @@
const Mainloop = imports.mainloop; const Mainloop = imports.mainloop;
const { AccountsService, Clutter, Gio, const { AccountsService, Clutter, Gio,
GLib, GObject, Pango, Polkit, Shell, St } = imports.gi; GLib, Pango, Polkit, Shell, St } = imports.gi;
const CheckBox = imports.ui.checkBox; const CheckBox = imports.ui.checkBox;
const GnomeSession = imports.misc.gnomeSession; const GnomeSession = imports.misc.gnomeSession;
@@ -226,11 +226,10 @@ function init() {
_endSessionDialog = new EndSessionDialog(); _endSessionDialog = new EndSessionDialog();
} }
var EndSessionDialog = GObject.registerClass( var EndSessionDialog = class EndSessionDialog extends ModalDialog.ModalDialog {
class EndSessionDialog extends ModalDialog.ModalDialog { constructor() {
_init() { super({ styleClass: 'end-session-dialog',
super._init({ styleClass: 'end-session-dialog', destroyOnClose: false });
destroyOnClose: false });
this._loginManager = LoginManager.getLoginManager(); this._loginManager = LoginManager.getLoginManager();
this._userManager = AccountsService.UserManager.get_default(); this._userManager = AccountsService.UserManager.get_default();
@@ -748,4 +747,4 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
Close(parameters, invocation) { Close(parameters, invocation) {
this.close(); this.close();
} }
}); };

View File

@@ -96,15 +96,6 @@ function init() {
Clutter.Actor.prototype.toString = function() { Clutter.Actor.prototype.toString = function() {
return St.describe_actor(this); return St.describe_actor(this);
}; };
// Deprecation warning for former JS classes turned into an actor subclass
Object.defineProperty(Clutter.Actor.prototype, 'actor', {
get() {
let klass = this.constructor.name;
let { stack } = new Error();
log(`Usage of object.actor is deprecated for ${klass}\n${stack}`);
return this;
}
});
let origToString = Object.prototype.toString; let origToString = Object.prototype.toString;
Object.prototype.toString = function() { Object.prototype.toString = function() {

View File

@@ -1,6 +1,6 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const { Clutter, Gio, GLib, GObject, Soup, St } = imports.gi; const { Clutter, Gio, GLib, Soup, St } = imports.gi;
const Config = imports.misc.config; const Config = imports.misc.config;
const ExtensionUtils = imports.misc.extensionUtils; const ExtensionUtils = imports.misc.extensionUtils;
@@ -176,10 +176,10 @@ function checkForUpdates() {
}); });
} }
var InstallExtensionDialog = GObject.registerClass( var InstallExtensionDialog =
class InstallExtensionDialog extends ModalDialog.ModalDialog { class InstallExtensionDialog extends ModalDialog.ModalDialog {
_init(uuid, info, invocation) { constructor(uuid, info, invocation) {
super._init({ styleClass: 'extension-dialog' }); super({ styleClass: 'extension-dialog' });
this._uuid = uuid; this._uuid = uuid;
this._info = info; this._info = info;
@@ -255,7 +255,7 @@ class InstallExtensionDialog extends ModalDialog.ModalDialog {
this.close(); this.close();
} }
}); };
function init() { function init() {
_httpSession = new Soup.SessionAsync({ ssl_use_system_ca_file: true }); _httpSession = new Soup.SessionAsync({ ssl_use_system_ca_file: true });

View File

@@ -43,9 +43,6 @@ function _popGrabHelper(grabHelper) {
// call grab(). // call grab().
var GrabHelper = class GrabHelper { var GrabHelper = class GrabHelper {
constructor(owner, params) { constructor(owner, params) {
if (!(owner instanceof Clutter.Actor))
throw new Error('GrabHelper owner must be a Clutter.Actor');
this._owner = owner; this._owner = owner;
this._modalParams = params; this._modalParams = params;

View File

@@ -272,7 +272,7 @@ var CandidatePopup = class CandidatePopup {
_setDummyCursorGeometry(x, y, w, h) { _setDummyCursorGeometry(x, y, w, h) {
Main.layoutManager.setDummyCursorGeometry(x, y, w, h); Main.layoutManager.setDummyCursorGeometry(x, y, w, h);
if (this._boxPointer.visible) if (this._boxPointer.actor.visible)
this._boxPointer.setPosition(Main.layoutManager.dummyCursor, 0); this._boxPointer.setPosition(Main.layoutManager.dummyCursor, 0);
} }
@@ -285,7 +285,7 @@ var CandidatePopup = class CandidatePopup {
if (isVisible) { if (isVisible) {
this._boxPointer.setPosition(Main.layoutManager.dummyCursor, 0); this._boxPointer.setPosition(Main.layoutManager.dummyCursor, 0);
this._boxPointer.open(BoxPointer.PopupAnimation.NONE); this._boxPointer.open(BoxPointer.PopupAnimation.NONE);
this._boxPointer.raise_top(); this._boxPointer.actor.raise_top();
} else { } else {
this._boxPointer.close(BoxPointer.PopupAnimation.NONE); this._boxPointer.close(BoxPointer.PopupAnimation.NONE);
} }

View File

@@ -43,6 +43,8 @@ class BaseIcon extends St.Bin {
x_fill: true, x_fill: true,
y_fill: true }); y_fill: true });
this.actor = this;
this.connect('destroy', this._onDestroy.bind(this)); this.connect('destroy', this._onDestroy.bind(this));
this._box = new St.BoxLayout({ vertical: true }); this._box = new St.BoxLayout({ vertical: true });
@@ -79,7 +81,7 @@ class BaseIcon extends St.Bin {
// This can be overridden by a subclass, or by the createIcon // This can be overridden by a subclass, or by the createIcon
// parameter to _init() // parameter to _init()
createIcon(size) { createIcon(size) {
throw new GObject.NotImplementedError(`createIcon in ${this.constructor.name}`); throw new Error('no implementation of createIcon in ' + this);
} }
setIconSize(size) { setIconSize(size) {
@@ -186,6 +188,8 @@ var IconGrid = GObject.registerClass({
super._init({ style_class: 'icon-grid', super._init({ style_class: 'icon-grid',
y_align: Clutter.ActorAlign.START }); y_align: Clutter.ActorAlign.START });
this.actor = this;
params = Params.parse(params, { rowLimit: null, params = Params.parse(params, { rowLimit: null,
columnLimit: null, columnLimit: null,
minRows: 1, minRows: 1,
@@ -322,7 +326,6 @@ var IconGrid = GObject.registerClass({
leftEmptySpace = availWidth - usedWidth; leftEmptySpace = availWidth - usedWidth;
} }
let animating = this._clonesAnimating.length > 0;
let x = box.x1 + leftEmptySpace + this.leftPadding; let x = box.x1 + leftEmptySpace + this.leftPadding;
let y = box.y1 + this.topPadding; let y = box.y1 + this.topPadding;
let columnIndex = 0; let columnIndex = 0;
@@ -332,11 +335,10 @@ var IconGrid = GObject.registerClass({
if (this._rowLimit && rowIndex >= this._rowLimit || if (this._rowLimit && rowIndex >= this._rowLimit ||
this._fillParent && childBox.y2 > availHeight - this.bottomPadding) { this._fillParent && childBox.y2 > availHeight - this.bottomPadding) {
children[i].opacity = 0; children[i].hide();
} else { } else {
if (!animating)
children[i].opacity = 255;
children[i].allocate(childBox, flags); children[i].allocate(childBox, flags);
children[i].show();
} }
columnIndex++; columnIndex++;
@@ -380,7 +382,7 @@ var IconGrid = GObject.registerClass({
child != null; child != null;
child = child.get_next_sibling()) { child = child.get_next_sibling()) {
if (!child.visible || !child.opacity) if (!child.visible)
continue; continue;
let childVolume = child.get_transformed_paint_volume(this); let childVolume = child.get_transformed_paint_volume(this);
@@ -418,8 +420,7 @@ var IconGrid = GObject.registerClass({
animatePulse(animationDirection) { animatePulse(animationDirection) {
if (animationDirection != AnimationDirection.IN) if (animationDirection != AnimationDirection.IN)
throw new GObject.NotImplementedError("Pulse animation only implements " + throw new Error("Pulse animation only implements 'in' animation direction");
"'in' animation direction");
this._cancelAnimation(); this._cancelAnimation();
@@ -843,7 +844,7 @@ var PaginatedIconGrid = GObject.registerClass({
} }
} }
// Overridden from IconGrid // Overriden from IconGrid
_getChildrenToAnimate() { _getChildrenToAnimate() {
let children = this._getVisibleChildren(); let children = this._getVisibleChildren();
let firstIndex = this._childrenPerPage * this.currentPage; let firstIndex = this._childrenPerPage * this.currentPage;

View File

@@ -282,11 +282,11 @@ var Key = class Key {
y_fill: true, y_fill: true,
x_align: St.Align.START }); x_align: St.Align.START });
this._boxPointer.hide(); this._boxPointer.hide();
Main.layoutManager.addTopChrome(this._boxPointer); Main.layoutManager.addChrome(this._boxPointer.actor);
this._boxPointer.setPosition(this.keyButton, 0.5); this._boxPointer.setPosition(this.keyButton, 0.5);
// Adds style to existing keyboard style to avoid repetition // Adds style to existing keyboard style to avoid repetition
this._boxPointer.add_style_class_name('keyboard-subkeys'); this._boxPointer.actor.add_style_class_name('keyboard-subkeys');
this._getExtendedKeys(); this._getExtendedKeys();
this.keyButton._extended_keys = this._extended_keyboard; this.keyButton._extended_keys = this._extended_keyboard;
} }
@@ -1049,7 +1049,7 @@ var Keyboard = class Keyboard {
this._a11yApplicationsSettings.connect('changed', this._syncEnabled.bind(this)); this._a11yApplicationsSettings.connect('changed', this._syncEnabled.bind(this));
this._lastDeviceId = null; this._lastDeviceId = null;
this._suggestions = null; this._suggestions = null;
this._emojiKeyVisible = Meta.is_wayland_compositor(); this._emojiKeyVisible = true;
this._focusTracker = new FocusTracker(); this._focusTracker = new FocusTracker();
this._focusTracker.connect('position-changed', this._onFocusPositionChanged.bind(this)); this._focusTracker.connect('position-changed', this._onFocusPositionChanged.bind(this));
@@ -1144,7 +1144,6 @@ var Keyboard = class Keyboard {
this._keyboardController.disconnect(this._keypadVisibleId); this._keyboardController.disconnect(this._keypadVisibleId);
if (this._focusNotifyId) if (this._focusNotifyId)
global.stage.disconnect(this._focusNotifyId); global.stage.disconnect(this._focusNotifyId);
this._clearShowIdle();
this._keyboard = null; this._keyboard = null;
this.actor.destroy(); this.actor.destroy();
this.actor = null; this.actor = null;
@@ -1163,7 +1162,7 @@ var Keyboard = class Keyboard {
this._keyboardController = new KeyboardController(); this._keyboardController = new KeyboardController();
this._groups = {}; this._groups = {};
this._currentPage = null; this._current_page = null;
this._suggestions = new Suggestions(); this._suggestions = new Suggestions();
this.actor.add(this._suggestions.actor, this.actor.add(this._suggestions.actor,
@@ -1203,12 +1202,10 @@ var Keyboard = class Keyboard {
this._keyboardNotifyId = this._keyboardController.connect('active-group', this._onGroupChanged.bind(this)); this._keyboardNotifyId = this._keyboardController.connect('active-group', this._onGroupChanged.bind(this));
this._keyboardGroupsChangedId = this._keyboardController.connect('groups-changed', this._onKeyboardGroupsChanged.bind(this)); this._keyboardGroupsChangedId = this._keyboardController.connect('groups-changed', this._onKeyboardGroupsChanged.bind(this));
this._keyboardStateId = this._keyboardController.connect('panel-state', this._onKeyboardStateChanged.bind(this)); this._keyboardStateId = this._keyboardController.connect('panel-state', this._onKeyboardStateChanged.bind(this));
this._emojiKeyVisibleId = this._keyboardController.connect('emoji-visible', this._onEmojiKeyVisible.bind(this));
this._keypadVisibleId = this._keyboardController.connect('keypad-visible', this._onKeypadVisible.bind(this)); this._keypadVisibleId = this._keyboardController.connect('keypad-visible', this._onKeypadVisible.bind(this));
this._focusNotifyId = global.stage.connect('notify::key-focus', this._onKeyFocusChanged.bind(this)); this._focusNotifyId = global.stage.connect('notify::key-focus', this._onKeyFocusChanged.bind(this));
if (Meta.is_wayland_compositor())
this._emojiKeyVisibleId = this._keyboardController.connect('emoji-visible', this._onEmojiKeyVisible.bind(this));
this._relayout(); this._relayout();
} }
@@ -1230,7 +1227,6 @@ var Keyboard = class Keyboard {
if (!this._showIdleId) { if (!this._showIdleId) {
this._showIdleId = GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => { this._showIdleId = GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => {
this.show(Main.layoutManager.focusIndex); this.show(Main.layoutManager.focusIndex);
this._showIdleId = 0;
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
}); });
GLib.Source.set_name_by_id(this._showIdleId, '[gnome-shell] this.show'); GLib.Source.set_name_by_id(this._showIdleId, '[gnome-shell] this.show');
@@ -1306,7 +1302,7 @@ var Keyboard = class Keyboard {
this._languagePopup.destroy(); this._languagePopup.destroy();
this._languagePopup = new LanguageSelectionPopup(keyActor); this._languagePopup = new LanguageSelectionPopup(keyActor);
Main.layoutManager.addTopChrome(this._languagePopup.actor); Main.layoutManager.addChrome(this._languagePopup.actor);
this._languagePopup.open(true); this._languagePopup.open(true);
} }
@@ -1357,7 +1353,7 @@ var Keyboard = class Keyboard {
} else if (switchToLevel == 1) { } else if (switchToLevel == 1) {
extraButton.connect('long-press', () => { extraButton.connect('long-press', () => {
this._latched = true; this._latched = true;
this._setCurrentLevelLatched(this._currentPage, this._latched); this._setCurrentLevelLatched(this._current_page, this._latched);
}); });
} }
@@ -1384,8 +1380,8 @@ var Keyboard = class Keyboard {
} }
_updateCurrentPageVisible() { _updateCurrentPageVisible() {
if (this._currentPage) if (this._current_page)
this._currentPage.visible = !this._emojiActive && !this._keypadVisible; this._current_page.visible = !this._emojiActive && !this._keypadVisible;
} }
_setEmojiActive(active) { _setEmojiActive(active) {
@@ -1444,7 +1440,7 @@ var Keyboard = class Keyboard {
_getGridSlots() { _getGridSlots() {
let numOfHorizSlots = 0, numOfVertSlots; let numOfHorizSlots = 0, numOfVertSlots;
let rows = this._currentPage.get_children(); let rows = this._current_page.get_children();
numOfVertSlots = rows.length; numOfVertSlots = rows.length;
for (let i = 0; i < rows.length; ++i) { for (let i = 0; i < rows.length; ++i) {
@@ -1521,24 +1517,13 @@ var Keyboard = class Keyboard {
_setActiveLayer(activeLevel) { _setActiveLayer(activeLevel) {
let activeGroupName = this._keyboardController.getCurrentGroup(); let activeGroupName = this._keyboardController.getCurrentGroup();
let layers = this._groups[activeGroupName]; let layers = this._groups[activeGroupName];
let currentPage = layers[activeLevel];
if (this._currentPage == currentPage) { if (this._current_page != null) {
this._updateCurrentPageVisible(); this._setCurrentLevelLatched(this._current_page, false);
return; this._current_page.hide();
} }
if (this._currentPage != null) { this._current_page = layers[activeLevel];
this._setCurrentLevelLatched(this._currentPage, false);
this._currentPage.disconnect(this._currentPage._destroyID);
this._currentPage.hide();
delete this._currentPage._destroyID;
}
this._currentPage = currentPage;
this._currentPage._destroyID = this._currentPage.connect('destroy', () => {
this._currentPage = null;
});
this._updateCurrentPageVisible(); this._updateCurrentPageVisible();
} }
@@ -1626,6 +1611,18 @@ var Keyboard = class Keyboard {
this.setCursorLocation(null); this.setCursorLocation(null);
} }
_hideSubkeys() {
if (this._subkeysBoxPointer) {
this._subkeysBoxPointer.hide(BoxPointer.PopupAnimation.FULL);
this._subkeysBoxPointer = null;
}
if (this._capturedEventId) {
this.actor.disconnect(this._capturedEventId);
this._capturedEventId = 0;
}
this._capturedPress = false;
}
resetSuggestions() { resetSuggestions() {
if (this._suggestions) if (this._suggestions)
this._suggestions.clear(); this._suggestions.clear();

View File

@@ -11,7 +11,6 @@ const DND = imports.ui.dnd;
const Main = imports.ui.main; const Main = imports.ui.main;
const Params = imports.misc.params; const Params = imports.misc.params;
const Tweener = imports.ui.tweener; const Tweener = imports.ui.tweener;
const Ripples = imports.ui.ripples;
var STARTUP_ANIMATION_TIME = 0.5; var STARTUP_ANIMATION_TIME = 0.5;
var KEYBOARD_ANIMATION_TIME = 0.15; var KEYBOARD_ANIMATION_TIME = 0.15;
@@ -217,17 +216,10 @@ var LayoutManager = GObject.registerClass({
this.uiGroup = new UiActor({ name: 'uiGroup' }); this.uiGroup = new UiActor({ name: 'uiGroup' });
this.uiGroup.set_flags(Clutter.ActorFlags.NO_LAYOUT); this.uiGroup.set_flags(Clutter.ActorFlags.NO_LAYOUT);
global.stage.add_child(this.uiGroup);
global.stage.remove_actor(global.window_group); global.stage.remove_actor(global.window_group);
this.uiGroup.add_actor(global.window_group); this.uiGroup.add_actor(global.window_group);
// Using addChrome() to add actors to uiGroup will position actors global.stage.add_child(this.uiGroup);
// underneath the top_window_group.
// To insert actors at the top of uiGroup, we use addTopChrome() or
// add the actor directly using uiGroup.add_actor().
global.stage.remove_actor(global.top_window_group);
this.uiGroup.add_actor(global.top_window_group);
this.overviewGroup = new St.Widget({ name: 'overviewGroup', this.overviewGroup = new St.Widget({ name: 'overviewGroup',
visible: false, visible: false,
@@ -255,7 +247,7 @@ var LayoutManager = GObject.registerClass({
this.keyboardBox = new St.BoxLayout({ name: 'keyboardBox', this.keyboardBox = new St.BoxLayout({ name: 'keyboardBox',
reactive: true, reactive: true,
track_hover: true }); track_hover: true });
this.addTopChrome(this.keyboardBox); this.addChrome(this.keyboardBox);
this._keyboardHeightNotifyId = 0; this._keyboardHeightNotifyId = 0;
// A dummy actor that tracks the mouse or text cursor, based on the // A dummy actor that tracks the mouse or text cursor, based on the
@@ -263,6 +255,9 @@ var LayoutManager = GObject.registerClass({
this.dummyCursor = new St.Widget({ width: 0, height: 0, opacity: 0 }); this.dummyCursor = new St.Widget({ width: 0, height: 0, opacity: 0 });
this.uiGroup.add_actor(this.dummyCursor); this.uiGroup.add_actor(this.dummyCursor);
global.stage.remove_actor(global.top_window_group);
this.uiGroup.add_actor(global.top_window_group);
let feedbackGroup = Meta.get_feedback_group_for_display(global.display); let feedbackGroup = Meta.get_feedback_group_for_display(global.display);
global.stage.remove_actor(feedbackGroup); global.stage.remove_actor(feedbackGroup);
this.uiGroup.add_actor(feedbackGroup); this.uiGroup.add_actor(feedbackGroup);
@@ -807,16 +802,6 @@ var LayoutManager = GObject.registerClass({
this._trackActor(actor, params); this._trackActor(actor, params);
} }
// addTopChrome:
// @actor: an actor to add to the chrome
// @params: (optional) additional params
//
// Like addChrome(), but adds @actor above all windows, including popups.
addTopChrome(actor, params) {
this.uiGroup.add_actor(actor);
this._trackActor(actor, params);
}
// trackChrome: // trackChrome:
// @actor: a descendant of the chrome to begin tracking // @actor: a descendant of the chrome to begin tracking
// @params: parameters describing how to track @actor // @params: parameters describing how to track @actor
@@ -1073,7 +1058,8 @@ var LayoutManager = GObject.registerClass({
} }
} }
global.set_stage_input_region(rects); if (!Meta.is_wayland_compositor())
global.set_stage_input_region(rects);
this._isPopupWindowVisible = isPopupMenuVisible; this._isPopupWindowVisible = isPopupMenuVisible;
let workspaceManager = global.workspace_manager; let workspaceManager = global.workspace_manager;
@@ -1118,15 +1104,14 @@ var HotCorner = class HotCorner {
Shell.ActionMode.OVERVIEW); Shell.ActionMode.OVERVIEW);
this._pressureBarrier.connect('trigger', this._toggleOverview.bind(this)); this._pressureBarrier.connect('trigger', this._toggleOverview.bind(this));
let px = 0.0; // Cache the three ripples instead of dynamically creating and destroying them.
let py = 0.0; this._ripple1 = new St.BoxLayout({ style_class: 'ripple-box', opacity: 0, visible: false });
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) { this._ripple2 = new St.BoxLayout({ style_class: 'ripple-box', opacity: 0, visible: false });
px = 1.0; this._ripple3 = new St.BoxLayout({ style_class: 'ripple-box', opacity: 0, visible: false });
py = 0.0;
}
this._ripples = new Ripples.Ripples(px, py, 'ripple-box'); layoutManager.uiGroup.add_actor(this._ripple1);
this._ripples.addTo(layoutManager.uiGroup); layoutManager.uiGroup.add_actor(this._ripple2);
layoutManager.uiGroup.add_actor(this._ripple3);
} }
setBarrierSize(size) { setBarrierSize(size) {
@@ -1208,12 +1193,53 @@ var HotCorner = class HotCorner {
this.actor.destroy(); this.actor.destroy();
} }
_animRipple(ripple, delay, time, startScale, startOpacity, finalScale) {
// We draw a ripple by using a source image and animating it scaling
// outwards and fading away. We want the ripples to move linearly
// or it looks unrealistic, but if the opacity of the ripple goes
// linearly to zero it fades away too quickly, so we use Tweener's
// 'onUpdate' to give a non-linear curve to the fade-away and make
// it more visible in the middle section.
ripple._opacity = startOpacity;
if (ripple.get_text_direction() == Clutter.TextDirection.RTL)
ripple.set_anchor_point_from_gravity(Clutter.Gravity.NORTH_EAST);
ripple.visible = true;
ripple.opacity = 255 * Math.sqrt(startOpacity);
ripple.scale_x = ripple.scale_y = startScale;
ripple.x = this._x;
ripple.y = this._y;
Tweener.addTween(ripple, { _opacity: 0,
scale_x: finalScale,
scale_y: finalScale,
delay: delay,
time: time,
transition: 'linear',
onUpdate() { ripple.opacity = 255 * Math.sqrt(ripple._opacity); },
onComplete() { ripple.visible = false; } });
}
_rippleAnimation() {
// Show three concentric ripples expanding outwards; the exact
// parameters were found by trial and error, so don't look
// for them to make perfect sense mathematically
// delay time scale opacity => scale
this._animRipple(this._ripple1, 0.0, 0.83, 0.25, 1.0, 1.5);
this._animRipple(this._ripple2, 0.05, 1.0, 0.0, 0.7, 1.25);
this._animRipple(this._ripple3, 0.35, 1.0, 0.0, 0.3, 1);
}
_toggleOverview() { _toggleOverview() {
if (this._monitor.inFullscreen && !Main.overview.visible) if (this._monitor.inFullscreen && !Main.overview.visible)
return; return;
if (Main.overview.shouldToggleByCornerOrButton()) { if (Main.overview.shouldToggleByCornerOrButton()) {
this._ripples.playAnimation(this._x, this._y); this._rippleAnimation();
Main.overview.toggle(); Main.overview.toggle();
} }
} }

View File

@@ -7,7 +7,7 @@ const Params = imports.misc.params;
const Tweener = imports.ui.tweener; const Tweener = imports.ui.tweener;
var DEFAULT_FADE_FACTOR = 0.4; var DEFAULT_FADE_FACTOR = 0.4;
var VIGNETTE_BRIGHTNESS = 0.2; var VIGNETTE_BRIGHTNESS = 0.8;
var VIGNETTE_SHARPNESS = 0.7; var VIGNETTE_SHARPNESS = 0.7;
const VIGNETTE_DECLARATIONS = '\ const VIGNETTE_DECLARATIONS = '\

View File

@@ -1,24 +0,0 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const { Clutter, Gio, GLib, St } = imports.gi;
const Ripples = imports.ui.ripples;
const Main = imports.ui.main;
const LOCATE_POINTER_KEY = "locate-pointer";
const LOCATE_POINTER_SCHEMA = "org.gnome.desktop.interface"
var locatePointer = class {
constructor() {
this._settings = new Gio.Settings({schema_id: LOCATE_POINTER_SCHEMA});
this._ripples = new Ripples.Ripples(0.5, 0.5, 'ripple-pointer-location');
this._ripples.addTo(Main.uiGroup);
}
show() {
if (!this._settings.get_boolean("locate-pointer"))
return;
let [x, y, mods] = global.get_pointer();
this._ripples.playAnimation(x, y);
}
};

View File

@@ -1272,7 +1272,7 @@ var ZoomRegion = class ZoomRegion {
/** /**
* getContrast: * getContrast:
* Retrieve the contrast of the magnified view. * Retreive the contrast of the magnified view.
* @return Object containing the contrast for the red, green, * @return Object containing the contrast for the red, green,
* and blue channels. * and blue channels.
*/ */

View File

@@ -1,6 +1,6 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const { Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi; const { Clutter, Gio, GLib, Meta, Shell, St } = imports.gi;
const Mainloop = imports.mainloop; const Mainloop = imports.mainloop;
const AccessDialog = imports.ui.accessDialog; const AccessDialog = imports.ui.accessDialog;
@@ -37,12 +37,9 @@ const WindowManager = imports.ui.windowManager;
const Magnifier = imports.ui.magnifier; const Magnifier = imports.ui.magnifier;
const XdndHandler = imports.ui.xdndHandler; const XdndHandler = imports.ui.xdndHandler;
const KbdA11yDialog = imports.ui.kbdA11yDialog; const KbdA11yDialog = imports.ui.kbdA11yDialog;
const LocatePointer = imports.ui.locatePointer;
const PointerA11yTimeout = imports.ui.pointerA11yTimeout;
const A11Y_SCHEMA = 'org.gnome.desktop.a11y.keyboard'; const A11Y_SCHEMA = 'org.gnome.desktop.a11y.keyboard';
const STICKY_KEYS_ENABLE = 'stickykeys-enable'; const STICKY_KEYS_ENABLE = 'stickykeys-enable';
const LOG_DOMAIN = 'GNOME Shell';
const GNOMESHELL_STARTED_MESSAGE_ID = 'f3ea493c22934e26811cd62abe8e203a'; const GNOMESHELL_STARTED_MESSAGE_ID = 'f3ea493c22934e26811cd62abe8e203a';
var componentManager = null; var componentManager = null;
@@ -77,14 +74,12 @@ var layoutManager = null;
var kbdA11yDialog = null; var kbdA11yDialog = null;
var inputMethod = null; var inputMethod = null;
var introspectService = null; var introspectService = null;
var locatePointer = null;
let _startDate; let _startDate;
let _defaultCssStylesheet = null; let _defaultCssStylesheet = null;
let _cssStylesheet = null; let _cssStylesheet = null;
let _a11ySettings = null; let _a11ySettings = null;
let _themeResource = null; let _themeResource = null;
let _oskResource = null; let _oskResource = null;
let pointerA11yTimeout = null;
function _sessionUpdated() { function _sessionUpdated() {
if (sessionMode.isPrimary) if (sessionMode.isPrimary)
@@ -97,8 +92,6 @@ function _sessionUpdated() {
wm.allowKeybinding('overlay-key', Shell.ActionMode.NORMAL | wm.allowKeybinding('overlay-key', Shell.ActionMode.NORMAL |
Shell.ActionMode.OVERVIEW); Shell.ActionMode.OVERVIEW);
wm.allowKeybinding('locate-pointer-key', Shell.ActionMode.ALL);
wm.setCustomKeybindingHandler('panel-run-dialog', wm.setCustomKeybindingHandler('panel-run-dialog',
Shell.ActionMode.NORMAL | Shell.ActionMode.NORMAL |
Shell.ActionMode.OVERVIEW, Shell.ActionMode.OVERVIEW,
@@ -172,8 +165,6 @@ function _initializeUI() {
kbdA11yDialog = new KbdA11yDialog.KbdA11yDialog(); kbdA11yDialog = new KbdA11yDialog.KbdA11yDialog();
wm = new WindowManager.WindowManager(); wm = new WindowManager.WindowManager();
magnifier = new Magnifier.Magnifier(); magnifier = new Magnifier.Magnifier();
locatePointer = new LocatePointer.locatePointer();
if (LoginManager.canLock()) if (LoginManager.canLock())
screenShield = new ScreenShield.ScreenShield(); screenShield = new ScreenShield.ScreenShield();
@@ -192,8 +183,6 @@ function _initializeUI() {
layoutManager.init(); layoutManager.init();
overview.init(); overview.init();
pointerA11yTimeout = new PointerA11yTimeout.PointerA11yTimeout();
_a11ySettings = new Gio.Settings({ schema_id: A11Y_SCHEMA }); _a11ySettings = new Gio.Settings({ schema_id: A11Y_SCHEMA });
global.display.connect('overlay-key', () => { global.display.connect('overlay-key', () => {
@@ -201,10 +190,6 @@ function _initializeUI() {
overview.toggle(); overview.toggle();
}); });
global.connect('locate-pointer', () => {
locatePointer.show();
});
global.display.connect('show-restart-message', (display, message) => { global.display.connect('show-restart-message', (display, message) => {
showRestartMessage(message); showRestartMessage(message);
return true; return true;
@@ -244,14 +229,10 @@ function _initializeUI() {
} }
if (sessionMode.currentMode != 'gdm' && if (sessionMode.currentMode != 'gdm' &&
sessionMode.currentMode != 'initial-setup') { sessionMode.currentMode != 'initial-setup') {
GLib.log_structured(LOG_DOMAIN, GLib.LogLevelFlags.LEVEL_MESSAGE, { Shell.Global.log_structured('GNOME Shell started at ' + _startDate,
'MESSAGE': `GNOME Shell started at ${_startDate}`, ['MESSAGE_ID=' + GNOMESHELL_STARTED_MESSAGE_ID]);
'MESSAGE_ID': GNOMESHELL_STARTED_MESSAGE_ID
});
} }
LoginManager.registerSessionWithGDM();
let perfModuleName = GLib.getenv("SHELL_PERF_MODULE"); let perfModuleName = GLib.getenv("SHELL_PERF_MODULE");
if (perfModuleName) { if (perfModuleName) {
let perfOutput = GLib.getenv("SHELL_PERF_OUTPUT"); let perfOutput = GLib.getenv("SHELL_PERF_OUTPUT");
@@ -655,7 +636,7 @@ function _queueBeforeRedraw(workId) {
* initialization as well, under the assumption that new actors * initialization as well, under the assumption that new actors
* will need it. * will need it.
* *
* Returns: A string work identifier * Returns: A string work identifer
*/ */
function initializeDeferredWork(actor, callback, props) { function initializeDeferredWork(actor, callback, props) {
// Turn into a string so we can use as an object property // Turn into a string so we can use as an object property
@@ -708,13 +689,12 @@ function queueDeferredWork(workId) {
} }
} }
var RestartMessage = GObject.registerClass( var RestartMessage = class extends ModalDialog.ModalDialog {
class RestartMessage extends ModalDialog.ModalDialog { constructor(message) {
_init(message) { super({ shellReactive: true,
super._init({ shellReactive: true, styleClass: 'restart-message headline',
styleClass: 'restart-message headline', shouldFadeIn: false,
shouldFadeIn: false, destroyOnClose: true });
destroyOnClose: true });
let label = new St.Label({ text: message }); let label = new St.Label({ text: message });
@@ -724,7 +704,7 @@ class RestartMessage extends ModalDialog.ModalDialog {
y_align: St.Align.MIDDLE }); y_align: St.Align.MIDDLE });
this.buttonLayout.hide(); this.buttonLayout.hide();
} }
}); };
function showRestartMessage(message) { function showRestartMessage(message) {
let restartMessage = new RestartMessage(message); let restartMessage = new RestartMessage(message);

View File

@@ -584,6 +584,7 @@ class SourceActor extends St.Widget {
this._source = source; this._source = source;
this._size = size; this._size = size;
this.actor = this;
this.connect('destroy', () => { this.connect('destroy', () => {
this._source.disconnect(this._iconUpdatedId); this._source.disconnect(this._iconUpdatedId);
this._actorDestroyed = true; this._actorDestroyed = true;

View File

@@ -1,6 +1,6 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const { Atk, Clutter, GObject, Shell, St } = imports.gi; const { Atk, Clutter, Shell, St } = imports.gi;
const Signals = imports.signals; const Signals = imports.signals;
const Dialog = imports.ui.dialog; const Dialog = imports.ui.dialog;
@@ -21,20 +21,8 @@ var State = {
FADED_OUT: 4 FADED_OUT: 4
}; };
var ModalDialog = GObject.registerClass({ var ModalDialog = class {
Properties: { 'state': GObject.ParamSpec.int('state', 'Dialog state', 'state', constructor(params) {
GObject.ParamFlags.READABLE,
Math.min(...Object.values(State)),
Math.max(...Object.values(State)),
State.CLOSED) },
Signals: { 'opened': {}, 'closed': {} }
}, class ModalDialog extends St.Widget {
_init(params) {
super._init({ visible: false,
x: 0,
y: 0,
accessible_role: Atk.Role.DIALOG });
params = Params.parse(params, { shellReactive: false, params = Params.parse(params, { shellReactive: false,
styleClass: null, styleClass: null,
actionMode: Shell.ActionMode.SYSTEM_MODAL, actionMode: Shell.ActionMode.SYSTEM_MODAL,
@@ -42,7 +30,7 @@ var ModalDialog = GObject.registerClass({
shouldFadeOut: true, shouldFadeOut: true,
destroyOnClose: true }); destroyOnClose: true });
this._state = State.CLOSED; this.state = State.CLOSED;
this._hasModal = false; this._hasModal = false;
this._actionMode = params.actionMode; this._actionMode = params.actionMode;
this._shellReactive = params.shellReactive; this._shellReactive = params.shellReactive;
@@ -50,25 +38,31 @@ var ModalDialog = GObject.registerClass({
this._shouldFadeOut = params.shouldFadeOut; this._shouldFadeOut = params.shouldFadeOut;
this._destroyOnClose = params.destroyOnClose; this._destroyOnClose = params.destroyOnClose;
Main.layoutManager.modalDialogGroup.add_actor(this); this._group = new St.Widget({ visible: false,
x: 0,
y: 0,
accessible_role: Atk.Role.DIALOG });
Main.layoutManager.modalDialogGroup.add_actor(this._group);
let constraint = new Clutter.BindConstraint({ source: global.stage, let constraint = new Clutter.BindConstraint({ source: global.stage,
coordinate: Clutter.BindCoordinate.ALL }); coordinate: Clutter.BindCoordinate.ALL });
this.add_constraint(constraint); this._group.add_constraint(constraint);
this._group.connect('destroy', this._onGroupDestroy.bind(this));
this.backgroundStack = new St.Widget({ layout_manager: new Clutter.BinLayout() }); this.backgroundStack = new St.Widget({ layout_manager: new Clutter.BinLayout() });
this._backgroundBin = new St.Bin({ child: this.backgroundStack, this._backgroundBin = new St.Bin({ child: this.backgroundStack,
x_fill: true, y_fill: true }); x_fill: true, y_fill: true });
this._monitorConstraint = new Layout.MonitorConstraint(); this._monitorConstraint = new Layout.MonitorConstraint();
this._backgroundBin.add_constraint(this._monitorConstraint); this._backgroundBin.add_constraint(this._monitorConstraint);
this.add_actor(this._backgroundBin); this._group.add_actor(this._backgroundBin);
this.dialogLayout = new Dialog.Dialog(this.backgroundStack, params.styleClass); this.dialogLayout = new Dialog.Dialog(this.backgroundStack, params.styleClass);
this.contentLayout = this.dialogLayout.contentLayout; this.contentLayout = this.dialogLayout.contentLayout;
this.buttonLayout = this.dialogLayout.buttonLayout; this.buttonLayout = this.dialogLayout.buttonLayout;
if (!this._shellReactive) { if (!this._shellReactive) {
this._lightbox = new Lightbox.Lightbox(this, this._lightbox = new Lightbox.Lightbox(this._group,
{ inhibitEvents: true, { inhibitEvents: true,
radialEffect: true }); radialEffect: true });
this._lightbox.highlight(this._backgroundBin); this._lightbox.highlight(this._backgroundBin);
@@ -83,16 +77,8 @@ var ModalDialog = GObject.registerClass({
this._savedKeyFocus = null; this._savedKeyFocus = null;
} }
get state() { destroy() {
return this._state; this._group.destroy();
}
_setState(state) {
if (this._state == state)
return;
this._state = state;
this.notify('state');
} }
clearButtons() { clearButtons() {
@@ -110,25 +96,29 @@ var ModalDialog = GObject.registerClass({
return this.dialogLayout.addButton(buttonInfo); return this.dialogLayout.addButton(buttonInfo);
} }
_onGroupDestroy() {
this.emit('destroy');
}
_fadeOpen(onPrimary) { _fadeOpen(onPrimary) {
if (onPrimary) if (onPrimary)
this._monitorConstraint.primary = true; this._monitorConstraint.primary = true;
else else
this._monitorConstraint.index = global.display.get_current_monitor(); this._monitorConstraint.index = global.display.get_current_monitor();
this._setState(State.OPENING); this.state = State.OPENING;
this.dialogLayout.opacity = 255; this.dialogLayout.opacity = 255;
if (this._lightbox) if (this._lightbox)
this._lightbox.show(); this._lightbox.show();
this.opacity = 0; this._group.opacity = 0;
this.show(); this._group.show();
Tweener.addTween(this, Tweener.addTween(this._group,
{ opacity: 255, { opacity: 255,
time: this._shouldFadeIn ? OPEN_AND_CLOSE_TIME : 0, time: this._shouldFadeIn ? OPEN_AND_CLOSE_TIME : 0,
transition: 'easeOutQuad', transition: 'easeOutQuad',
onComplete: () => { onComplete: () => {
this._setState(State.OPENED); this.state = State.OPENED;
this.emit('opened'); this.emit('opened');
} }
}); });
@@ -158,8 +148,8 @@ var ModalDialog = GObject.registerClass({
} }
_closeComplete() { _closeComplete() {
this._setState(State.CLOSED); this.state = State.CLOSED;
this.hide(); this._group.hide();
this.emit('closed'); this.emit('closed');
if (this._destroyOnClose) if (this._destroyOnClose)
@@ -170,12 +160,12 @@ var ModalDialog = GObject.registerClass({
if (this.state == State.CLOSED || this.state == State.CLOSING) if (this.state == State.CLOSED || this.state == State.CLOSING)
return; return;
this._setState(State.CLOSING); this.state = State.CLOSING;
this.popModal(timestamp); this.popModal(timestamp);
this._savedKeyFocus = null; this._savedKeyFocus = null;
if (this._shouldFadeOut) if (this._shouldFadeOut)
Tweener.addTween(this, Tweener.addTween(this._group,
{ opacity: 0, { opacity: 0,
time: OPEN_AND_CLOSE_TIME, time: OPEN_AND_CLOSE_TIME,
transition: 'easeOutQuad', transition: 'easeOutQuad',
@@ -193,11 +183,11 @@ var ModalDialog = GObject.registerClass({
return; return;
let focus = global.stage.key_focus; let focus = global.stage.key_focus;
if (focus && this.contains(focus)) if (focus && this._group.contains(focus))
this._savedKeyFocus = focus; this._savedKeyFocus = focus;
else else
this._savedKeyFocus = null; this._savedKeyFocus = null;
Main.popModal(this, timestamp); Main.popModal(this._group, timestamp);
this._hasModal = false; this._hasModal = false;
if (!this._shellReactive) if (!this._shellReactive)
@@ -211,7 +201,7 @@ var ModalDialog = GObject.registerClass({
let params = { actionMode: this._actionMode }; let params = { actionMode: this._actionMode };
if (timestamp) if (timestamp)
params['timestamp'] = timestamp; params['timestamp'] = timestamp;
if (!Main.pushModal(this, params)) if (!Main.pushModal(this._group, params))
return false; return false;
this._hasModal = true; this._hasModal = true;
@@ -234,10 +224,10 @@ var ModalDialog = GObject.registerClass({
// can be dismissed by a close call. // can be dismissed by a close call.
// //
// The main point of this method is to give some indication to the user // The main point of this method is to give some indication to the user
// that the dialog response has been acknowledged but will take a few // that the dialog reponse has been acknowledged but will take a few
// moments before being processed. // moments before being processed.
// e.g., if a user clicked "Log Out" then the dialog should go away // e.g., if a user clicked "Log Out" then the dialog should go away
// immediately, but the lightbox should remain until the logout is // imediately, but the lightbox should remain until the logout is
// complete. // complete.
_fadeOutDialog(timestamp) { _fadeOutDialog(timestamp) {
if (this.state == State.CLOSED || this.state == State.CLOSING) if (this.state == State.CLOSED || this.state == State.CLOSING)
@@ -252,8 +242,9 @@ var ModalDialog = GObject.registerClass({
time: FADE_OUT_DIALOG_TIME, time: FADE_OUT_DIALOG_TIME,
transition: 'easeOutQuad', transition: 'easeOutQuad',
onComplete: () => { onComplete: () => {
this._setState(State.FADED_OUT); this.state = State.FADED_OUT;
} }
}); });
} }
}); };
Signals.addSignalMethods(ModalDialog.prototype);

View File

@@ -122,7 +122,7 @@ var SlidingControl = class {
} }
_getSlide() { _getSlide() {
throw new GObject.NotImplementedError(`_getSlide in ${this.constructor.name}`); throw new Error('getSlide() must be overridden');
} }
_updateSlide() { _updateSlide() {

View File

@@ -66,7 +66,7 @@ function _unpremultiply(color) {
class AppMenu extends PopupMenu.PopupMenu { class AppMenu extends PopupMenu.PopupMenu {
constructor(sourceActor) { constructor(sourceActor) {
super(sourceActor, 0.5, St.Side.TOP); super(sourceActor, 0.0, St.Side.TOP);
this.actor.add_style_class_name('app-menu'); this.actor.add_style_class_name('app-menu');
@@ -75,9 +75,6 @@ class AppMenu extends PopupMenu.PopupMenu {
this._windowsChangedId = 0; this._windowsChangedId = 0;
/* Translators: This is the heading of a list of open windows */
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem(_("Open Windows")));
this._windowSection = new PopupMenu.PopupMenuSection(); this._windowSection = new PopupMenu.PopupMenuSection();
this.addMenuItem(this._windowSection); this.addMenuItem(this._windowSection);
@@ -108,8 +105,6 @@ class AppMenu extends PopupMenu.PopupMenu {
}); });
}); });
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this.addAction(_("Quit"), () => { this.addAction(_("Quit"), () => {
this._app.request_quit(); this._app.request_quit();
}); });
@@ -122,7 +117,7 @@ class AppMenu extends PopupMenu.PopupMenu {
_updateDetailsVisibility() { _updateDetailsVisibility() {
let sw = this._appSystem.lookup_app('org.gnome.Software.desktop'); let sw = this._appSystem.lookup_app('org.gnome.Software.desktop');
this._detailsItem.visible = (sw != null); this._detailsItem.actor.visible = (sw != null);
} }
isEmpty() { isEmpty() {
@@ -160,7 +155,7 @@ class AppMenu extends PopupMenu.PopupMenu {
}); });
}); });
this._newWindowItem.visible = this._newWindowItem.actor.visible =
app && app.can_open_new_window() && !actions.includes('new-window'); app && app.can_open_new_window() && !actions.includes('new-window');
} }
@@ -177,6 +172,13 @@ class AppMenu extends PopupMenu.PopupMenu {
Main.activateWindow(window, event.get_time()); Main.activateWindow(window, event.get_time());
}); });
}); });
// Add separator between windows of the current desktop and other windows.
let workspaceManager = global.workspace_manager;
let activeWorkspace = workspaceManager.get_active_workspace();
let pos = windows.findIndex(w => w.get_workspace() != activeWorkspace);
if (pos >= 0)
this._windowSection.addMenuItem(new PopupMenu.PopupSeparatorMenuItem(), pos);
} }
} }
@@ -194,7 +196,7 @@ var AppMenuButton = GObject.registerClass({
_init(panel) { _init(panel) {
super._init(0.0, null, true); super._init(0.0, null, true);
this.accessible_role = Atk.Role.MENU; this.actor.accessible_role = Atk.Role.MENU;
this._startingApps = []; this._startingApps = [];
@@ -204,10 +206,10 @@ var AppMenuButton = GObject.registerClass({
let bin = new St.Bin({ name: 'appMenu' }); let bin = new St.Bin({ name: 'appMenu' });
bin.connect('style-changed', this._onStyleChanged.bind(this)); bin.connect('style-changed', this._onStyleChanged.bind(this));
this.add_actor(bin); this.actor.add_actor(bin);
this.bind_property("reactive", this, "can-focus", 0); this.actor.bind_property("reactive", this.actor, "can-focus", 0);
this.reactive = false; this.actor.reactive = false;
this._container = new St.BoxLayout({ style_class: 'panel-status-menu-box' }); this._container = new St.BoxLayout({ style_class: 'panel-status-menu-box' });
bin.set_child(this._container); bin.set_child(this._container);
@@ -263,10 +265,10 @@ var AppMenuButton = GObject.registerClass({
return; return;
this._visible = true; this._visible = true;
this.reactive = true; this.actor.reactive = true;
this.show(); this.show();
Tweener.removeTweens(this); Tweener.removeTweens(this.actor);
Tweener.addTween(this, Tweener.addTween(this.actor,
{ opacity: 255, { opacity: 255,
time: Overview.ANIMATION_TIME, time: Overview.ANIMATION_TIME,
transition: 'easeOutQuad' }); transition: 'easeOutQuad' });
@@ -277,9 +279,9 @@ var AppMenuButton = GObject.registerClass({
return; return;
this._visible = false; this._visible = false;
this.reactive = false; this.actor.reactive = false;
Tweener.removeTweens(this); Tweener.removeTweens(this.actor);
Tweener.addTween(this, Tweener.addTween(this.actor,
{ opacity: 0, { opacity: 0,
time: Overview.ANIMATION_TIME, time: Overview.ANIMATION_TIME,
transition: 'easeOutQuad', transition: 'easeOutQuad',
@@ -402,7 +404,7 @@ var AppMenuButton = GObject.registerClass({
if (this._targetApp) { if (this._targetApp) {
this._busyNotifyId = this._targetApp.connect('notify::busy', this._sync.bind(this)); this._busyNotifyId = this._targetApp.connect('notify::busy', this._sync.bind(this));
this._label.set_text(this._targetApp.get_name()); this._label.set_text(this._targetApp.get_name());
this.set_accessible_name(this._targetApp.get_name()); this.actor.set_accessible_name(this._targetApp.get_name());
} }
} }
@@ -420,7 +422,7 @@ var AppMenuButton = GObject.registerClass({
else else
this.stopAnimation(); this.stopAnimation();
this.reactive = (visible && !isBusy); this.actor.reactive = (visible && !isBusy);
this._syncIcon(); this._syncIcon();
this.menu.setApp(this._targetApp); this.menu.setApp(this._targetApp);
@@ -459,28 +461,28 @@ var ActivitiesButton = GObject.registerClass(
class ActivitiesButton extends PanelMenu.Button { class ActivitiesButton extends PanelMenu.Button {
_init() { _init() {
super._init(0.0, null, true); super._init(0.0, null, true);
this.accessible_role = Atk.Role.TOGGLE_BUTTON; this.actor.accessible_role = Atk.Role.TOGGLE_BUTTON;
this.name = 'panelActivities'; this.actor.name = 'panelActivities';
/* Translators: If there is no suitable word for "Activities" /* Translators: If there is no suitable word for "Activities"
in your language, you can use the word for "Overview". */ in your language, you can use the word for "Overview". */
this._label = new St.Label({ text: _("Activities"), this._label = new St.Label({ text: _("Activities"),
y_align: Clutter.ActorAlign.CENTER }); y_align: Clutter.ActorAlign.CENTER });
this.add_actor(this._label); this.actor.add_actor(this._label);
this.label_actor = this._label; this.actor.label_actor = this._label;
this.connect('captured-event', this._onCapturedEvent.bind(this)); this.actor.connect('captured-event', this._onCapturedEvent.bind(this));
this.connect_after('key-release-event', this._onKeyRelease.bind(this)); this.actor.connect_after('key-release-event', this._onKeyRelease.bind(this));
Main.overview.connect('showing', () => { Main.overview.connect('showing', () => {
this.add_style_pseudo_class('overview'); this.actor.add_style_pseudo_class('overview');
this.add_accessible_state (Atk.StateType.CHECKED); this.actor.add_accessible_state (Atk.StateType.CHECKED);
}); });
Main.overview.connect('hiding', () => { Main.overview.connect('hiding', () => {
this.remove_style_pseudo_class('overview'); this.actor.remove_style_pseudo_class('overview');
this.remove_accessible_state (Atk.StateType.CHECKED); this.actor.remove_accessible_state (Atk.StateType.CHECKED);
}); });
this._xdndTimeOut = 0; this._xdndTimeOut = 0;
@@ -533,7 +535,7 @@ class ActivitiesButton extends PanelMenu.Button {
let [x, y, mask] = global.get_pointer(); let [x, y, mask] = global.get_pointer();
let pickedActor = global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, x, y); let pickedActor = global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, x, y);
if (pickedActor == this && Main.overview.shouldToggleByCornerOrButton()) if (pickedActor == this.actor && Main.overview.shouldToggleByCornerOrButton())
Main.overview.toggle(); Main.overview.toggle();
Mainloop.source_remove(this._xdndTimeOut); Mainloop.source_remove(this._xdndTimeOut);
@@ -747,7 +749,7 @@ class AggregateMenu extends PanelMenu.Button {
this.menu.box.set_layout_manager(menuLayout); this.menu.box.set_layout_manager(menuLayout);
this._indicators = new St.BoxLayout({ style_class: 'panel-status-indicators-box' }); this._indicators = new St.BoxLayout({ style_class: 'panel-status-indicators-box' });
this.add_child(this._indicators); this.actor.add_child(this._indicators);
if (Config.HAVE_NETWORKMANAGER) { if (Config.HAVE_NETWORKMANAGER) {
this._network = new imports.ui.status.network.NMApplet(); this._network = new imports.ui.status.network.NMApplet();
@@ -817,7 +819,6 @@ const PANEL_ITEM_IMPLEMENTATIONS = {
'dateMenu': imports.ui.dateMenu.DateMenuButton, 'dateMenu': imports.ui.dateMenu.DateMenuButton,
'a11y': imports.ui.status.accessibility.ATIndicator, 'a11y': imports.ui.status.accessibility.ATIndicator,
'keyboard': imports.ui.status.keyboard.InputSourceIndicator, 'keyboard': imports.ui.status.keyboard.InputSourceIndicator,
'dwellClick': imports.ui.status.dwellClick.DwellClickIndicator,
}; };
var Panel = GObject.registerClass( var Panel = GObject.registerClass(
@@ -826,6 +827,9 @@ class Panel extends St.Widget {
super._init({ name: 'panel', super._init({ name: 'panel',
reactive: true }); reactive: true });
// For compatibility with extensions that still use the
// this.actor field
this.actor = this;
this.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS); this.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS);
this._sessionStyle = null; this._sessionStyle = null;
@@ -972,11 +976,22 @@ class Panel extends St.Widget {
if (isPress && button != 1) if (isPress && button != 1)
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
let focusWindow = global.display.focus_window;
if (!focusWindow)
return Clutter.EVENT_PROPAGATE;
let dragWindow = focusWindow.is_attached_dialog() ? focusWindow.get_transient_for()
: focusWindow;
if (!dragWindow)
return Clutter.EVENT_PROPAGATE;
let rect = dragWindow.get_frame_rect();
let [stageX, stageY] = event.get_coords(); let [stageX, stageY] = event.get_coords();
let dragWindow = this._getDraggableWindowForPosition(stageX); let allowDrag = dragWindow.maximized_vertically &&
stageX > rect.x && stageX < rect.x + rect.width;
if (!dragWindow) if (!allowDrag)
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
global.display.begin_grab_op(dragWindow, global.display.begin_grab_op(dragWindow,
@@ -1006,7 +1021,7 @@ class Panel extends St.Widget {
return; // menu not supported by current session mode return; // menu not supported by current session mode
let menu = indicator.menu; let menu = indicator.menu;
if (!indicator.reactive) if (!indicator.actor.reactive)
return; return;
menu.toggle(); menu.toggle();
@@ -1028,7 +1043,7 @@ class Panel extends St.Widget {
return; return;
let menu = indicator.menu; let menu = indicator.menu;
if (!indicator.reactive) if (!indicator.actor.reactive)
return; return;
menu.close(); menu.close();
@@ -1186,21 +1201,4 @@ class Panel extends St.Widget {
Main.messageTray.bannerBlocked = isOpen; Main.messageTray.bannerBlocked = isOpen;
}); });
} }
_getDraggableWindowForPosition(stageX) {
let workspaceManager = global.workspace_manager;
let workspace = workspaceManager.get_active_workspace()
let allWindowsByStacking = global.display.sort_windows_by_stacking(
workspace.list_windows()
).reverse();
return allWindowsByStacking.find(metaWindow => {
let rect = metaWindow.get_frame_rect();
return metaWindow.is_on_primary_monitor() &&
metaWindow.showing_on_its_workspace() &&
metaWindow.get_window_type() != Meta.WindowType.DESKTOP &&
metaWindow.maximized_vertically &&
stageX > rect.x && stageX < rect.x + rect.width
});
}
}); });

View File

@@ -14,11 +14,12 @@ class ButtonBox extends St.Widget {
super._init(params); super._init(params);
this.actor = this;
this._delegate = this; this._delegate = this;
this.container = new St.Bin({ y_fill: true, this.container = new St.Bin({ y_fill: true,
x_fill: true, x_fill: true,
child: this }); child: this.actor });
this.connect('style-changed', this._onStyleChanged.bind(this)); this.connect('style-changed', this._onStyleChanged.bind(this));
this.connect('destroy', this._onDestroy.bind(this)); this.connect('destroy', this._onDestroy.bind(this));
@@ -104,9 +105,9 @@ var Button = GObject.registerClass({
this.connect('notify::visible', this._onVisibilityChanged.bind(this)); this.connect('notify::visible', this._onVisibilityChanged.bind(this));
if (dontCreateMenu) if (dontCreateMenu)
this.menu = new PopupMenu.PopupDummyMenu(this); this.menu = new PopupMenu.PopupDummyMenu(this.actor);
else else
this.setMenu(new PopupMenu.PopupMenu(this, menuAlignment, St.Side.TOP, 0)); this.setMenu(new PopupMenu.PopupMenu(this.actor, menuAlignment, St.Side.TOP, 0));
} }
setSensitive(sensitive) { setSensitive(sensitive) {
@@ -144,7 +145,7 @@ var Button = GObject.registerClass({
if (!this.menu) if (!this.menu)
return; return;
if (!this.visible) if (!this.actor.visible)
this.menu.close(); this.menu.close();
} }
@@ -154,10 +155,10 @@ var Button = GObject.registerClass({
let symbol = event.get_key_symbol(); let symbol = event.get_key_symbol();
if (symbol == Clutter.KEY_Left || symbol == Clutter.KEY_Right) { if (symbol == Clutter.KEY_Left || symbol == Clutter.KEY_Right) {
let group = global.focus_manager.get_group(this); let group = global.focus_manager.get_group(this.actor);
if (group) { if (group) {
let direction = (symbol == Clutter.KEY_Left) ? St.DirectionType.LEFT : St.DirectionType.RIGHT; let direction = (symbol == Clutter.KEY_Left) ? St.DirectionType.LEFT : St.DirectionType.RIGHT;
group.navigate_focus(this, direction, false); group.navigate_focus(this.actor, direction, false);
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
} }
} }
@@ -166,9 +167,9 @@ var Button = GObject.registerClass({
_onOpenStateChanged(menu, open) { _onOpenStateChanged(menu, open) {
if (open) if (open)
this.add_style_pseudo_class('active'); this.actor.add_style_pseudo_class('active');
else else
this.remove_style_pseudo_class('active'); this.actor.remove_style_pseudo_class('active');
// Setting the max-height won't do any good if the minimum height of the // Setting the max-height won't do any good if the minimum height of the
// menu is higher then the screen; it's useful if part of the menu is // menu is higher then the screen; it's useful if part of the menu is

View File

@@ -1,104 +0,0 @@
const { Clutter, GLib, GObject, Meta, St } = imports.gi;
const Tweener = imports.ui.tweener;
const Main = imports.ui.main;
const Cairo = imports.cairo;
const ANIMATION_STEPS = 36.;
var PieTimer = GObject.registerClass(
class PieTimer extends St.DrawingArea {
_init() {
this._x = 0;
this._y = 0;
this._startTime = 0;
this._duration = 0;
super._init( { style_class: 'pie-timer',
visible: false,
can_focus: false,
reactive: false });
}
vfunc_repaint() {
let node = this.get_theme_node();
let backgroundColor = node.get_color('-pie-background-color');
let borderColor = node.get_color('-pie-border-color');
let borderWidth = node.get_length('-pie-border-width');
let [width, height] = this.get_surface_size();
let radius = Math.min(width / 2, height / 2);
let currentTime = GLib.get_monotonic_time() / 1000.0;
let ellapsed = currentTime - this._startTime;
let angle = (ellapsed / this._duration) * 2 * Math.PI;
let startAngle = 3 * Math.PI / 2;
let endAngle = startAngle + angle;
let cr = this.get_context();
cr.setLineCap(Cairo.LineCap.ROUND);
cr.setLineJoin(Cairo.LineJoin.ROUND);
cr.translate(width / 2, height / 2);
cr.moveTo(0, 0);
cr.arc(0, 0, radius - borderWidth, startAngle, endAngle);
cr.lineTo(0, 0);
cr.closePath();
cr.setLineWidth(0);
Clutter.cairo_set_source_color(cr, backgroundColor);
cr.fillPreserve();
cr.setLineWidth(borderWidth);
Clutter.cairo_set_source_color(cr, borderColor);
cr.stroke();
cr.$dispose();
}
start(x, y, duration) {
Tweener.removeTweens(this);
this.x = x - this.width / 2;
this.y = y - this.height / 2;
this.show();
Main.uiGroup.set_child_above_sibling(this, null);
this._startTime = GLib.get_monotonic_time() / 1000.0;
this._duration = duration;
Tweener.addTween(this,
{ opacity: 255,
time: duration / 1000,
transition: 'easeOutQuad',
onUpdateScope: this,
onUpdate() { this.queue_repaint() },
onCompleteScope: this,
onComplete() { this.stop(); }
});
}
stop() {
Tweener.removeTweens(this);
this.hide();
}
});
var PointerA11yTimeout = class PointerA11yTimeout {
constructor() {
let manager = Clutter.DeviceManager.get_default();
let pieTimer = new PieTimer();
Main.uiGroup.add_actor(pieTimer);
manager.connect('ptr-a11y-timeout-started', (manager, device, type, timeout) => {
let [x, y, mods] = global.get_pointer();
pieTimer.start(x, y, timeout);
if (type == Clutter.PointerA11yTimeoutType.GESTURE)
global.display.set_cursor(Meta.Cursor.CROSSHAIR);
});
manager.connect('ptr-a11y-timeout-stopped', (manager, device, type) => {
pieTimer.stop();
if (type == Clutter.PointerA11yTimeoutType.GESTURE)
global.display.set_cursor(Meta.Cursor.DEFAULT);
});
}
};

View File

@@ -51,64 +51,49 @@ function arrowIcon(side) {
return arrow; return arrow;
} }
var PopupBaseMenuItem = GObject.registerClass({ var PopupBaseMenuItem = class {
Properties: { constructor(params) {
'active': GObject.ParamSpec.boolean('active', 'active', 'active',
GObject.ParamFlags.READWRITE,
GObject.TYPE_BOOLEAN,
false),
'sensitive': GObject.ParamSpec.boolean('sensitive', 'sensitive', 'sensitive',
GObject.ParamFlags.READWRITE,
GObject.TYPE_BOOLEAN,
true),
},
Signals: {
'activate': { param_types: [Clutter.Event.$gtype] },
}
}, class PopupBaseMenuItem extends St.BoxLayout {
_init(params) {
params = Params.parse (params, { reactive: true, params = Params.parse (params, { reactive: true,
activate: true, activate: true,
hover: true, hover: true,
style_class: null, style_class: null,
can_focus: true can_focus: true
}); });
super._init({ style_class: 'popup-menu-item',
reactive: params.reactive, this.actor = new St.BoxLayout({ style_class: 'popup-menu-item',
track_hover: params.reactive, reactive: params.reactive,
can_focus: params.can_focus, track_hover: params.reactive,
accessible_role: Atk.Role.MENU_ITEM }); can_focus: params.can_focus,
this._delegate = this; accessible_role: Atk.Role.MENU_ITEM });
this.actor._delegate = this;
this._ornament = Ornament.NONE; this._ornament = Ornament.NONE;
this._ornamentLabel = new St.Label({ style_class: 'popup-menu-ornament' }); this._ornamentLabel = new St.Label({ style_class: 'popup-menu-ornament' });
this.add(this._ornamentLabel); this.actor.add(this._ornamentLabel);
this._parent = null; this._parent = null;
this._active = false; this.active = false;
this._activatable = params.reactive && params.activate; this._activatable = params.reactive && params.activate;
this._sensitive = true; this._sensitive = true;
if (!this._activatable) if (!this._activatable)
this.add_style_class_name('popup-inactive-menu-item'); this.actor.add_style_class_name('popup-inactive-menu-item');
if (params.style_class) if (params.style_class)
this.add_style_class_name(params.style_class); this.actor.add_style_class_name(params.style_class);
if (this._activatable) { if (this._activatable) {
this.connect('button-press-event', this._onButtonPressEvent.bind(this)); this.actor.connect('button-press-event', this._onButtonPressEvent.bind(this));
this.connect('button-release-event', this._onButtonReleaseEvent.bind(this)); this.actor.connect('button-release-event', this._onButtonReleaseEvent.bind(this));
this.connect('touch-event', this._onTouchEvent.bind(this)); this.actor.connect('touch-event', this._onTouchEvent.bind(this));
this.connect('key-press-event', this._onKeyPressEvent.bind(this)); this.actor.connect('key-press-event', this._onKeyPressEvent.bind(this));
} }
if (params.reactive && params.hover) if (params.reactive && params.hover)
this.bind_property('hover', this, 'active', GObject.BindingFlags.SYNC_CREATE); this.actor.connect('notify::hover', this._onHoverChanged.bind(this));
}
get actor() { this.actor.connect('key-focus-in', this._onKeyFocusIn.bind(this));
/* This is kept for compatibility with current implementation, and we this.actor.connect('key-focus-out', this._onKeyFocusOut.bind(this));
don't want to warn here yet since PopupMenu depends on this */ this.actor.connect('destroy', this._onDestroy.bind(this));
return this;
} }
_getTopMenu() { _getTopMenu() {
@@ -124,24 +109,24 @@ var PopupBaseMenuItem = GObject.registerClass({
_onButtonPressEvent(actor, event) { _onButtonPressEvent(actor, event) {
// This is the CSS active state // This is the CSS active state
this.add_style_pseudo_class('active'); this.actor.add_style_pseudo_class ('active');
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
} }
_onButtonReleaseEvent(actor, event) { _onButtonReleaseEvent(actor, event) {
this.remove_style_pseudo_class('active'); this.actor.remove_style_pseudo_class ('active');
this.activate(event); this.activate(event);
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
} }
_onTouchEvent(actor, event) { _onTouchEvent(actor, event) {
if (event.type() == Clutter.EventType.TOUCH_END) { if (event.type() == Clutter.EventType.TOUCH_END) {
this.remove_style_pseudo_class('active'); this.actor.remove_style_pseudo_class ('active');
this.activate(event); this.activate(event);
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
} else if (event.type() == Clutter.EventType.TOUCH_BEGIN) { } else if (event.type() == Clutter.EventType.TOUCH_BEGIN) {
// This is the CSS active state // This is the CSS active state
this.add_style_pseudo_class('active'); this.actor.add_style_pseudo_class ('active');
} }
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
} }
@@ -166,56 +151,54 @@ var PopupBaseMenuItem = GObject.registerClass({
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
} }
vfunc_key_focus_in() { _onKeyFocusIn(actor) {
super.vfunc_key_focus_in(); this.setActive(true);
this.active = true;
} }
vfunc_key_focus_out() { _onKeyFocusOut(actor) {
super.vfunc_key_focus_out(); this.setActive(false);
this.active = false; }
_onHoverChanged(actor) {
this.setActive(actor.hover);
} }
activate(event) { activate(event) {
this.emit('activate', event); this.emit('activate', event);
} }
get active() { setActive(active) {
return this._active;
}
set active(active) {
let activeChanged = active != this.active; let activeChanged = active != this.active;
if (activeChanged) { if (activeChanged) {
this._active = active; this.active = active;
if (active) { if (active) {
this.add_style_class_name('selected'); this.actor.add_style_class_name('selected');
if (this.can_focus) if (this.actor.can_focus)
this.grab_key_focus(); this.actor.grab_key_focus();
} else { } else {
this.remove_style_class_name('selected'); this.actor.remove_style_class_name('selected');
// Remove the CSS active state if the user press the button and // Remove the CSS active state if the user press the button and
// while holding moves to another menu item, so we don't paint all items. // while holding moves to another menu item, so we don't paint all items.
// The correct behaviour would be to set the new item with the CSS // The correct behaviour would be to set the new item with the CSS
// active state as well, but button-press-event is not trigered, // active state as well, but button-press-event is not trigered,
// so we should track it in our own, which would involve some work // so we should track it in our own, which would involve some work
// in the container // in the container
this.remove_style_pseudo_class('active'); this.actor.remove_style_pseudo_class ('active');
} }
this.notify('active'); this.emit('active-changed', active);
} }
} }
syncSensitive() { syncSensitive() {
let sensitive = this.sensitive; let sensitive = this.getSensitive();
this.reactive = sensitive; this.actor.reactive = sensitive;
this.can_focus = sensitive; this.actor.can_focus = sensitive;
this.notify('sensitive'); this.emit('sensitive-changed');
return sensitive; return sensitive;
} }
getSensitive() { getSensitive() {
let parentSensitive = this._parent ? this._parent.sensitive : true; let parentSensitive = this._parent ? this._parent.getSensitive() : true;
return this._activatable && this._sensitive && parentSensitive; return this._activatable && this._sensitive && parentSensitive;
} }
@@ -227,12 +210,12 @@ var PopupBaseMenuItem = GObject.registerClass({
this.syncSensitive(); this.syncSensitive();
} }
get sensitive() { destroy() {
return this.getSensitive(); this.actor.destroy();
} }
set sensitive(sensitive) { _onDestroy() {
this.setSensitive(sensitive); this.emit('destroy');
} }
setOrnament(ornament) { setOrnament(ornament) {
@@ -243,38 +226,36 @@ var PopupBaseMenuItem = GObject.registerClass({
if (ornament == Ornament.DOT) { if (ornament == Ornament.DOT) {
this._ornamentLabel.text = '\u2022'; this._ornamentLabel.text = '\u2022';
this.add_accessible_state(Atk.StateType.CHECKED); this.actor.add_accessible_state(Atk.StateType.CHECKED);
} else if (ornament == Ornament.CHECK) { } else if (ornament == Ornament.CHECK) {
this._ornamentLabel.text = '\u2713'; this._ornamentLabel.text = '\u2713';
this.add_accessible_state(Atk.StateType.CHECKED); this.actor.add_accessible_state(Atk.StateType.CHECKED);
} else if (ornament == Ornament.NONE) { } else if (ornament == Ornament.NONE) {
this._ornamentLabel.text = ''; this._ornamentLabel.text = '';
this.remove_accessible_state(Atk.StateType.CHECKED); this.actor.remove_accessible_state(Atk.StateType.CHECKED);
} }
} }
}); };
Signals.addSignalMethods(PopupBaseMenuItem.prototype);
var PopupMenuItem = GObject.registerClass( var PopupMenuItem = class extends PopupBaseMenuItem {
class PopupMenuItem extends PopupBaseMenuItem { constructor(text, params) {
_init(text, params) { super(params);
super._init(params);
this.label = new St.Label({ text: text }); this.label = new St.Label({ text: text });
this.add_child(this.label); this.actor.add_child(this.label);
this.label_actor = this.label this.actor.label_actor = this.label
} }
}); };
var PopupSeparatorMenuItem = class extends PopupBaseMenuItem {
var PopupSeparatorMenuItem = GObject.registerClass( constructor(text) {
class PopupSeparatorMenuItem extends PopupBaseMenuItem { super({ reactive: false,
_init(text) { can_focus: false});
super._init({ reactive: false,
can_focus: false });
this.label = new St.Label({ text: text || '' }); this.label = new St.Label({ text: text || '' });
this.add(this.label); this.actor.add(this.label);
this.label_actor = this.label; this.actor.label_actor = this.label;
this.label.connect('notify::text', this.label.connect('notify::text',
this._syncVisibility.bind(this)); this._syncVisibility.bind(this));
@@ -283,78 +264,75 @@ class PopupSeparatorMenuItem extends PopupBaseMenuItem {
this._separator = new St.Widget({ style_class: 'popup-separator-menu-item', this._separator = new St.Widget({ style_class: 'popup-separator-menu-item',
y_expand: true, y_expand: true,
y_align: Clutter.ActorAlign.CENTER }); y_align: Clutter.ActorAlign.CENTER });
this.add(this._separator, { expand: true }); this.actor.add(this._separator, { expand: true });
} }
_syncVisibility() { _syncVisibility() {
this.label.visible = this.label.text != ''; this.label.visible = this.label.text != '';
} }
}); };
var Switch = GObject.registerClass( var Switch = class {
class Switch extends St.Bin { constructor(state) {
_init(state) { this.actor = new St.Bin({ style_class: 'toggle-switch',
super._init({ style_class: 'toggle-switch', accessible_role: Atk.Role.CHECK_BOX,
accessible_role: Atk.Role.CHECK_BOX, can_focus: true });
can_focus: true });
this.setToggleState(state); this.setToggleState(state);
} }
setToggleState(state) { setToggleState(state) {
if (state) if (state)
this.add_style_pseudo_class('checked'); this.actor.add_style_pseudo_class('checked');
else else
this.remove_style_pseudo_class('checked'); this.actor.remove_style_pseudo_class('checked');
this.state = state; this.state = state;
} }
toggle() { toggle() {
this.setToggleState(!this.state); this.setToggleState(!this.state);
} }
}); };
var PopupSwitchMenuItem = GObject.registerClass({ var PopupSwitchMenuItem = class extends PopupBaseMenuItem {
Signals: { 'toggled': { param_types: [GObject.TYPE_BOOLEAN] }, }, constructor(text, active, params) {
}, super(params);
class PopupSwitchMenuItem extends PopupBaseMenuItem {
_init(text, active, params) {
super._init(params);
this.label = new St.Label({ text: text }); this.label = new St.Label({ text: text });
this._switch = new Switch(active); this._switch = new Switch(active);
this.accessible_role = Atk.Role.CHECK_MENU_ITEM; this.actor.accessible_role = Atk.Role.CHECK_MENU_ITEM;
this.checkAccessibleState(); this.checkAccessibleState();
this.label_actor = this.label; this.actor.label_actor = this.label;
this.add_child(this.label); this.actor.add_child(this.label);
this._statusBin = new St.Bin({ x_align: St.Align.END }); this._statusBin = new St.Bin({ x_align: St.Align.END });
this.add(this._statusBin, { expand: true, x_align: St.Align.END }); this.actor.add(this._statusBin, { expand: true, x_align: St.Align.END });
this._statusLabel = new St.Label({ text: '', this._statusLabel = new St.Label({ text: '',
style_class: 'popup-status-menu-item' style_class: 'popup-status-menu-item'
}); });
this._statusBin.child = this._switch; this._statusBin.child = this._switch.actor;
} }
setStatus(text) { setStatus(text) {
if (text != null) { if (text != null) {
this._statusLabel.text = text; this._statusLabel.text = text;
this._statusBin.child = this._statusLabel; this._statusBin.child = this._statusLabel;
this.reactive = false; this.actor.reactive = false;
this.accessible_role = Atk.Role.MENU_ITEM; this.actor.accessible_role = Atk.Role.MENU_ITEM;
} else { } else {
this._statusBin.child = this._switch; this._statusBin.child = this._switch.actor;
this.reactive = true; this.actor.reactive = true;
this.accessible_role = Atk.Role.CHECK_MENU_ITEM; this.actor.accessible_role = Atk.Role.CHECK_MENU_ITEM;
} }
this.checkAccessibleState(); this.checkAccessibleState();
} }
activate(event) { activate(event) {
if (this._switch.mapped) if (this._switch.actor.mapped) {
this.toggle(); this.toggle();
}
// we allow pressing space to toggle the switch // we allow pressing space to toggle the switch
// without closing the menu // without closing the menu
@@ -381,30 +359,29 @@ class PopupSwitchMenuItem extends PopupBaseMenuItem {
} }
checkAccessibleState() { checkAccessibleState() {
switch (this.accessible_role) { switch (this.actor.accessible_role) {
case Atk.Role.CHECK_MENU_ITEM: case Atk.Role.CHECK_MENU_ITEM:
if (this._switch.state) if (this._switch.state)
this.add_accessible_state(Atk.StateType.CHECKED); this.actor.add_accessible_state (Atk.StateType.CHECKED);
else else
this.remove_accessible_state(Atk.StateType.CHECKED); this.actor.remove_accessible_state (Atk.StateType.CHECKED);
break; break;
default: default:
this.remove_accessible_state(Atk.StateType.CHECKED); this.actor.remove_accessible_state (Atk.StateType.CHECKED);
} }
} }
}); };
var PopupImageMenuItem = GObject.registerClass( var PopupImageMenuItem = class extends PopupBaseMenuItem {
class PopupImageMenuItem extends PopupBaseMenuItem { constructor(text, icon, params) {
_init(text, icon, params) { super(params);
super._init(params);
this._icon = new St.Icon({ style_class: 'popup-menu-icon', this._icon = new St.Icon({ style_class: 'popup-menu-icon',
x_align: Clutter.ActorAlign.END }); x_align: Clutter.ActorAlign.END });
this.add_child(this._icon); this.actor.add_child(this._icon);
this.label = new St.Label({ text: text }); this.label = new St.Label({ text: text });
this.add_child(this.label); this.actor.add_child(this.label);
this.label_actor = this.label; this.actor.label_actor = this.label;
this.setIcon(icon); this.setIcon(icon);
} }
@@ -416,12 +393,12 @@ class PopupImageMenuItem extends PopupBaseMenuItem {
else else
this._icon.icon_name = icon; this._icon.icon_name = icon;
} }
}); };
var PopupMenuBase = class { var PopupMenuBase = class {
constructor(sourceActor, styleClass) { constructor(sourceActor, styleClass) {
if (this.constructor === PopupMenuBase) if (new.target === PopupMenuBase)
throw new TypeError(`Cannot instantiate abstract class ${this.constructor.name}`); throw new TypeError('Cannot instantiate abstract class ' + new.target.name);
this.sourceActor = sourceActor; this.sourceActor = sourceActor;
this._parent = null; this._parent = null;
@@ -460,21 +437,13 @@ var PopupMenuBase = class {
} }
getSensitive() { getSensitive() {
let parentSensitive = this._parent ? this._parent.sensitive : true; let parentSensitive = this._parent ? this._parent.getSensitive() : true;
return this._sensitive && parentSensitive; return this._sensitive && parentSensitive;
} }
setSensitive(sensitive) { setSensitive(sensitive) {
this._sensitive = sensitive; this._sensitive = sensitive;
this.emit('notify::sensitive'); this.emit('sensitive-changed');
}
get sensitive() {
return this.getSensitive();
}
set sensitive(sensitive) {
this.setSensitive(sensitive);
} }
_sessionUpdated() { _sessionUpdated() {
@@ -510,7 +479,7 @@ var PopupMenuBase = class {
app.activate(); app.activate();
}); });
menuItem.visible = Main.sessionMode.allowSettings; menuItem.actor.visible = Main.sessionMode.allowSettings;
this._settingsActions[desktopFile] = menuItem; this._settingsActions[desktopFile] = menuItem;
return menuItem; return menuItem;
@@ -519,7 +488,7 @@ var PopupMenuBase = class {
_setSettingsVisibility(visible) { _setSettingsVisibility(visible) {
for (let id in this._settingsActions) { for (let id in this._settingsActions) {
let item = this._settingsActions[id]; let item = this._settingsActions[id];
item.visible = visible; item.actor.visible = visible;
} }
} }
@@ -542,17 +511,16 @@ var PopupMenuBase = class {
_subMenuActiveChanged(submenu, submenuItem) { _subMenuActiveChanged(submenu, submenuItem) {
if (this._activeMenuItem && this._activeMenuItem != submenuItem) if (this._activeMenuItem && this._activeMenuItem != submenuItem)
this._activeMenuItem.active = false; this._activeMenuItem.setActive(false);
this._activeMenuItem = submenuItem; this._activeMenuItem = submenuItem;
this.emit('active-changed', submenuItem); this.emit('active-changed', submenuItem);
} }
_connectItemSignals(menuItem) { _connectItemSignals(menuItem) {
menuItem._activeChangeId = menuItem.connect('notify::active', (menuItem) => { menuItem._activeChangeId = menuItem.connect('active-changed', (menuItem, active) => {
let active = menuItem.active;
if (active && this._activeMenuItem != menuItem) { if (active && this._activeMenuItem != menuItem) {
if (this._activeMenuItem) if (this._activeMenuItem)
this._activeMenuItem.active = false; this._activeMenuItem.setActive(false);
this._activeMenuItem = menuItem; this._activeMenuItem = menuItem;
this.emit('active-changed', menuItem); this.emit('active-changed', menuItem);
} else if (!active && this._activeMenuItem == menuItem) { } else if (!active && this._activeMenuItem == menuItem) {
@@ -560,8 +528,8 @@ var PopupMenuBase = class {
this.emit('active-changed', null); this.emit('active-changed', null);
} }
}); });
menuItem._sensitiveChangeId = menuItem.connect('notify::sensitive', () => { menuItem._sensitiveChangeId = menuItem.connect('sensitive-changed', () => {
let sensitive = menuItem.sensitive; let sensitive = menuItem.getSensitive();
if (!sensitive && this._activeMenuItem == menuItem) { if (!sensitive && this._activeMenuItem == menuItem) {
if (!this.actor.navigate_focus(menuItem.actor, if (!this.actor.navigate_focus(menuItem.actor,
St.DirectionType.TAB_FORWARD, St.DirectionType.TAB_FORWARD,
@@ -572,12 +540,12 @@ var PopupMenuBase = class {
menuItem.actor.grab_key_focus(); menuItem.actor.grab_key_focus();
} }
}); });
menuItem._activateId = menuItem.connect_after('activate', (menuItem, event) => { menuItem._activateId = menuItem.connect('activate', (menuItem, event) => {
this.emit('activate', menuItem); this.emit('activate', menuItem);
this.itemActivated(BoxPointer.PopupAnimation.FULL); this.itemActivated(BoxPointer.PopupAnimation.FULL);
}); });
menuItem._parentSensitiveChangeId = this.connect('notify::sensitive', () => { menuItem._parentSensitiveChangeId = this.connect('sensitive-changed', () => {
menuItem.syncSensitive(); menuItem.syncSensitive();
}); });
@@ -629,7 +597,7 @@ var PopupMenuBase = class {
return; return;
} }
menuItem.show(); menuItem.actor.show();
} }
moveMenuItem(menuItem, position) { moveMenuItem(menuItem, position) {
@@ -676,8 +644,8 @@ var PopupMenuBase = class {
let parentClosingId = this.connect('menu-closed', () => { let parentClosingId = this.connect('menu-closed', () => {
menuItem.emit('menu-closed'); menuItem.emit('menu-closed');
}); });
let subMenuSensitiveChangedId = this.connect('notify::sensitive', () => { let subMenuSensitiveChangedId = this.connect('sensitive-changed', () => {
menuItem.emit('notify::sensitive'); menuItem.emit('sensitive-changed');
}); });
menuItem.connect('destroy', () => { menuItem.connect('destroy', () => {
@@ -883,9 +851,9 @@ var PopupMenu = class extends PopupMenuBase {
close(animate) { close(animate) {
if (this._activeMenuItem) if (this._activeMenuItem)
this._activeMenuItem.active = false; this._activeMenuItem.setActive(false);
if (this._boxPointer.visible) { if (this._boxPointer.actor.visible) {
this._boxPointer.close(animate, () => { this._boxPointer.close(animate, () => {
this.emit('menu-closed'); this.emit('menu-closed');
}); });
@@ -916,10 +884,6 @@ var PopupDummyMenu = class {
return true; return true;
} }
get sensitive() {
return this.getSensitive();
}
open() { this.emit('open-state-changed', true); } open() { this.emit('open-state-changed', true); }
close() { this.emit('open-state-changed', false); } close() { this.emit('open-state-changed', false); }
toggle() {} toggle() {}
@@ -959,11 +923,7 @@ var PopupSubMenu = class extends PopupMenuBase {
} }
getSensitive() { getSensitive() {
return this._sensitive && this.sourceActor.sensitive; return this._sensitive && this.sourceActor._delegate.getSensitive();
}
get sensitive() {
return this.getSensitive();
} }
open(animate) { open(animate) {
@@ -1030,7 +990,7 @@ var PopupSubMenu = class extends PopupMenuBase {
this.emit('open-state-changed', false); this.emit('open-state-changed', false);
if (this._activeMenuItem) if (this._activeMenuItem)
this._activeMenuItem.active = false; this._activeMenuItem.setActive(false);
if (animate && this._needsScrollbar()) if (animate && this._needsScrollbar())
animate = false; animate = false;
@@ -1062,7 +1022,7 @@ var PopupSubMenu = class extends PopupMenuBase {
if (this.isOpen && event.get_key_symbol() == Clutter.KEY_Left) { if (this.isOpen && event.get_key_symbol() == Clutter.KEY_Left) {
this.close(BoxPointer.PopupAnimation.FULL); this.close(BoxPointer.PopupAnimation.FULL);
this.sourceActor._delegate.active = true; this.sourceActor._delegate.setActive(true);
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
} }
@@ -1093,26 +1053,25 @@ var PopupMenuSection = class extends PopupMenuBase {
close() { this.emit('open-state-changed', false); } close() { this.emit('open-state-changed', false); }
}; };
var PopupSubMenuMenuItem = GObject.registerClass( var PopupSubMenuMenuItem = class extends PopupBaseMenuItem {
class PopupSubMenuMenuItem extends PopupBaseMenuItem { constructor(text, wantIcon) {
_init(text, wantIcon) { super();
super._init();
this.add_style_class_name('popup-submenu-menu-item'); this.actor.add_style_class_name('popup-submenu-menu-item');
if (wantIcon) { if (wantIcon) {
this.icon = new St.Icon({ style_class: 'popup-menu-icon' }); this.icon = new St.Icon({ style_class: 'popup-menu-icon' });
this.add_child(this.icon); this.actor.add_child(this.icon);
} }
this.label = new St.Label({ text: text, this.label = new St.Label({ text: text,
y_expand: true, y_expand: true,
y_align: Clutter.ActorAlign.CENTER }); y_align: Clutter.ActorAlign.CENTER });
this.add_child(this.label); this.actor.add_child(this.label);
this.label_actor = this.label; this.actor.label_actor = this.label;
let expander = new St.Bin({ style_class: 'popup-menu-item-expander' }); let expander = new St.Bin({ style_class: 'popup-menu-item-expander' });
this.add(expander, { expand: true }); this.actor.add(expander, { expand: true });
this._triangle = arrowIcon(St.Side.RIGHT); this._triangle = arrowIcon(St.Side.RIGHT);
this._triangle.pivot_point = new Clutter.Point({ x: 0.5, y: 0.6 }); this._triangle.pivot_point = new Clutter.Point({ x: 0.5, y: 0.6 });
@@ -1121,12 +1080,11 @@ class PopupSubMenuMenuItem extends PopupBaseMenuItem {
y_align: Clutter.ActorAlign.CENTER }); y_align: Clutter.ActorAlign.CENTER });
this._triangleBin.add_child(this._triangle); this._triangleBin.add_child(this._triangle);
this.add_child(this._triangleBin); this.actor.add_child(this._triangleBin);
this.add_accessible_state(Atk.StateType.EXPANDABLE); this.actor.add_accessible_state (Atk.StateType.EXPANDABLE);
this.menu = new PopupSubMenu(this, this._triangle); this.menu = new PopupSubMenu(this.actor, this._triangle);
this.menu.connect('open-state-changed', this._subMenuOpenStateChanged.bind(this)); this.menu.connect('open-state-changed', this._subMenuOpenStateChanged.bind(this));
this.connect('destroy', () => { this.menu.destroy(); });
} }
_setParent(parent) { _setParent(parent) {
@@ -1143,18 +1101,24 @@ class PopupSubMenuMenuItem extends PopupBaseMenuItem {
_subMenuOpenStateChanged(menu, open) { _subMenuOpenStateChanged(menu, open) {
if (open) { if (open) {
this.add_style_pseudo_class('open'); this.actor.add_style_pseudo_class('open');
this._getTopMenu()._setOpenedSubMenu(this.menu); this._getTopMenu()._setOpenedSubMenu(this.menu);
this.add_accessible_state(Atk.StateType.EXPANDED); this.actor.add_accessible_state (Atk.StateType.EXPANDED);
this.add_style_pseudo_class('checked'); this.actor.add_style_pseudo_class('checked');
} else { } else {
this.remove_style_pseudo_class('open'); this.actor.remove_style_pseudo_class('open');
this._getTopMenu()._setOpenedSubMenu(null); this._getTopMenu()._setOpenedSubMenu(null);
this.remove_accessible_state (Atk.StateType.EXPANDED); this.actor.remove_accessible_state (Atk.StateType.EXPANDED);
this.remove_style_pseudo_class('checked'); this.actor.remove_style_pseudo_class('checked');
} }
} }
destroy() {
this.menu.destroy();
super.destroy();
}
setSubmenuShown(open) { setSubmenuShown(open) {
if (open) if (open)
this.menu.open(BoxPointer.PopupAnimation.FULL); this.menu.open(BoxPointer.PopupAnimation.FULL);
@@ -1192,7 +1156,7 @@ class PopupSubMenuMenuItem extends PopupBaseMenuItem {
_onButtonReleaseEvent(actor) { _onButtonReleaseEvent(actor) {
// Since we override the parent, we need to manage what the parent does // Since we override the parent, we need to manage what the parent does
// with the active style class // with the active style class
this.remove_style_pseudo_class('active'); this.actor.remove_style_pseudo_class ('active');
this._setOpenState(!this._getOpenState()); this._setOpenState(!this._getOpenState());
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
} }
@@ -1201,12 +1165,12 @@ class PopupSubMenuMenuItem extends PopupBaseMenuItem {
if (event.type() == Clutter.EventType.TOUCH_END) { if (event.type() == Clutter.EventType.TOUCH_END) {
// Since we override the parent, we need to manage what the parent does // Since we override the parent, we need to manage what the parent does
// with the active style class // with the active style class
this.remove_style_pseudo_class('active'); this.actor.remove_style_pseudo_class ('active');
this._setOpenState(!this._getOpenState()); this._setOpenState(!this._getOpenState());
} }
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
} }
}); };
/* Basic implementation of a menu manager. /* Basic implementation of a menu manager.
* Call addMenu to add menus * Call addMenu to add menus
@@ -1215,7 +1179,8 @@ var PopupMenuManager = class {
constructor(owner, grabParams) { constructor(owner, grabParams) {
grabParams = Params.parse(grabParams, grabParams = Params.parse(grabParams,
{ actionMode: Shell.ActionMode.POPUP }); { actionMode: Shell.ActionMode.POPUP });
this._grabHelper = new GrabHelper.GrabHelper(owner, grabParams); this._owner = owner;
this._grabHelper = new GrabHelper.GrabHelper(owner.actor, grabParams);
this._menus = []; this._menus = [];
} }

View File

@@ -89,8 +89,6 @@ function loadRemoteSearchProviders(searchSettings, callback) {
try { try {
let desktopId = keyfile.get_string(group, 'DesktopId'); let desktopId = keyfile.get_string(group, 'DesktopId');
appInfo = Gio.DesktopAppInfo.new(desktopId); appInfo = Gio.DesktopAppInfo.new(desktopId);
if (!appInfo.should_show())
return;
} catch (e) { } catch (e) {
log('Ignoring search provider ' + path + ': missing DesktopId'); log('Ignoring search provider ' + path + ': missing DesktopId');
return; return;

View File

@@ -1,97 +0,0 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const { Clutter, St } = imports.gi;
const Tweener = imports.ui.tweener;
// Shamelessly copied from the layout "hotcorner" ripples implementation
var Ripples = class Ripples {
constructor(px, py, styleClass) {
this._x = 0;
this._y = 0;
this._px = px;
this._py = py;
this._ripple1 = new St.BoxLayout({ style_class: styleClass,
opacity: 0,
can_focus: false,
reactive: false,
visible: false });
this._ripple1.set_pivot_point(px, py);
this._ripple2 = new St.BoxLayout({ style_class: styleClass,
opacity: 0,
can_focus: false,
reactive: false,
visible: false });
this._ripple2.set_pivot_point(px, py);
this._ripple3 = new St.BoxLayout({ style_class: styleClass,
opacity: 0,
can_focus: false,
reactive: false,
visible: false });
this._ripple3.set_pivot_point(px, py);
}
_animRipple(ripple, delay, time, startScale, startOpacity, finalScale) {
// We draw a ripple by using a source image and animating it scaling
// outwards and fading away. We want the ripples to move linearly
// or it looks unrealistic, but if the opacity of the ripple goes
// linearly to zero it fades away too quickly, so we use Tweener's
// 'onUpdate' to give a non-linear curve to the fade-away and make
// it more visible in the middle section.
ripple.x = this._x;
ripple.y = this._y;
ripple._opacity = startOpacity;
ripple.visible = true;
ripple.opacity = 255 * Math.sqrt(startOpacity);
ripple.scale_x = ripple.scale_y = startScale;
ripple.set_translation( - this._px * ripple.width, - this._py * ripple.height, 0.0);
Tweener.addTween(ripple, { _opacity: 0,
scale_x: finalScale,
scale_y: finalScale,
delay: delay,
time: time,
transition: 'linear',
onUpdate() { ripple.opacity = 255 * Math.sqrt(ripple._opacity); },
onComplete() { ripple.visible = false; } });
}
addTo(stage) {
if (this._stage !== undefined) {
throw new Error('Ripples already added');
return;
}
this._stage = stage;
this._stage.add_actor(this._ripple1);
this._stage.add_actor(this._ripple2);
this._stage.add_actor(this._ripple3);
}
playAnimation(x, y) {
if (this._stage === undefined) {
throw new Error('Ripples not added');
return;
}
this._x = x;
this._y = y;
this._stage.set_child_above_sibling(this._ripple1, null);
this._stage.set_child_above_sibling(this._ripple2, this._ripple1);
this._stage.set_child_above_sibling(this._ripple3, this._ripple2);
// Show three concentric ripples expanding outwards; the exact
// parameters were found by trial and error, so don't look
// for them to make perfect sense mathematically
// delay time scale opacity => scale
this._animRipple(this._ripple1, 0.0, 0.83, 0.25, 1.0, 1.5);
this._animRipple(this._ripple2, 0.05, 1.0, 0.0, 0.7, 1.25);
this._animRipple(this._ripple3, 0.35, 1.0, 0.0, 0.3, 1);
}
};

View File

@@ -1,6 +1,6 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const { Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi; const { Clutter, Gio, GLib, Meta, Shell, St } = imports.gi;
const Signals = imports.signals; const Signals = imports.signals;
const Main = imports.ui.main; const Main = imports.ui.main;
@@ -23,11 +23,10 @@ const EXEC_ARG_KEY = 'exec-arg';
var DIALOG_GROW_TIME = 0.1; var DIALOG_GROW_TIME = 0.1;
var RunDialog = GObject.registerClass( var RunDialog = class extends ModalDialog.ModalDialog {
class RunDialog extends ModalDialog.ModalDialog { constructor() {
_init() { super({ styleClass: 'run-dialog',
super._init({ styleClass: 'run-dialog', destroyOnClose: false });
destroyOnClose: false });
this._lockdownSettings = new Gio.Settings({ schema_id: LOCKDOWN_SCHEMA }); this._lockdownSettings = new Gio.Settings({ schema_id: LOCKDOWN_SCHEMA });
this._terminalSettings = new Gio.Settings({ schema_id: TERMINAL_SCHEMA }); this._terminalSettings = new Gio.Settings({ schema_id: TERMINAL_SCHEMA });
@@ -283,4 +282,5 @@ class RunDialog extends ModalDialog.ModalDialog {
super.open(); super.open();
} }
}); };
Signals.addSignalMethods(RunDialog.prototype);

View File

@@ -431,9 +431,6 @@ var SearchResults = class {
this._cancellable = new Gio.Cancellable(); this._cancellable = new Gio.Cancellable();
this._registerProvider(new AppDisplay.AppSearchProvider()); this._registerProvider(new AppDisplay.AppSearchProvider());
let appSystem = Shell.AppSystem.get_default();
appSystem.connect('installed-changed', this._reloadRemoteProviders.bind(this));
this._reloadRemoteProviders(); this._reloadRemoteProviders();
} }

View File

@@ -25,7 +25,6 @@ const _modes = {
hasWorkspaces: false, hasWorkspaces: false,
hasWindows: false, hasWindows: false,
hasNotifications: false, hasNotifications: false,
hasWmMenus: false,
isLocked: false, isLocked: false,
isGreeter: false, isGreeter: false,
isPrimary: false, isPrimary: false,
@@ -48,7 +47,7 @@ const _modes = {
panel: { panel: {
left: [], left: [],
center: ['dateMenu'], center: ['dateMenu'],
right: ['dwellClick', 'a11y', 'keyboard', 'aggregateMenu'] right: ['a11y', 'keyboard', 'aggregateMenu']
}, },
panelStyle: 'login-screen' panelStyle: 'login-screen'
}, },
@@ -73,7 +72,7 @@ const _modes = {
panel: { panel: {
left: [], left: [],
center: [], center: [],
right: ['dwellClick', 'a11y', 'keyboard', 'aggregateMenu'] right: ['a11y', 'keyboard', 'aggregateMenu']
}, },
panelStyle: 'unlock-screen' panelStyle: 'unlock-screen'
}, },
@@ -87,7 +86,6 @@ const _modes = {
hasRunDialog: true, hasRunDialog: true,
hasWorkspaces: true, hasWorkspaces: true,
hasWindows: true, hasWindows: true,
hasWmMenus: true,
hasNotifications: true, hasNotifications: true,
isLocked: false, isLocked: false,
isPrimary: true, isPrimary: true,
@@ -101,7 +99,7 @@ const _modes = {
panel: { panel: {
left: ['activities', 'appMenu'], left: ['activities', 'appMenu'],
center: ['dateMenu'], center: ['dateMenu'],
right: ['dwellClick', 'a11y', 'keyboard', 'aggregateMenu'] right: ['a11y', 'keyboard', 'aggregateMenu']
} }
} }
}; };

View File

@@ -148,7 +148,7 @@ function addContextMenu(entry, params) {
entry.menu = new EntryMenu(entry); entry.menu = new EntryMenu(entry);
entry.menu.isPassword = params.isPassword; entry.menu.isPassword = params.isPassword;
entry._menuManager = new PopupMenu.PopupMenuManager(entry, entry._menuManager = new PopupMenu.PopupMenuManager({ actor: entry },
{ actionMode: params.actionMode }); { actionMode: params.actionMode });
entry._menuManager.addMenu(entry.menu); entry._menuManager.addMenu(entry.menu);

View File

@@ -1,9 +1,8 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const { Clutter, Gio, GLib, GObject, Pango, Shell, St } = imports.gi; const { Clutter, Gio, GLib, Pango, Shell, St } = imports.gi;
const Signals = imports.signals; const Signals = imports.signals;
const Animation = imports.ui.animation;
const CheckBox = imports.ui.checkBox; const CheckBox = imports.ui.checkBox;
const Dialog = imports.ui.dialog; const Dialog = imports.ui.dialog;
const Main = imports.ui.main; const Main = imports.ui.main;
@@ -15,7 +14,6 @@ const ShellEntry = imports.ui.shellEntry;
const { loadInterfaceXML } = imports.misc.fileUtils; const { loadInterfaceXML } = imports.misc.fileUtils;
var LIST_ITEM_ICON_SIZE = 48; var LIST_ITEM_ICON_SIZE = 48;
var WORK_SPINNER_ICON_SIZE = 16;
const REMEMBER_MOUNT_PASSWORD_KEY = 'remember-mount-password'; const REMEMBER_MOUNT_PASSWORD_KEY = 'remember-mount-password';
@@ -150,7 +148,7 @@ var ShellMountOperation = class {
} }
this._dialogId = this._dialog.connect('response', this._dialogId = this._dialog.connect('response',
(object, choice, password, remember, hiddenVolume, systemVolume, pim) => { (object, choice, password, remember) => {
if (choice == -1) { if (choice == -1) {
this.mountOp.reply(Gio.MountOperationResult.ABORTED); this.mountOp.reply(Gio.MountOperationResult.ABORTED);
} else { } else {
@@ -160,9 +158,6 @@ var ShellMountOperation = class {
this.mountOp.set_password_save(Gio.PasswordSave.NEVER); this.mountOp.set_password_save(Gio.PasswordSave.NEVER);
this.mountOp.set_password(password); this.mountOp.set_password(password);
this.mountOp.set_is_tcrypt_hidden_volume(hiddenVolume);
this.mountOp.set_is_tcrypt_system_volume(systemVolume);
this.mountOp.set_pim(pim);
this.mountOp.reply(Gio.MountOperationResult.HANDLED); this.mountOp.reply(Gio.MountOperationResult.HANDLED);
} }
}); });
@@ -269,11 +264,9 @@ var ShellUnmountNotifier = class extends MessageTray.Source {
} }
}; };
var ShellMountQuestionDialog = GObject.registerClass({ var ShellMountQuestionDialog = class extends ModalDialog.ModalDialog {
Signals: { 'response': { param_types: [GObject.TYPE_INT] } } constructor(icon) {
}, class ShellMountQuestionDialog extends ModalDialog.ModalDialog { super({ styleClass: 'mount-dialog' });
_init(icon) {
super._init({ styleClass: 'mount-dialog' });
this._content = new Dialog.MessageDialogContent({ icon }); this._content = new Dialog.MessageDialogContent({ icon });
this.contentLayout.add(this._content, { x_fill: true, y_fill: false }); this.contentLayout.add(this._content, { x_fill: true, y_fill: false });
@@ -283,107 +276,34 @@ var ShellMountQuestionDialog = GObject.registerClass({
_setLabelsForMessage(this._content, message); _setLabelsForMessage(this._content, message);
_setButtonsForChoices(this, choices); _setButtonsForChoices(this, choices);
} }
}); };
Signals.addSignalMethods(ShellMountQuestionDialog.prototype);
var ShellMountPasswordDialog = GObject.registerClass({ var ShellMountPasswordDialog = class extends ModalDialog.ModalDialog {
Signals: { 'response': { param_types: [GObject.TYPE_INT, constructor(message, icon, flags) {
GObject.TYPE_STRING,
GObject.TYPE_BOOLEAN,
GObject.TYPE_BOOLEAN,
GObject.TYPE_BOOLEAN,
GObject.TYPE_UINT] } }
}, class ShellMountPasswordDialog extends ModalDialog.ModalDialog {
_init(message, icon, flags) {
let strings = message.split('\n'); let strings = message.split('\n');
let title = strings.shift() || null; let title = strings.shift() || null;
let body = strings.shift() || null; let body = strings.shift() || null;
super._init({ styleClass: 'prompt-dialog' }); super({ styleClass: 'prompt-dialog' });
let disksApp = Shell.AppSystem.get_default().lookup_app('org.gnome.DiskUtility.desktop');
let content = new Dialog.MessageDialogContent({ icon, title, body }); let content = new Dialog.MessageDialogContent({ icon, title, body });
this.contentLayout.add_actor(content); this.contentLayout.add_actor(content);
content._body.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
let layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL }); this._passwordBox = new St.BoxLayout({ vertical: false, style_class: 'prompt-dialog-password-box' });
let grid = new St.Widget({ style_class: 'prompt-dialog-grid', content.messageBox.add(this._passwordBox);
layout_manager: layout });
layout.hookup_style(grid);
let rtl = grid.get_text_direction() === Clutter.TextDirection.RTL;
if (flags & Gio.AskPasswordFlags.TCRYPT) { this._passwordLabel = new St.Label(({ style_class: 'prompt-dialog-password-label',
this._keyfilesLabel = new St.Label(({ style_class: 'prompt-dialog-keyfiles-label', text: _("Password") }));
visible: false })); this._passwordBox.add(this._passwordLabel, { y_fill: false, y_align: St.Align.MIDDLE });
this._hiddenVolume = new CheckBox.CheckBox(_("Hidden Volume"));
content.messageBox.add(this._hiddenVolume.actor);
this._systemVolume = new CheckBox.CheckBox(_("Windows System Volume"));
content.messageBox.add(this._systemVolume.actor);
this._keyfilesCheckbox = new CheckBox.CheckBox(_("Uses Keyfiles"));
this._keyfilesCheckbox.actor.connect("clicked", this._onKeyfilesCheckboxClicked.bind(this));
content.messageBox.add(this._keyfilesCheckbox.actor);
this._keyfilesLabel.clutter_text.set_markup(
/* Translators: %s is the Disks application */
_("To unlock a volume that uses keyfiles, use the <i>%s</i> utility instead.").format(disksApp.get_name())
);
this._keyfilesLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
this._keyfilesLabel.clutter_text.line_wrap = true;
content.messageBox.add(this._keyfilesLabel, { y_fill: false, y_align: St.Align.MIDDLE, expand: true });
this._pimLabel = new St.Label({ style_class: 'prompt-dialog-password-label',
text: _("PIM Number"),
y_align: Clutter.ActorAlign.CENTER });
this._pimEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry',
can_focus: true,
x_expand: true });
this._pimEntry.clutter_text.connect('activate', this._onEntryActivate.bind(this));
this._pimEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE
ShellEntry.addContextMenu(this._pimEntry, { isPassword: true });
if (rtl) {
layout.attach(this._pimEntry, 0, 0, 1, 1);
layout.attach(this._pimLabel, 1, 0, 1, 1);
} else {
layout.attach(this._pimLabel, 0, 0, 1, 1);
layout.attach(this._pimEntry, 1, 0, 1, 1);
}
this._pimErrorMessageLabel = new St.Label({ style_class: 'prompt-dialog-password-entry',
text: _("The PIM must be a number or empty."),
visible: false });
layout.attach(this._pimErrorMessageLabel, 0, 2, 2, 1);
} else {
this._hiddenVolume = null;
this._systemVolume = null;
this._pimEntry = null;
this._pimErrorMessageLabel = null;
}
this._passwordLabel = new St.Label({ style_class: 'prompt-dialog-password-label',
text: _("Password"),
y_align: Clutter.ActorAlign.CENTER });
this._passwordEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry', this._passwordEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry',
can_focus: true, text: "",
x_expand: true }); can_focus: true});
ShellEntry.addContextMenu(this._passwordEntry, { isPassword: true });
this._passwordEntry.clutter_text.connect('activate', this._onEntryActivate.bind(this)); this._passwordEntry.clutter_text.connect('activate', this._onEntryActivate.bind(this));
this._passwordEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE this._passwordEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE
ShellEntry.addContextMenu(this._passwordEntry, { isPassword: true }); this._passwordBox.add(this._passwordEntry, {expand: true });
this.setInitialKeyFocus(this._passwordEntry); this.setInitialKeyFocus(this._passwordEntry);
this._workSpinner = new Animation.Spinner(WORK_SPINNER_ICON_SIZE, true);
this._passwordEntry.secondary_icon = this._workSpinner.actor;
if (rtl) {
layout.attach(this._passwordEntry, 0, 1, 1, 1);
layout.attach(this._passwordLabel, 1, 1, 1, 1);
} else {
layout.attach(this._passwordLabel, 0, 1, 1, 1);
layout.attach(this._passwordEntry, 1, 1, 1, 1);
}
content.messageBox.add(grid);
this._errorMessageLabel = new St.Label({ style_class: 'prompt-dialog-error-label', this._errorMessageLabel = new St.Label({ style_class: 'prompt-dialog-error-label',
text: _("Sorry, that didnt work. Please try again.") }); text: _("Sorry, that didnt work. Please try again.") });
@@ -393,7 +313,8 @@ var ShellMountPasswordDialog = GObject.registerClass({
content.messageBox.add(this._errorMessageLabel); content.messageBox.add(this._errorMessageLabel);
if (flags & Gio.AskPasswordFlags.SAVING_SUPPORTED) { if (flags & Gio.AskPasswordFlags.SAVING_SUPPORTED) {
this._rememberChoice = new CheckBox.CheckBox(_("Remember Password")); this._rememberChoice = new CheckBox.CheckBox();
this._rememberChoice.getLabelActor().text = _("Remember Password");
this._rememberChoice.actor.checked = this._rememberChoice.actor.checked =
global.settings.get_boolean(REMEMBER_MOUNT_PASSWORD_KEY); global.settings.get_boolean(REMEMBER_MOUNT_PASSWORD_KEY);
content.messageBox.add(this._rememberChoice.actor); content.messageBox.add(this._rememberChoice.actor);
@@ -401,36 +322,25 @@ var ShellMountPasswordDialog = GObject.registerClass({
this._rememberChoice = null; this._rememberChoice = null;
} }
this._defaultButtons = [{ label: _("Cancel"), let buttons = [{ label: _("Cancel"),
action: this._onCancelButton.bind(this), action: this._onCancelButton.bind(this),
key: Clutter.Escape key: Clutter.Escape
}, },
{ label: _("Unlock"), { label: _("Unlock"),
action: this._onUnlockButton.bind(this), action: this._onUnlockButton.bind(this),
default: true default: true
}]; }];
this._usesKeyfilesButtons = [{ label: _("Cancel"), this.setButtons(buttons);
action: this._onCancelButton.bind(this),
key: Clutter.Escape
},
{ /* Translators: %s is the Disks application */
label: _("Open %s").format(disksApp.get_name()),
action: this._onOpenDisksButton.bind(this),
default: true
}];
this.setButtons(this._defaultButtons);
} }
reaskPassword() { reaskPassword() {
this._passwordEntry.set_text(''); this._passwordEntry.set_text('');
this._errorMessageLabel.show(); this._errorMessageLabel.show();
this._workSpinner.stop();
} }
_onCancelButton() { _onCancelButton() {
this.emit('response', -1, '', false, false, false, 0); this.emit('response', -1, '', false);
} }
_onUnlockButton() { _onUnlockButton() {
@@ -438,68 +348,18 @@ var ShellMountPasswordDialog = GObject.registerClass({
} }
_onEntryActivate() { _onEntryActivate() {
let pim = 0;
if (this._pimEntry !== null)
pim = this._pimEntry.get_text();
if (isNaN(pim)) {
this._pimEntry.set_text('');
this._pimErrorMessageLabel.show();
return;
} else if (this._pimErrorMessageLabel !== null) {
this._pimErrorMessageLabel.hide();
}
global.settings.set_boolean(REMEMBER_MOUNT_PASSWORD_KEY, global.settings.set_boolean(REMEMBER_MOUNT_PASSWORD_KEY,
this._rememberChoice && this._rememberChoice.actor.checked); this._rememberChoice && this._rememberChoice.actor.checked);
this._workSpinner.play();
this.emit('response', 1, this.emit('response', 1,
this._passwordEntry.get_text(), this._passwordEntry.get_text(),
this._rememberChoice && this._rememberChoice &&
this._rememberChoice.actor.checked, this._rememberChoice.actor.checked);
this._hiddenVolume &&
this._hiddenVolume.actor.checked,
this._systemVolume &&
this._systemVolume.actor.checked,
parseInt(pim));
} }
};
_onKeyfilesCheckboxClicked() { var ShellProcessesDialog = class extends ModalDialog.ModalDialog {
let useKeyfiles = this._keyfilesCheckbox.actor.checked; constructor(icon) {
this._passwordEntry.reactive = !useKeyfiles; super({ styleClass: 'mount-dialog' });
this._passwordEntry.can_focus = !useKeyfiles;
this._passwordEntry.clutter_text.editable = !useKeyfiles;
this._passwordEntry.clutter_text.selectable = !useKeyfiles;
this._pimEntry.reactive = !useKeyfiles;
this._pimEntry.can_focus = !useKeyfiles;
this._pimEntry.clutter_text.editable = !useKeyfiles;
this._pimEntry.clutter_text.selectable = !useKeyfiles;
this._rememberChoice.actor.reactive = !useKeyfiles;
this._rememberChoice.actor.can_focus = !useKeyfiles;
this._keyfilesLabel.visible = useKeyfiles;
this.setButtons(useKeyfiles ? this._usesKeyfilesButtons : this._defaultButtons);
}
_onOpenDisksButton() {
let app = Shell.AppSystem.get_default().lookup_app('org.gnome.DiskUtility.desktop');
if (app)
app.activate();
else
Main.notifyError(
/* Translators: %s is the Disks application */
_("Unable to start %s").format(app.get_name()),
/* Translators: %s is the Disks application */
_("Couldnt find the %s application").format(app.get_name())
);
this._onCancelButton();
}
});
var ShellProcessesDialog = GObject.registerClass({
Signals: { 'response': { param_types: [GObject.TYPE_INT] } }
}, class ShellProcessesDialog extends ModalDialog.ModalDialog {
_init(icon) {
super._init({ styleClass: 'mount-dialog' });
this._content = new Dialog.MessageDialogContent({ icon }); this._content = new Dialog.MessageDialogContent({ icon });
this.contentLayout.add(this._content, { x_fill: true, y_fill: false }); this.contentLayout.add(this._content, { x_fill: true, y_fill: false });
@@ -552,7 +412,8 @@ var ShellProcessesDialog = GObject.registerClass({
_setLabelsForMessage(this._content, message); _setLabelsForMessage(this._content, message);
_setButtonsForChoices(this, choices); _setButtonsForChoices(this, choices);
} }
}); };
Signals.addSignalMethods(ShellProcessesDialog.prototype);
const GnomeShellMountOpIface = loadInterfaceXML('org.Gtk.MountOperationHandler'); const GnomeShellMountOpIface = loadInterfaceXML('org.Gtk.MountOperationHandler');
@@ -654,7 +515,7 @@ var GnomeShellMountOpHandler = class {
this._dialog = new ShellMountPasswordDialog(message, this._createGIcon(iconName), flags); this._dialog = new ShellMountPasswordDialog(message, this._createGIcon(iconName), flags);
this._dialog.connect('response', this._dialog.connect('response',
(object, choice, password, remember, hiddenVolume, systemVolume, pim) => { (object, choice, password, remember) => {
let details = {}; let details = {};
let response; let response;
@@ -666,9 +527,6 @@ var GnomeShellMountOpHandler = class {
let passSave = remember ? Gio.PasswordSave.PERMANENTLY : Gio.PasswordSave.NEVER; let passSave = remember ? Gio.PasswordSave.PERMANENTLY : Gio.PasswordSave.NEVER;
details['password_save'] = GLib.Variant.new('u', passSave); details['password_save'] = GLib.Variant.new('u', passSave);
details['password'] = GLib.Variant.new('s', password); details['password'] = GLib.Variant.new('s', password);
details['hidden_volume'] = GLib.Variant.new('b', hiddenVolume);
details['system_volume'] = GLib.Variant.new('b', systemVolume);
details['pim'] = GLib.Variant.new('u', pim);
} }
this._clearCurrentRequest(response, details); this._clearCurrentRequest(response, details);

View File

@@ -32,14 +32,14 @@ const HIGH_CONTRAST_THEME = 'HighContrast';
var ATIndicator = GObject.registerClass( var ATIndicator = GObject.registerClass(
class ATIndicator extends PanelMenu.Button { class ATIndicator extends PanelMenu.Button {
_init() { _init() {
super._init(0.5, _("Accessibility")); super._init(0.0, _("Accessibility"));
this._hbox = new St.BoxLayout({ style_class: 'panel-status-menu-box' }); this._hbox = new St.BoxLayout({ style_class: 'panel-status-menu-box' });
this._hbox.add_child(new St.Icon({ style_class: 'system-status-icon', this._hbox.add_child(new St.Icon({ style_class: 'system-status-icon',
icon_name: 'preferences-desktop-accessibility-symbolic' })); icon_name: 'preferences-desktop-accessibility-symbolic' }));
this._hbox.add_child(PopupMenu.arrowIcon(St.Side.BOTTOM)); this._hbox.add_child(PopupMenu.arrowIcon(St.Side.BOTTOM));
this.add_child(this._hbox); this.actor.add_child(this._hbox);
this._a11ySettings = new Gio.Settings({ schema_id: A11Y_SCHEMA }); this._a11ySettings = new Gio.Settings({ schema_id: A11Y_SCHEMA });
this._a11ySettings.connect('changed::' + KEY_ALWAYS_SHOW, this._queueSyncMenuVisibility.bind(this)); this._a11ySettings.connect('changed::' + KEY_ALWAYS_SHOW, this._queueSyncMenuVisibility.bind(this));
@@ -86,7 +86,7 @@ class ATIndicator extends PanelMenu.Button {
let alwaysShow = this._a11ySettings.get_boolean(KEY_ALWAYS_SHOW); let alwaysShow = this._a11ySettings.get_boolean(KEY_ALWAYS_SHOW);
let items = this.menu._getMenuItems(); let items = this.menu._getMenuItems();
this.visible = alwaysShow || items.some(f => !!f.state); this.actor.visible = alwaysShow || items.some(f => !!f.state);
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
} }
@@ -112,22 +112,38 @@ class ATIndicator extends PanelMenu.Button {
_buildItem(string, schema, key) { _buildItem(string, schema, key) {
let settings = new Gio.Settings({ schema_id: schema }); let settings = new Gio.Settings({ schema_id: schema });
let widget = this._buildItemExtended(string, settings.connect('changed::'+key, () => {
settings.get_boolean(key),
settings.is_writable(key),
enabled => settings.set_boolean(key, enabled));
settings.connect('changed::' + key, () => {
widget.setToggleState(settings.get_boolean(key)); widget.setToggleState(settings.get_boolean(key));
this._queueSyncMenuVisibility(); this._queueSyncMenuVisibility();
}); });
let widget = this._buildItemExtended(string,
settings.get_boolean(key),
settings.is_writable(key),
enabled => settings.set_boolean(key, enabled));
return widget; return widget;
} }
_buildHCItem() { _buildHCItem() {
let interfaceSettings = new Gio.Settings({ schema_id: DESKTOP_INTERFACE_SCHEMA }); let interfaceSettings = new Gio.Settings({ schema_id: DESKTOP_INTERFACE_SCHEMA });
interfaceSettings.connect('changed::' + KEY_GTK_THEME, () => {
let value = interfaceSettings.get_string(KEY_GTK_THEME);
if (value == HIGH_CONTRAST_THEME) {
highContrast.setToggleState(true);
} else {
highContrast.setToggleState(false);
gtkTheme = value;
}
this._queueSyncMenuVisibility();
});
interfaceSettings.connect('changed::' + KEY_ICON_THEME, () => {
let value = interfaceSettings.get_string(KEY_ICON_THEME);
if (value != HIGH_CONTRAST_THEME)
iconTheme = value;
});
let gtkTheme = interfaceSettings.get_string(KEY_GTK_THEME); let gtkTheme = interfaceSettings.get_string(KEY_GTK_THEME);
let iconTheme = interfaceSettings.get_string(KEY_ICON_THEME); let iconTheme = interfaceSettings.get_string(KEY_ICON_THEME);
let hasHC = (gtkTheme == HIGH_CONTRAST_THEME); let hasHC = (gtkTheme == HIGH_CONTRAST_THEME);
@@ -148,30 +164,19 @@ class ATIndicator extends PanelMenu.Button {
interfaceSettings.reset(KEY_ICON_THEME); interfaceSettings.reset(KEY_ICON_THEME);
} }
}); });
interfaceSettings.connect('changed::' + KEY_GTK_THEME, () => {
let value = interfaceSettings.get_string(KEY_GTK_THEME);
if (value == HIGH_CONTRAST_THEME) {
highContrast.setToggleState(true);
} else {
highContrast.setToggleState(false);
gtkTheme = value;
}
this._queueSyncMenuVisibility();
});
interfaceSettings.connect('changed::' + KEY_ICON_THEME, () => {
let value = interfaceSettings.get_string(KEY_ICON_THEME);
if (value != HIGH_CONTRAST_THEME)
iconTheme = value;
});
return highContrast; return highContrast;
} }
_buildFontItem() { _buildFontItem() {
let settings = new Gio.Settings({ schema_id: DESKTOP_INTERFACE_SCHEMA }); let settings = new Gio.Settings({ schema_id: DESKTOP_INTERFACE_SCHEMA });
settings.connect('changed::' + KEY_TEXT_SCALING_FACTOR, () => {
let factor = settings.get_double(KEY_TEXT_SCALING_FACTOR);
let active = (factor > 1.0);
widget.setToggleState(active);
this._queueSyncMenuVisibility();
});
let factor = settings.get_double(KEY_TEXT_SCALING_FACTOR); let factor = settings.get_double(KEY_TEXT_SCALING_FACTOR);
let initial_setting = (factor > 1.0); let initial_setting = (factor > 1.0);
let widget = this._buildItemExtended(_("Large Text"), let widget = this._buildItemExtended(_("Large Text"),
@@ -184,15 +189,6 @@ class ATIndicator extends PanelMenu.Button {
else else
settings.reset(KEY_TEXT_SCALING_FACTOR); settings.reset(KEY_TEXT_SCALING_FACTOR);
}); });
settings.connect('changed::' + KEY_TEXT_SCALING_FACTOR, () => {
let factor = settings.get_double(KEY_TEXT_SCALING_FACTOR);
let active = (factor > 1.0);
widget.setToggleState(active);
this._queueSyncMenuVisibility();
});
return widget; return widget;
} }
}); });

View File

@@ -118,9 +118,9 @@ var Indicator = class extends PanelMenu.SystemIndicator {
// Remember if there were setup devices and show the menu // Remember if there were setup devices and show the menu
// if we've seen setup devices and we're not hard blocked // if we've seen setup devices and we're not hard blocked
if (nDevices > 0) if (nDevices > 0)
this._item.visible = !this._proxy.BluetoothHardwareAirplaneMode; this._item.actor.visible = !this._proxy.BluetoothHardwareAirplaneMode;
else else
this._item.visible = this._proxy.BluetoothHasAirplaneMode && !this._proxy.BluetoothAirplaneMode; this._item.actor.visible = this._proxy.BluetoothHasAirplaneMode && !this._proxy.BluetoothAirplaneMode;
if (nConnectedDevices > 0) if (nConnectedDevices > 0)
/* Translators: this is the number of connected bluetooth devices */ /* Translators: this is the number of connected bluetooth devices */

View File

@@ -37,12 +37,12 @@ var Indicator = class extends PanelMenu.SystemIndicator {
let icon = new St.Icon({ icon_name: 'display-brightness-symbolic', let icon = new St.Icon({ icon_name: 'display-brightness-symbolic',
style_class: 'popup-menu-icon' }); style_class: 'popup-menu-icon' });
this._item.add(icon); this._item.actor.add(icon);
this._item.add(this._slider.actor, { expand: true }); this._item.actor.add(this._slider.actor, { expand: true });
this._item.connect('button-press-event', (actor, event) => { this._item.actor.connect('button-press-event', (actor, event) => {
return this._slider.startDragging(event); return this._slider.startDragging(event);
}); });
this._item.connect('key-press-event', (actor, event) => { this._item.actor.connect('key-press-event', (actor, event) => {
return this._slider.onKeyPressEvent(actor, event); return this._slider.onKeyPressEvent(actor, event);
}); });
@@ -55,7 +55,7 @@ var Indicator = class extends PanelMenu.SystemIndicator {
_sync() { _sync() {
let visible = this._proxy.Brightness >= 0; let visible = this._proxy.Brightness >= 0;
this._item.visible = visible; this._item.actor.visible = visible;
if (visible) if (visible)
this._slider.setValue(this._proxy.Brightness / 100.0); this._slider.setValue(this._proxy.Brightness / 100.0);
} }

View File

@@ -1,86 +0,0 @@
const { Clutter, Gio, GLib, GObject, St } = imports.gi;
const Mainloop = imports.mainloop;
const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu;
const MOUSE_A11Y_SCHEMA = 'org.gnome.desktop.a11y.mouse';
const KEY_DWELL_CLICK_ENABLED = 'dwell-click-enabled';
const KEY_DWELL_MODE = 'dwell-mode';
const DWELL_MODE_WINDOW = 'window';
const DWELL_CLICK_MODES = {
primary: {
name: _("Single Click"),
icon: 'pointer-primary-click-symbolic',
type: Clutter.PointerA11yDwellClickType.PRIMARY
},
double: {
name: _("Double Click"),
icon: 'pointer-double-click-symbolic',
type: Clutter.PointerA11yDwellClickType.DOUBLE
},
drag: {
name: _("Drag"),
icon: 'pointer-drag-symbolic',
type: Clutter.PointerA11yDwellClickType.DRAG
},
secondary: {
name: _("Secondary Click"),
icon: 'pointer-secondary-click-symbolic',
type: Clutter.PointerA11yDwellClickType.SECONDARY
},
};
var DwellClickIndicator = GObject.registerClass(
class DwellClickIndicator extends PanelMenu.Button {
_init() {
super._init(0.5, _("Dwell Click"));
this._hbox = new St.BoxLayout({ style_class: 'panel-status-menu-box' });
this._icon = new St.Icon({ style_class: 'system-status-icon',
icon_name: 'pointer-primary-click-symbolic' });
this._hbox.add_child(this._icon);
this._hbox.add_child(PopupMenu.arrowIcon(St.Side.BOTTOM));
this.add_child(this._hbox);
this._a11ySettings = new Gio.Settings({ schema_id: MOUSE_A11Y_SCHEMA });
this._a11ySettings.connect('changed::' + KEY_DWELL_CLICK_ENABLED, this._syncMenuVisibility.bind(this));
this._a11ySettings.connect('changed::' + KEY_DWELL_MODE, this._syncMenuVisibility.bind(this));
this._deviceManager = Clutter.DeviceManager.get_default();
this._deviceManager.connect('ptr-a11y-dwell-click-type-changed', this._updateClickType.bind(this));
this._addDwellAction(DWELL_CLICK_MODES.primary);
this._addDwellAction(DWELL_CLICK_MODES.double);
this._addDwellAction(DWELL_CLICK_MODES.drag);
this._addDwellAction(DWELL_CLICK_MODES.secondary);
this._setClickType(DWELL_CLICK_MODES.primary);
this._syncMenuVisibility();
}
_syncMenuVisibility() {
this.visible =
(this._a11ySettings.get_boolean(KEY_DWELL_CLICK_ENABLED) &&
this._a11ySettings.get_string(KEY_DWELL_MODE) == DWELL_MODE_WINDOW);
return GLib.SOURCE_REMOVE;
}
_addDwellAction(mode) {
this.menu.addAction(mode.name, this._setClickType.bind(this, mode), mode.icon);
}
_updateClickType(manager, click_type) {
for (let mode in DWELL_CLICK_MODES) {
if (DWELL_CLICK_MODES[mode].type == click_type)
this._icon.icon_name = DWELL_CLICK_MODES[mode].icon;
}
}
_setClickType(mode) {
this._deviceManager.set_pointer_a11y_dwell_click_type(mode.type);
this._icon.icon_name = mode.icon;
}
});

View File

@@ -15,18 +15,17 @@ const Util = imports.misc.util;
const INPUT_SOURCE_TYPE_XKB = 'xkb'; const INPUT_SOURCE_TYPE_XKB = 'xkb';
const INPUT_SOURCE_TYPE_IBUS = 'ibus'; const INPUT_SOURCE_TYPE_IBUS = 'ibus';
var LayoutMenuItem = GObject.registerClass( var LayoutMenuItem = class extends PopupMenu.PopupBaseMenuItem {
class LayoutMenuItem extends PopupMenu.PopupBaseMenuItem { constructor(displayName, shortName) {
_init(displayName, shortName) { super();
super._init();
this.label = new St.Label({ text: displayName }); this.label = new St.Label({ text: displayName });
this.indicator = new St.Label({ text: shortName }); this.indicator = new St.Label({ text: shortName });
this.add(this.label, { expand: true }); this.actor.add(this.label, { expand: true });
this.add(this.indicator); this.actor.add(this.indicator);
this.label_actor = this.label; this.actor.label_actor = this.label;
} }
}); };
var InputSource = class { var InputSource = class {
constructor(type, id, displayName, shortName, index) { constructor(type, id, displayName, shortName, index) {
@@ -126,8 +125,8 @@ class InputSourceSwitcher extends SwitcherPopup.SwitcherList {
var InputSourceSettings = class { var InputSourceSettings = class {
constructor() { constructor() {
if (this.constructor === InputSourceSettings) if (new.target === InputSourceSettings)
throw new TypeError(`Cannot instantiate abstract class ${this.constructor.name}`); throw new TypeError('Cannot instantiate abstract class ' + new.target.name);
} }
_emitInputSourcesChanged() { _emitInputSourcesChanged() {
@@ -810,7 +809,7 @@ class InputSourceIndicatorContainer extends St.Widget {
var InputSourceIndicator = GObject.registerClass( var InputSourceIndicator = GObject.registerClass(
class InputSourceIndicator extends PanelMenu.Button { class InputSourceIndicator extends PanelMenu.Button {
_init() { _init() {
super._init(0.5, _("Keyboard")); super._init(0.0, _("Keyboard"));
this.connect('destroy', this._onDestroy.bind(this)); this.connect('destroy', this._onDestroy.bind(this));
@@ -823,7 +822,7 @@ class InputSourceIndicator extends PanelMenu.Button {
this._hbox.add_child(this._container); this._hbox.add_child(this._container);
this._hbox.add_child(PopupMenu.arrowIcon(St.Side.BOTTOM)); this._hbox.add_child(PopupMenu.arrowIcon(St.Side.BOTTOM));
this.add_child(this._hbox); this.actor.add_child(this._hbox);
this._propSeparator = new PopupMenu.PopupSeparatorMenuItem(); this._propSeparator = new PopupMenu.PopupSeparatorMenuItem();
this.menu.addMenuItem(this._propSeparator); this.menu.addMenuItem(this._propSeparator);
@@ -858,7 +857,7 @@ class InputSourceIndicator extends PanelMenu.Button {
// but at least for now it is used as "allow popping up windows // but at least for now it is used as "allow popping up windows
// from shell menus"; we can always add a separate sessionMode // from shell menus"; we can always add a separate sessionMode
// option if need arises. // option if need arises.
this._showLayoutItem.visible = Main.sessionMode.allowSettings; this._showLayoutItem.actor.visible = Main.sessionMode.allowSettings;
} }
_sourcesChanged() { _sourcesChanged() {
@@ -909,11 +908,11 @@ class InputSourceIndicator extends PanelMenu.Button {
// We also hide if we have only one visible source unless // We also hide if we have only one visible source unless
// it's an IBus source with properties. // it's an IBus source with properties.
this.menu.close(); this.menu.close();
this.hide(); this.actor.hide();
return; return;
} }
this.show(); this.actor.show();
this._buildPropSection(newSource.properties); this._buildPropSection(newSource.properties);

View File

@@ -1,6 +1,6 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const { Clutter, Gio, GLib, GObject, Shell } = imports.gi; const { Clutter, Gio, GLib, Shell } = imports.gi;
const Dialog = imports.ui.dialog; const Dialog = imports.ui.dialog;
const Main = imports.ui.main; const Main = imports.ui.main;
@@ -101,12 +101,12 @@ var Indicator = class extends PanelMenu.SystemIndicator {
_syncIndicator() { _syncIndicator() {
if (this._managerProxy == null) { if (this._managerProxy == null) {
this._indicator.visible = false; this._indicator.visible = false;
this._item.visible = false; this._item.actor.visible = false;
return; return;
} }
this._indicator.visible = this._managerProxy.InUse; this._indicator.visible = this._managerProxy.InUse;
this._item.visible = this._indicator.visible; this._item.actor.visible = this._indicator.visible;
this._updateMenuLabels(); this._updateMenuLabels();
} }
@@ -342,11 +342,9 @@ var AppAuthorizer = class {
} }
}; };
var GeolocationDialog = GObject.registerClass({ var GeolocationDialog = class extends ModalDialog.ModalDialog {
Signals: { 'response': { param_types: [GObject.TYPE_UINT] } } constructor(name, subtitle, reqAccuracyLevel) {
}, class GeolocationDialog extends ModalDialog.ModalDialog { super({ styleClass: 'geolocation-dialog' });
_init(name, subtitle, reqAccuracyLevel) {
super._init({ styleClass: 'geolocation-dialog' });
this.reqAccuracyLevel = reqAccuracyLevel; this.reqAccuracyLevel = reqAccuracyLevel;
let icon = new Gio.ThemedIcon({ name: 'find-location-symbolic' }); let icon = new Gio.ThemedIcon({ name: 'find-location-symbolic' });
@@ -377,4 +375,5 @@ var GeolocationDialog = GObject.registerClass({
this.emit('response', GeoclueAccuracyLevel.NONE); this.emit('response', GeoclueAccuracyLevel.NONE);
this.close(); this.close();
} }
}); };
Signals.addSignalMethods(GeolocationDialog.prototype);

View File

@@ -69,12 +69,9 @@ function ssidToLabel(ssid) {
function ensureActiveConnectionProps(active, client) { function ensureActiveConnectionProps(active, client) {
if (!active._primaryDevice) { if (!active._primaryDevice) {
let devices = active.get_devices(); // This list is guaranteed to have only one device in it.
if (devices.length > 0) { let device = active.get_devices()[0]._delegate;
// This list is guaranteed to have at most one device in it. active._primaryDevice = device;
let device = devices[0]._delegate;
active._primaryDevice = device;
}
} }
} }
@@ -170,10 +167,10 @@ var NMConnectionItem = class {
}; };
Signals.addSignalMethods(NMConnectionItem.prototype); Signals.addSignalMethods(NMConnectionItem.prototype);
var NMConnectionSection = class NMConnectionSection { var NMConnectionSection = class {
constructor(client) { constructor(client) {
if (this.constructor === NMConnectionSection) if (new.target === NMConnectionSection)
throw new TypeError(`Cannot instantiate abstract type ${this.constructor.name}`); throw new TypeError('Cannot instantiate abstract type ' + new.target.name);
this._client = client; this._client = client;
@@ -238,14 +235,14 @@ var NMConnectionSection = class NMConnectionSection {
if (!this._connectionValid(connection)) if (!this._connectionValid(connection))
return; return;
// This function is called every time the connection is added or updated. // This function is called everytime connection is added or updated
// In the usual case, we already added this connection and UUID // In the usual case, we already added this connection and UUID
// didn't change. So we need to check if we already have an item, // didn't change. So we need to check if we already have an item,
// and update it for properties in the connection that changed // and update it for properties in the connection that changed
// (the only one we care about is the name) // (the only one we care about is the name)
// But it's also possible we didn't know about this connection // But it's also possible we didn't know about this connection
// (eg, during coldplug, or because it was updated and suddenly // (eg, during coldplug, or because it was updated and suddenly
// it's valid for this device), in which case we add a new item. // it's valid for this device), in which case we add a new item
let item = this._connectionItems.get(connection.get_uuid()); let item = this._connectionItems.get(connection.get_uuid());
if (item) if (item)
@@ -300,13 +297,12 @@ var NMConnectionSection = class NMConnectionSection {
}; };
Signals.addSignalMethods(NMConnectionSection.prototype); Signals.addSignalMethods(NMConnectionSection.prototype);
var NMConnectionDevice = class NMConnectionDevice extends NMConnectionSection { var NMConnectionDevice = class extends NMConnectionSection {
constructor(client, device) { constructor(client, device) {
if (new.target === NMConnectionDevice)
throw new TypeError('Cannot instantiate abstract type ' + new.target.name);
super(client); super(client);
if (this.constructor === NMConnectionDevice)
throw new TypeError(`Cannot instantiate abstract type ${this.constructor.name}`);
this._device = device; this._device = device;
this._description = ''; this._description = '';
@@ -392,8 +388,8 @@ var NMConnectionDevice = class NMConnectionDevice extends NMConnectionSection {
_sync() { _sync() {
let nItems = this._connectionItems.size; let nItems = this._connectionItems.size;
this._autoConnectItem.visible = (nItems == 0); this._autoConnectItem.actor.visible = (nItems == 0);
this._deactivateItem.visible = this._device.state > NM.DeviceState.DISCONNECTED; this._deactivateItem.actor.visible = this._device.state > NM.DeviceState.DISCONNECTED;
if (this._activeConnection == null) { if (this._activeConnection == null) {
let activeConnection = this._device.active_connection; let activeConnection = this._device.active_connection;
@@ -480,7 +476,7 @@ var NMDeviceWired = class extends NMConnectionDevice {
} }
_sync() { _sync() {
this.item.visible = this._hasCarrier(); this.item.actor.visible = this._hasCarrier();
super._sync(); super._sync();
} }
@@ -616,36 +612,31 @@ var NMDeviceBluetooth = class extends NMConnectionDevice {
} }
}; };
var NMWirelessDialogItem = GObject.registerClass({ var NMWirelessDialogItem = class {
Signals: { constructor(network) {
'selected': {},
}
}, class NMWirelessDialogItem extends St.BoxLayout {
_init(network) {
this._network = network; this._network = network;
this._ap = network.accessPoints[0]; this._ap = network.accessPoints[0];
super._init({ style_class: 'nm-dialog-item', this.actor = new St.BoxLayout({ style_class: 'nm-dialog-item',
can_focus: true, can_focus: true,
reactive: true }); reactive: true });
this.actor.connect('key-focus-in', () => { this.emit('selected'); });
this.connect('key-focus-in', () => { this.emit('selected'); });
let action = new Clutter.ClickAction(); let action = new Clutter.ClickAction();
action.connect('clicked', () => { this.grab_key_focus(); }); action.connect('clicked', () => { this.actor.grab_key_focus(); });
this.add_action(action); this.actor.add_action(action);
let title = ssidToLabel(this._ap.get_ssid()); let title = ssidToLabel(this._ap.get_ssid());
this._label = new St.Label({ text: title }); this._label = new St.Label({ text: title });
this.label_actor = this._label; this.actor.label_actor = this._label;
this.add(this._label, { x_align: St.Align.START }); this.actor.add(this._label, { x_align: St.Align.START });
this._selectedIcon = new St.Icon({ style_class: 'nm-dialog-icon', this._selectedIcon = new St.Icon({ style_class: 'nm-dialog-icon',
icon_name: 'object-select-symbolic' }); icon_name: 'object-select-symbolic' });
this.add(this._selectedIcon); this.actor.add(this._selectedIcon);
this._icons = new St.BoxLayout({ style_class: 'nm-dialog-icons' }); this._icons = new St.BoxLayout({ style_class: 'nm-dialog-icons' });
this.add(this._icons, { expand: true, x_fill: false, x_align: St.Align.END }); this.actor.add(this._icons, { expand: true, x_fill: false, x_align: St.Align.END });
this._secureIcon = new St.Icon({ style_class: 'nm-dialog-icon' }); this._secureIcon = new St.Icon({ style_class: 'nm-dialog-icon' });
if (this._ap._secType != NMAccessPointSecurity.NONE) if (this._ap._secType != NMAccessPointSecurity.NONE)
@@ -677,12 +668,12 @@ var NMWirelessDialogItem = GObject.registerClass({
else else
return 'network-wireless-signal-' + signalToIcon(this._ap.strength) + '-symbolic'; return 'network-wireless-signal-' + signalToIcon(this._ap.strength) + '-symbolic';
} }
}); };
Signals.addSignalMethods(NMWirelessDialogItem.prototype);
var NMWirelessDialog = GObject.registerClass( var NMWirelessDialog = class extends ModalDialog.ModalDialog {
class NMWirelessDialog extends ModalDialog.ModalDialog { constructor(client, device) {
_init(client, device) { super({ styleClass: 'nm-dialog' });
super._init({ styleClass: 'nm-dialog' });
this._client = client; this._client = client;
this._device = device; this._device = device;
@@ -728,11 +719,9 @@ class NMWirelessDialog extends ModalDialog.ModalDialog {
Main.sessionMode.disconnect(id); Main.sessionMode.disconnect(id);
this.close(); this.close();
}); });
this.connect('destroy', this._onDestroy.bind(this));
} }
_onDestroy() { destroy() {
if (this._apAddedId) { if (this._apAddedId) {
GObject.Object.prototype.disconnect.call(this._device, this._apAddedId); GObject.Object.prototype.disconnect.call(this._device, this._apAddedId);
this._apAddedId = 0; this._apAddedId = 0;
@@ -758,6 +747,8 @@ class NMWirelessDialog extends ModalDialog.ModalDialog {
Mainloop.source_remove(this._scanTimeoutId); Mainloop.source_remove(this._scanTimeoutId);
this._scanTimeoutId = 0; this._scanTimeoutId = 0;
} }
super.destroy();
} }
_onScanTimeout() { _onScanTimeout() {
@@ -1084,7 +1075,7 @@ class NMWirelessDialog extends ModalDialog.ModalDialog {
let newPos = Util.insertSorted(this._networks, network, this._networkSortFunction); let newPos = Util.insertSorted(this._networks, network, this._networkSortFunction);
this._createNetworkItem(network); this._createNetworkItem(network);
this._itemBox.insert_child_at_index(network.item, newPos); this._itemBox.insert_child_at_index(network.item.actor, newPos);
} }
this._syncView(); this._syncView();
@@ -1102,7 +1093,7 @@ class NMWirelessDialog extends ModalDialog.ModalDialog {
network.accessPoints.splice(res.ap, 1); network.accessPoints.splice(res.ap, 1);
if (network.accessPoints.length == 0) { if (network.accessPoints.length == 0) {
network.item.destroy(); network.item.actor.destroy();
this._networks.splice(res.network, 1); this._networks.splice(res.network, 1);
} else { } else {
network.item.updateBestAP(network.accessPoints[0]); network.item.updateBestAP(network.accessPoints[0]);
@@ -1118,7 +1109,7 @@ class NMWirelessDialog extends ModalDialog.ModalDialog {
this._itemBox.remove_all_children(); this._itemBox.remove_all_children();
this._networks.forEach(network => { this._networks.forEach(network => {
this._itemBox.add_child(network.item); this._itemBox.add_child(network.item.actor);
}); });
adjustment.value = scrollValue; adjustment.value = scrollValue;
@@ -1126,29 +1117,29 @@ class NMWirelessDialog extends ModalDialog.ModalDialog {
_selectNetwork(network) { _selectNetwork(network) {
if (this._selectedNetwork) if (this._selectedNetwork)
this._selectedNetwork.item.remove_style_pseudo_class('selected'); this._selectedNetwork.item.actor.remove_style_pseudo_class('selected');
this._selectedNetwork = network; this._selectedNetwork = network;
this._updateSensitivity(); this._updateSensitivity();
if (this._selectedNetwork) if (this._selectedNetwork)
this._selectedNetwork.item.add_style_pseudo_class('selected'); this._selectedNetwork.item.actor.add_style_pseudo_class('selected');
} }
_createNetworkItem(network) { _createNetworkItem(network) {
network.item = new NMWirelessDialogItem(network); network.item = new NMWirelessDialogItem(network);
network.item.setActive(network == this._selectedNetwork); network.item.setActive(network == this._selectedNetwork);
network.item.connect('selected', () => { network.item.connect('selected', () => {
Util.ensureActorVisibleInScrollView(this._scrollView, network.item); Util.ensureActorVisibleInScrollView(this._scrollView, network.item.actor);
this._selectNetwork(network); this._selectNetwork(network);
}); });
network.item.connect('destroy', () => { network.item.actor.connect('destroy', () => {
let keyFocus = global.stage.key_focus; let keyFocus = global.stage.key_focus;
if (keyFocus && keyFocus.contains(network.item)) if (keyFocus && keyFocus.contains(network.item.actor))
this._itemBox.grab_key_focus(); this._itemBox.grab_key_focus();
}); });
} }
}); };
var NMDeviceWireless = class { var NMDeviceWireless = class {
constructor(client, device) { constructor(client, device) {
@@ -1270,7 +1261,7 @@ var NMDeviceWireless = class {
_sync() { _sync() {
this._toggleItem.label.text = this._client.wireless_enabled ? _("Turn Off") : _("Turn On"); this._toggleItem.label.text = this._client.wireless_enabled ? _("Turn Off") : _("Turn On");
this._toggleItem.visible = this._client.wireless_hardware_enabled; this._toggleItem.actor.visible = this._client.wireless_hardware_enabled;
this.item.icon.icon_name = this._getMenuIcon(); this.item.icon.icon_name = this._getMenuIcon();
this.item.label.text = this._getStatus(); this.item.label.text = this._getStatus();
@@ -1460,7 +1451,7 @@ var NMVpnSection = class extends NMConnectionSection {
_sync() { _sync() {
let nItems = this._connectionItems.size; let nItems = this._connectionItems.size;
this.item.visible = (nItems > 0); this.item.actor.visible = (nItems > 0);
super._sync(); super._sync();
} }
@@ -1543,7 +1534,7 @@ var DeviceCategory = class extends PopupMenu.PopupMenuSection {
this._summaryItem.menu.addSettingsAction(_('Network Settings'), this._summaryItem.menu.addSettingsAction(_('Network Settings'),
'gnome-network-panel.desktop'); 'gnome-network-panel.desktop');
this._summaryItem.hide(); this._summaryItem.actor.hide();
} }
@@ -1552,7 +1543,7 @@ var DeviceCategory = class extends PopupMenu.PopupMenuSection {
(prev, child) => prev + (child.visible ? 1 : 0), 0); (prev, child) => prev + (child.visible ? 1 : 0), 0);
this._summaryItem.label.text = this._getSummaryLabel(nDevices); this._summaryItem.label.text = this._getSummaryLabel(nDevices);
let shouldSummarize = nDevices > MAX_DEVICE_ITEMS; let shouldSummarize = nDevices > MAX_DEVICE_ITEMS;
this._summaryItem.visible = shouldSummarize; this._summaryItem.actor.visible = shouldSummarize;
this.section.actor.visible = !shouldSummarize; this.section.actor.visible = !shouldSummarize;
} }

View File

@@ -61,6 +61,6 @@ var Indicator = class extends PanelMenu.SystemIndicator {
: _("Night Light On"); : _("Night Light On");
this._disableItem.label.text = disabled ? _("Resume") this._disableItem.label.text = disabled ? _("Resume")
: _("Disable Until Tomorrow"); : _("Disable Until Tomorrow");
this._item.visible = this._indicator.visible = visible; this._item.actor.visible = this._indicator.visible = visible;
} }
}; };

View File

@@ -96,11 +96,11 @@ var Indicator = class extends PanelMenu.SystemIndicator {
// Do we have batteries or a UPS? // Do we have batteries or a UPS?
let visible = this._proxy.IsPresent; let visible = this._proxy.IsPresent;
if (visible) { if (visible) {
this._item.show(); this._item.actor.show();
this._percentageLabel.visible = this._desktopSettings.get_boolean(SHOW_BATTERY_PERCENTAGE); this._percentageLabel.visible = this._desktopSettings.get_boolean(SHOW_BATTERY_PERCENTAGE);
} else { } else {
// If there's no battery, then we use the power icon. // If there's no battery, then we use the power icon.
this._item.hide(); this._item.actor.hide();
this._indicator.icon_name = 'system-shutdown-symbolic'; this._indicator.icon_name = 'system-shutdown-symbolic';
this._percentageLabel.hide(); this._percentageLabel.hide();
return; return;

View File

@@ -53,10 +53,10 @@ var RemoteAccessApplet = class extends PanelMenu.SystemIndicator {
_sync() { _sync() {
if (this._handles.size == 0) { if (this._handles.size == 0) {
this._indicator.visible = false; this._indicator.visible = false;
this._item.visible = false; this._item.actor.visible = false;
} else { } else {
this._indicator.visible = true; this._indicator.visible = true;
this._item.visible = true; this._item.actor.visible = true;
} }
} }

View File

@@ -97,7 +97,7 @@ var Indicator = class extends PanelMenu.SystemIndicator {
let showAirplaneMode = this._manager.shouldShowAirplaneMode; let showAirplaneMode = this._manager.shouldShowAirplaneMode;
this._indicator.visible = (airplaneMode && showAirplaneMode); this._indicator.visible = (airplaneMode && showAirplaneMode);
this._item.visible = (airplaneMode && showAirplaneMode); this._item.actor.visible = (airplaneMode && showAirplaneMode);
this._offItem.setSensitive(!hwAirplaneMode); this._offItem.setSensitive(!hwAirplaneMode);
if (hwAirplaneMode) if (hwAirplaneMode)

View File

@@ -116,10 +116,10 @@ var Indicator = class extends PanelMenu.SystemIndicator {
this._createSubMenu(); this._createSubMenu();
this._loginScreenItem.connect('notify::visible', this._loginScreenItem.actor.connect('notify::visible',
() => { this._updateMultiUser(); }); () => { this._updateMultiUser(); });
this._logoutItem.connect('notify::visible', this._logoutItem.actor.connect('notify::visible',
() => { this._updateMultiUser(); }); () => { this._updateMultiUser(); });
// Whether shutdown is available or not depends on both lockdown // Whether shutdown is available or not depends on both lockdown
// settings (disable-log-out) and Polkit policy - the latter doesn't // settings (disable-log-out) and Polkit policy - the latter doesn't
// notify, so we update the menu item each time the menu opens or // notify, so we update the menu item each time the menu opens or
@@ -142,7 +142,7 @@ var Indicator = class extends PanelMenu.SystemIndicator {
this._lockScreenAction.visible || this._lockScreenAction.visible ||
this._altSwitcher.actor.visible); this._altSwitcher.actor.visible);
this.buttonGroup.visible = visible; this._actionsItem.actor.visible = visible;
} }
_sessionUpdated() { _sessionUpdated() {
@@ -150,10 +150,10 @@ var Indicator = class extends PanelMenu.SystemIndicator {
} }
_updateMultiUser() { _updateMultiUser() {
let hasSwitchUser = this._loginScreenItem.visible; let hasSwitchUser = this._loginScreenItem.actor.visible;
let hasLogout = this._logoutItem.visible; let hasLogout = this._logoutItem.actor.visible;
this._switchUserSubMenu.visible = hasSwitchUser || hasLogout; this._switchUserSubMenu.actor.visible = hasSwitchUser || hasLogout;
} }
_updateSwitchUserSubMenu() { _updateSwitchUserSubMenu() {
@@ -208,7 +208,7 @@ var Indicator = class extends PanelMenu.SystemIndicator {
this._switchUserSubMenu.menu.addMenuItem(item); this._switchUserSubMenu.menu.addMenuItem(item);
this._loginScreenItem = item; this._loginScreenItem = item;
this._systemActions.bind_property('can-switch-user', this._systemActions.bind_property('can-switch-user',
this._loginScreenItem, this._loginScreenItem.actor,
'visible', 'visible',
bindFlags); bindFlags);
@@ -220,7 +220,7 @@ var Indicator = class extends PanelMenu.SystemIndicator {
this._switchUserSubMenu.menu.addMenuItem(item); this._switchUserSubMenu.menu.addMenuItem(item);
this._logoutItem = item; this._logoutItem = item;
this._systemActions.bind_property('can-logout', this._systemActions.bind_property('can-logout',
this._logoutItem, this._logoutItem.actor,
'visible', 'visible',
bindFlags); bindFlags);
@@ -236,7 +236,7 @@ var Indicator = class extends PanelMenu.SystemIndicator {
item = new PopupMenu.PopupBaseMenuItem({ reactive: false, item = new PopupMenu.PopupBaseMenuItem({ reactive: false,
can_focus: false }); can_focus: false });
this.buttonGroup = item; this.buttonGroup = item.actor;
let app = this._settingsApp = Shell.AppSystem.get_default().lookup_app( let app = this._settingsApp = Shell.AppSystem.get_default().lookup_app(
'gnome-control-center.desktop' 'gnome-control-center.desktop'
@@ -251,14 +251,14 @@ var Indicator = class extends PanelMenu.SystemIndicator {
log('Missing required core component Settings, expect trouble…'); log('Missing required core component Settings, expect trouble…');
this._settingsAction = new St.Widget(); this._settingsAction = new St.Widget();
} }
item.add(this._settingsAction, { expand: true, x_fill: false }); item.actor.add(this._settingsAction, { expand: true, x_fill: false });
this._orientationLockAction = this._createActionButton('', _("Orientation Lock")); this._orientationLockAction = this._createActionButton('', _("Orientation Lock"));
this._orientationLockAction.connect('clicked', () => { this._orientationLockAction.connect('clicked', () => {
this.menu.itemActivated(BoxPointer.PopupAnimation.NONE), this.menu.itemActivated(BoxPointer.PopupAnimation.NONE),
this._systemActions.activateLockOrientation(); this._systemActions.activateLockOrientation();
}); });
item.add(this._orientationLockAction, { expand: true, x_fill: false }); item.actor.add(this._orientationLockAction, { expand: true, x_fill: false });
this._systemActions.bind_property('can-lock-orientation', this._systemActions.bind_property('can-lock-orientation',
this._orientationLockAction, this._orientationLockAction,
'visible', 'visible',
@@ -273,7 +273,7 @@ var Indicator = class extends PanelMenu.SystemIndicator {
this.menu.itemActivated(BoxPointer.PopupAnimation.NONE); this.menu.itemActivated(BoxPointer.PopupAnimation.NONE);
this._systemActions.activateLockScreen(); this._systemActions.activateLockScreen();
}); });
item.add(this._lockScreenAction, { expand: true, x_fill: false }); item.actor.add(this._lockScreenAction, { expand: true, x_fill: false });
this._systemActions.bind_property('can-lock-screen', this._systemActions.bind_property('can-lock-screen',
this._lockScreenAction, this._lockScreenAction,
'visible', 'visible',
@@ -300,8 +300,9 @@ var Indicator = class extends PanelMenu.SystemIndicator {
bindFlags); bindFlags);
this._altSwitcher = new AltSwitcher(this._powerOffAction, this._suspendAction); this._altSwitcher = new AltSwitcher(this._powerOffAction, this._suspendAction);
item.add(this._altSwitcher.actor, { expand: true, x_fill: false }); item.actor.add(this._altSwitcher.actor, { expand: true, x_fill: false });
this._actionsItem = item;
this.menu.addMenuItem(item); this.menu.addMenuItem(item);

View File

@@ -41,12 +41,12 @@ var StreamSlider = class {
this._slider.connect('drag-end', this._notifyVolumeChange.bind(this)); this._slider.connect('drag-end', this._notifyVolumeChange.bind(this));
this._icon = new St.Icon({ style_class: 'popup-menu-icon' }); this._icon = new St.Icon({ style_class: 'popup-menu-icon' });
this.item.add(this._icon); this.item.actor.add(this._icon);
this.item.add(this._slider.actor, { expand: true }); this.item.actor.add(this._slider.actor, { expand: true });
this.item.connect('button-press-event', (actor, event) => { this.item.actor.connect('button-press-event', (actor, event) => {
return this._slider.startDragging(event); return this._slider.startDragging(event);
}); });
this.item.connect('key-press-event', (actor, event) => { this.item.actor.connect('key-press-event', (actor, event) => {
return this._slider.onKeyPressEvent(actor, event); return this._slider.onKeyPressEvent(actor, event);
}); });
@@ -93,7 +93,7 @@ var StreamSlider = class {
_updateVisibility() { _updateVisibility() {
let visible = this._shouldBeVisible(); let visible = this._shouldBeVisible();
this.item.visible = visible; this.item.actor.visible = visible;
} }
scroll(event) { scroll(event) {

View File

@@ -30,10 +30,12 @@ function primaryModifier(mask) {
return primary; return primary;
} }
var SwitcherPopup = GObject.registerClass({ var SwitcherPopup = GObject.registerClass(
GTypeFlags: GObject.TypeFlags.ABSTRACT class SwitcherPopup extends St.Widget {
}, class SwitcherPopup extends St.Widget {
_init(items) { _init(items) {
if (new.target === SwitcherPopup)
throw new TypeError('Cannot instantiate abstract class ' + new.target.name);
super._init({ style_class: 'switcher-popup', super._init({ style_class: 'switcher-popup',
reactive: true, reactive: true,
visible: false }); visible: false });
@@ -162,7 +164,7 @@ var SwitcherPopup = GObject.registerClass({
} }
_keyPressHandler(keysym, action) { _keyPressHandler(keysym, action) {
throw new GObject.NotImplementedError(`_keyPressHandler in ${this.constructor.name}`); throw new Error('Not implemented');
} }
_keyPressEvent(actor, event) { _keyPressEvent(actor, event) {

View File

@@ -152,7 +152,7 @@ function registerSpecialPropertySplitter(name, splitFunction, parameters) {
// Tweener to a Clutter.TimeLine. Now, Clutter.Timeline itself isn't a // Tweener to a Clutter.TimeLine. Now, Clutter.Timeline itself isn't a
// whole lot more sophisticated than a simple timeout at a fixed frame // whole lot more sophisticated than a simple timeout at a fixed frame
// rate, but at least it knows how to drop frames. (See // rate, but at least it knows how to drop frames. (See
// HippoAnimationManager for a more sophisticated view of continuous // HippoAnimationManager for a more sophisticated view of continous
// time updates; even better is to pay attention to the vertical // time updates; even better is to pay attention to the vertical
// vblank and sync to that when possible.) // vblank and sync to that when possible.)
// //

View File

@@ -40,10 +40,9 @@ const GSD_WACOM_OBJECT_PATH = '/org/gnome/SettingsDaemon/Wacom';
const GsdWacomIface = loadInterfaceXML('org.gnome.SettingsDaemon.Wacom'); const GsdWacomIface = loadInterfaceXML('org.gnome.SettingsDaemon.Wacom');
const GsdWacomProxy = Gio.DBusProxy.makeProxyWrapper(GsdWacomIface); const GsdWacomProxy = Gio.DBusProxy.makeProxyWrapper(GsdWacomIface);
var DisplayChangeDialog = GObject.registerClass( var DisplayChangeDialog = class extends ModalDialog.ModalDialog {
class DisplayChangeDialog extends ModalDialog.ModalDialog { constructor(wm) {
_init(wm) { super({ styleClass: 'prompt-dialog' });
super._init({ styleClass: 'prompt-dialog' });
this._wm = wm; this._wm = wm;
@@ -60,7 +59,7 @@ class DisplayChangeDialog extends ModalDialog.ModalDialog {
{ x_fill: true, { x_fill: true,
y_fill: true }); y_fill: true });
/* Translators: this and the following message should be limited in length, /* Translators: this and the following message should be limited in lenght,
to avoid ellipsizing the labels. to avoid ellipsizing the labels.
*/ */
this._cancelButton = this.addButton({ label: _("Revert Settings"), this._cancelButton = this.addButton({ label: _("Revert Settings"),
@@ -112,7 +111,7 @@ class DisplayChangeDialog extends ModalDialog.ModalDialog {
this._wm.complete_display_change(true); this._wm.complete_display_change(true);
this.close(); this.close();
} }
}); };
var WindowDimmer = class { var WindowDimmer = class {
constructor(actor) { constructor(actor) {
@@ -1871,25 +1870,17 @@ var WindowManager = class {
} }
} }
_getPositionForDirection(direction, fromWs, toWs) { _getPositionForDirection(direction) {
let xDest = 0, yDest = 0; let xDest = 0, yDest = 0;
let oldWsIsFullscreen = fromWs.list_windows().some(w => w.is_fullscreen());
let newWsIsFullscreen = toWs.list_windows().some(w => w.is_fullscreen());
// We have to shift windows up or down by the height of the panel to prevent having a
// visible gap between the windows while switching workspaces. Since fullscreen windows
// hide the panel, they don't need to be shifted up or down.
let shiftHeight = Main.panel.height;
if (direction == Meta.MotionDirection.UP || if (direction == Meta.MotionDirection.UP ||
direction == Meta.MotionDirection.UP_LEFT || direction == Meta.MotionDirection.UP_LEFT ||
direction == Meta.MotionDirection.UP_RIGHT) direction == Meta.MotionDirection.UP_RIGHT)
yDest = -global.screen_height + (oldWsIsFullscreen ? 0 : shiftHeight); yDest = -global.screen_height + Main.panel.height;
else if (direction == Meta.MotionDirection.DOWN || else if (direction == Meta.MotionDirection.DOWN ||
direction == Meta.MotionDirection.DOWN_LEFT || direction == Meta.MotionDirection.DOWN_LEFT ||
direction == Meta.MotionDirection.DOWN_RIGHT) direction == Meta.MotionDirection.DOWN_RIGHT)
yDest = global.screen_height - (newWsIsFullscreen ? 0 : shiftHeight); yDest = global.screen_height - Main.panel.height;
if (direction == Meta.MotionDirection.LEFT || if (direction == Meta.MotionDirection.LEFT ||
direction == Meta.MotionDirection.UP_LEFT || direction == Meta.MotionDirection.UP_LEFT ||
@@ -1947,7 +1938,7 @@ var WindowManager = class {
switchData.container.add_actor(info.actor); switchData.container.add_actor(info.actor);
info.actor.raise_top(); info.actor.raise_top();
let [x, y] = this._getPositionForDirection(dir, curWs, ws); let [x, y] = this._getPositionForDirection(dir);
info.actor.set_position(x, y); info.actor.set_position(x, y);
} }
@@ -2033,11 +2024,7 @@ var WindowManager = class {
this._switchData.inProgress = true; this._switchData.inProgress = true;
let workspaceManager = global.workspace_manager; let [xDest, yDest] = this._getPositionForDirection(direction);
let fromWs = workspaceManager.get_workspace_by_index(from);
let toWs = workspaceManager.get_workspace_by_index(to);
let [xDest, yDest] = this._getPositionForDirection(direction, fromWs, toWs);
/* @direction is the direction that the "camera" moves, so the /* @direction is the direction that the "camera" moves, so the
* screen contents have to move one screen's worth in the * screen contents have to move one screen's worth in the
@@ -2121,14 +2108,7 @@ var WindowManager = class {
Main.ctrlAltTabManager.popup(binding.is_reversed(), binding.get_name(), binding.get_mask()); Main.ctrlAltTabManager.popup(binding.is_reversed(), binding.get_name(), binding.get_mask());
} }
_allowFavoriteShortcuts() {
return Main.sessionMode.hasOverview;
}
_switchToApplication(display, window, binding) { _switchToApplication(display, window, binding) {
if (!this._allowFavoriteShortcuts())
return;
let [,,,target] = binding.get_name().split('-'); let [,,,target] = binding.get_name().split('-');
let apps = AppFavorites.getAppFavorites().getFavorites(); let apps = AppFavorites.getAppFavorites().getFavorites();
let app = apps[target - 1]; let app = apps[target - 1];

View File

@@ -1,6 +1,6 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -* // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*
const { GLib, Meta, St } = imports.gi; const { Meta, St } = imports.gi;
const BoxPointer = imports.ui.boxpointer; const BoxPointer = imports.ui.boxpointer;
const Main = imports.ui.main; const Main = imports.ui.main;
@@ -42,13 +42,13 @@ var WindowMenu = class extends PopupMenu.PopupMenu {
item.setSensitive(false); item.setSensitive(false);
item = this.addAction(_("Move"), event => { item = this.addAction(_("Move"), event => {
this._grabAction(window, Meta.GrabOp.KEYBOARD_MOVING, event.get_time()); window.begin_grab_op(Meta.GrabOp.KEYBOARD_MOVING, true, event.get_time());
}); });
if (!window.allows_move()) if (!window.allows_move())
item.setSensitive(false); item.setSensitive(false);
item = this.addAction(_("Resize"), event => { item = this.addAction(_("Resize"), event => {
this._grabAction(window, Meta.GrabOp.KEYBOARD_RESIZING_UNKNOWN, event.get_time()); window.begin_grab_op(Meta.GrabOp.KEYBOARD_RESIZING_UNKNOWN, true, event.get_time());
}); });
if (!window.allows_resize()) if (!window.allows_resize())
item.setSensitive(false); item.setSensitive(false);
@@ -169,31 +169,11 @@ var WindowMenu = class extends PopupMenu.PopupMenu {
if (!window.can_close()) if (!window.can_close())
item.setSensitive(false); item.setSensitive(false);
} }
_grabAction(window, grabOp, time) {
if (global.display.get_grab_op() == Meta.GrabOp.NONE) {
window.begin_grab_op(grabOp, true, time);
return;
}
let waitId = 0;
let id = global.display.connect('grab-op-end', (display) => {
display.disconnect(id);
GLib.source_remove(waitId);
window.begin_grab_op(grabOp, true, time);
});
waitId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 100, () => {
global.display.disconnect(id);
return GLib.SOURCE_REMOVE;
});
}
}; };
var WindowMenuManager = class { var WindowMenuManager = class {
constructor() { constructor() {
this._manager = new PopupMenu.PopupMenuManager(Main.layoutManager.dummyCursor); this._manager = new PopupMenu.PopupMenuManager({ actor: Main.layoutManager.dummyCursor });
this._sourceActor = new St.Widget({ reactive: true, visible: false }); this._sourceActor = new St.Widget({ reactive: true, visible: false });
this._sourceActor.connect('button-press-event', () => { this._sourceActor.connect('button-press-event', () => {
@@ -203,9 +183,6 @@ var WindowMenuManager = class {
} }
showWindowMenuForWindow(window, type, rect) { showWindowMenuForWindow(window, type, rect) {
if (!Main.sessionMode.hasWmMenus)
return;
if (type != Meta.WindowMenuType.WM) if (type != Meta.WindowMenuType.WM)
throw new Error('Unsupported window menu type'); throw new Error('Unsupported window menu type');
let menu = new WindowMenu(window, this._sourceActor); let menu = new WindowMenu(window, this._sourceActor);

View File

@@ -786,8 +786,8 @@ var WindowPositionFlags = {
var LayoutStrategy = class { var LayoutStrategy = class {
constructor(monitor, rowSpacing, columnSpacing) { constructor(monitor, rowSpacing, columnSpacing) {
if (this.constructor === LayoutStrategy) if (new.target === LayoutStrategy)
throw new TypeError(`Cannot instantiate abstract type ${this.constructor.name}`); throw new TypeError('Cannot instantiate abstract type ' + new.target.name);
this._monitor = monitor; this._monitor = monitor;
this._rowSpacing = rowSpacing; this._rowSpacing = rowSpacing;
@@ -813,7 +813,7 @@ var LayoutStrategy = class {
} }
// Computes and returns an individual scaling factor for @window, // Computes and returns an individual scaling factor for @window,
// to be applied in addition to the overall layout scale. // to be applied in addition to the overal layout scale.
_computeWindowScale(window) { _computeWindowScale(window) {
// Since we align windows next to each other, the height of the // Since we align windows next to each other, the height of the
// thumbnails is much more important to preserve than the width of // thumbnails is much more important to preserve than the width of
@@ -835,7 +835,7 @@ var LayoutStrategy = class {
// (optionally) for each row in @layout.rows. This method is // (optionally) for each row in @layout.rows. This method is
// intended to be called by subclasses. // intended to be called by subclasses.
_computeRowSizes(layout) { _computeRowSizes(layout) {
throw new GObject.NotImplementedError(`_computeRowSizes in ${this.constructor.name}`); throw new Error('_computeRowSizes not implemented');
} }
// Compute strategy-specific window slots for each window in // Compute strategy-specific window slots for each window in
@@ -848,7 +848,7 @@ var LayoutStrategy = class {
// * gridHeight - The totial height used by the grid, unscaled, unspaced. // * gridHeight - The totial height used by the grid, unscaled, unspaced.
// * rows - A list of rows, which should be instantiated by _newRow. // * rows - A list of rows, which should be instantiated by _newRow.
computeLayout(windows, layout) { computeLayout(windows, layout) {
throw new GObject.NotImplementedError(`computeLayout in ${this.constructor.name}`); throw new Error('computeLayout not implemented');
} }
// Given @layout, compute the overall scale and space of the layout. // Given @layout, compute the overall scale and space of the layout.
@@ -1266,7 +1266,7 @@ var Workspace = class {
} }
// We will reposition windows anyway when enter again overview or when ending the windows // We will reposition windows anyway when enter again overview or when ending the windows
// animations with fade animation. // animations whith fade animation.
// In this way we avoid unwanted animations of windows repositioning while // In this way we avoid unwanted animations of windows repositioning while
// animating overview. // animating overview.
if (this.leavingOverview || this._animatingWindowsFade) if (this.leavingOverview || this._animatingWindowsFade)
@@ -1886,10 +1886,10 @@ var Workspace = class {
// Win win -- better scale and better space // Win win -- better scale and better space
return true; return true;
} else if (newLayout.scale > oldLayout.scale && newLayout.space <= oldLayout.space) { } else if (newLayout.scale > oldLayout.scale && newLayout.space <= oldLayout.space) {
// Keep new layout only if scale gain outweighs aspect space loss // Keep new layout only if scale gain outweights aspect space loss
return scalePower > spacePower; return scalePower > spacePower;
} else if (newLayout.scale <= oldLayout.scale && newLayout.space > oldLayout.space) { } else if (newLayout.scale <= oldLayout.scale && newLayout.space > oldLayout.space) {
// Keep new layout only if aspect space gain outweighs scale loss // Keep new layout only if aspect space gain outweights scale loss
return spacePower > scalePower; return spacePower > scalePower;
} else { } else {
// Lose -- worse scale and space // Lose -- worse scale and space

View File

@@ -85,6 +85,8 @@ class WorkspaceSwitcherPopup extends St.Widget {
height: global.screen_height, height: global.screen_height,
style_class: 'workspace-switcher-group' }); style_class: 'workspace-switcher-group' });
this.actor = this;
Main.uiGroup.add_actor(this); Main.uiGroup.add_actor(this);
this._timeoutId = 0; this._timeoutId = 0;
@@ -140,7 +142,7 @@ class WorkspaceSwitcherPopup extends St.Widget {
time: ANIMATION_TIME, time: ANIMATION_TIME,
transition: 'easeOutQuad' transition: 'easeOutQuad'
}); });
this.show(); this.actor.show();
} }
display(direction, activeWorkspaceIndex) { display(direction, activeWorkspaceIndex) {

View File

@@ -601,7 +601,8 @@ class ThumbnailsBox extends St.Widget {
style_class: 'workspace-thumbnails', style_class: 'workspace-thumbnails',
request_mode: Clutter.RequestMode.WIDTH_FOR_HEIGHT }); request_mode: Clutter.RequestMode.WIDTH_FOR_HEIGHT });
this._delegate = this; this.actor = this;
this.actor._delegate = this;
let indicator = new St.Bin({ style_class: 'workspace-thumbnail-indicator' }); let indicator = new St.Bin({ style_class: 'workspace-thumbnail-indicator' });

View File

@@ -84,7 +84,7 @@ var WorkspacesView = class extends WorkspacesViewBase {
this._animating = false; // tweening this._animating = false; // tweening
this._scrolling = false; // swipe-scrolling this._scrolling = false; // swipe-scrolling
this._gestureActive = false; // touch(pad) gestures this._gestureActive = false; // touch(pad) gestures
this._animatingScroll = false; // programmatically updating the adjustment this._animatingScroll = false; // programatically updating the adjustment
let activeWorkspaceIndex = workspaceManager.get_active_workspace_index(); let activeWorkspaceIndex = workspaceManager.get_active_workspace_index();
this.scrollAdjustment = new St.Adjustment({ value: activeWorkspaceIndex, this.scrollAdjustment = new St.Adjustment({ value: activeWorkspaceIndex,
@@ -483,6 +483,7 @@ var WorkspacesDisplay = class {
this._primaryIndex = Main.layoutManager.primaryIndex; this._primaryIndex = Main.layoutManager.primaryIndex;
this._workspacesViews = []; this._workspacesViews = [];
this._primaryScrollAdjustment = null;
switchGesture.enabled = this.actor.mapped; switchGesture.enabled = this.actor.mapped;
this._settings = new Gio.Settings({ schema_id: MUTTER_SCHEMA }); this._settings = new Gio.Settings({ schema_id: MUTTER_SCHEMA });
@@ -490,6 +491,8 @@ var WorkspacesDisplay = class {
this._workspacesOnlyOnPrimaryChanged.bind(this)); this._workspacesOnlyOnPrimaryChanged.bind(this));
this._workspacesOnlyOnPrimaryChanged(); this._workspacesOnlyOnPrimaryChanged();
this._switchWorkspaceNotifyId = 0;
this._notifyOpacityId = 0; this._notifyOpacityId = 0;
this._restackedNotifyId = 0; this._restackedNotifyId = 0;
this._scrollEventId = 0; this._scrollEventId = 0;

View File

@@ -1,5 +1,5 @@
project('gnome-shell', 'c', project('gnome-shell', 'c',
version: '3.33.3', version: '3.32.2',
meson_version: '>= 0.47.0', meson_version: '>= 0.47.0',
license: 'GPLv2+' license: 'GPLv2+'
) )
@@ -14,16 +14,16 @@ cogl_pango_pc = 'mutter-cogl-pango-' + mutter_api_version
libmutter_pc = 'libmutter-' + mutter_api_version libmutter_pc = 'libmutter-' + mutter_api_version
croco_req = '>= 0.6.8' croco_req = '>= 0.6.8'
ecal_req = '>= 3.33.1' ecal_req = '>= 3.5.3'
eds_req = '>= 3.17.2' eds_req = '>= 3.17.2'
gcr_req = '>= 3.7.5' gcr_req = '>= 3.7.5'
gdesktop_req = '>= 3.7.90' gdesktop_req = '>= 3.7.90'
gio_req = '>= 2.56.0' gio_req = '>= 2.56.0'
gi_req = '>= 1.49.1' gi_req = '>= 1.49.1'
gjs_req = '>= 1.57.3' gjs_req = '>= 1.54.0'
gtk_req = '>= 3.15.0' gtk_req = '>= 3.15.0'
json_glib_req = '>= 0.13.2' json_glib_req = '>= 0.13.2'
mutter_req = '>= 3.33.3' mutter_req = '>= 3.32.0'
polkit_req = '>= 0.100' polkit_req = '>= 0.100'
schemas_req = '>= 3.27.90' schemas_req = '>= 3.27.90'
startup_req = '>= 0.11' startup_req = '>= 0.11'
@@ -73,7 +73,7 @@ else
endif endif
atk_bridge_dep = dependency('atk-bridge-2.0') atk_bridge_dep = dependency('atk-bridge-2.0')
ecal_dep = dependency('libecal-2.0', version: ecal_req) ecal_dep = dependency('libecal-1.2', version: ecal_req)
eds_dep = dependency('libedataserver-1.2', version: eds_req) eds_dep = dependency('libedataserver-1.2', version: eds_req)
gcr_dep = dependency('gcr-base-3', version: gcr_req) gcr_dep = dependency('gcr-base-3', version: gcr_req)
gdk_x11_dep = dependency('gdk-x11-3.0') gdk_x11_dep = dependency('gdk-x11-3.0')
@@ -167,58 +167,6 @@ cdata.set('HAVE_FDWALK',
cc.has_function('fdwalk') cc.has_function('fdwalk')
) )
buildtype = get_option('buildtype')
if buildtype != 'plain'
all_warnings = [
'-fno-strict-aliasing',
'-Wpointer-arith',
'-Wmissing-declarations',
'-Wimplicit-function-declaration',
'-Wformat=2',
'-Wformat-nonliteral',
'-Wformat-security',
'-Wstrict-prototypes',
'-Wmissing-prototypes',
'-Wnested-externs',
'-Wold-style-definition',
'-Wundef',
'-Wunused',
'-Wcast-align',
'-Wmissing-noreturn',
'-Wmissing-format-attribute',
'-Wmissing-include-dirs',
'-Wlogical-op',
'-Wignored-qualifiers',
'-Werror=redundant-decls',
'-Werror=implicit',
'-Werror=nonnull',
'-Werror=init-self',
'-Werror=main',
'-Werror=missing-braces',
'-Werror=sequence-point',
'-Werror=return-type',
'-Werror=trigraphs',
'-Werror=array-bounds',
'-Werror=write-strings',
'-Werror=address',
'-Werror=int-to-pointer-cast',
'-Werror=pointer-to-int-cast',
'-Werror=empty-body',
'-Werror=write-strings',
]
supported_warnings = cc.get_supported_arguments(all_warnings)
add_project_arguments(supported_warnings, language: 'c')
endif
if get_option('debug')
debug_c_args = [
'-DG_ENABLE_DEBUG',
'-fno-omit-frame-pointer'
]
supported_debug_c_args = cc.get_supported_arguments(debug_c_args)
add_project_arguments(supported_debug_c_args, language: 'c')
endif
config_h = configure_file( config_h = configure_file(
input: 'config.h.meson', input: 'config.h.meson',
output: 'config.h', output: 'config.h',

View File

@@ -54,7 +54,6 @@ js/ui/shellMountOperation.js
js/ui/status/accessibility.js js/ui/status/accessibility.js
js/ui/status/bluetooth.js js/ui/status/bluetooth.js
js/ui/status/brightness.js js/ui/status/brightness.js
js/ui/status/dwellClick.js
js/ui/status/keyboard.js js/ui/status/keyboard.js
js/ui/status/location.js js/ui/status/location.js
js/ui/status/network.js js/ui/status/network.js

1031
po/ca.po

File diff suppressed because it is too large Load Diff

169
po/eo.po
View File

@@ -6,22 +6,22 @@
# Daniel PUENTES <blatberk@openmailbox.org>, 2015. # Daniel PUENTES <blatberk@openmailbox.org>, 2015.
# Nicolas MAIA < >, 2015. # Nicolas MAIA < >, 2015.
# Kristjan SCHMIDT <kristjan.schmidt@googlemail.com>, 2011, 2012, 2015, 2016, 2018. # Kristjan SCHMIDT <kristjan.schmidt@googlemail.com>, 2011, 2012, 2015, 2016, 2018.
# Carmen Bianca BAKKER <carmen@carmenbianca.eu>, 2018-2019. # Carmen Bianca BAKKER <carmen@carmenbianca.eu>, 2018, 2019.
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell master\n" "Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2019-05-08 17:45+0000\n" "POT-Creation-Date: 2019-03-24 17:37+0000\n"
"PO-Revision-Date: 2019-05-09 20:12+0200\n" "PO-Revision-Date: 2019-03-31 00:14+0100\n"
"Last-Translator: Carmen Bianca BAKKER <carmen@carmenbianca.eu>\n" "Last-Translator: Carmen Bianca Bakker <carmen@carmenbianca.eu>\n"
"Language-Team: Esperanto <gnome-eo-list@gnome.org>\n" "Language-Team: Esperanto <gnome-eo-list@gnome.org>\n"
"Language: eo\n" "Language: eo\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Gtranslator 3.32.0\n" "X-Generator: Poedit 2.2.1\n"
"X-DamnedLies-Scope: partial\n" "X-DamnedLies-Scope: partial\n"
"X-Project-Style: gnome\n" "X-Project-Style: gnome\n"
@@ -383,7 +383,7 @@ msgstr "Foliumi en Programaro"
#: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55 #: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136 #: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136
#: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188 #: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188
#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:889 #: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888
msgid "Cancel" msgid "Cancel"
msgstr "Nuligi" msgstr "Nuligi"
@@ -681,37 +681,32 @@ msgstr "Oftaj"
msgid "All" msgid "All"
msgstr "Ĉiuj" msgstr "Ĉiuj"
#. Translators: This is the heading of a list of open windows #: js/ui/appDisplay.js:1737 js/ui/panel.js:83
#: js/ui/appDisplay.js:1713 js/ui/panel.js:79
msgid "Open Windows"
msgstr "Malfermaj fenestroj"
#: js/ui/appDisplay.js:1732 js/ui/panel.js:86
msgid "New Window" msgid "New Window"
msgstr "Nova fenestro" msgstr "Nova fenestro"
#: js/ui/appDisplay.js:1746 #: js/ui/appDisplay.js:1751
msgid "Launch using Dedicated Graphics Card" msgid "Launch using Dedicated Graphics Card"
msgstr "Lanĉi uzante dediĉitan vidkarton" msgstr "Lanĉi uzante dediĉitan vidkarton"
#: js/ui/appDisplay.js:1773 js/ui/dash.js:239 #: js/ui/appDisplay.js:1778 js/ui/dash.js:239
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Forigi el preferataj" msgstr "Forigi el preferataj"
#: js/ui/appDisplay.js:1779 #: js/ui/appDisplay.js:1784
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Aldoni al preferataj" msgstr "Aldoni al preferataj"
#: js/ui/appDisplay.js:1789 js/ui/panel.js:97 #: js/ui/appDisplay.js:1794 js/ui/panel.js:94
msgid "Show Details" msgid "Show Details"
msgstr "Montri detalojn" msgstr "Montri detalojn"
#: js/ui/appFavorites.js:149 #: js/ui/appFavorites.js:141
#, javascript-format #, javascript-format
msgid "%s has been added to your favorites." msgid "%s has been added to your favorites."
msgstr "%s estas aldonita de via preferataj aplikaĵoj." msgstr "%s estas aldonita de via preferataj aplikaĵoj."
#: js/ui/appFavorites.js:183 #: js/ui/appFavorites.js:175
#, javascript-format #, javascript-format
msgid "%s has been removed from your favorites." msgid "%s has been removed from your favorites."
msgstr "%s estas forigita de via preferataj aplikaĵoj." msgstr "%s estas forigita de via preferataj aplikaĵoj."
@@ -919,7 +914,7 @@ msgstr ""
"Alternative vi povas konekti per premi la “WPS”-butonon de via enkursigilo." "Alternative vi povas konekti per premi la “WPS”-butonon de via enkursigilo."
#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219 #: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219
#: js/ui/status/network.js:310 js/ui/status/network.js:892 #: js/ui/status/network.js:309 js/ui/status/network.js:891
msgid "Connect" msgid "Connect"
msgstr "Konekti" msgstr "Konekti"
@@ -949,7 +944,7 @@ msgstr "Servo: "
#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685 #: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685
msgid "Authentication required by wireless network" msgid "Authentication required by wireless network"
msgstr "Sendrata reto bezonas aŭtentigon" msgstr "Aŭtentigo estas bezonata de sendrata reto"
#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686 #: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686
#, javascript-format #, javascript-format
@@ -977,7 +972,7 @@ msgstr "PIN-kodo bezonata"
#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700 #: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700
msgid "PIN code is needed for the mobile broadband device" msgid "PIN code is needed for the mobile broadband device"
msgstr "PIN-kodo necesas por la portebla larĝkapacita aparato" msgstr "PIN-kodo estas bezonata por la portebla larĝkapacita aparato"
#: js/ui/components/networkAgent.js:333 #: js/ui/components/networkAgent.js:333
msgid "PIN: " msgid "PIN: "
@@ -991,9 +986,9 @@ msgstr "Portebla larĝkapacita retopasvorto"
#: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707 #: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707
#, javascript-format #, javascript-format
msgid "A password is required to connect to “%s”." msgid "A password is required to connect to “%s”."
msgstr "Pasvorto necesas por konekti al “%s”." msgstr "Pasvorto estas bezonata por konekti al “%s”."
#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1665 #: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1664
msgid "Network Manager" msgid "Network Manager"
msgstr "Retadministrilo" msgstr "Retadministrilo"
@@ -1065,23 +1060,23 @@ msgstr "Aldoni mondajn horloĝojn…"
msgid "World Clocks" msgid "World Clocks"
msgstr "Mondaj horloĝoj" msgstr "Mondaj horloĝoj"
#: js/ui/dateMenu.js:228 #: js/ui/dateMenu.js:222
msgid "Weather" msgid "Weather"
msgstr "Vetero" msgstr "Vetero"
#: js/ui/dateMenu.js:311 #: js/ui/dateMenu.js:305
msgid "Select a location…" msgid "Select a location…"
msgstr "Elekti lokon…" msgstr "Elekti lokon…"
#: js/ui/dateMenu.js:319 #: js/ui/dateMenu.js:313
msgid "Loading…" msgid "Loading…"
msgstr "Ŝargante…" msgstr "Ŝargante…"
#: js/ui/dateMenu.js:329 #: js/ui/dateMenu.js:323
msgid "Go online for weather information" msgid "Go online for weather information"
msgstr "Enretigi por veterinformoj" msgstr "Enretigi por veterinformoj"
#: js/ui/dateMenu.js:331 #: js/ui/dateMenu.js:325
msgid "Weather information is currently unavailable" msgid "Weather information is currently unavailable"
msgstr "Veterinformoj ĉimomente nehaveblas" msgstr "Veterinformoj ĉimomente nehaveblas"
@@ -1310,13 +1305,13 @@ msgid "Leave On"
msgstr "Lasi ŝaltita" msgstr "Lasi ŝaltita"
#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133 #: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133
#: js/ui/status/network.js:1264 #: js/ui/status/network.js:1263
msgid "Turn On" msgid "Turn On"
msgstr "Ŝalti" msgstr "Ŝalti"
#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133 #: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133
#: js/ui/status/network.js:128 js/ui/status/network.js:311 #: js/ui/status/network.js:128 js/ui/status/network.js:310
#: js/ui/status/network.js:1264 js/ui/status/network.js:1376 #: js/ui/status/network.js:1263 js/ui/status/network.js:1375
#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 #: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79
#: js/ui/status/rfkill.js:106 #: js/ui/status/rfkill.js:106
msgid "Turn Off" msgid "Turn Off"
@@ -1378,7 +1373,7 @@ msgstr "Montri fonton"
msgid "Web Page" msgid "Web Page"
msgstr "Retpaĝo" msgstr "Retpaĝo"
#: js/ui/messageTray.js:1479 #: js/ui/messageTray.js:1480
msgid "System Information" msgid "System Information"
msgstr "Sisteminformoj" msgstr "Sisteminformoj"
@@ -1457,25 +1452,34 @@ msgstr "Premu Esk-klavon por ĉesi"
msgid "Press any key to exit" msgid "Press any key to exit"
msgstr "Premu iun ajn klavon por ĉesi" msgstr "Premu iun ajn klavon por ĉesi"
#: js/ui/panel.js:113 #: js/ui/panel.js:108
msgid "Quit" msgid "Quit"
msgstr "Ĉesi" msgstr "Ĉesi"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". #. in your language, you can use the word for "Overview".
#: js/ui/panel.js:468 #: js/ui/panel.js:471
msgid "Activities" msgid "Activities"
msgstr "Aktivecoj" msgstr "Aktivecoj"
#: js/ui/panel.js:743 #: js/ui/panel.js:746
msgctxt "System menu in the top bar" msgctxt "System menu in the top bar"
msgid "System" msgid "System"
msgstr "Sistemo" msgstr "Sistemo"
#: js/ui/panel.js:861 #: js/ui/panel.js:867
msgid "Top Bar" msgid "Top Bar"
msgstr "Supra breto" msgstr "Supra breto"
#. Translators: this MUST be either "toggle-switch-us"
#. (for toggle switches containing the English words
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches.
#: js/ui/popupMenu.js:285
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
#: js/ui/runDialog.js:64 #: js/ui/runDialog.js:64
msgid "Enter a Command" msgid "Enter a Command"
msgstr "Enigu komandon" msgstr "Enigu komandon"
@@ -1610,11 +1614,11 @@ msgstr "Saltaj klavoj"
msgid "Mouse Keys" msgid "Mouse Keys"
msgstr "Musklavoj" msgstr "Musklavoj"
#: js/ui/status/accessibility.js:135 #: js/ui/status/accessibility.js:151
msgid "High Contrast" msgid "High Contrast"
msgstr "Alta kontrasto" msgstr "Alta kontrasto"
#: js/ui/status/accessibility.js:177 #: js/ui/status/accessibility.js:182
msgid "Large Text" msgid "Large Text"
msgstr "Granda teksto" msgstr "Granda teksto"
@@ -1622,7 +1626,7 @@ msgstr "Granda teksto"
msgid "Bluetooth" msgid "Bluetooth"
msgstr "Bludento" msgstr "Bludento"
#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:586 #: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585
msgid "Bluetooth Settings" msgid "Bluetooth Settings"
msgstr "Bludento-agordoj" msgstr "Bludento-agordoj"
@@ -1693,13 +1697,13 @@ msgid "<unknown>"
msgstr "<nekonata>" msgstr "<nekonata>"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:417 js/ui/status/network.js:1293 #: js/ui/status/network.js:416 js/ui/status/network.js:1292
#, javascript-format #, javascript-format
msgid "%s Off" msgid "%s Off"
msgstr "%s malŝaltita" msgstr "%s malŝaltita"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:420 #: js/ui/status/network.js:419
#, javascript-format #, javascript-format
msgid "%s Connected" msgid "%s Connected"
msgstr "%s konektita" msgstr "%s konektita"
@@ -1707,189 +1711,189 @@ msgstr "%s konektita"
#. Translators: this is for network devices that are physically present but are not #. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu); #. under NetworkManager's control (and thus cannot be used in the menu);
#. %s is a network identifier #. %s is a network identifier
#: js/ui/status/network.js:425 #: js/ui/status/network.js:424
#, javascript-format #, javascript-format
msgid "%s Unmanaged" msgid "%s Unmanaged"
msgstr "%s nemastrumita" msgstr "%s nemastrumita"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:428 #: js/ui/status/network.js:427
#, javascript-format #, javascript-format
msgid "%s Disconnecting" msgid "%s Disconnecting"
msgstr "%s malkonektante" msgstr "%s malkonektante"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:435 js/ui/status/network.js:1285 #: js/ui/status/network.js:434 js/ui/status/network.js:1284
#, javascript-format #, javascript-format
msgid "%s Connecting" msgid "%s Connecting"
msgstr "%s konektante" msgstr "%s konektante"
#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier #. Translators: this is for network connections that require some kind of key or password; %s is a network identifier
#: js/ui/status/network.js:438 #: js/ui/status/network.js:437
#, javascript-format #, javascript-format
msgid "%s Requires Authentication" msgid "%s Requires Authentication"
msgstr "%s postulas aŭtentigon" msgstr "%s postulas aŭtentigon"
#. Translators: this is for devices that require some kind of firmware or kernel #. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing; %s is a network identifier #. module, which is missing; %s is a network identifier
#: js/ui/status/network.js:446 #: js/ui/status/network.js:445
#, javascript-format #, javascript-format
msgid "Firmware Missing For %s" msgid "Firmware Missing For %s"
msgstr "Mikroprogramo mankas por %s" msgstr "Mikroprogramo mankas por %s"
#. Translators: this is for a network device that cannot be activated (for example it #. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage; %s is a network identifier #. is disabled by rfkill, or it has no coverage; %s is a network identifier
#: js/ui/status/network.js:450 #: js/ui/status/network.js:449
#, javascript-format #, javascript-format
msgid "%s Unavailable" msgid "%s Unavailable"
msgstr "%s nedisponebla" msgstr "%s nedisponebla"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:453 #: js/ui/status/network.js:452
#, javascript-format #, javascript-format
msgid "%s Connection Failed" msgid "%s Connection Failed"
msgstr "%s konekto malsukcesis" msgstr "%s konekto malsukcesis"
#: js/ui/status/network.js:465 #: js/ui/status/network.js:464
msgid "Wired Settings" msgid "Wired Settings"
msgstr "Drataj agordoj" msgstr "Drataj agordoj"
#: js/ui/status/network.js:507 #: js/ui/status/network.js:506
msgid "Mobile Broadband Settings" msgid "Mobile Broadband Settings"
msgstr "Porteblaj larĝkapacitaj agordoj" msgstr "Porteblaj larĝkapacitaj agordoj"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:554 js/ui/status/network.js:1290 #: js/ui/status/network.js:553 js/ui/status/network.js:1289
#, javascript-format #, javascript-format
msgid "%s Hardware Disabled" msgid "%s Hardware Disabled"
msgstr "%s aparataro malŝaltita" msgstr "%s aparataro malŝaltita"
#. Translators: this is for a network device that cannot be activated #. Translators: this is for a network device that cannot be activated
#. because it's disabled by rfkill (airplane mode); %s is a network identifier #. because it's disabled by rfkill (airplane mode); %s is a network identifier
#: js/ui/status/network.js:558 #: js/ui/status/network.js:557
#, javascript-format #, javascript-format
msgid "%s Disabled" msgid "%s Disabled"
msgstr "%s malŝaltita" msgstr "%s malŝaltita"
#: js/ui/status/network.js:598 #: js/ui/status/network.js:597
msgid "Connect to Internet" msgid "Connect to Internet"
msgstr "Konekti al interreto" msgstr "Konekti al interreto"
#: js/ui/status/network.js:787 #: js/ui/status/network.js:786
msgid "Airplane Mode is On" msgid "Airplane Mode is On"
msgstr "Aviadila reĝimo ŝaltita" msgstr "Aviadila reĝimo ŝaltita"
#: js/ui/status/network.js:788 #: js/ui/status/network.js:787
msgid "Wi-Fi is disabled when airplane mode is on." msgid "Wi-Fi is disabled when airplane mode is on."
msgstr "Vifio malebliĝas se aviadila reĝimo estas ŝaltita." msgstr "Vifio malebliĝas se aviadila reĝimo estas ŝaltita."
#: js/ui/status/network.js:789 #: js/ui/status/network.js:788
msgid "Turn Off Airplane Mode" msgid "Turn Off Airplane Mode"
msgstr "Malŝalti aviadilan reĝimon" msgstr "Malŝalti aviadilan reĝimon"
#: js/ui/status/network.js:798 #: js/ui/status/network.js:797
msgid "Wi-Fi is Off" msgid "Wi-Fi is Off"
msgstr "Vifio malŝaltita" msgstr "Vifio malŝaltita"
#: js/ui/status/network.js:799 #: js/ui/status/network.js:798
msgid "Wi-Fi needs to be turned on in order to connect to a network." msgid "Wi-Fi needs to be turned on in order to connect to a network."
msgstr "Necesas ŝalti vifion por konekti al reto." msgstr "Necesas ŝalti vifion por konekti al reto."
#: js/ui/status/network.js:800 #: js/ui/status/network.js:799
msgid "Turn On Wi-Fi" msgid "Turn On Wi-Fi"
msgstr "Ŝalti vifion" msgstr "Ŝalti vifion"
#: js/ui/status/network.js:825 #: js/ui/status/network.js:824
msgid "Wi-Fi Networks" msgid "Wi-Fi Networks"
msgstr "Vifiaj retoj" msgstr "Vifiaj retoj"
#: js/ui/status/network.js:827 #: js/ui/status/network.js:826
msgid "Select a network" msgid "Select a network"
msgstr "Elekti reton" msgstr "Elekti reton"
#: js/ui/status/network.js:856 #: js/ui/status/network.js:855
msgid "No Networks" msgid "No Networks"
msgstr "Neniu reto" msgstr "Neniu reto"
#: js/ui/status/network.js:877 js/ui/status/rfkill.js:104 #: js/ui/status/network.js:876 js/ui/status/rfkill.js:104
msgid "Use hardware switch to turn off" msgid "Use hardware switch to turn off"
msgstr "Uzi aparataran ŝaltilon por malŝalti" msgstr "Uzi aparataran ŝaltilon por malŝalti"
#: js/ui/status/network.js:1153 #: js/ui/status/network.js:1152
msgid "Select Network" msgid "Select Network"
msgstr "Elekti reton" msgstr "Elekti reton"
#: js/ui/status/network.js:1159 #: js/ui/status/network.js:1158
msgid "Wi-Fi Settings" msgid "Wi-Fi Settings"
msgstr "Vifio-agordoj" msgstr "Vifio-agordoj"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:1281 #: js/ui/status/network.js:1280
#, javascript-format #, javascript-format
msgid "%s Hotspot Active" msgid "%s Hotspot Active"
msgstr "%s retkaptejo aktiva" msgstr "%s retkaptejo aktiva"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:1296 #: js/ui/status/network.js:1295
#, javascript-format #, javascript-format
msgid "%s Not Connected" msgid "%s Not Connected"
msgstr "%s ne konektita" msgstr "%s ne konektita"
#: js/ui/status/network.js:1393 #: js/ui/status/network.js:1392
msgid "connecting…" msgid "connecting…"
msgstr "konektante…" msgstr "konektante…"
#. Translators: this is for network connections that require some kind of key or password #. Translators: this is for network connections that require some kind of key or password
#: js/ui/status/network.js:1396 #: js/ui/status/network.js:1395
msgid "authentication required" msgid "authentication required"
msgstr "aŭtentigo necesas" msgstr "aŭtentigo necesas"
#: js/ui/status/network.js:1398 #: js/ui/status/network.js:1397
msgid "connection failed" msgid "connection failed"
msgstr "konekto malsukcesis" msgstr "konekto malsukcesis"
#: js/ui/status/network.js:1448 #: js/ui/status/network.js:1447
msgid "VPN Settings" msgid "VPN Settings"
msgstr "VPR-agordoj" msgstr "VPR-agordoj"
#: js/ui/status/network.js:1465 #: js/ui/status/network.js:1464
msgid "VPN" msgid "VPN"
msgstr "VPR" msgstr "VPR"
#: js/ui/status/network.js:1475 #: js/ui/status/network.js:1474
msgid "VPN Off" msgid "VPN Off"
msgstr "VPR malŝaltita" msgstr "VPR malŝaltita"
#: js/ui/status/network.js:1536 js/ui/status/rfkill.js:82 #: js/ui/status/network.js:1535 js/ui/status/rfkill.js:82
msgid "Network Settings" msgid "Network Settings"
msgstr "Ret-agordoj" msgstr "Ret-agordoj"
#: js/ui/status/network.js:1565 #: js/ui/status/network.js:1564
#, javascript-format #, javascript-format
msgid "%s Wired Connection" msgid "%s Wired Connection"
msgid_plural "%s Wired Connections" msgid_plural "%s Wired Connections"
msgstr[0] "%s drata konekto" msgstr[0] "%s drata konekto"
msgstr[1] "%s drataj konektoj" msgstr[1] "%s drataj konektoj"
#: js/ui/status/network.js:1569 #: js/ui/status/network.js:1568
#, javascript-format #, javascript-format
msgid "%s Wi-Fi Connection" msgid "%s Wi-Fi Connection"
msgid_plural "%s Wi-Fi Connections" msgid_plural "%s Wi-Fi Connections"
msgstr[0] "%s vifia konekto" msgstr[0] "%s vifia konekto"
msgstr[1] "%s vifiaj konektoj" msgstr[1] "%s vifiaj konektoj"
#: js/ui/status/network.js:1573 #: js/ui/status/network.js:1572
#, javascript-format #, javascript-format
msgid "%s Modem Connection" msgid "%s Modem Connection"
msgid_plural "%s Modem Connections" msgid_plural "%s Modem Connections"
msgstr[0] "%s modema konekto" msgstr[0] "%s modema konekto"
msgstr[1] "%s modemaj konektoj" msgstr[1] "%s modemaj konektoj"
#: js/ui/status/network.js:1706 #: js/ui/status/network.js:1701
msgid "Connection failed" msgid "Connection failed"
msgstr "Konekto malsukcesis" msgstr "Konekto malsukcesis"
#: js/ui/status/network.js:1707 #: js/ui/status/network.js:1702
msgid "Activation of network connection failed" msgid "Activation of network connection failed"
msgstr "Aktivigo de reto-konekto malsukcesis" msgstr "Aktivigo de reto-konekto malsukcesis"
@@ -2094,7 +2098,7 @@ msgstr[1] "Agordaj ŝanĝoj malfaritos post %d sekundoj"
#. Translators: This represents the size of a window. The first number is #. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height. #. * the width of the window and the second is the height.
#: js/ui/windowManager.js:677 #: js/ui/windowManager.js:662
#, javascript-format #, javascript-format
msgid "%d × %d" msgid "%d × %d"
msgstr "%d × %d" msgstr "%d × %d"
@@ -2227,9 +2231,6 @@ msgstr[1] "%u enigoj"
msgid "System Sounds" msgid "System Sounds"
msgstr "Sistemsonoj" msgstr "Sistemsonoj"
#~ msgid "toggle-switch-us"
#~ msgstr "toggle-switch-intl"
#~ msgid "network-workgroup" #~ msgid "network-workgroup"
#~ msgstr "network-workgroup" #~ msgstr "network-workgroup"

348
po/es.po
View File

@@ -9,16 +9,16 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell.master\n" "Project-Id-Version: gnome-shell.master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2019-06-06 11:42+0000\n" "POT-Creation-Date: 2019-07-17 14:17+0000\n"
"PO-Revision-Date: 2019-06-10 12:04+0200\n" "PO-Revision-Date: 2019-07-24 09:53+0200\n"
"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n" "Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
"Language-Team: es <gnome-es-list@gnome.org>\n" "Language-Team: Spanish - Spain <gnome-es-list@gnome.org>\n"
"Language: es\n" "Language: es_ES\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Gtranslator 3.32.0\n" "X-Generator: Gtranslator 3.32.1\n"
#: data/50-gnome-shell-system.xml:6 #: data/50-gnome-shell-system.xml:6
msgid "System" msgid "System"
@@ -428,11 +428,10 @@ msgstr ""
msgid "Browse in Software" msgid "Browse in Software"
msgstr "Buscar en Software" msgstr "Buscar en Software"
#: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:52 #: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55
#: js/ui/components/networkAgent.js:118 js/ui/components/polkitAgent.js:138 #: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136
#: js/ui/endSessionDialog.js:431 js/ui/extensionDownloader.js:188 #: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188
#: js/ui/shellMountOperation.js:404 js/ui/shellMountOperation.js:413 #: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888
#: js/ui/status/network.js:894
msgid "Cancel" msgid "Cancel"
msgstr "Cancelar" msgstr "Cancelar"
@@ -440,7 +439,7 @@ msgstr "Cancelar"
msgid "Next" msgid "Next"
msgstr "Siguiente" msgstr "Siguiente"
#: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:408 #: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:329
#: js/ui/unlockDialog.js:41 #: js/ui/unlockDialog.js:41
msgid "Unlock" msgid "Unlock"
msgstr "Desbloquear" msgstr "Desbloquear"
@@ -471,8 +470,8 @@ msgstr "(ej., usuario o %s)"
#. TTLS and PEAP are actually much more complicated, but this complication #. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication #. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one) #. (and don't even care of which one)
#: js/gdm/loginDialog.js:889 js/ui/components/networkAgent.js:244 #: js/gdm/loginDialog.js:889 js/ui/components/networkAgent.js:243
#: js/ui/components/networkAgent.js:264 js/ui/components/networkAgent.js:282 #: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281
msgid "Username: " msgid "Username: "
msgstr "Nombre de usuario:" msgstr "Nombre de usuario:"
@@ -523,7 +522,7 @@ msgstr "Cerrar la sesión"
#. Translators: A list of keywords that match the logout action, separated by semicolons #. Translators: A list of keywords that match the logout action, separated by semicolons
#: js/misc/systemActions.js:105 #: js/misc/systemActions.js:105
msgid "logout;log out;sign off" msgid "logout;sign off"
msgstr "cerrar;sesión;salir" msgstr "cerrar;sesión;salir"
#. Translators: The name of the suspend action in search #. Translators: The name of the suspend action in search
@@ -709,11 +708,11 @@ msgstr ""
#. No support for non-modal system dialogs, so ignore the option #. No support for non-modal system dialogs, so ignore the option
#. let modal = options['modal'] || true; #. let modal = options['modal'] || true;
#: js/ui/accessDialog.js:38 js/ui/status/location.js:362 #: js/ui/accessDialog.js:37 js/ui/status/location.js:360
msgid "Deny Access" msgid "Deny Access"
msgstr "Denegar acceso" msgstr "Denegar acceso"
#: js/ui/accessDialog.js:39 js/ui/status/location.js:365 #: js/ui/accessDialog.js:38 js/ui/status/location.js:363
msgid "Grant Access" msgid "Grant Access"
msgstr "Conceder acceso" msgstr "Conceder acceso"
@@ -729,28 +728,23 @@ msgstr "Frecuentes"
msgid "All" msgid "All"
msgstr "Todas" msgstr "Todas"
#. Translators: This is the heading of a list of open windows #: js/ui/appDisplay.js:1737 js/ui/panel.js:83
#: js/ui/appDisplay.js:1713 js/ui/panel.js:79
msgid "Open Windows"
msgstr "Ventanas abiertas"
#: js/ui/appDisplay.js:1732 js/ui/panel.js:86
msgid "New Window" msgid "New Window"
msgstr "Ventana nueva" msgstr "Ventana nueva"
#: js/ui/appDisplay.js:1746 #: js/ui/appDisplay.js:1751
msgid "Launch using Dedicated Graphics Card" msgid "Launch using Dedicated Graphics Card"
msgstr "Lanzar usando la tarjeta gráfica dedicada" msgstr "Lanzar usando la tarjeta gráfica dedicada"
#: js/ui/appDisplay.js:1773 js/ui/dash.js:239 #: js/ui/appDisplay.js:1778 js/ui/dash.js:239
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Quitar de los favoritos" msgstr "Quitar de los favoritos"
#: js/ui/appDisplay.js:1779 #: js/ui/appDisplay.js:1784
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Añadir a los favoritos" msgstr "Añadir a los favoritos"
#: js/ui/appDisplay.js:1789 js/ui/panel.js:97 #: js/ui/appDisplay.js:1794 js/ui/panel.js:94
msgid "Show Details" msgid "Show Details"
msgstr "Mostrar detalles" msgstr "Mostrar detalles"
@@ -764,23 +758,23 @@ msgstr "Se ha añadido %s a sus favoritos."
msgid "%s has been removed from your favorites." msgid "%s has been removed from your favorites."
msgstr "Se ha quitado %s de sus favoritos." msgstr "Se ha quitado %s de sus favoritos."
#: js/ui/audioDeviceSelection.js:39 #: js/ui/audioDeviceSelection.js:42
msgid "Select Audio Device" msgid "Select Audio Device"
msgstr "Seleccionar dispositivo de sonido" msgstr "Seleccionar dispositivo de sonido"
#: js/ui/audioDeviceSelection.js:50 #: js/ui/audioDeviceSelection.js:53
msgid "Sound Settings" msgid "Sound Settings"
msgstr "Configuración de sonido" msgstr "Configuración de sonido"
#: js/ui/audioDeviceSelection.js:59 #: js/ui/audioDeviceSelection.js:62
msgid "Headphones" msgid "Headphones"
msgstr "Auriculares" msgstr "Auriculares"
#: js/ui/audioDeviceSelection.js:61 #: js/ui/audioDeviceSelection.js:64
msgid "Headset" msgid "Headset"
msgstr "Manos libres" msgstr "Manos libres"
#: js/ui/audioDeviceSelection.js:63 js/ui/status/volume.js:247 #: js/ui/audioDeviceSelection.js:66 js/ui/status/volume.js:247
msgid "Microphone" msgid "Microphone"
msgstr "Micrófono" msgstr "Micrófono"
@@ -941,75 +935,67 @@ msgstr "Forzar la salida"
msgid "Wait" msgid "Wait"
msgstr "Esperar" msgstr "Esperar"
#: js/ui/components/automountManager.js:87 #: js/ui/components/automountManager.js:86
msgid "External drive connected" msgid "External drive connected"
msgstr "Dispositivo externo conectado" msgstr "Dispositivo externo conectado"
#: js/ui/components/automountManager.js:99 #: js/ui/components/automountManager.js:98
msgid "External drive disconnected" msgid "External drive disconnected"
msgstr "Dispositivo externo desconectado" msgstr "Dispositivo externo desconectado"
#: js/ui/components/automountManager.js:211
msgid "Unable to unlock volume"
msgstr "No se puede desbloquear el volumen"
#: js/ui/components/automountManager.js:212
msgid "The installed udisks version does not support the PIM setting"
msgstr "La versión de udisks instalada no soporta la configuración PIM"
#: js/ui/components/autorunManager.js:334 #: js/ui/components/autorunManager.js:334
#, javascript-format #, javascript-format
msgid "Open with %s" msgid "Open with %s"
msgstr "Abrir con %s" msgstr "Abrir con %s"
#: js/ui/components/keyring.js:66 js/ui/components/polkitAgent.js:257 #: js/ui/components/keyring.js:77 js/ui/components/polkitAgent.js:255
msgid "Password:" msgid "Password:"
msgstr "Contraseña:" msgstr "Contraseña:"
#: js/ui/components/keyring.js:97 #: js/ui/components/keyring.js:108
msgid "Type again:" msgid "Type again:"
msgstr "Escriba de nuevo:" msgstr "Escriba de nuevo:"
#: js/ui/components/networkAgent.js:103 #: js/ui/components/networkAgent.js:102
msgid "" msgid ""
"Alternatively you can connect by pushing the “WPS” button on your router." "Alternatively you can connect by pushing the “WPS” button on your router."
msgstr "" msgstr ""
"Alternativamente puede conectarse pulsando el botón «WPS» de su router." "Alternativamente puede conectarse pulsando el botón «WPS» de su router."
#: js/ui/components/networkAgent.js:113 js/ui/status/network.js:219 #: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219
#: js/ui/status/network.js:310 js/ui/status/network.js:897 #: js/ui/status/network.js:309 js/ui/status/network.js:891
msgid "Connect" msgid "Connect"
msgstr "Conectar" msgstr "Conectar"
#. Cisco LEAP #. Cisco LEAP
#: js/ui/components/networkAgent.js:212 js/ui/components/networkAgent.js:224 #: js/ui/components/networkAgent.js:211 js/ui/components/networkAgent.js:223
#: js/ui/components/networkAgent.js:247 js/ui/components/networkAgent.js:266 #: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:265
#: js/ui/components/networkAgent.js:286 js/ui/components/networkAgent.js:296 #: js/ui/components/networkAgent.js:285 js/ui/components/networkAgent.js:295
msgid "Password: " msgid "Password: "
msgstr "Contraseña: " msgstr "Contraseña: "
#. static WEP #. static WEP
#: js/ui/components/networkAgent.js:217 #: js/ui/components/networkAgent.js:216
msgid "Key: " msgid "Key: "
msgstr "Clave:" msgstr "Clave:"
#: js/ui/components/networkAgent.js:250 js/ui/components/networkAgent.js:272 #: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271
msgid "Private key password: " msgid "Private key password: "
msgstr "Contraseña de la clave privada:" msgstr "Contraseña de la clave privada:"
#: js/ui/components/networkAgent.js:270 #: js/ui/components/networkAgent.js:269
msgid "Identity: " msgid "Identity: "
msgstr "Identidad:" msgstr "Identidad:"
#: js/ui/components/networkAgent.js:284 #: js/ui/components/networkAgent.js:283
msgid "Service: " msgid "Service: "
msgstr "Servicio:" msgstr "Servicio:"
#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686 #: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685
msgid "Authentication required by wireless network" msgid "Authentication required by wireless network"
msgstr "La red inalámbrica requiere autenticación" msgstr "La red inalámbrica requiere autenticación"
#: js/ui/components/networkAgent.js:314 js/ui/components/networkAgent.js:687 #: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686
#, javascript-format #, javascript-format
msgid "" msgid ""
"Passwords or encryption keys are required to access the wireless network " "Passwords or encryption keys are required to access the wireless network "
@@ -1018,53 +1004,53 @@ msgstr ""
"Se necesitan contraseñas o claves de cifrado para acceder a la red " "Se necesitan contraseñas o claves de cifrado para acceder a la red "
"inalámbrica «%s»." "inalámbrica «%s»."
#: js/ui/components/networkAgent.js:318 js/ui/components/networkAgent.js:690 #: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:689
msgid "Wired 802.1X authentication" msgid "Wired 802.1X authentication"
msgstr "Autenticación 802.1X cableada" msgstr "Autenticación 802.1X cableada"
#: js/ui/components/networkAgent.js:320 #: js/ui/components/networkAgent.js:319
msgid "Network name: " msgid "Network name: "
msgstr "Nombre de la red: " msgstr "Nombre de la red: "
#: js/ui/components/networkAgent.js:325 js/ui/components/networkAgent.js:694 #: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:693
msgid "DSL authentication" msgid "DSL authentication"
msgstr "Autenticación DSL" msgstr "Autenticación DSL"
#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700 #: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:699
msgid "PIN code required" msgid "PIN code required"
msgstr "Código PIN requerido" msgstr "Código PIN requerido"
#: js/ui/components/networkAgent.js:333 js/ui/components/networkAgent.js:701 #: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700
msgid "PIN code is needed for the mobile broadband device" msgid "PIN code is needed for the mobile broadband device"
msgstr "Se necesita un código PIN para el dispositivo de banda ancha móvil" msgstr "Se necesita un código PIN para el dispositivo de banda ancha móvil"
#: js/ui/components/networkAgent.js:334 #: js/ui/components/networkAgent.js:333
msgid "PIN: " msgid "PIN: "
msgstr "PIN: " msgstr "PIN: "
#: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:707 #: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:706
msgid "Mobile broadband network password" msgid "Mobile broadband network password"
msgstr "Contraseña de la red de banda ancha móvil" msgstr "Contraseña de la red de banda ancha móvil"
#: js/ui/components/networkAgent.js:342 js/ui/components/networkAgent.js:691 #: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:690
#: js/ui/components/networkAgent.js:695 js/ui/components/networkAgent.js:708 #: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707
#, javascript-format #, javascript-format
msgid "A password is required to connect to “%s”." msgid "A password is required to connect to “%s”."
msgstr "Se requiere una contraseña para conectarse a «%s»." msgstr "Se requiere una contraseña para conectarse a «%s»."
#: js/ui/components/networkAgent.js:675 js/ui/status/network.js:1670 #: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1664
msgid "Network Manager" msgid "Network Manager"
msgstr "Gestor de la red" msgstr "Gestor de la red"
#: js/ui/components/polkitAgent.js:36 #: js/ui/components/polkitAgent.js:34
msgid "Authentication Required" msgid "Authentication Required"
msgstr "Se necesita autenticación" msgstr "Se necesita autenticación"
#: js/ui/components/polkitAgent.js:64 #: js/ui/components/polkitAgent.js:62
msgid "Administrator" msgid "Administrator"
msgstr "Administrador" msgstr "Administrador"
#: js/ui/components/polkitAgent.js:141 #: js/ui/components/polkitAgent.js:139
msgid "Authenticate" msgid "Authenticate"
msgstr "Autenticar" msgstr "Autenticar"
@@ -1072,7 +1058,7 @@ msgstr "Autenticar"
#. * requested authentication was not gained; this can happen #. * requested authentication was not gained; this can happen
#. * because of an authentication error (like invalid password), #. * because of an authentication error (like invalid password),
#. * for instance. #. * for instance.
#: js/ui/components/polkitAgent.js:243 js/ui/shellMountOperation.js:389 #: js/ui/components/polkitAgent.js:241 js/ui/shellMountOperation.js:309
msgid "Sorry, that didnt work. Please try again." msgid "Sorry, that didnt work. Please try again."
msgstr "Eso no ha funcionado. Inténtelo de nuevo." msgstr "Eso no ha funcionado. Inténtelo de nuevo."
@@ -1266,27 +1252,27 @@ msgstr ""
"puede tardar mucho tiempo: asegúrese de que tiene una copia de respaldo y de " "puede tardar mucho tiempo: asegúrese de que tiene una copia de respaldo y de "
"que el equipo está enchufado." "que el equipo está enchufado."
#: js/ui/endSessionDialog.js:310 #: js/ui/endSessionDialog.js:309
msgid "Running on battery power: please plug in before installing updates." msgid "Running on battery power: please plug in before installing updates."
msgstr "" msgstr ""
"Funcionando con batería: conéctese antes de instalar las actualizaciones." "Funcionando con batería: conéctese antes de instalar las actualizaciones."
#: js/ui/endSessionDialog.js:327 #: js/ui/endSessionDialog.js:326
msgid "Some applications are busy or have unsaved work." msgid "Some applications are busy or have unsaved work."
msgstr "Algunas aplicaciones están ocupadas o tienen trabajo sin guardar." msgstr "Algunas aplicaciones están ocupadas o tienen trabajo sin guardar."
#: js/ui/endSessionDialog.js:334 #: js/ui/endSessionDialog.js:333
msgid "Other users are logged in." msgid "Other users are logged in."
msgstr "Hay otros usuarios con la sesión iniciada." msgstr "Hay otros usuarios con la sesión iniciada."
#. Translators: Remote here refers to a remote session, like a ssh login #. Translators: Remote here refers to a remote session, like a ssh login
#: js/ui/endSessionDialog.js:615 #: js/ui/endSessionDialog.js:614
#, javascript-format #, javascript-format
msgid "%s (remote)" msgid "%s (remote)"
msgstr "%s (remoto)" msgstr "%s (remoto)"
#. Translators: Console here refers to a tty like a VT console #. Translators: Console here refers to a tty like a VT console
#: js/ui/endSessionDialog.js:618 #: js/ui/endSessionDialog.js:617
#, javascript-format #, javascript-format
msgid "%s (console)" msgid "%s (console)"
msgstr "%s (consola)" msgstr "%s (consola)"
@@ -1373,13 +1359,13 @@ msgid "Leave On"
msgstr "Dejar activada" msgstr "Dejar activada"
#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133 #: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133
#: js/ui/status/network.js:1269 #: js/ui/status/network.js:1263
msgid "Turn On" msgid "Turn On"
msgstr "Encender" msgstr "Encendido"
#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133 #: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133
#: js/ui/status/network.js:128 js/ui/status/network.js:311 #: js/ui/status/network.js:128 js/ui/status/network.js:310
#: js/ui/status/network.js:1269 js/ui/status/network.js:1381 #: js/ui/status/network.js:1263 js/ui/status/network.js:1375
#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 #: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79
#: js/ui/status/rfkill.js:106 #: js/ui/status/rfkill.js:106
msgid "Turn Off" msgid "Turn Off"
@@ -1387,7 +1373,7 @@ msgstr "Apagar"
#: js/ui/kbdA11yDialog.js:65 #: js/ui/kbdA11yDialog.js:65
msgid "Leave Off" msgid "Leave Off"
msgstr "Dejar desactivada" msgstr "Dejar desactivado"
#: js/ui/keyboard.js:200 #: js/ui/keyboard.js:200
msgid "Region & Language Settings" msgid "Region & Language Settings"
@@ -1441,7 +1427,7 @@ msgstr "Ver fuente"
msgid "Web Page" msgid "Web Page"
msgstr "Página web" msgstr "Página web"
#: js/ui/messageTray.js:1479 #: js/ui/messageTray.js:1480
msgid "System Information" msgid "System Information"
msgstr "Información del sistema" msgstr "Información del sistema"
@@ -1519,38 +1505,38 @@ msgstr "Pulse Esc para salir"
msgid "Press any key to exit" msgid "Press any key to exit"
msgstr "Pulse cualquier tecla para salir" msgstr "Pulse cualquier tecla para salir"
#: js/ui/panel.js:113 #: js/ui/panel.js:108
msgid "Quit" msgid "Quit"
msgstr "Salir" msgstr "Salir"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". #. in your language, you can use the word for "Overview".
#: js/ui/panel.js:468 #: js/ui/panel.js:470
msgid "Activities" msgid "Activities"
msgstr "Actividades" msgstr "Actividades"
#: js/ui/panel.js:743 #: js/ui/panel.js:745
msgctxt "System menu in the top bar" msgctxt "System menu in the top bar"
msgid "System" msgid "System"
msgstr "Sistema" msgstr "Sistema"
#: js/ui/panel.js:862 #: js/ui/panel.js:866
msgid "Top Bar" msgid "Top Bar"
msgstr "Barra superior" msgstr "Barra superior"
#: js/ui/runDialog.js:65 #: js/ui/runDialog.js:64
msgid "Enter a Command" msgid "Enter a Command"
msgstr "Introducir un comando" msgstr "Introducir un comando"
#: js/ui/runDialog.js:105 js/ui/windowMenu.js:166 #: js/ui/runDialog.js:104 js/ui/windowMenu.js:166
msgid "Close" msgid "Close"
msgstr "Cerrar" msgstr "Cerrar"
#: js/ui/runDialog.js:267 #: js/ui/runDialog.js:266
msgid "Restart is not available on Wayland" msgid "Restart is not available on Wayland"
msgstr "Reiniciar no está disponible en Wayland" msgstr "Reiniciar no está disponible en Wayland"
#: js/ui/runDialog.js:272 #: js/ui/runDialog.js:271
msgid "Restarting…" msgid "Restarting…"
msgstr "Reiniciando…" msgstr "Reiniciando…"
@@ -1597,15 +1583,15 @@ msgstr "No se pudo bloquear"
msgid "Lock was blocked by an application" msgid "Lock was blocked by an application"
msgstr "Una aplicación impidió el bloqueo" msgstr "Una aplicación impidió el bloqueo"
#: js/ui/search.js:638 #: js/ui/search.js:635
msgid "Searching…" msgid "Searching…"
msgstr "Buscando…" msgstr "Buscando…"
#: js/ui/search.js:640 #: js/ui/search.js:637
msgid "No results." msgid "No results."
msgstr "No se encontraron resultados." msgstr "No se encontraron resultados."
#: js/ui/search.js:764 #: js/ui/search.js:761
#, javascript-format #, javascript-format
msgid "%d more" msgid "%d more"
msgid_plural "%d more" msgid_plural "%d more"
@@ -1628,61 +1614,14 @@ msgstr "Mostrar texto"
msgid "Hide Text" msgid "Hide Text"
msgstr "Ocultar texto" msgstr "Ocultar texto"
#: js/ui/shellMountOperation.js:318 #: js/ui/shellMountOperation.js:296
msgid "Hidden Volume"
msgstr "Ocultar volumen"
#: js/ui/shellMountOperation.js:321
msgid "Windows System Volume"
msgstr "Volumen de sistema Windows"
#: js/ui/shellMountOperation.js:324
msgid "Uses Keyfiles"
msgstr "Usa archivos de claves"
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:330
#, javascript-format
msgid ""
"To unlock a volume that uses keyfiles, use the <i>%s</i> utility instead."
msgstr ""
"Para desbloquear un volumen que usa archivos de claves use la herramienta <i>"
"%s</i> en su lugar."
#: js/ui/shellMountOperation.js:337
msgid "PIM Number"
msgstr "Número PIM"
#: js/ui/shellMountOperation.js:355
msgid "The PIM must be a number or empty."
msgstr "El PIM debe ser un número o estar vacío."
#: js/ui/shellMountOperation.js:366
msgid "Password" msgid "Password"
msgstr "Contraseña" msgstr "Contraseña"
#: js/ui/shellMountOperation.js:396 #: js/ui/shellMountOperation.js:317
msgid "Remember Password" msgid "Remember Password"
msgstr "Recordar contraseña" msgstr "Recordar contraseña"
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:418
#, javascript-format
msgid "Open %s"
msgstr "Abrir %s"
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:490
#, javascript-format
msgid "Unable to start %s"
msgstr "No se puede iniciar %s"
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:492
#, javascript-format
msgid "Couldnt find the %s application"
msgstr "No se pudo encontrar la aplicación %s"
#: js/ui/status/accessibility.js:35 #: js/ui/status/accessibility.js:35
msgid "Accessibility" msgid "Accessibility"
msgstr "Accesibilidad" msgstr "Accesibilidad"
@@ -1719,11 +1658,11 @@ msgstr "Rechazo de teclas"
msgid "Mouse Keys" msgid "Mouse Keys"
msgstr "Teclas del ratón" msgstr "Teclas del ratón"
#: js/ui/status/accessibility.js:135 #: js/ui/status/accessibility.js:151
msgid "High Contrast" msgid "High Contrast"
msgstr "Contraste alto" msgstr "Contraste alto"
#: js/ui/status/accessibility.js:177 #: js/ui/status/accessibility.js:182
msgid "Large Text" msgid "Large Text"
msgstr "Texto grande" msgstr "Texto grande"
@@ -1731,7 +1670,7 @@ msgstr "Texto grande"
msgid "Bluetooth" msgid "Bluetooth"
msgstr "Bluetooth" msgstr "Bluetooth"
#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:586 #: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585
msgid "Bluetooth Settings" msgid "Bluetooth Settings"
msgstr "Configuración de Bluetooth" msgstr "Configuración de Bluetooth"
@@ -1755,31 +1694,11 @@ msgstr "Encendido"
msgid "Brightness" msgid "Brightness"
msgstr "Brillo" msgstr "Brillo"
#: js/ui/status/dwellClick.js:13 #: js/ui/status/keyboard.js:812
msgid "Single Click"
msgstr "Una sola pulsación"
#: js/ui/status/dwellClick.js:18
msgid "Double Click"
msgstr "Doble pulsación"
#: js/ui/status/dwellClick.js:23
msgid "Drag"
msgstr "Arrastrar"
#: js/ui/status/dwellClick.js:28
msgid "Secondary Click"
msgstr "Pulsación secundaria"
#: js/ui/status/dwellClick.js:37
msgid "Dwell Click"
msgstr "Pulsación al posarse"
#: js/ui/status/keyboard.js:813
msgid "Keyboard" msgid "Keyboard"
msgstr "Teclado" msgstr "Teclado"
#: js/ui/status/keyboard.js:835 #: js/ui/status/keyboard.js:834
msgid "Show Keyboard Layout" msgid "Show Keyboard Layout"
msgstr "Mostrar la distribución del teclado" msgstr "Mostrar la distribución del teclado"
@@ -1808,12 +1727,12 @@ msgid "Enable"
msgstr "Activar" msgstr "Activar"
#. Translators: %s is an application name #. Translators: %s is an application name
#: js/ui/status/location.js:355 #: js/ui/status/location.js:353
#, javascript-format #, javascript-format
msgid "Give %s access to your location?" msgid "Give %s access to your location?"
msgstr "¿Conceder acceso a %s a su ubicación?" msgstr "¿Conceder acceso a %s a su ubicación?"
#: js/ui/status/location.js:356 #: js/ui/status/location.js:354
msgid "Location access can be changed at any time from the privacy settings." msgid "Location access can be changed at any time from the privacy settings."
msgstr "" msgstr ""
"Los servicios de ubicación se pueden cambiar en cualquier momento desde la " "Los servicios de ubicación se pueden cambiar en cualquier momento desde la "
@@ -1824,13 +1743,13 @@ msgid "<unknown>"
msgstr "<desconocido>" msgstr "<desconocido>"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:417 js/ui/status/network.js:1298 #: js/ui/status/network.js:416 js/ui/status/network.js:1292
#, javascript-format #, javascript-format
msgid "%s Off" msgid "%s Off"
msgstr "%s apagada" msgstr "%s apagada"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:420 #: js/ui/status/network.js:419
#, javascript-format #, javascript-format
msgid "%s Connected" msgid "%s Connected"
msgstr "%s conectada" msgstr "%s conectada"
@@ -1838,189 +1757,189 @@ msgstr "%s conectada"
#. Translators: this is for network devices that are physically present but are not #. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu); #. under NetworkManager's control (and thus cannot be used in the menu);
#. %s is a network identifier #. %s is a network identifier
#: js/ui/status/network.js:425 #: js/ui/status/network.js:424
#, javascript-format #, javascript-format
msgid "%s Unmanaged" msgid "%s Unmanaged"
msgstr "%s sin gestionar" msgstr "%s sin gestionar"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:428 #: js/ui/status/network.js:427
#, javascript-format #, javascript-format
msgid "%s Disconnecting" msgid "%s Disconnecting"
msgstr "Desconectando %s" msgstr "Desconectando %s"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:435 js/ui/status/network.js:1290 #: js/ui/status/network.js:434 js/ui/status/network.js:1284
#, javascript-format #, javascript-format
msgid "%s Connecting" msgid "%s Connecting"
msgstr "Conectando %s" msgstr "Conectando %s"
#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier #. Translators: this is for network connections that require some kind of key or password; %s is a network identifier
#: js/ui/status/network.js:438 #: js/ui/status/network.js:437
#, javascript-format #, javascript-format
msgid "%s Requires Authentication" msgid "%s Requires Authentication"
msgstr "%s requiere autenticación" msgstr "%s requiere autenticación"
#. Translators: this is for devices that require some kind of firmware or kernel #. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing; %s is a network identifier #. module, which is missing; %s is a network identifier
#: js/ui/status/network.js:446 #: js/ui/status/network.js:445
#, javascript-format #, javascript-format
msgid "Firmware Missing For %s" msgid "Firmware Missing For %s"
msgstr "Falta el «firmware» para %s" msgstr "Falta el «firmware» para %s"
#. Translators: this is for a network device that cannot be activated (for example it #. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage; %s is a network identifier #. is disabled by rfkill, or it has no coverage; %s is a network identifier
#: js/ui/status/network.js:450 #: js/ui/status/network.js:449
#, javascript-format #, javascript-format
msgid "%s Unavailable" msgid "%s Unavailable"
msgstr "%s no disponible" msgstr "%s no disponible"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:453 #: js/ui/status/network.js:452
#, javascript-format #, javascript-format
msgid "%s Connection Failed" msgid "%s Connection Failed"
msgstr "Falló la conexión %s" msgstr "Falló la conexión %s"
#: js/ui/status/network.js:465 #: js/ui/status/network.js:464
msgid "Wired Settings" msgid "Wired Settings"
msgstr "Configuración de red cableada" msgstr "Configuración de red cableada"
#: js/ui/status/network.js:507 #: js/ui/status/network.js:506
msgid "Mobile Broadband Settings" msgid "Mobile Broadband Settings"
msgstr "Configuración de banda ancha móvil" msgstr "Configuración de banda ancha móvil"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:554 js/ui/status/network.js:1295 #: js/ui/status/network.js:553 js/ui/status/network.js:1289
#, javascript-format #, javascript-format
msgid "%s Hardware Disabled" msgid "%s Hardware Disabled"
msgstr "Hardware %s desactivado" msgstr "Hardware %s desactivado"
#. Translators: this is for a network device that cannot be activated #. Translators: this is for a network device that cannot be activated
#. because it's disabled by rfkill (airplane mode); %s is a network identifier #. because it's disabled by rfkill (airplane mode); %s is a network identifier
#: js/ui/status/network.js:558 #: js/ui/status/network.js:557
#, javascript-format #, javascript-format
msgid "%s Disabled" msgid "%s Disabled"
msgstr "%s desactivado" msgstr "%s desactivado"
#: js/ui/status/network.js:598 #: js/ui/status/network.js:597
msgid "Connect to Internet" msgid "Connect to Internet"
msgstr "Conectar a Internet" msgstr "Conectar a Internet"
#: js/ui/status/network.js:792 #: js/ui/status/network.js:786
msgid "Airplane Mode is On" msgid "Airplane Mode is On"
msgstr "El modo avión está activado" msgstr "El modo avión está activado"
#: js/ui/status/network.js:793 #: js/ui/status/network.js:787
msgid "Wi-Fi is disabled when airplane mode is on." msgid "Wi-Fi is disabled when airplane mode is on."
msgstr "La Wi-Fi se desactiva cuando se activa el modo avión." msgstr "La Wi-Fi se desactiva cuando se activa el modo avión."
#: js/ui/status/network.js:794 #: js/ui/status/network.js:788
msgid "Turn Off Airplane Mode" msgid "Turn Off Airplane Mode"
msgstr "Apagar el modo avión" msgstr "Apagar el modo avión"
#: js/ui/status/network.js:803 #: js/ui/status/network.js:797
msgid "Wi-Fi is Off" msgid "Wi-Fi is Off"
msgstr "La Wi-Fi está desactivada" msgstr "La Wi-Fi está desactivada"
#: js/ui/status/network.js:804 #: js/ui/status/network.js:798
msgid "Wi-Fi needs to be turned on in order to connect to a network." msgid "Wi-Fi needs to be turned on in order to connect to a network."
msgstr "Se debe activar la Wi-Fi para poder conectarse a la red." msgstr "Se debe activar la Wi-Fi para poder conectarse a la red."
#: js/ui/status/network.js:805 #: js/ui/status/network.js:799
msgid "Turn On Wi-Fi" msgid "Turn On Wi-Fi"
msgstr "Activar la Wi-Fi" msgstr "Activar la Wi-Fi"
#: js/ui/status/network.js:830 #: js/ui/status/network.js:824
msgid "Wi-Fi Networks" msgid "Wi-Fi Networks"
msgstr "Redes Wi-Fi" msgstr "Redes Wi-Fi"
#: js/ui/status/network.js:832 #: js/ui/status/network.js:826
msgid "Select a network" msgid "Select a network"
msgstr "Seleccionar una red" msgstr "Seleccionar una red"
#: js/ui/status/network.js:861 #: js/ui/status/network.js:855
msgid "No Networks" msgid "No Networks"
msgstr "No hay redes" msgstr "No hay redes"
#: js/ui/status/network.js:882 js/ui/status/rfkill.js:104 #: js/ui/status/network.js:876 js/ui/status/rfkill.js:104
msgid "Use hardware switch to turn off" msgid "Use hardware switch to turn off"
msgstr "Usar el interruptor hardware para apagar" msgstr "Usar el interruptor hardware para apagar"
#: js/ui/status/network.js:1158 #: js/ui/status/network.js:1152
msgid "Select Network" msgid "Select Network"
msgstr "Seleccionar red" msgstr "Seleccionar red"
#: js/ui/status/network.js:1164 #: js/ui/status/network.js:1158
msgid "Wi-Fi Settings" msgid "Wi-Fi Settings"
msgstr "Configuración de Wi-Fi" msgstr "Configuración de Wi-Fi"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:1286 #: js/ui/status/network.js:1280
#, javascript-format #, javascript-format
msgid "%s Hotspot Active" msgid "%s Hotspot Active"
msgstr "Punto de acceso %s activo" msgstr "Punto de acceso %s activo"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:1301 #: js/ui/status/network.js:1295
#, javascript-format #, javascript-format
msgid "%s Not Connected" msgid "%s Not Connected"
msgstr "%s no conectado" msgstr "%s no conectado"
#: js/ui/status/network.js:1398 #: js/ui/status/network.js:1392
msgid "connecting…" msgid "connecting…"
msgstr "conectando…" msgstr "conectando…"
#. Translators: this is for network connections that require some kind of key or password #. Translators: this is for network connections that require some kind of key or password
#: js/ui/status/network.js:1401 #: js/ui/status/network.js:1395
msgid "authentication required" msgid "authentication required"
msgstr "se necesita autenticación" msgstr "se necesita autenticación"
#: js/ui/status/network.js:1403 #: js/ui/status/network.js:1397
msgid "connection failed" msgid "connection failed"
msgstr "falló la conexión" msgstr "falló la conexión"
#: js/ui/status/network.js:1453 #: js/ui/status/network.js:1447
msgid "VPN Settings" msgid "VPN Settings"
msgstr "Configuración de VPN" msgstr "Configuración de VPN"
#: js/ui/status/network.js:1470 #: js/ui/status/network.js:1464
msgid "VPN" msgid "VPN"
msgstr "VPN" msgstr "VPN"
#: js/ui/status/network.js:1480 #: js/ui/status/network.js:1474
msgid "VPN Off" msgid "VPN Off"
msgstr "VPN apagada" msgstr "VPN apagada"
#: js/ui/status/network.js:1541 js/ui/status/rfkill.js:82 #: js/ui/status/network.js:1535 js/ui/status/rfkill.js:82
msgid "Network Settings" msgid "Network Settings"
msgstr "Configuración de la red" msgstr "Configuración de la red"
#: js/ui/status/network.js:1570 #: js/ui/status/network.js:1564
#, javascript-format #, javascript-format
msgid "%s Wired Connection" msgid "%s Wired Connection"
msgid_plural "%s Wired Connections" msgid_plural "%s Wired Connections"
msgstr[0] "%s conexión cableada" msgstr[0] "%s conexión cableada"
msgstr[1] "%s conexiones cableadas" msgstr[1] "%s conexiones cableadas"
#: js/ui/status/network.js:1574 #: js/ui/status/network.js:1568
#, javascript-format #, javascript-format
msgid "%s Wi-Fi Connection" msgid "%s Wi-Fi Connection"
msgid_plural "%s Wi-Fi Connections" msgid_plural "%s Wi-Fi Connections"
msgstr[0] "%s conexión inalámbrica" msgstr[0] "%s conexión inalámbrica"
msgstr[1] "%s conexiones inalámbricas" msgstr[1] "%s conexiones inalámbricas"
#: js/ui/status/network.js:1578 #: js/ui/status/network.js:1572
#, javascript-format #, javascript-format
msgid "%s Modem Connection" msgid "%s Modem Connection"
msgid_plural "%s Modem Connections" msgid_plural "%s Modem Connections"
msgstr[0] "%s conexión por módem" msgstr[0] "%s conexión por módem"
msgstr[1] "%s conexiones por módem" msgstr[1] "%s conexiones por módem"
#: js/ui/status/network.js:1711 #: js/ui/status/network.js:1705
msgid "Connection failed" msgid "Connection failed"
msgstr "Falló la conexión" msgstr "Falló la conexión"
#: js/ui/status/network.js:1712 #: js/ui/status/network.js:1706
msgid "Activation of network connection failed" msgid "Activation of network connection failed"
msgstr "Falló la activación de la conexión de red" msgstr "Falló la activación de la conexión de red"
@@ -2202,22 +2121,22 @@ msgstr "Buscar"
msgid "“%s” is ready" msgid "“%s” is ready"
msgstr "«%s» está preparado" msgstr "«%s» está preparado"
#: js/ui/windowManager.js:54 #: js/ui/windowManager.js:53
msgid "Do you want to keep these display settings?" msgid "Do you want to keep these display settings?"
msgstr "¿Quiere mantener esta configuración de la pantalla?" msgstr "¿Quiere mantener esta configuración de la pantalla?"
#. Translators: this and the following message should be limited in length, #. Translators: this and the following message should be limited in lenght,
#. to avoid ellipsizing the labels. #. to avoid ellipsizing the labels.
#. #.
#: js/ui/windowManager.js:66 #: js/ui/windowManager.js:65
msgid "Revert Settings" msgid "Revert Settings"
msgstr "Revertir configuración" msgstr "Revertir configuración"
#: js/ui/windowManager.js:69 #: js/ui/windowManager.js:68
msgid "Keep Changes" msgid "Keep Changes"
msgstr "Mantener cambios" msgstr "Mantener cambios"
#: js/ui/windowManager.js:87 #: js/ui/windowManager.js:86
#, javascript-format #, javascript-format
msgid "Settings changes will revert in %d second" msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds" msgid_plural "Settings changes will revert in %d seconds"
@@ -2226,7 +2145,7 @@ msgstr[1] "La configuración se revertirá en %d segundos"
#. Translators: This represents the size of a window. The first number is #. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height. #. * the width of the window and the second is the height.
#: js/ui/windowManager.js:678 #: js/ui/windowManager.js:677
#, javascript-format #, javascript-format
msgid "%d × %d" msgid "%d × %d"
msgstr "%d × %d" msgstr "%d × %d"
@@ -2587,6 +2506,9 @@ msgstr "Sonidos del sistema"
#~ msgid "Internal error" #~ msgid "Internal error"
#~ msgstr "Error interno" #~ msgstr "Error interno"
#~ msgid "Unable to connect to %s"
#~ msgstr "No se pudo conectar a %s"
#~ msgid "View account" #~ msgid "View account"
#~ msgstr "Ver cuenta" #~ msgstr "Ver cuenta"

859
po/fur.po

File diff suppressed because it is too large Load Diff

371
po/hr.po
View File

@@ -7,8 +7,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell master\n" "Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2019-06-15 10:38+0000\n" "POT-Creation-Date: 2019-03-24 17:37+0000\n"
"PO-Revision-Date: 2019-06-22 01:55+0200\n" "PO-Revision-Date: 2019-03-26 12:33+0100\n"
"Last-Translator: gogo <trebelnik2@gmail.com>\n" "Last-Translator: gogo <trebelnik2@gmail.com>\n"
"Language-Team: Croatian <hr@li.org>\n" "Language-Team: Croatian <hr@li.org>\n"
"Language: hr\n" "Language: hr\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Poedit 2.2.1\n" "X-Generator: Poedit 2.0.6\n"
#: data/50-gnome-shell-system.xml:6 #: data/50-gnome-shell-system.xml:6
msgid "System" msgid "System"
@@ -418,11 +418,10 @@ msgstr ""
msgid "Browse in Software" msgid "Browse in Software"
msgstr "Pregledaj u Softveru" msgstr "Pregledaj u Softveru"
#: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:52 #: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55
#: js/ui/components/networkAgent.js:118 js/ui/components/polkitAgent.js:138 #: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136
#: js/ui/endSessionDialog.js:431 js/ui/extensionDownloader.js:188 #: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188
#: js/ui/shellMountOperation.js:404 js/ui/shellMountOperation.js:413 #: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888
#: js/ui/status/network.js:894
msgid "Cancel" msgid "Cancel"
msgstr "Odustani" msgstr "Odustani"
@@ -430,7 +429,7 @@ msgstr "Odustani"
msgid "Next" msgid "Next"
msgstr "Sljedeće" msgstr "Sljedeće"
#: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:408 #: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:329
#: js/ui/unlockDialog.js:41 #: js/ui/unlockDialog.js:41
msgid "Unlock" msgid "Unlock"
msgstr "Otključaj" msgstr "Otključaj"
@@ -461,8 +460,8 @@ msgstr "(npr., korisnik ili %s)"
#. TTLS and PEAP are actually much more complicated, but this complication #. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication #. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one) #. (and don't even care of which one)
#: js/gdm/loginDialog.js:889 js/ui/components/networkAgent.js:244 #: js/gdm/loginDialog.js:889 js/ui/components/networkAgent.js:243
#: js/ui/components/networkAgent.js:264 js/ui/components/networkAgent.js:282 #: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281
msgid "Username: " msgid "Username: "
msgstr "Korisničko ime: " msgstr "Korisničko ime: "
@@ -513,8 +512,8 @@ msgstr "Odjava"
#. Translators: A list of keywords that match the logout action, separated by semicolons #. Translators: A list of keywords that match the logout action, separated by semicolons
#: js/misc/systemActions.js:105 #: js/misc/systemActions.js:105
msgid "logout;log out;sign off" msgid "logout;sign off"
msgstr "odjava;odjavljivanje" msgstr "odjava:odjavljivanje"
#. Translators: The name of the suspend action in search #. Translators: The name of the suspend action in search
#: js/misc/systemActions.js:109 #: js/misc/systemActions.js:109
@@ -706,11 +705,11 @@ msgstr ""
#. No support for non-modal system dialogs, so ignore the option #. No support for non-modal system dialogs, so ignore the option
#. let modal = options['modal'] || true; #. let modal = options['modal'] || true;
#: js/ui/accessDialog.js:38 js/ui/status/location.js:362 #: js/ui/accessDialog.js:37 js/ui/status/location.js:360
msgid "Deny Access" msgid "Deny Access"
msgstr "Zabrani pristup" msgstr "Zabrani pristup"
#: js/ui/accessDialog.js:39 js/ui/status/location.js:365 #: js/ui/accessDialog.js:38 js/ui/status/location.js:363
msgid "Grant Access" msgid "Grant Access"
msgstr "Dopusti pristup" msgstr "Dopusti pristup"
@@ -726,58 +725,53 @@ msgstr "Najčešće"
msgid "All" msgid "All"
msgstr "Sve" msgstr "Sve"
#. Translators: This is the heading of a list of open windows #: js/ui/appDisplay.js:1737 js/ui/panel.js:83
#: js/ui/appDisplay.js:1713 js/ui/panel.js:79
msgid "Open Windows"
msgstr "Otvaranje prozora"
#: js/ui/appDisplay.js:1732 js/ui/panel.js:86
msgid "New Window" msgid "New Window"
msgstr "Novi prozor" msgstr "Novi prozor"
#: js/ui/appDisplay.js:1746 #: js/ui/appDisplay.js:1751
msgid "Launch using Dedicated Graphics Card" msgid "Launch using Dedicated Graphics Card"
msgstr "Pokreni pomoću namjenske grafičke kartice" msgstr "Pokreni pomoću namjenske grafičke kartice"
#: js/ui/appDisplay.js:1773 js/ui/dash.js:239 #: js/ui/appDisplay.js:1778 js/ui/dash.js:239
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Ukloni iz omiljenih" msgstr "Ukloni iz omiljenih"
#: js/ui/appDisplay.js:1779 #: js/ui/appDisplay.js:1784
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Dodaj u omiljene" msgstr "Dodaj u omiljene"
#: js/ui/appDisplay.js:1789 js/ui/panel.js:97 #: js/ui/appDisplay.js:1794 js/ui/panel.js:94
msgid "Show Details" msgid "Show Details"
msgstr "Prikaži pojedinosti" msgstr "Prikaži pojedinosti"
#: js/ui/appFavorites.js:149 #: js/ui/appFavorites.js:141
#, javascript-format #, javascript-format
msgid "%s has been added to your favorites." msgid "%s has been added to your favorites."
msgstr "%s je dodan u omiljene." msgstr "%s je dodan u omiljene."
#: js/ui/appFavorites.js:183 #: js/ui/appFavorites.js:175
#, javascript-format #, javascript-format
msgid "%s has been removed from your favorites." msgid "%s has been removed from your favorites."
msgstr "%s je uklonjen iz omiljenih." msgstr "%s je uklonjen iz omiljenih."
#: js/ui/audioDeviceSelection.js:39 #: js/ui/audioDeviceSelection.js:42
msgid "Select Audio Device" msgid "Select Audio Device"
msgstr "Odaberi zvučni uređaj" msgstr "Odaberi zvučni uređaj"
#: js/ui/audioDeviceSelection.js:50 #: js/ui/audioDeviceSelection.js:53
msgid "Sound Settings" msgid "Sound Settings"
msgstr "Postavke zvuka" msgstr "Postavke zvuka"
#: js/ui/audioDeviceSelection.js:59 #: js/ui/audioDeviceSelection.js:62
msgid "Headphones" msgid "Headphones"
msgstr "Slušalice" msgstr "Slušalice"
#: js/ui/audioDeviceSelection.js:61 #: js/ui/audioDeviceSelection.js:64
msgid "Headset" msgid "Headset"
msgstr "Slušalice s mikrofonom" msgstr "Slušalice s mikrofonom"
#: js/ui/audioDeviceSelection.js:63 js/ui/status/volume.js:247 #: js/ui/audioDeviceSelection.js:66 js/ui/status/volume.js:247
msgid "Microphone" msgid "Microphone"
msgstr "Mikrofon" msgstr "Mikrofon"
@@ -938,75 +932,67 @@ msgstr "Prisilno zatvori"
msgid "Wait" msgid "Wait"
msgstr "Čekaj" msgstr "Čekaj"
#: js/ui/components/automountManager.js:87 #: js/ui/components/automountManager.js:86
msgid "External drive connected" msgid "External drive connected"
msgstr "Vanjski uređaj povezan" msgstr "Vanjski uređaj povezan"
#: js/ui/components/automountManager.js:99 #: js/ui/components/automountManager.js:98
msgid "External drive disconnected" msgid "External drive disconnected"
msgstr "Vanjski uređaj odspojen" msgstr "Vanjski uređaj odspojen"
#: js/ui/components/automountManager.js:211
msgid "Unable to unlock volume"
msgstr "Nemoguće otključavanje uređaja"
#: js/ui/components/automountManager.js:212
msgid "The installed udisks version does not support the PIM setting"
msgstr "Instalirana udisks inačica ne podržava PIM postavku"
#: js/ui/components/autorunManager.js:334 #: js/ui/components/autorunManager.js:334
#, javascript-format #, javascript-format
msgid "Open with %s" msgid "Open with %s"
msgstr "Otvori s(a) %s" msgstr "Otvori s(a) %s"
#: js/ui/components/keyring.js:66 js/ui/components/polkitAgent.js:257 #: js/ui/components/keyring.js:77 js/ui/components/polkitAgent.js:255
msgid "Password:" msgid "Password:"
msgstr "Lozinka:" msgstr "Lozinka:"
#: js/ui/components/keyring.js:97 #: js/ui/components/keyring.js:108
msgid "Type again:" msgid "Type again:"
msgstr "Pokušaj ponovno:" msgstr "Pokušaj ponovno:"
#: js/ui/components/networkAgent.js:103 #: js/ui/components/networkAgent.js:102
msgid "" msgid ""
"Alternatively you can connect by pushing the “WPS” button on your router." "Alternatively you can connect by pushing the “WPS” button on your router."
msgstr "" msgstr ""
"Alternativno se možete povezati pritiskom na “WPS” tipku vašeg usmjernika." "Alternativno se možete povezati pritiskom na “WPS” tipku vašeg usmjernika."
#: js/ui/components/networkAgent.js:113 js/ui/status/network.js:219 #: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219
#: js/ui/status/network.js:310 js/ui/status/network.js:897 #: js/ui/status/network.js:309 js/ui/status/network.js:891
msgid "Connect" msgid "Connect"
msgstr "Povezivanje" msgstr "Povezivanje"
#. Cisco LEAP #. Cisco LEAP
#: js/ui/components/networkAgent.js:212 js/ui/components/networkAgent.js:224 #: js/ui/components/networkAgent.js:211 js/ui/components/networkAgent.js:223
#: js/ui/components/networkAgent.js:247 js/ui/components/networkAgent.js:266 #: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:265
#: js/ui/components/networkAgent.js:286 js/ui/components/networkAgent.js:296 #: js/ui/components/networkAgent.js:285 js/ui/components/networkAgent.js:295
msgid "Password: " msgid "Password: "
msgstr "Lozinka: " msgstr "Lozinka: "
#. static WEP #. static WEP
#: js/ui/components/networkAgent.js:217 #: js/ui/components/networkAgent.js:216
msgid "Key: " msgid "Key: "
msgstr "Ključ: " msgstr "Ključ: "
#: js/ui/components/networkAgent.js:250 js/ui/components/networkAgent.js:272 #: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271
msgid "Private key password: " msgid "Private key password: "
msgstr "Lozinka privatnog ključa: " msgstr "Lozinka privatnog ključa: "
#: js/ui/components/networkAgent.js:270 #: js/ui/components/networkAgent.js:269
msgid "Identity: " msgid "Identity: "
msgstr "Identitet: " msgstr "Identitet: "
#: js/ui/components/networkAgent.js:284 #: js/ui/components/networkAgent.js:283
msgid "Service: " msgid "Service: "
msgstr "Usluga: " msgstr "Usluga: "
#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686 #: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685
msgid "Authentication required by wireless network" msgid "Authentication required by wireless network"
msgstr "Potrebna je ovjera za bežičnu mrežu" msgstr "Potrebna je ovjera za bežičnu mrežu"
#: js/ui/components/networkAgent.js:314 js/ui/components/networkAgent.js:687 #: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686
#, javascript-format #, javascript-format
msgid "" msgid ""
"Passwords or encryption keys are required to access the wireless network " "Passwords or encryption keys are required to access the wireless network "
@@ -1014,53 +1000,53 @@ msgid ""
msgstr "" msgstr ""
"Lozinka ili ključevi šifriranja su potrebni za pristup bežičnoj mreži “%s”." "Lozinka ili ključevi šifriranja su potrebni za pristup bežičnoj mreži “%s”."
#: js/ui/components/networkAgent.js:318 js/ui/components/networkAgent.js:690 #: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:689
msgid "Wired 802.1X authentication" msgid "Wired 802.1X authentication"
msgstr "Wired 802.1X ovjera" msgstr "Wired 802.1X ovjera"
#: js/ui/components/networkAgent.js:320 #: js/ui/components/networkAgent.js:319
msgid "Network name: " msgid "Network name: "
msgstr "Naziv mreže: " msgstr "Naziv mreže: "
#: js/ui/components/networkAgent.js:325 js/ui/components/networkAgent.js:694 #: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:693
msgid "DSL authentication" msgid "DSL authentication"
msgstr "DSL ovjera" msgstr "DSL ovjera"
#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700 #: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:699
msgid "PIN code required" msgid "PIN code required"
msgstr "PIN kôd je potreban" msgstr "PIN kôd je potreban"
#: js/ui/components/networkAgent.js:333 js/ui/components/networkAgent.js:701 #: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700
msgid "PIN code is needed for the mobile broadband device" msgid "PIN code is needed for the mobile broadband device"
msgstr "PIN kôd je potreban za uređaj mobilnog interneta" msgstr "PIN kôd je potreban za uređaj mobilnog interneta"
#: js/ui/components/networkAgent.js:334 #: js/ui/components/networkAgent.js:333
msgid "PIN: " msgid "PIN: "
msgstr "PIN: " msgstr "PIN: "
#: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:707 #: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:706
msgid "Mobile broadband network password" msgid "Mobile broadband network password"
msgstr "Lozinka mreže mobilnog interneta" msgstr "Lozinka mreže mobilnog interneta"
#: js/ui/components/networkAgent.js:342 js/ui/components/networkAgent.js:691 #: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:690
#: js/ui/components/networkAgent.js:695 js/ui/components/networkAgent.js:708 #: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707
#, javascript-format #, javascript-format
msgid "A password is required to connect to “%s”." msgid "A password is required to connect to “%s”."
msgstr "Potrebna je lozinka za povezivanje s “%s”." msgstr "Potrebna je lozinka za povezivanje s “%s”."
#: js/ui/components/networkAgent.js:675 js/ui/status/network.js:1670 #: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1664
msgid "Network Manager" msgid "Network Manager"
msgstr "Mrežni upravitelj" msgstr "Mrežni upravitelj"
#: js/ui/components/polkitAgent.js:36 #: js/ui/components/polkitAgent.js:34
msgid "Authentication Required" msgid "Authentication Required"
msgstr "Potrebna je ovjera" msgstr "Potrebna je ovjera"
#: js/ui/components/polkitAgent.js:64 #: js/ui/components/polkitAgent.js:62
msgid "Administrator" msgid "Administrator"
msgstr "Administrator" msgstr "Administrator"
#: js/ui/components/polkitAgent.js:141 #: js/ui/components/polkitAgent.js:139
msgid "Authenticate" msgid "Authenticate"
msgstr "Ovjeri" msgstr "Ovjeri"
@@ -1068,7 +1054,7 @@ msgstr "Ovjeri"
#. * requested authentication was not gained; this can happen #. * requested authentication was not gained; this can happen
#. * because of an authentication error (like invalid password), #. * because of an authentication error (like invalid password),
#. * for instance. #. * for instance.
#: js/ui/components/polkitAgent.js:243 js/ui/shellMountOperation.js:389 #: js/ui/components/polkitAgent.js:241 js/ui/shellMountOperation.js:309
msgid "Sorry, that didnt work. Please try again." msgid "Sorry, that didnt work. Please try again."
msgstr "Nažalost, to ne radi. Pokušajte ponovno." msgstr "Nažalost, to ne radi. Pokušajte ponovno."
@@ -1118,23 +1104,23 @@ msgstr "Dodaj satove iz svijeta…"
msgid "World Clocks" msgid "World Clocks"
msgstr "Svjetski satovi" msgstr "Svjetski satovi"
#: js/ui/dateMenu.js:228 #: js/ui/dateMenu.js:222
msgid "Weather" msgid "Weather"
msgstr "Vrijeme" msgstr "Vrijeme"
#: js/ui/dateMenu.js:311 #: js/ui/dateMenu.js:305
msgid "Select a location…" msgid "Select a location…"
msgstr "Odaberi lokaciju…" msgstr "Odaberi lokaciju…"
#: js/ui/dateMenu.js:319 #: js/ui/dateMenu.js:313
msgid "Loading…" msgid "Loading…"
msgstr "Pretraživanje…" msgstr "Pretraživanje…"
#: js/ui/dateMenu.js:329 #: js/ui/dateMenu.js:323
msgid "Go online for weather information" msgid "Go online for weather information"
msgstr "Posjetite za opširnije vremenske informacije" msgstr "Posjetite za opširnije vremenske informacije"
#: js/ui/dateMenu.js:331 #: js/ui/dateMenu.js:325
msgid "Weather information is currently unavailable" msgid "Weather information is currently unavailable"
msgstr "Vremenske informacije su trenutno nedostupne" msgstr "Vremenske informacije su trenutno nedostupne"
@@ -1269,28 +1255,28 @@ msgstr ""
"može potrajati duže vrijeme: pobrinite se da ste spremili svoj rad i " "može potrajati duže vrijeme: pobrinite se da ste spremili svoj rad i "
"računalo je priključeno na izvor napajanja." "računalo je priključeno na izvor napajanja."
#: js/ui/endSessionDialog.js:310 #: js/ui/endSessionDialog.js:309
msgid "Running on battery power: please plug in before installing updates." msgid "Running on battery power: please plug in before installing updates."
msgstr "" msgstr ""
"Koristi se energija baterije: računalo priključite na izvor napajanja prije " "Koristi se energija baterije: računalo priključite na izvor napajanja prije "
"instalacije nadopuna." "instalacije nadopuna."
#: js/ui/endSessionDialog.js:327 #: js/ui/endSessionDialog.js:326
msgid "Some applications are busy or have unsaved work." msgid "Some applications are busy or have unsaved work."
msgstr "Neke aplikacije su zauzete ili imaju nespremljeni rad." msgstr "Neke aplikacije su zauzete ili imaju nespremljeni rad."
#: js/ui/endSessionDialog.js:334 #: js/ui/endSessionDialog.js:333
msgid "Other users are logged in." msgid "Other users are logged in."
msgstr "Drugi korisnici su prijavljeni." msgstr "Drugi korisnici su prijavljeni."
#. Translators: Remote here refers to a remote session, like a ssh login #. Translators: Remote here refers to a remote session, like a ssh login
#: js/ui/endSessionDialog.js:615 #: js/ui/endSessionDialog.js:614
#, javascript-format #, javascript-format
msgid "%s (remote)" msgid "%s (remote)"
msgstr "%s (udaljeno)" msgstr "%s (udaljeno)"
#. Translators: Console here refers to a tty like a VT console #. Translators: Console here refers to a tty like a VT console
#: js/ui/endSessionDialog.js:618 #: js/ui/endSessionDialog.js:617
#, javascript-format #, javascript-format
msgid "%s (console)" msgid "%s (console)"
msgstr "%s (konzola)" msgstr "%s (konzola)"
@@ -1375,13 +1361,13 @@ msgid "Leave On"
msgstr "Ostavi" msgstr "Ostavi"
#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133 #: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133
#: js/ui/status/network.js:1269 #: js/ui/status/network.js:1263
msgid "Turn On" msgid "Turn On"
msgstr "Uključi" msgstr "Uključi"
#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133 #: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133
#: js/ui/status/network.js:128 js/ui/status/network.js:311 #: js/ui/status/network.js:128 js/ui/status/network.js:310
#: js/ui/status/network.js:1269 js/ui/status/network.js:1381 #: js/ui/status/network.js:1263 js/ui/status/network.js:1375
#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 #: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79
#: js/ui/status/rfkill.js:106 #: js/ui/status/rfkill.js:106
msgid "Turn Off" msgid "Turn Off"
@@ -1443,7 +1429,7 @@ msgstr "Pogledaj izvor"
msgid "Web Page" msgid "Web Page"
msgstr "Web stranica" msgstr "Web stranica"
#: js/ui/messageTray.js:1479 #: js/ui/messageTray.js:1480
msgid "System Information" msgid "System Information"
msgstr "Informacije sustava" msgstr "Informacije sustava"
@@ -1521,38 +1507,47 @@ msgstr "Pritisni Esc za prekidanje"
msgid "Press any key to exit" msgid "Press any key to exit"
msgstr "Pritisni bilo koju tipku za prekidanje" msgstr "Pritisni bilo koju tipku za prekidanje"
#: js/ui/panel.js:113 #: js/ui/panel.js:108
msgid "Quit" msgid "Quit"
msgstr "Zatvori" msgstr "Zatvori"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". #. in your language, you can use the word for "Overview".
#: js/ui/panel.js:468 #: js/ui/panel.js:471
msgid "Activities" msgid "Activities"
msgstr "Aktivnosti" msgstr "Aktivnosti"
#: js/ui/panel.js:743 #: js/ui/panel.js:746
msgctxt "System menu in the top bar" msgctxt "System menu in the top bar"
msgid "System" msgid "System"
msgstr "Sustav" msgstr "Sustav"
#: js/ui/panel.js:862 #: js/ui/panel.js:867
msgid "Top Bar" msgid "Top Bar"
msgstr "Gornja traka" msgstr "Gornja traka"
#: js/ui/runDialog.js:65 #. Translators: this MUST be either "toggle-switch-us"
#. (for toggle switches containing the English words
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches.
#: js/ui/popupMenu.js:285
msgid "toggle-switch-us"
msgstr "toggle-switch-us"
#: js/ui/runDialog.js:64
msgid "Enter a Command" msgid "Enter a Command"
msgstr "Upiši naredbu" msgstr "Upiši naredbu"
#: js/ui/runDialog.js:105 js/ui/windowMenu.js:166 #: js/ui/runDialog.js:104 js/ui/windowMenu.js:166
msgid "Close" msgid "Close"
msgstr "Zatvori" msgstr "Zatvori"
#: js/ui/runDialog.js:267 #: js/ui/runDialog.js:266
msgid "Restart is not available on Wayland" msgid "Restart is not available on Wayland"
msgstr "Ponovno pokretanje nije dostupno na Waylandu" msgstr "Ponovno pokretanje nije dostupno na Waylandu"
#: js/ui/runDialog.js:272 #: js/ui/runDialog.js:271
msgid "Restarting…" msgid "Restarting…"
msgstr "Ponovno pokretanje…" msgstr "Ponovno pokretanje…"
@@ -1599,17 +1594,17 @@ msgstr "Nemoguće zaključavanje"
#: js/ui/screenShield.js:827 js/ui/screenShield.js:1300 #: js/ui/screenShield.js:827 js/ui/screenShield.js:1300
msgid "Lock was blocked by an application" msgid "Lock was blocked by an application"
msgstr "Zaključavanje je blokirala aplikacija" msgstr "Zaključavanje je blokirala apliakcija"
#: js/ui/search.js:638 #: js/ui/search.js:635
msgid "Searching…" msgid "Searching…"
msgstr "Pretraživanje…" msgstr "Pretraživanje…"
#: js/ui/search.js:640 #: js/ui/search.js:637
msgid "No results." msgid "No results."
msgstr "Nema rezultata." msgstr "Nema rezultata."
#: js/ui/search.js:764 #: js/ui/search.js:761
#, javascript-format #, javascript-format
msgid "%d more" msgid "%d more"
msgid_plural "%d more" msgid_plural "%d more"
@@ -1633,61 +1628,14 @@ msgstr "Prikaži tekst"
msgid "Hide Text" msgid "Hide Text"
msgstr "Sakrij tekst" msgstr "Sakrij tekst"
#: js/ui/shellMountOperation.js:318 #: js/ui/shellMountOperation.js:296
msgid "Hidden Volume"
msgstr "Skriveni uređaj"
#: js/ui/shellMountOperation.js:321
msgid "Windows System Volume"
msgstr "Uređaj Windows sustava"
#: js/ui/shellMountOperation.js:324
msgid "Uses Keyfiles"
msgstr "Koristi datoteke ključa"
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:330
#, javascript-format
msgid ""
"To unlock a volume that uses keyfiles, use the <i>%s</i> utility instead."
msgstr ""
"Za otključavanje uređaja koji koristi datoteke ključa, koristite <i>%s</i> "
"pomagalo."
#: js/ui/shellMountOperation.js:337
msgid "PIM Number"
msgstr "PIM broj"
#: js/ui/shellMountOperation.js:355
msgid "The PIM must be a number or empty."
msgstr "PIM mora biti broj ili prazan."
#: js/ui/shellMountOperation.js:366
msgid "Password" msgid "Password"
msgstr "Lozinka" msgstr "Lozinka"
#: js/ui/shellMountOperation.js:396 #: js/ui/shellMountOperation.js:317
msgid "Remember Password" msgid "Remember Password"
msgstr "Zapamti lozinku" msgstr "Zapamti lozinku"
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:418
#, javascript-format
msgid "Open %s"
msgstr "Otvori %s"
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:490
#, javascript-format
msgid "Unable to start %s"
msgstr "Nemoguće pokretanje %s"
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:492
#, javascript-format
msgid "Couldnt find the %s application"
msgstr "Nemoguć pronalazak %s aplikacije"
#: js/ui/status/accessibility.js:35 #: js/ui/status/accessibility.js:35
msgid "Accessibility" msgid "Accessibility"
msgstr "Pristupačnost" msgstr "Pristupačnost"
@@ -1724,11 +1672,11 @@ msgstr "Odbijanje tipki"
msgid "Mouse Keys" msgid "Mouse Keys"
msgstr "Tipke miša" msgstr "Tipke miša"
#: js/ui/status/accessibility.js:135 #: js/ui/status/accessibility.js:151
msgid "High Contrast" msgid "High Contrast"
msgstr "Visok kontrast" msgstr "Visok kontrast"
#: js/ui/status/accessibility.js:177 #: js/ui/status/accessibility.js:182
msgid "Large Text" msgid "Large Text"
msgstr "Velik tekst" msgstr "Velik tekst"
@@ -1736,7 +1684,7 @@ msgstr "Velik tekst"
msgid "Bluetooth" msgid "Bluetooth"
msgstr "Bluetooth" msgstr "Bluetooth"
#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:586 #: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585
msgid "Bluetooth Settings" msgid "Bluetooth Settings"
msgstr "Bluetooth postavke" msgstr "Bluetooth postavke"
@@ -1761,31 +1709,11 @@ msgstr "Uključeno"
msgid "Brightness" msgid "Brightness"
msgstr "Svjetlina" msgstr "Svjetlina"
#: js/ui/status/dwellClick.js:13 #: js/ui/status/keyboard.js:812
msgid "Single Click"
msgstr "Jednostruki klik"
#: js/ui/status/dwellClick.js:18
msgid "Double Click"
msgstr "Dvostruki klik"
#: js/ui/status/dwellClick.js:23
msgid "Drag"
msgstr "Povlačenje"
#: js/ui/status/dwellClick.js:28
msgid "Secondary Click"
msgstr "Pomoćni klik"
#: js/ui/status/dwellClick.js:37
msgid "Dwell Click"
msgstr "Zadržani klik"
#: js/ui/status/keyboard.js:813
msgid "Keyboard" msgid "Keyboard"
msgstr "Tipkovnica" msgstr "Tipkovnica"
#: js/ui/status/keyboard.js:835 #: js/ui/status/keyboard.js:834
msgid "Show Keyboard Layout" msgid "Show Keyboard Layout"
msgstr "Prikaži raspored tipkovnice" msgstr "Prikaži raspored tipkovnice"
@@ -1814,12 +1742,12 @@ msgid "Enable"
msgstr "Omogući" msgstr "Omogući"
#. Translators: %s is an application name #. Translators: %s is an application name
#: js/ui/status/location.js:355 #: js/ui/status/location.js:353
#, javascript-format #, javascript-format
msgid "Give %s access to your location?" msgid "Give %s access to your location?"
msgstr "Dopustite %s pristup vašoj lokaciji?" msgstr "Dopustite %s pristup vašoj lokaciji?"
#: js/ui/status/location.js:356 #: js/ui/status/location.js:354
msgid "Location access can be changed at any time from the privacy settings." msgid "Location access can be changed at any time from the privacy settings."
msgstr "" msgstr ""
"Pristup lokaciji može se promijeniti u svako vrijeme iz postavka privatnosti." "Pristup lokaciji može se promijeniti u svako vrijeme iz postavka privatnosti."
@@ -1829,13 +1757,13 @@ msgid "<unknown>"
msgstr "<nepoznato>" msgstr "<nepoznato>"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:417 js/ui/status/network.js:1298 #: js/ui/status/network.js:416 js/ui/status/network.js:1292
#, javascript-format #, javascript-format
msgid "%s Off" msgid "%s Off"
msgstr "%s isključena" msgstr "%s isključena"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:420 #: js/ui/status/network.js:419
#, javascript-format #, javascript-format
msgid "%s Connected" msgid "%s Connected"
msgstr "%s povezana" msgstr "%s povezana"
@@ -1843,164 +1771,164 @@ msgstr "%s povezana"
#. Translators: this is for network devices that are physically present but are not #. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu); #. under NetworkManager's control (and thus cannot be used in the menu);
#. %s is a network identifier #. %s is a network identifier
#: js/ui/status/network.js:425 #: js/ui/status/network.js:424
#, javascript-format #, javascript-format
msgid "%s Unmanaged" msgid "%s Unmanaged"
msgstr "%s neupravljana" msgstr "%s neupravljana"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:428 #: js/ui/status/network.js:427
#, javascript-format #, javascript-format
msgid "%s Disconnecting" msgid "%s Disconnecting"
msgstr "%s prekidanje povezivanja" msgstr "%s prekidanje povezivanja"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:435 js/ui/status/network.js:1290 #: js/ui/status/network.js:434 js/ui/status/network.js:1284
#, javascript-format #, javascript-format
msgid "%s Connecting" msgid "%s Connecting"
msgstr "%s povezivanje" msgstr "%s povezivanje"
#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier #. Translators: this is for network connections that require some kind of key or password; %s is a network identifier
#: js/ui/status/network.js:438 #: js/ui/status/network.js:437
#, javascript-format #, javascript-format
msgid "%s Requires Authentication" msgid "%s Requires Authentication"
msgstr "%s zahtijeva ovjeru" msgstr "%s zahtijeva ovjeru"
#. Translators: this is for devices that require some kind of firmware or kernel #. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing; %s is a network identifier #. module, which is missing; %s is a network identifier
#: js/ui/status/network.js:446 #: js/ui/status/network.js:445
#, javascript-format #, javascript-format
msgid "Firmware Missing For %s" msgid "Firmware Missing For %s"
msgstr "Nedostaje firmver za %s" msgstr "Nedostaje firmver za %s"
#. Translators: this is for a network device that cannot be activated (for example it #. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage; %s is a network identifier #. is disabled by rfkill, or it has no coverage; %s is a network identifier
#: js/ui/status/network.js:450 #: js/ui/status/network.js:449
#, javascript-format #, javascript-format
msgid "%s Unavailable" msgid "%s Unavailable"
msgstr "%s nedostupna" msgstr "%s nedostupna"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:453 #: js/ui/status/network.js:452
#, javascript-format #, javascript-format
msgid "%s Connection Failed" msgid "%s Connection Failed"
msgstr "%s neuspješno povezivanje" msgstr "%s neuspješno povezivanje"
#: js/ui/status/network.js:465 #: js/ui/status/network.js:464
msgid "Wired Settings" msgid "Wired Settings"
msgstr "Postavke žične mreže" msgstr "Postavke žične mreže"
#: js/ui/status/network.js:507 #: js/ui/status/network.js:506
msgid "Mobile Broadband Settings" msgid "Mobile Broadband Settings"
msgstr "Mobilni internet" msgstr "Mobilni internet"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:554 js/ui/status/network.js:1295 #: js/ui/status/network.js:553 js/ui/status/network.js:1289
#, javascript-format #, javascript-format
msgid "%s Hardware Disabled" msgid "%s Hardware Disabled"
msgstr "%s hardverski onemogućena" msgstr "%s hardverski onemogućena"
#. Translators: this is for a network device that cannot be activated #. Translators: this is for a network device that cannot be activated
#. because it's disabled by rfkill (airplane mode); %s is a network identifier #. because it's disabled by rfkill (airplane mode); %s is a network identifier
#: js/ui/status/network.js:558 #: js/ui/status/network.js:557
#, javascript-format #, javascript-format
msgid "%s Disabled" msgid "%s Disabled"
msgstr "%s onemogućeno" msgstr "%s onemogućeno"
#: js/ui/status/network.js:598 #: js/ui/status/network.js:597
msgid "Connect to Internet" msgid "Connect to Internet"
msgstr "Povežite se na internet" msgstr "Povežite se na internet"
#: js/ui/status/network.js:792 #: js/ui/status/network.js:786
msgid "Airplane Mode is On" msgid "Airplane Mode is On"
msgstr "Zrakoplovni način rada je omogućen" msgstr "Zrakoplovni način rada je omogućen"
#: js/ui/status/network.js:793 #: js/ui/status/network.js:787
msgid "Wi-Fi is disabled when airplane mode is on." msgid "Wi-Fi is disabled when airplane mode is on."
msgstr "Bežična mreža je onemogućena u zrakoplovnom načinu rada." msgstr "Bežična mreža je onemogućena u zrakoplovnom načinu rada."
#: js/ui/status/network.js:794 #: js/ui/status/network.js:788
msgid "Turn Off Airplane Mode" msgid "Turn Off Airplane Mode"
msgstr "Isključi zrakoplovni način rada" msgstr "Isključi zrakoplovni način rada"
#: js/ui/status/network.js:803 #: js/ui/status/network.js:797
msgid "Wi-Fi is Off" msgid "Wi-Fi is Off"
msgstr "Bežična mreža isključena" msgstr "Bežična mreža isključena"
#: js/ui/status/network.js:804 #: js/ui/status/network.js:798
msgid "Wi-Fi needs to be turned on in order to connect to a network." msgid "Wi-Fi needs to be turned on in order to connect to a network."
msgstr "Bežična mreža se mora uključiti kako bi se povezala s internetom." msgstr "Bežična mreža se mora uključiti kako bi se povezala s internetom."
#: js/ui/status/network.js:805 #: js/ui/status/network.js:799
msgid "Turn On Wi-Fi" msgid "Turn On Wi-Fi"
msgstr "Uključi bežičnu mrežu" msgstr "Uključi bežičnu mrežu"
#: js/ui/status/network.js:830 #: js/ui/status/network.js:824
msgid "Wi-Fi Networks" msgid "Wi-Fi Networks"
msgstr "Bežične mreže" msgstr "Bežične mreže"
#: js/ui/status/network.js:832 #: js/ui/status/network.js:826
msgid "Select a network" msgid "Select a network"
msgstr "Odaberi mrežu" msgstr "Odaberi mrežu"
#: js/ui/status/network.js:861 #: js/ui/status/network.js:855
msgid "No Networks" msgid "No Networks"
msgstr "Nema mreža" msgstr "Nema mreža"
#: js/ui/status/network.js:882 js/ui/status/rfkill.js:104 #: js/ui/status/network.js:876 js/ui/status/rfkill.js:104
msgid "Use hardware switch to turn off" msgid "Use hardware switch to turn off"
msgstr "Koristi hardverski prekidač za isključivanje" msgstr "Koristi hardverski prekidač za isključivanje"
#: js/ui/status/network.js:1158 #: js/ui/status/network.js:1152
msgid "Select Network" msgid "Select Network"
msgstr "Odaberi mrežu" msgstr "Odaberi mrežu"
#: js/ui/status/network.js:1164 #: js/ui/status/network.js:1158
msgid "Wi-Fi Settings" msgid "Wi-Fi Settings"
msgstr "Postavke bežične mreže" msgstr "Postavke bežične mreže"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:1286 #: js/ui/status/network.js:1280
#, javascript-format #, javascript-format
msgid "%s Hotspot Active" msgid "%s Hotspot Active"
msgstr "%s pristupna točka aktivna" msgstr "%s pristupna točka aktivna"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:1301 #: js/ui/status/network.js:1295
#, javascript-format #, javascript-format
msgid "%s Not Connected" msgid "%s Not Connected"
msgstr "%s nije povezana" msgstr "%s nije povezana"
#: js/ui/status/network.js:1398 #: js/ui/status/network.js:1392
msgid "connecting…" msgid "connecting…"
msgstr "povezivanje…" msgstr "povezivanje…"
#. Translators: this is for network connections that require some kind of key or password #. Translators: this is for network connections that require some kind of key or password
#: js/ui/status/network.js:1401 #: js/ui/status/network.js:1395
msgid "authentication required" msgid "authentication required"
msgstr "potrebna je ovjera" msgstr "potrebna je ovjera"
#: js/ui/status/network.js:1403 #: js/ui/status/network.js:1397
msgid "connection failed" msgid "connection failed"
msgstr "neuspješno povezivanje" msgstr "neuspješno povezivanje"
#: js/ui/status/network.js:1453 #: js/ui/status/network.js:1447
msgid "VPN Settings" msgid "VPN Settings"
msgstr "VPN postavke" msgstr "VPN postavke"
#: js/ui/status/network.js:1470 #: js/ui/status/network.js:1464
msgid "VPN" msgid "VPN"
msgstr "VPN" msgstr "VPN"
#: js/ui/status/network.js:1480 #: js/ui/status/network.js:1474
msgid "VPN Off" msgid "VPN Off"
msgstr "VPN isključen" msgstr "VPN isključen"
#: js/ui/status/network.js:1541 js/ui/status/rfkill.js:82 #: js/ui/status/network.js:1535 js/ui/status/rfkill.js:82
msgid "Network Settings" msgid "Network Settings"
msgstr "Mrežne postavke" msgstr "Mrežne postavke"
#: js/ui/status/network.js:1570 #: js/ui/status/network.js:1564
#, javascript-format #, javascript-format
msgid "%s Wired Connection" msgid "%s Wired Connection"
msgid_plural "%s Wired Connections" msgid_plural "%s Wired Connections"
@@ -2008,7 +1936,7 @@ msgstr[0] "%s žično povezivanje"
msgstr[1] "%s žična povezivanja" msgstr[1] "%s žična povezivanja"
msgstr[2] "%s žičnih povezivanja" msgstr[2] "%s žičnih povezivanja"
#: js/ui/status/network.js:1574 #: js/ui/status/network.js:1568
#, javascript-format #, javascript-format
msgid "%s Wi-Fi Connection" msgid "%s Wi-Fi Connection"
msgid_plural "%s Wi-Fi Connections" msgid_plural "%s Wi-Fi Connections"
@@ -2016,7 +1944,7 @@ msgstr[0] "%s bežično povezivanje"
msgstr[1] "%s bežična povezivanja" msgstr[1] "%s bežična povezivanja"
msgstr[2] "%s bežičnih povezivanja" msgstr[2] "%s bežičnih povezivanja"
#: js/ui/status/network.js:1578 #: js/ui/status/network.js:1572
#, javascript-format #, javascript-format
msgid "%s Modem Connection" msgid "%s Modem Connection"
msgid_plural "%s Modem Connections" msgid_plural "%s Modem Connections"
@@ -2024,11 +1952,11 @@ msgstr[0] "%s modemsko povezivanje"
msgstr[1] "%s modemska povezivanja" msgstr[1] "%s modemska povezivanja"
msgstr[2] "%s modemskih povezivanja" msgstr[2] "%s modemskih povezivanja"
#: js/ui/status/network.js:1711 #: js/ui/status/network.js:1701
msgid "Connection failed" msgid "Connection failed"
msgstr "Neuspješno povezivanje" msgstr "Neuspješno povezivanje"
#: js/ui/status/network.js:1712 #: js/ui/status/network.js:1702
msgid "Activation of network connection failed" msgid "Activation of network connection failed"
msgstr "Aktiviranje mrežnog povezivanja je neuspjelo" msgstr "Aktiviranje mrežnog povezivanja je neuspjelo"
@@ -2209,22 +2137,22 @@ msgstr "Pretraži"
msgid "“%s” is ready" msgid "“%s” is ready"
msgstr "“%s” je spreman" msgstr "“%s” je spreman"
#: js/ui/windowManager.js:54 #: js/ui/windowManager.js:53
msgid "Do you want to keep these display settings?" msgid "Do you want to keep these display settings?"
msgstr "Želite li zadržati ove postavke zaslona?" msgstr "Želite li zadržati ove postavke zaslona?"
#. Translators: this and the following message should be limited in length, #. Translators: this and the following message should be limited in lenght,
#. to avoid ellipsizing the labels. #. to avoid ellipsizing the labels.
#. #.
#: js/ui/windowManager.js:66 #: js/ui/windowManager.js:65
msgid "Revert Settings" msgid "Revert Settings"
msgstr "Vrati postavke" msgstr "Vrati postavke"
#: js/ui/windowManager.js:69 #: js/ui/windowManager.js:68
msgid "Keep Changes" msgid "Keep Changes"
msgstr "Zadrži promjene" msgstr "Zadrži promjene"
#: js/ui/windowManager.js:87 #: js/ui/windowManager.js:86
#, javascript-format #, javascript-format
msgid "Settings changes will revert in %d second" msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds" msgid_plural "Settings changes will revert in %d seconds"
@@ -2234,7 +2162,7 @@ msgstr[2] "Promjene postavka će se vratiti za %d sekundi"
#. Translators: This represents the size of a window. The first number is #. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height. #. * the width of the window and the second is the height.
#: js/ui/windowManager.js:678 #: js/ui/windowManager.js:662
#, javascript-format #, javascript-format
msgid "%d × %d" msgid "%d × %d"
msgstr "%d × %d" msgstr "%d × %d"
@@ -2333,11 +2261,11 @@ msgstr "Nepoznat"
msgid "Failed to launch “%s”" msgid "Failed to launch “%s”"
msgstr "Neuspješno pokretanje “%s”" msgstr "Neuspješno pokretanje “%s”"
#: src/shell-keyring-prompt.c:731 #: src/shell-keyring-prompt.c:730
msgid "Passwords do not match." msgid "Passwords do not match."
msgstr "Lozinke se ne podudaraju." msgstr "Lozinke se ne podudaraju."
#: src/shell-keyring-prompt.c:739 #: src/shell-keyring-prompt.c:738
msgid "Password cannot be blank" msgid "Password cannot be blank"
msgstr "Lozinka ne može biti prazna" msgstr "Lozinka ne može biti prazna"
@@ -2369,9 +2297,6 @@ msgstr[2] "%u ulaza"
msgid "System Sounds" msgid "System Sounds"
msgstr "Zvukovi sustava" msgstr "Zvukovi sustava"
#~ msgid "toggle-switch-us"
#~ msgstr "toggle-switch-us"
#~ msgid "network-workgroup" #~ msgid "network-workgroup"
#~ msgstr "network-workgroup" #~ msgstr "network-workgroup"

386
po/hu.po
View File

@@ -4,22 +4,22 @@
# #
# Gabor Kelemen <kelemeng at gnome dot hu>, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016. # Gabor Kelemen <kelemeng at gnome dot hu>, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016.
# Lukács Bence <lukacs.bence1 at gmail dot com>, 2012. # Lukács Bence <lukacs.bence1 at gmail dot com>, 2012.
# Balázs Meskó <meskobalazs at gmail dot com>, 2014, 2019. # Balázs Meskó <meskobalazs at gmail dot com>, 2014.
# Balázs Úr <ur.balazs at fsf dot hu>, 2012, 2014, 2015, 2016, 2017, 2018, 2019. # Balázs Úr <urbalazs at gmail dot com>, 2012, 2014, 2015, 2016, 2017, 2018, 2019.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell master\n" "Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2019-05-28 17:15+0000\n" "POT-Creation-Date: 2019-03-03 10:16+0000\n"
"PO-Revision-Date: 2019-06-01 13:15+0200\n" "PO-Revision-Date: 2019-02-05 21:05+0100\n"
"Last-Translator: Balázs Úr <ur.balazs at fsf dot hu>\n" "Last-Translator: Balázs Úr <urbalazs@gmail.com>\n"
"Language-Team: Hungarian <gnome-hu-list at gnome dot org>\n" "Language-Team: Hungarian <gnome-hu-list at gnome dot org>\n"
"Language: hu\n" "Language: hu\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Lokalize 18.12.3\n" "X-Generator: Lokalize 1.2\n"
#: data/50-gnome-shell-system.xml:6 #: data/50-gnome-shell-system.xml:6
msgid "System" msgid "System"
@@ -373,6 +373,11 @@ msgstr ""
msgid "Network Login" msgid "Network Login"
msgstr "Hálózati bejelentkezés" msgstr "Hálózati bejelentkezés"
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9
msgid "network-workgroup"
msgstr "network-workgroup"
#: js/extensionPrefs/main.js:116 #: js/extensionPrefs/main.js:116
msgid "Somethings gone wrong" msgid "Somethings gone wrong"
msgstr "Valami elromlott" msgstr "Valami elromlott"
@@ -418,11 +423,10 @@ msgstr ""
msgid "Browse in Software" msgid "Browse in Software"
msgstr "Tallózás a Szoftverekben" msgstr "Tallózás a Szoftverekben"
#: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:52 #: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55
#: js/ui/components/networkAgent.js:118 js/ui/components/polkitAgent.js:138 #: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136
#: js/ui/endSessionDialog.js:431 js/ui/extensionDownloader.js:188 #: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188
#: js/ui/shellMountOperation.js:404 js/ui/shellMountOperation.js:413 #: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888
#: js/ui/status/network.js:894
msgid "Cancel" msgid "Cancel"
msgstr "Mégse" msgstr "Mégse"
@@ -430,7 +434,7 @@ msgstr "Mégse"
msgid "Next" msgid "Next"
msgstr "Következő" msgstr "Következő"
#: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:408 #: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:329
#: js/ui/unlockDialog.js:41 #: js/ui/unlockDialog.js:41
msgid "Unlock" msgid "Unlock"
msgstr "Feloldás" msgstr "Feloldás"
@@ -461,8 +465,8 @@ msgstr "(például: felhasználó vagy %s)"
#. TTLS and PEAP are actually much more complicated, but this complication #. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication #. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one) #. (and don't even care of which one)
#: js/gdm/loginDialog.js:889 js/ui/components/networkAgent.js:244 #: js/gdm/loginDialog.js:889 js/ui/components/networkAgent.js:243
#: js/ui/components/networkAgent.js:264 js/ui/components/networkAgent.js:282 #: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281
msgid "Username: " msgid "Username: "
msgstr "Felhasználónév: " msgstr "Felhasználónév: "
@@ -513,7 +517,7 @@ msgstr "Kijelentkezés"
#. Translators: A list of keywords that match the logout action, separated by semicolons #. Translators: A list of keywords that match the logout action, separated by semicolons
#: js/misc/systemActions.js:105 #: js/misc/systemActions.js:105
msgid "logout;log out;sign off" msgid "logout;sign off"
msgstr "kijelentkezés;kilépés" msgstr "kijelentkezés;kilépés"
#. Translators: The name of the suspend action in search #. Translators: The name of the suspend action in search
@@ -700,11 +704,11 @@ msgstr ""
#. No support for non-modal system dialogs, so ignore the option #. No support for non-modal system dialogs, so ignore the option
#. let modal = options['modal'] || true; #. let modal = options['modal'] || true;
#: js/ui/accessDialog.js:38 js/ui/status/location.js:362 #: js/ui/accessDialog.js:37 js/ui/status/location.js:360
msgid "Deny Access" msgid "Deny Access"
msgstr "Hozzáférés tiltása" msgstr "Hozzáférés tiltása"
#: js/ui/accessDialog.js:39 js/ui/status/location.js:365 #: js/ui/accessDialog.js:38 js/ui/status/location.js:363
msgid "Grant Access" msgid "Grant Access"
msgstr "Hozzáférés megadása" msgstr "Hozzáférés megadása"
@@ -720,58 +724,53 @@ msgstr "Gyakori"
msgid "All" msgid "All"
msgstr "Összes" msgstr "Összes"
#. Translators: This is the heading of a list of open windows #: js/ui/appDisplay.js:1737 js/ui/panel.js:83
#: js/ui/appDisplay.js:1713 js/ui/panel.js:79
msgid "Open Windows"
msgstr "Ablakok megnyitása"
#: js/ui/appDisplay.js:1732 js/ui/panel.js:86
msgid "New Window" msgid "New Window"
msgstr "Új ablak" msgstr "Új ablak"
#: js/ui/appDisplay.js:1746 #: js/ui/appDisplay.js:1751
msgid "Launch using Dedicated Graphics Card" msgid "Launch using Dedicated Graphics Card"
msgstr "Futtatás a dedikált videokártyával" msgstr "Futtatás a dedikált videokártyával"
#: js/ui/appDisplay.js:1773 js/ui/dash.js:239 #: js/ui/appDisplay.js:1778 js/ui/dash.js:239
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Eltávolítás a Kedvencek közül" msgstr "Eltávolítás a Kedvencek közül"
#: js/ui/appDisplay.js:1779 #: js/ui/appDisplay.js:1784
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Hozzáadás a Kedvencekhez" msgstr "Hozzáadás a Kedvencekhez"
#: js/ui/appDisplay.js:1789 js/ui/panel.js:97 #: js/ui/appDisplay.js:1794 js/ui/panel.js:94
msgid "Show Details" msgid "Show Details"
msgstr "Részletek megjelenítése" msgstr "Részletek megjelenítése"
#: js/ui/appFavorites.js:149 #: js/ui/appFavorites.js:141
#, javascript-format #, javascript-format
msgid "%s has been added to your favorites." msgid "%s has been added to your favorites."
msgstr "%s felvéve a Kedvencek közé." msgstr "%s felvéve a Kedvencek közé."
#: js/ui/appFavorites.js:183 #: js/ui/appFavorites.js:175
#, javascript-format #, javascript-format
msgid "%s has been removed from your favorites." msgid "%s has been removed from your favorites."
msgstr "%s eltávolítva a Kedvencek közül." msgstr "%s eltávolítva a Kedvencek közül"
#: js/ui/audioDeviceSelection.js:39 #: js/ui/audioDeviceSelection.js:42
msgid "Select Audio Device" msgid "Select Audio Device"
msgstr "Válasszon hangeszközt" msgstr "Válasszon hangeszközt"
#: js/ui/audioDeviceSelection.js:50 #: js/ui/audioDeviceSelection.js:53
msgid "Sound Settings" msgid "Sound Settings"
msgstr "Hangbeállítások" msgstr "Hangbeállítások"
#: js/ui/audioDeviceSelection.js:59 #: js/ui/audioDeviceSelection.js:62
msgid "Headphones" msgid "Headphones"
msgstr "Fülhallgatók" msgstr "Fülhallgatók"
#: js/ui/audioDeviceSelection.js:61 #: js/ui/audioDeviceSelection.js:64
msgid "Headset" msgid "Headset"
msgstr "Fejhallgató" msgstr "Fejhallgató"
#: js/ui/audioDeviceSelection.js:63 js/ui/status/volume.js:247 #: js/ui/audioDeviceSelection.js:66 js/ui/status/volume.js:247
msgid "Microphone" msgid "Microphone"
msgstr "Mikrofon" msgstr "Mikrofon"
@@ -932,74 +931,66 @@ msgstr "Erőltetett kilépés"
msgid "Wait" msgid "Wait"
msgstr "Várakozás" msgstr "Várakozás"
#: js/ui/components/automountManager.js:87 #: js/ui/components/automountManager.js:86
msgid "External drive connected" msgid "External drive connected"
msgstr "Külső meghajtó csatlakoztatva" msgstr "Külső meghajtó csatlakoztatva"
#: js/ui/components/automountManager.js:99 #: js/ui/components/automountManager.js:98
msgid "External drive disconnected" msgid "External drive disconnected"
msgstr "Külső meghajtó leválasztva" msgstr "Külső meghajtó leválasztva"
#: js/ui/components/automountManager.js:211
msgid "Unable to unlock volume"
msgstr "Nem lehet feloldani a kötetet"
#: js/ui/components/automountManager.js:212
msgid "The installed udisks version does not support the PIM setting"
msgstr "A telepített udisks verzió nem támogatja a PIM beállítást"
#: js/ui/components/autorunManager.js:334 #: js/ui/components/autorunManager.js:334
#, javascript-format #, javascript-format
msgid "Open with %s" msgid "Open with %s"
msgstr "Megnyitás ezzel: %s" msgstr "Megnyitás ezzel: %s"
#: js/ui/components/keyring.js:66 js/ui/components/polkitAgent.js:257 #: js/ui/components/keyring.js:77 js/ui/components/polkitAgent.js:255
msgid "Password:" msgid "Password:"
msgstr "Jelszó:" msgstr "Jelszó:"
#: js/ui/components/keyring.js:97 #: js/ui/components/keyring.js:108
msgid "Type again:" msgid "Type again:"
msgstr "Írja be újra:" msgstr "Írja be újra:"
#: js/ui/components/networkAgent.js:103 #: js/ui/components/networkAgent.js:102
msgid "" msgid ""
"Alternatively you can connect by pushing the “WPS” button on your router." "Alternatively you can connect by pushing the “WPS” button on your router."
msgstr "Alternatívaként kapcsolódhat a „WPS” gomb megnyomásával az eszközön." msgstr "Alternatívaként kapcsolódhat a „WPS” gomb megnyomásával az eszközön."
#: js/ui/components/networkAgent.js:113 js/ui/status/network.js:219 #: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219
#: js/ui/status/network.js:310 js/ui/status/network.js:897 #: js/ui/status/network.js:309 js/ui/status/network.js:891
msgid "Connect" msgid "Connect"
msgstr "Kapcsolódás" msgstr "Kapcsolódás"
#. Cisco LEAP #. Cisco LEAP
#: js/ui/components/networkAgent.js:212 js/ui/components/networkAgent.js:224 #: js/ui/components/networkAgent.js:211 js/ui/components/networkAgent.js:223
#: js/ui/components/networkAgent.js:247 js/ui/components/networkAgent.js:266 #: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:265
#: js/ui/components/networkAgent.js:286 js/ui/components/networkAgent.js:296 #: js/ui/components/networkAgent.js:285 js/ui/components/networkAgent.js:295
msgid "Password: " msgid "Password: "
msgstr "Jelszó: " msgstr "Jelszó: "
#. static WEP #. static WEP
#: js/ui/components/networkAgent.js:217 #: js/ui/components/networkAgent.js:216
msgid "Key: " msgid "Key: "
msgstr "Kulcs: " msgstr "Kulcs: "
#: js/ui/components/networkAgent.js:250 js/ui/components/networkAgent.js:272 #: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271
msgid "Private key password: " msgid "Private key password: "
msgstr "Személyes kulcs jelszava: " msgstr "Személyes kulcs jelszava: "
#: js/ui/components/networkAgent.js:270 #: js/ui/components/networkAgent.js:269
msgid "Identity: " msgid "Identity: "
msgstr "Személyazonosság: " msgstr "Személyazonosság: "
#: js/ui/components/networkAgent.js:284 #: js/ui/components/networkAgent.js:283
msgid "Service: " msgid "Service: "
msgstr "Szolgáltatás: " msgstr "Szolgáltatás: "
#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686 #: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685
msgid "Authentication required by wireless network" msgid "Authentication required by wireless network"
msgstr "A vezeték nélküli hálózat hitelesítést igényel" msgstr "A vezeték nélküli hálózat hitelesítést igényel"
#: js/ui/components/networkAgent.js:314 js/ui/components/networkAgent.js:687 #: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686
#, javascript-format #, javascript-format
msgid "" msgid ""
"Passwords or encryption keys are required to access the wireless network " "Passwords or encryption keys are required to access the wireless network "
@@ -1008,53 +999,53 @@ msgstr ""
"Jelszavak vagy titkosítási kulcsok szükségesek a(z) „%s” vezeték nélküli " "Jelszavak vagy titkosítási kulcsok szükségesek a(z) „%s” vezeték nélküli "
"hálózat eléréséhez." "hálózat eléréséhez."
#: js/ui/components/networkAgent.js:318 js/ui/components/networkAgent.js:690 #: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:689
msgid "Wired 802.1X authentication" msgid "Wired 802.1X authentication"
msgstr "Vezetékes 802.1X hitelesítés" msgstr "Vezetékes 802.1X hitelesítés"
#: js/ui/components/networkAgent.js:320 #: js/ui/components/networkAgent.js:319
msgid "Network name: " msgid "Network name: "
msgstr "Hálózat neve: " msgstr "Hálózat neve: "
#: js/ui/components/networkAgent.js:325 js/ui/components/networkAgent.js:694 #: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:693
msgid "DSL authentication" msgid "DSL authentication"
msgstr "DSL hitelesítés" msgstr "DSL hitelesítés"
#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700 #: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:699
msgid "PIN code required" msgid "PIN code required"
msgstr "PIN kód szükséges" msgstr "PIN kód szükséges"
#: js/ui/components/networkAgent.js:333 js/ui/components/networkAgent.js:701 #: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700
msgid "PIN code is needed for the mobile broadband device" msgid "PIN code is needed for the mobile broadband device"
msgstr "PIN kód szükséges a mobil széles sávú eszközhöz" msgstr "PIN kód szükséges a mobil széles sávú eszközhöz"
#: js/ui/components/networkAgent.js:334 #: js/ui/components/networkAgent.js:333
msgid "PIN: " msgid "PIN: "
msgstr "PIN: " msgstr "PIN: "
#: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:707 #: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:706
msgid "Mobile broadband network password" msgid "Mobile broadband network password"
msgstr "Mobil széles sávú hálózat jelszava" msgstr "Mobil széles sávú hálózat jelszava"
#: js/ui/components/networkAgent.js:342 js/ui/components/networkAgent.js:691 #: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:690
#: js/ui/components/networkAgent.js:695 js/ui/components/networkAgent.js:708 #: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707
#, javascript-format #, javascript-format
msgid "A password is required to connect to “%s”." msgid "A password is required to connect to “%s”."
msgstr "Jelszó szükséges a kapcsolódáshoz a következőhöz: „%s”." msgstr "Jelszó szükséges a kapcsolódáshoz a következőhöz: „%s”."
#: js/ui/components/networkAgent.js:675 js/ui/status/network.js:1670 #: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1664
msgid "Network Manager" msgid "Network Manager"
msgstr "Hálózatkezelő" msgstr "Hálózatkezelő"
#: js/ui/components/polkitAgent.js:36 #: js/ui/components/polkitAgent.js:34
msgid "Authentication Required" msgid "Authentication Required"
msgstr "Hitelesítés szükséges" msgstr "Hitelesítés szükséges"
#: js/ui/components/polkitAgent.js:64 #: js/ui/components/polkitAgent.js:62
msgid "Administrator" msgid "Administrator"
msgstr "Rendszergazda" msgstr "Rendszergazda"
#: js/ui/components/polkitAgent.js:141 #: js/ui/components/polkitAgent.js:139
msgid "Authenticate" msgid "Authenticate"
msgstr "Hitelesítés" msgstr "Hitelesítés"
@@ -1062,7 +1053,7 @@ msgstr "Hitelesítés"
#. * requested authentication was not gained; this can happen #. * requested authentication was not gained; this can happen
#. * because of an authentication error (like invalid password), #. * because of an authentication error (like invalid password),
#. * for instance. #. * for instance.
#: js/ui/components/polkitAgent.js:243 js/ui/shellMountOperation.js:389 #: js/ui/components/polkitAgent.js:241 js/ui/shellMountOperation.js:309
msgid "Sorry, that didnt work. Please try again." msgid "Sorry, that didnt work. Please try again."
msgstr "Elnézést, ez nem sikerült. Próbálja újra." msgstr "Elnézést, ez nem sikerült. Próbálja újra."
@@ -1113,23 +1104,23 @@ msgstr "Világórák hozzáadása…"
msgid "World Clocks" msgid "World Clocks"
msgstr "Világórák" msgstr "Világórák"
#: js/ui/dateMenu.js:228 #: js/ui/dateMenu.js:222
msgid "Weather" msgid "Weather"
msgstr "Időjárás" msgstr "Időjárás"
#: js/ui/dateMenu.js:311 #: js/ui/dateMenu.js:305
msgid "Select a location…" msgid "Select a location…"
msgstr "Válasszon egy helyet…" msgstr "Válasszon egy helyet…"
#: js/ui/dateMenu.js:319 #: js/ui/dateMenu.js:313
msgid "Loading…" msgid "Loading…"
msgstr "Betöltés…" msgstr "Betöltés…"
#: js/ui/dateMenu.js:329 #: js/ui/dateMenu.js:323
msgid "Go online for weather information" msgid "Go online for weather information"
msgstr "Időjárás-információkért kapcsolódjon az internetre" msgstr "Időjárás-információkért kapcsolódjon az internetre"
#: js/ui/dateMenu.js:331 #: js/ui/dateMenu.js:325
msgid "Weather information is currently unavailable" msgid "Weather information is currently unavailable"
msgstr "Az időjárás-információk jelenleg nem érhetőek el" msgstr "Az időjárás-információk jelenleg nem érhetőek el"
@@ -1257,28 +1248,28 @@ msgstr ""
"eltarthat egy ideig: győződjön meg arról, hogy készített-e biztonsági " "eltarthat egy ideig: győződjön meg arról, hogy készített-e biztonsági "
"mentést, valamint a számítógép be van-e dugva." "mentést, valamint a számítógép be van-e dugva."
#: js/ui/endSessionDialog.js:310 #: js/ui/endSessionDialog.js:309
msgid "Running on battery power: please plug in before installing updates." msgid "Running on battery power: please plug in before installing updates."
msgstr "" msgstr ""
"Akkumulátoros működés: a frissítések telepítése előtt dugja be eszközét a " "Akkumulátoros működés: a frissítések telepítése előtt dugja be eszközét a "
"konnektorba." "konnektorba."
#: js/ui/endSessionDialog.js:327 #: js/ui/endSessionDialog.js:326
msgid "Some applications are busy or have unsaved work." msgid "Some applications are busy or have unsaved work."
msgstr "Egyes alkalmazások elfoglaltak, vagy mentetlen munkát tartalmaznak." msgstr "Egyes alkalmazások elfoglaltak, vagy mentetlen munkát tartalmaznak."
#: js/ui/endSessionDialog.js:334 #: js/ui/endSessionDialog.js:333
msgid "Other users are logged in." msgid "Other users are logged in."
msgstr "Más felhasználók vannak bejelentkezve." msgstr "Más felhasználók vannak bejelentkezve."
#. Translators: Remote here refers to a remote session, like a ssh login #. Translators: Remote here refers to a remote session, like a ssh login
#: js/ui/endSessionDialog.js:615 #: js/ui/endSessionDialog.js:614
#, javascript-format #, javascript-format
msgid "%s (remote)" msgid "%s (remote)"
msgstr "%s (távoli)" msgstr "%s (távoli)"
#. Translators: Console here refers to a tty like a VT console #. Translators: Console here refers to a tty like a VT console
#: js/ui/endSessionDialog.js:618 #: js/ui/endSessionDialog.js:617
#, javascript-format #, javascript-format
msgid "%s (console)" msgid "%s (console)"
msgstr "%s (konzol)" msgstr "%s (konzol)"
@@ -1294,26 +1285,26 @@ msgstr ""
"Letölti és telepíti a következőt az extensions.gnome.org webhelyről: „%s”?" "Letölti és telepíti a következőt az extensions.gnome.org webhelyről: „%s”?"
#. Translators: %s is an application name like "Settings" #. Translators: %s is an application name like "Settings"
#: js/ui/inhibitShortcutsDialog.js:78 #: js/ui/inhibitShortcutsDialog.js:50
#, javascript-format #, javascript-format
msgid "%s wants to inhibit shortcuts" msgid "%s wants to inhibit shortcuts"
msgstr "A(z) %s meg akarja gátolni a gyorsbillentyűk használatát" msgstr "A(z) %s meg akarja gátolni a gyorsbillentyűk használatát"
#: js/ui/inhibitShortcutsDialog.js:79 #: js/ui/inhibitShortcutsDialog.js:51
msgid "Application wants to inhibit shortcuts" msgid "Application wants to inhibit shortcuts"
msgstr "Az alkalmazás meg akarja gátolni a gyorsbillentyűk használatát" msgstr "Az alkalmazás meg akarja gátolni a gyorsbillentyűk használatát"
#. Translators: %s is a keyboard shortcut like "Super+x" #. Translators: %s is a keyboard shortcut like "Super+x"
#: js/ui/inhibitShortcutsDialog.js:88 #: js/ui/inhibitShortcutsDialog.js:60
#, javascript-format #, javascript-format
msgid "You can restore shortcuts by pressing %s." msgid "You can restore shortcuts by pressing %s."
msgstr "A(z) %s megnyomásával visszaállíthatja a gyorsbillentyűket." msgstr "A(z) %s megnyomásával visszaállíthatja a gyorsbillentyűket."
#: js/ui/inhibitShortcutsDialog.js:93 #: js/ui/inhibitShortcutsDialog.js:65
msgid "Deny" msgid "Deny"
msgstr "Tiltás" msgstr "Tiltás"
#: js/ui/inhibitShortcutsDialog.js:100 #: js/ui/inhibitShortcutsDialog.js:71
msgid "Allow" msgid "Allow"
msgstr "Engedélyezés" msgstr "Engedélyezés"
@@ -1364,13 +1355,13 @@ msgid "Leave On"
msgstr "Bekapcsolva hagyás" msgstr "Bekapcsolva hagyás"
#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133 #: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133
#: js/ui/status/network.js:1269 #: js/ui/status/network.js:1263
msgid "Turn On" msgid "Turn On"
msgstr "Bekapcsolás" msgstr "Bekapcsolás"
#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133 #: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133
#: js/ui/status/network.js:128 js/ui/status/network.js:311 #: js/ui/status/network.js:128 js/ui/status/network.js:310
#: js/ui/status/network.js:1269 js/ui/status/network.js:1381 #: js/ui/status/network.js:1263 js/ui/status/network.js:1375
#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 #: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79
#: js/ui/status/rfkill.js:106 #: js/ui/status/rfkill.js:106
msgid "Turn Off" msgid "Turn Off"
@@ -1380,7 +1371,7 @@ msgstr "Kikapcsolás"
msgid "Leave Off" msgid "Leave Off"
msgstr "Kikapcsolva hagyás" msgstr "Kikapcsolva hagyás"
#: js/ui/keyboard.js:200 #: js/ui/keyboard.js:203
msgid "Region & Language Settings" msgid "Region & Language Settings"
msgstr "Területi és nyelvi beállítások" msgstr "Területi és nyelvi beállítások"
@@ -1432,7 +1423,7 @@ msgstr "Forrás megtekintése"
msgid "Web Page" msgid "Web Page"
msgstr "Weblap" msgstr "Weblap"
#: js/ui/messageTray.js:1479 #: js/ui/messageTray.js:1480
msgid "System Information" msgid "System Information"
msgstr "Rendszerinformációk" msgstr "Rendszerinformációk"
@@ -1510,38 +1501,47 @@ msgstr "Nyomja meg az Esc gombot a kilépéshez"
msgid "Press any key to exit" msgid "Press any key to exit"
msgstr "Nyomjon meg egy gombot a kilépéshez" msgstr "Nyomjon meg egy gombot a kilépéshez"
#: js/ui/panel.js:113 #: js/ui/panel.js:108
msgid "Quit" msgid "Quit"
msgstr "Kilépés" msgstr "Kilépés"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". #. in your language, you can use the word for "Overview".
#: js/ui/panel.js:468 #: js/ui/panel.js:471
msgid "Activities" msgid "Activities"
msgstr "Tevékenységek" msgstr "Tevékenységek"
#: js/ui/panel.js:743 #: js/ui/panel.js:746
msgctxt "System menu in the top bar" msgctxt "System menu in the top bar"
msgid "System" msgid "System"
msgstr "Rendszer" msgstr "Rendszer"
#: js/ui/panel.js:861 #: js/ui/panel.js:866
msgid "Top Bar" msgid "Top Bar"
msgstr "Felső sáv" msgstr "Felső sáv"
#: js/ui/runDialog.js:65 #. Translators: this MUST be either "toggle-switch-us"
#. (for toggle switches containing the English words
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches.
#: js/ui/popupMenu.js:285
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
#: js/ui/runDialog.js:64
msgid "Enter a Command" msgid "Enter a Command"
msgstr "Adjon meg egy parancsot" msgstr "Adjon meg egy parancsot"
#: js/ui/runDialog.js:105 js/ui/windowMenu.js:166 #: js/ui/runDialog.js:104 js/ui/windowMenu.js:166
msgid "Close" msgid "Close"
msgstr "Bezárás" msgstr "Bezárás"
#: js/ui/runDialog.js:267 #: js/ui/runDialog.js:266
msgid "Restart is not available on Wayland" msgid "Restart is not available on Wayland"
msgstr "Az újraindítás nem érhető el Wayland alatt" msgstr "Az újraindítás nem érhető el Wayland alatt"
#: js/ui/runDialog.js:272 #: js/ui/runDialog.js:271
msgid "Restarting…" msgid "Restarting…"
msgstr "Újraindítás…" msgstr "Újraindítás…"
@@ -1565,7 +1565,7 @@ msgid_plural "%d new notifications"
msgstr[0] "%d új értesítés" msgstr[0] "%d új értesítés"
msgstr[1] "%d új értesítés" msgstr[1] "%d új értesítés"
#: js/ui/screenShield.js:449 js/ui/status/system.js:271 #: js/ui/screenShield.js:449 js/ui/status/system.js:270
msgid "Lock" msgid "Lock"
msgstr "Zárolás" msgstr "Zárolás"
@@ -1580,11 +1580,11 @@ msgstr "A GNOME-nak zárolnia kell a képernyőt"
#. #.
#. XXX: another option is to kick the user into the gdm login #. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs #. screen, where we're not affected by grabs
#: js/ui/screenShield.js:826 js/ui/screenShield.js:1299 #: js/ui/screenShield.js:834 js/ui/screenShield.js:1307
msgid "Unable to lock" msgid "Unable to lock"
msgstr "Nem lehet zárolni" msgstr "Nem lehet zárolni"
#: js/ui/screenShield.js:827 js/ui/screenShield.js:1300 #: js/ui/screenShield.js:835 js/ui/screenShield.js:1308
msgid "Lock was blocked by an application" msgid "Lock was blocked by an application"
msgstr "A zárolást egy alkalmazás blokkolta" msgstr "A zárolást egy alkalmazás blokkolta"
@@ -1619,61 +1619,14 @@ msgstr "Szöveg megjelenítése"
msgid "Hide Text" msgid "Hide Text"
msgstr "Szöveg elrejtése" msgstr "Szöveg elrejtése"
#: js/ui/shellMountOperation.js:318 #: js/ui/shellMountOperation.js:296
msgid "Hidden Volume"
msgstr "Rejtett kötet"
#: js/ui/shellMountOperation.js:321
msgid "Windows System Volume"
msgstr "Windows rendszerkötet"
#: js/ui/shellMountOperation.js:324
msgid "Uses Keyfiles"
msgstr "Kulcsfájlokat használ"
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:330
#, javascript-format
msgid ""
"To unlock a volume that uses keyfiles, use the <i>%s</i> utility instead."
msgstr ""
"A kulcsfájlokat használó kötetek feloldásához használja inkább a(z) <i>%s</i> "
"segédprogramot."
#: js/ui/shellMountOperation.js:337
msgid "PIM Number"
msgstr "PIM-szám"
#: js/ui/shellMountOperation.js:355
msgid "The PIM must be a number or empty."
msgstr "A PIM-nek számnak vagy üresnek kell lennie."
#: js/ui/shellMountOperation.js:366
msgid "Password" msgid "Password"
msgstr "Jelszó" msgstr "Jelszó"
#: js/ui/shellMountOperation.js:396 #: js/ui/shellMountOperation.js:317
msgid "Remember Password" msgid "Remember Password"
msgstr "Jelszó megjegyzése" msgstr "Jelszó megjegyzése"
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:418
#, javascript-format
msgid "Open %s"
msgstr "%s megnyitása"
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:490
#, javascript-format
msgid "Unable to start %s"
msgstr "A(z) %s nem indítható el"
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:492
#, javascript-format
msgid "Couldnt find the %s application"
msgstr "Nem sikerült megtalálni a(z) %s alkalmazást"
#: js/ui/status/accessibility.js:35 #: js/ui/status/accessibility.js:35
msgid "Accessibility" msgid "Accessibility"
msgstr "Akadálymentesítés" msgstr "Akadálymentesítés"
@@ -1710,11 +1663,11 @@ msgstr "Billentyűszűrés"
msgid "Mouse Keys" msgid "Mouse Keys"
msgstr "Egérbillentyűk" msgstr "Egérbillentyűk"
#: js/ui/status/accessibility.js:135 #: js/ui/status/accessibility.js:151
msgid "High Contrast" msgid "High Contrast"
msgstr "Nagy kontraszt" msgstr "Nagy kontraszt"
#: js/ui/status/accessibility.js:177 #: js/ui/status/accessibility.js:182
msgid "Large Text" msgid "Large Text"
msgstr "Nagy szöveg" msgstr "Nagy szöveg"
@@ -1722,7 +1675,7 @@ msgstr "Nagy szöveg"
msgid "Bluetooth" msgid "Bluetooth"
msgstr "Bluetooth" msgstr "Bluetooth"
#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:586 #: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585
msgid "Bluetooth Settings" msgid "Bluetooth Settings"
msgstr "Bluetooth-beállítások" msgstr "Bluetooth-beállítások"
@@ -1746,11 +1699,11 @@ msgstr "Be"
msgid "Brightness" msgid "Brightness"
msgstr "Fényerő" msgstr "Fényerő"
#: js/ui/status/keyboard.js:813 #: js/ui/status/keyboard.js:812
msgid "Keyboard" msgid "Keyboard"
msgstr "Billentyűzet" msgstr "Billentyűzet"
#: js/ui/status/keyboard.js:835 #: js/ui/status/keyboard.js:834
msgid "Show Keyboard Layout" msgid "Show Keyboard Layout"
msgstr "Billentyűzetkiosztás megjelenítése" msgstr "Billentyűzetkiosztás megjelenítése"
@@ -1779,12 +1732,12 @@ msgid "Enable"
msgstr "Engedélyezés" msgstr "Engedélyezés"
#. Translators: %s is an application name #. Translators: %s is an application name
#: js/ui/status/location.js:355 #: js/ui/status/location.js:353
#, javascript-format #, javascript-format
msgid "Give %s access to your location?" msgid "Give %s access to your location?"
msgstr "Elérheti a(z) %s a földrajzi hely adatait?" msgstr "Elérheti a(z) %s a földrajzi hely adatait?"
#: js/ui/status/location.js:356 #: js/ui/status/location.js:354
msgid "Location access can be changed at any time from the privacy settings." msgid "Location access can be changed at any time from the privacy settings."
msgstr "" msgstr ""
"A hely hozzáférése bármikor megváltoztatható az adatvédelmi beállításokban." "A hely hozzáférése bármikor megváltoztatható az adatvédelmi beállításokban."
@@ -1794,13 +1747,13 @@ msgid "<unknown>"
msgstr "<ismeretlen>" msgstr "<ismeretlen>"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:417 js/ui/status/network.js:1298 #: js/ui/status/network.js:416 js/ui/status/network.js:1292
#, javascript-format #, javascript-format
msgid "%s Off" msgid "%s Off"
msgstr "%s ki" msgstr "%s ki"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:420 #: js/ui/status/network.js:419
#, javascript-format #, javascript-format
msgid "%s Connected" msgid "%s Connected"
msgstr "%s kapcsolódva" msgstr "%s kapcsolódva"
@@ -1808,189 +1761,189 @@ msgstr "%s kapcsolódva"
#. Translators: this is for network devices that are physically present but are not #. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu); #. under NetworkManager's control (and thus cannot be used in the menu);
#. %s is a network identifier #. %s is a network identifier
#: js/ui/status/network.js:425 #: js/ui/status/network.js:424
#, javascript-format #, javascript-format
msgid "%s Unmanaged" msgid "%s Unmanaged"
msgstr "%s felügyeletlen" msgstr "%s felügyeletlen"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:428 #: js/ui/status/network.js:427
#, javascript-format #, javascript-format
msgid "%s Disconnecting" msgid "%s Disconnecting"
msgstr "%s leválasztása" msgstr "%s leválasztása"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:435 js/ui/status/network.js:1290 #: js/ui/status/network.js:434 js/ui/status/network.js:1284
#, javascript-format #, javascript-format
msgid "%s Connecting" msgid "%s Connecting"
msgstr "%s kapcsolódás" msgstr "%s kapcsolódás"
#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier #. Translators: this is for network connections that require some kind of key or password; %s is a network identifier
#: js/ui/status/network.js:438 #: js/ui/status/network.js:437
#, javascript-format #, javascript-format
msgid "%s Requires Authentication" msgid "%s Requires Authentication"
msgstr "%s hitelesítést igényel" msgstr "%s hitelesítést igényel"
#. Translators: this is for devices that require some kind of firmware or kernel #. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing; %s is a network identifier #. module, which is missing; %s is a network identifier
#: js/ui/status/network.js:446 #: js/ui/status/network.js:445
#, javascript-format #, javascript-format
msgid "Firmware Missing For %s" msgid "Firmware Missing For %s"
msgstr "Hiányzó firmware ennél: %s" msgstr "Hiányzó firmware ennél: %s"
#. Translators: this is for a network device that cannot be activated (for example it #. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage; %s is a network identifier #. is disabled by rfkill, or it has no coverage; %s is a network identifier
#: js/ui/status/network.js:450 #: js/ui/status/network.js:449
#, javascript-format #, javascript-format
msgid "%s Unavailable" msgid "%s Unavailable"
msgstr "%s nem érhető el" msgstr "%s nem érhető el"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:453 #: js/ui/status/network.js:452
#, javascript-format #, javascript-format
msgid "%s Connection Failed" msgid "%s Connection Failed"
msgstr "%s kapcsolódás meghiúsult" msgstr "%s kapcsolódás meghiúsult"
#: js/ui/status/network.js:465 #: js/ui/status/network.js:464
msgid "Wired Settings" msgid "Wired Settings"
msgstr "Vezetékes beállítások" msgstr "Vezetékes beállítások"
#: js/ui/status/network.js:507 #: js/ui/status/network.js:506
msgid "Mobile Broadband Settings" msgid "Mobile Broadband Settings"
msgstr "Mobil széles sáv beállításai" msgstr "Mobil széles sáv beállításai"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:554 js/ui/status/network.js:1295 #: js/ui/status/network.js:553 js/ui/status/network.js:1289
#, javascript-format #, javascript-format
msgid "%s Hardware Disabled" msgid "%s Hardware Disabled"
msgstr "%s hardver letiltva" msgstr "%s hardver letiltva"
#. Translators: this is for a network device that cannot be activated #. Translators: this is for a network device that cannot be activated
#. because it's disabled by rfkill (airplane mode); %s is a network identifier #. because it's disabled by rfkill (airplane mode); %s is a network identifier
#: js/ui/status/network.js:558 #: js/ui/status/network.js:557
#, javascript-format #, javascript-format
msgid "%s Disabled" msgid "%s Disabled"
msgstr "%s letiltva" msgstr "%s letiltva"
#: js/ui/status/network.js:598 #: js/ui/status/network.js:597
msgid "Connect to Internet" msgid "Connect to Internet"
msgstr "Kapcsolódás az internetre" msgstr "Kapcsolódás az internetre"
#: js/ui/status/network.js:792 #: js/ui/status/network.js:786
msgid "Airplane Mode is On" msgid "Airplane Mode is On"
msgstr "Repülőgép mód be" msgstr "Repülőgép mód be"
#: js/ui/status/network.js:793 #: js/ui/status/network.js:787
msgid "Wi-Fi is disabled when airplane mode is on." msgid "Wi-Fi is disabled when airplane mode is on."
msgstr "A Wi-Fi ki van kapcsolva repülőgép üzemmódban." msgstr "A Wi-Fi ki van kapcsolva repülőgép üzemmódban."
#: js/ui/status/network.js:794 #: js/ui/status/network.js:788
msgid "Turn Off Airplane Mode" msgid "Turn Off Airplane Mode"
msgstr "Repülőgép mód ki" msgstr "Repülőgép mód ki"
#: js/ui/status/network.js:803 #: js/ui/status/network.js:797
msgid "Wi-Fi is Off" msgid "Wi-Fi is Off"
msgstr "Wi-Fi ki" msgstr "Wi-Fi ki"
#: js/ui/status/network.js:804 #: js/ui/status/network.js:798
msgid "Wi-Fi needs to be turned on in order to connect to a network." msgid "Wi-Fi needs to be turned on in order to connect to a network."
msgstr "A Wi-Fi-t be kell kapcsolni a hálózatra kapcsolódáshoz." msgstr "A Wi-Fi-t be kell kapcsolni a hálózatra kapcsolódáshoz."
#: js/ui/status/network.js:805 #: js/ui/status/network.js:799
msgid "Turn On Wi-Fi" msgid "Turn On Wi-Fi"
msgstr "Wi-Fi bekapcsolása" msgstr "Wi-Fi bekapcsolása"
#: js/ui/status/network.js:830 #: js/ui/status/network.js:824
msgid "Wi-Fi Networks" msgid "Wi-Fi Networks"
msgstr "Wi-Fi hálózatok" msgstr "Wi-Fi hálózatok"
#: js/ui/status/network.js:832 #: js/ui/status/network.js:826
msgid "Select a network" msgid "Select a network"
msgstr "Válasszon egy hálózatot" msgstr "Válasszon egy hálózatot"
#: js/ui/status/network.js:861 #: js/ui/status/network.js:855
msgid "No Networks" msgid "No Networks"
msgstr "Nincs hálózat" msgstr "Nincs hálózat"
#: js/ui/status/network.js:882 js/ui/status/rfkill.js:104 #: js/ui/status/network.js:876 js/ui/status/rfkill.js:104
msgid "Use hardware switch to turn off" msgid "Use hardware switch to turn off"
msgstr "A hardveres kapcsolóval kapcsolja ki" msgstr "A hardveres kapcsolóval kapcsolja ki"
#: js/ui/status/network.js:1158 #: js/ui/status/network.js:1152
msgid "Select Network" msgid "Select Network"
msgstr "Válasszon hálózatot" msgstr "Válasszon hálózatot"
#: js/ui/status/network.js:1164 #: js/ui/status/network.js:1158
msgid "Wi-Fi Settings" msgid "Wi-Fi Settings"
msgstr "Wi-Fi beállítások" msgstr "Wi-Fi beállítások"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:1286 #: js/ui/status/network.js:1280
#, javascript-format #, javascript-format
msgid "%s Hotspot Active" msgid "%s Hotspot Active"
msgstr "%s hotspot aktív" msgstr "%s hotspot aktív"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:1301 #: js/ui/status/network.js:1295
#, javascript-format #, javascript-format
msgid "%s Not Connected" msgid "%s Not Connected"
msgstr "%s nincs kapcsolódva" msgstr "%s nincs kapcsolódva"
#: js/ui/status/network.js:1398 #: js/ui/status/network.js:1392
msgid "connecting…" msgid "connecting…"
msgstr "kapcsolódás…" msgstr "kapcsolódás…"
#. Translators: this is for network connections that require some kind of key or password #. Translators: this is for network connections that require some kind of key or password
#: js/ui/status/network.js:1401 #: js/ui/status/network.js:1395
msgid "authentication required" msgid "authentication required"
msgstr "hitelesítés szükséges" msgstr "hitelesítés szükséges"
#: js/ui/status/network.js:1403 #: js/ui/status/network.js:1397
msgid "connection failed" msgid "connection failed"
msgstr "a kapcsolódás meghiúsult" msgstr "a kapcsolódás meghiúsult"
#: js/ui/status/network.js:1453 #: js/ui/status/network.js:1447
msgid "VPN Settings" msgid "VPN Settings"
msgstr "VPN beállítások" msgstr "VPN beállítások"
#: js/ui/status/network.js:1470 #: js/ui/status/network.js:1464
msgid "VPN" msgid "VPN"
msgstr "VPN" msgstr "VPN"
#: js/ui/status/network.js:1480 #: js/ui/status/network.js:1474
msgid "VPN Off" msgid "VPN Off"
msgstr "VPN ki" msgstr "VPN ki"
#: js/ui/status/network.js:1541 js/ui/status/rfkill.js:82 #: js/ui/status/network.js:1535 js/ui/status/rfkill.js:82
msgid "Network Settings" msgid "Network Settings"
msgstr "Hálózati beállítások" msgstr "Hálózati beállítások"
#: js/ui/status/network.js:1570 #: js/ui/status/network.js:1564
#, javascript-format #, javascript-format
msgid "%s Wired Connection" msgid "%s Wired Connection"
msgid_plural "%s Wired Connections" msgid_plural "%s Wired Connections"
msgstr[0] "%s vezetékes kapcsolat" msgstr[0] "%s vezetékes kapcsolat"
msgstr[1] "%s vezetékes kapcsolat" msgstr[1] "%s vezetékes kapcsolat"
#: js/ui/status/network.js:1574 #: js/ui/status/network.js:1568
#, javascript-format #, javascript-format
msgid "%s Wi-Fi Connection" msgid "%s Wi-Fi Connection"
msgid_plural "%s Wi-Fi Connections" msgid_plural "%s Wi-Fi Connections"
msgstr[0] "%s Wi-Fi kapcsolat" msgstr[0] "%s Wi-Fi kapcsolat"
msgstr[1] "%s Wi-Fi kapcsolat" msgstr[1] "%s Wi-Fi kapcsolat"
#: js/ui/status/network.js:1578 #: js/ui/status/network.js:1572
#, javascript-format #, javascript-format
msgid "%s Modem Connection" msgid "%s Modem Connection"
msgid_plural "%s Modem Connections" msgid_plural "%s Modem Connections"
msgstr[0] "%s modemes kapcsolat" msgstr[0] "%s modemes kapcsolat"
msgstr[1] "%s modemes kapcsolat" msgstr[1] "%s modemes kapcsolat"
#: js/ui/status/network.js:1711 #: js/ui/status/network.js:1701
msgid "Connection failed" msgid "Connection failed"
msgstr "Kapcsolódás meghiúsult" msgstr "Kapcsolódás meghiúsult"
#: js/ui/status/network.js:1712 #: js/ui/status/network.js:1702
msgid "Activation of network connection failed" msgid "Activation of network connection failed"
msgstr "A hálózati kapcsolat aktiválása meghiúsult" msgstr "A hálózati kapcsolat aktiválása meghiúsult"
@@ -2037,7 +1990,7 @@ msgstr "%d%02d van hátra (%d%%)"
#. Translators: this is <hours>:<minutes> Until Full (<percentage>) #. Translators: this is <hours>:<minutes> Until Full (<percentage>)
#: js/ui/status/power.js:89 #: js/ui/status/power.js:89
#, javascript-format #, javascript-format
msgid "%d%02d Until Full (%d%%)" msgid "%d%02d Until Full (%d%%)"
msgstr "Töltésidő: %d%02d (%d%%)" msgstr "Töltésidő: %d%02d (%d%%)"
#: js/ui/status/power.js:117 js/ui/status/power.js:119 #: js/ui/status/power.js:117 js/ui/status/power.js:119
@@ -2072,15 +2025,15 @@ msgstr "Kijelentkezés"
msgid "Account Settings" msgid "Account Settings"
msgstr "Fiókbeállítások" msgstr "Fiókbeállítások"
#: js/ui/status/system.js:256 #: js/ui/status/system.js:255
msgid "Orientation Lock" msgid "Orientation Lock"
msgstr "Tájolás zárolása" msgstr "Tájolás zárolása"
#: js/ui/status/system.js:282 #: js/ui/status/system.js:281
msgid "Suspend" msgid "Suspend"
msgstr "Felfüggesztés" msgstr "Felfüggesztés"
#: js/ui/status/system.js:292 #: js/ui/status/system.js:291
msgid "Power Off" msgid "Power Off"
msgstr "Kikapcsolás" msgstr "Kikapcsolás"
@@ -2172,22 +2125,22 @@ msgstr "Oldalsáv"
msgid "“%s” is ready" msgid "“%s” is ready"
msgstr "„%s” kész" msgstr "„%s” kész"
#: js/ui/windowManager.js:54 #: js/ui/windowManager.js:53
msgid "Do you want to keep these display settings?" msgid "Do you want to keep these display settings?"
msgstr "Meg szeretné tartani ezeket a kijelzőbeállításokat?" msgstr "Meg szeretné tartani ezeket a kijelzőbeállításokat?"
#. Translators: this and the following message should be limited in length, #. Translators: this and the following message should be limited in lenght,
#. to avoid ellipsizing the labels. #. to avoid ellipsizing the labels.
#. #.
#: js/ui/windowManager.js:66 #: js/ui/windowManager.js:65
msgid "Revert Settings" msgid "Revert Settings"
msgstr "Beállítások visszavonása" msgstr "Beállítások visszavonása"
#: js/ui/windowManager.js:69 #: js/ui/windowManager.js:68
msgid "Keep Changes" msgid "Keep Changes"
msgstr "Módosítások megtartása" msgstr "Módosítások megtartása"
#: js/ui/windowManager.js:87 #: js/ui/windowManager.js:86
#, javascript-format #, javascript-format
msgid "Settings changes will revert in %d second" msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds" msgid_plural "Settings changes will revert in %d seconds"
@@ -2196,7 +2149,7 @@ msgstr[1] "A beállítások módosításai %d másodperc múlva visszavonásra k
#. Translators: This represents the size of a window. The first number is #. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height. #. * the width of the window and the second is the height.
#: js/ui/windowManager.js:678 #: js/ui/windowManager.js:662
#, javascript-format #, javascript-format
msgid "%d × %d" msgid "%d × %d"
msgstr "%d × %d" msgstr "%d × %d"
@@ -2269,6 +2222,11 @@ msgstr "Áthelyezés a jobb oldali kijelzőre"
msgid "Evolution Calendar" msgid "Evolution Calendar"
msgstr "Evolution naptár" msgstr "Evolution naptár"
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
#: src/calendar-server/evolution-calendar.desktop.in:6
msgid "evolution"
msgstr "evolution"
#: src/main.c:408 #: src/main.c:408
msgid "Print version" msgid "Print version"
msgstr "Verzió kiírása" msgstr "Verzió kiírása"
@@ -2286,21 +2244,21 @@ msgstr ""
msgid "List possible modes" msgid "List possible modes"
msgstr "Lehetséges módok listázása" msgstr "Lehetséges módok listázása"
#: src/shell-app.c:264 #: src/shell-app.c:260
msgctxt "program" msgctxt "program"
msgid "Unknown" msgid "Unknown"
msgstr "Ismeretlen" msgstr "Ismeretlen"
#: src/shell-app.c:515 #: src/shell-app.c:511
#, c-format #, c-format
msgid "Failed to launch “%s”" msgid "Failed to launch “%s”"
msgstr "„%s” indítása meghiúsult" msgstr "„%s” indítása meghiúsult"
#: src/shell-keyring-prompt.c:731 #: src/shell-keyring-prompt.c:730
msgid "Passwords do not match." msgid "Passwords do not match."
msgstr "A jelszavak nem egyeznek." msgstr "A jelszavak nem egyeznek."
#: src/shell-keyring-prompt.c:739 #: src/shell-keyring-prompt.c:738
msgid "Password cannot be blank" msgid "Password cannot be blank"
msgstr "A jelszó nem lehet üres" msgstr "A jelszó nem lehet üres"

460
po/id.po

File diff suppressed because it is too large Load Diff

1040
po/is.po

File diff suppressed because it is too large Load Diff

487
po/nl.po

File diff suppressed because it is too large Load Diff

View File

@@ -295,13 +295,13 @@ create_client_for_source (ESource *source,
CalendarSourceData *source_data) CalendarSourceData *source_data)
{ {
ClientData *data; ClientData *data;
EClient *client; ECalClient *client;
GError *error = NULL; GError *error = NULL;
client = g_hash_table_lookup (source_data->clients, source); client = g_hash_table_lookup (source_data->clients, source);
g_return_if_fail (client == NULL); g_return_if_fail (client == NULL);
client = e_cal_client_connect_sync (source, source_type, -1, NULL, &error); client = e_cal_client_new (source, source_type, &error);
if (!client) if (!client)
{ {
g_warning ("Could not load source '%s': %s", g_warning ("Could not load source '%s': %s",
@@ -312,7 +312,7 @@ create_client_for_source (ESource *source,
} }
data = g_slice_new0 (ClientData); data = g_slice_new0 (ClientData);
data->client = E_CAL_CLIENT (client); /* takes ownership */ data->client = client; /* takes ownership */
data->backend_died_id = g_signal_connect (client, data->backend_died_id = g_signal_connect (client,
"backend-died", "backend-died",
G_CALLBACK (backend_died_cb), G_CALLBACK (backend_died_cb),

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