Compare commits

...

88 Commits

Author SHA1 Message Date
Allan Day
1b4062c931 theme: Standardise text styles
Initial attempt to use standard text styles, in line with what's
being done for GTK (https://gitlab.gnome.org/GNOME/gtk/issues/1808).

This is just changing the sizes and weights for now. Spacing
adjustments will be required further down the line.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/594
2019-06-25 14:28:49 +02:00
Florian Müllner
8864816b94 Bump version to 3.33.3
Update NEWS.
2019-06-24 19:19:04 +02:00
Christian Hergert
751cd2f1c1 main: setup GJS profiler when GJS_TRACE_FD is set
This is the same environment variable that will be used in GJS to auto-
connect Sysprof to the GJS profiler when the gjs binary is used.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/573
2019-06-24 15:05:46 +00:00
Jakub Steiner
6f6b6fb9d6 Merge branch 'wip/jimmac/sync-with-adwaita' 2019-06-24 15:39:26 +02:00
Jordi Mas
fe346b89f0 Update Catalan translation 2019-06-23 09:48:21 +02:00
Goran Vidović
0744c6af2e Update Croatian translation 2019-06-21 23:56:14 +00:00
Florian Müllner
2e070ab834 panel: Center-align menu arrows
Center alignment looks more balanced and makes it more likely that
the menu opens below the pointer position.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1351
2019-06-21 21:09:56 +00:00
Jonas Dreßler
00f9b7bf69 layout: Use addChrome instead of addTopChrome for screenShieldGroup
Make sure the panel is visible above the login and screen shield actors
by adding the screenShieldGroup to the uiGroup underneath the panelBox.

This fixes a regression introduced with 2bd80579ed

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

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/571
2019-06-21 20:57:23 +00:00
Will Thompson
94ba52af0c network: don't assume NMActiveConnection has a device
In practice this has been seen to fail:

    JS ERROR: TypeError: active.get_devices(...)[0] is undefined
    ensureActiveConnectionProps@resource:///org/gnome/shell/ui/status/network.js:73:22
    _getMainConnection@resource:///org/gnome/shell/ui/status/network.js:1791:13
    _syncMainConnection@resource:///org/gnome/shell/ui/status/network.js:1809:32

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1406
2019-06-21 11:26:53 +01:00
Frederik Feichtmeier
44e1a6ce06 Theme: update to sync with gtk Adwaita
- consistent OSD colors
- consistent fg/bg colors
- updated rounded corners
- switches

Fixes https://gitlab.gnome.org/GNOME/gnome-shell/issues/841
2019-06-21 10:44:08 +02:00
Niels De Graef
ccf646f54a Drop CoglError for GError
From https://gitlab.gnome.org/GNOME/mutter/merge_requests/631

```
CoglError was added at a certain point to remove the hard dependency on
GLib, but since this can't be avoided inside mutter, let's remove this
whole abstraction.
```

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/586
2019-06-20 16:30:40 +02:00
Marco Trevisan (Treviño)
4e84b46c9b keyboard: Add extended keys and language popups to top window group
As per commit 2bd80579ed important actors are added to the top window group
using the layout's addTopChrome method.

This group includes the on-screen keyboard, however its popups were not added
and so they are now shown under the OSK and don't receive any input.

Fix this by adding Language popup and extended keys popup to top chrome.

Fixes https://gitlab.gnome.org/GNOME/gnome-shell/issues/1396
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/583
2019-06-19 00:30:17 +02:00
Florian Müllner
b4797956c7 iconGrid: Fix animation glitch
Since commit 520cea9394, the opacity of icon grid children is used
both to skip children outside the current viewport and to hide the
real icons while animating icon clones.

As a result, a grid animation during an animation now ends up showing the
icons that are being animated. Avoid that glitch by leaving children's
opacity alone when there's an ongoing animation.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/582
2019-06-18 22:03:34 +00:00
Marco Trevisan (Treviño)
c1c45f95af appDisplay: Set Adjustment value after allocation
AllView's adaptToSize is called as part of viewStack allocation vfunc, and this
makes the adjustment value to be reset while relayouting.

So, fix this by delaying this using the Meta later that we already had for
pageIndicators operations.

Fixes: https://gitlab.gnome.org/GNOME/gnome-shell/issues/1392
2019-06-18 23:22:32 +02:00
Nathan Follens
ac09e0110a Update Dutch translation 2019-06-18 08:33:32 +00:00
Iain Lane
0e37cd2ec9 main, LoginManager: Call GDM's RegisterSession()
So that it can know if we started up properly and use that to (e.g.)
kill its greeter.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/570
2019-06-18 09:21:58 +01:00
Marco Trevisan (Treviño)
76dc77f617 boxpointer: Remove deprecated show/hide methods
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/576
2019-06-17 14:22:42 +02:00
Marco Trevisan (Treviño)
cb4c0d32c0 boxpointer: Trigger a relayout when setting position
Since the repositioning is now done during allocation, we can just queue
a relayout when setting the boxpointer positioning via the source actor.

As per this _relayout() and _updateFlip now needs to be called during allocation
only and with an allocation box set.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/576
2019-06-17 14:22:40 +02:00
Marco Trevisan (Treviño)
3d4ba028c4 boxpointer: Don't trigger a relayout when updating arrow side
Changing the arrow side might need to reposition the boxpointer, however
if this happens during allocation, we don't need to trigger a new relayout since
we'd set the new allocation once _updateFlip's _reposition call is terminated,
otherwise if the position has changed, changing the boxpointer coordinates
will trigger a relayout anyways.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/576
2019-06-17 14:22:19 +02:00
Marco Trevisan (Treviño)
5481c1899f boxpointer: Don't set actor position during allocation
As per commit 044572cb60 boxpointer uses its own coordinates to position itself.
However this would lead to warning when mutter-clutter is compiled with debug
options as we'd might try to set the box coordinates during the allocation
cycle.

So, when calling _reposition during allocation, instead of setting the actor's
coordinates we just pass the allocation box and we adjust its origin, in order
to set it properly in the vfunc.

Fixes https://gitlab.gnome.org/GNOME/gnome-shell/issues/1382
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/576
2019-06-17 14:22:18 +02:00
Marco Trevisan (Treviño)
2fd120162f 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
2019-06-17 12:39:26 +02:00
Florian Müllner
523ba5a719 shell: Remove shell_global_structured_log()
It is now unused.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/579
2019-06-15 15:26:17 +02:00
Florian Müllner
07d25cd69d main: Use GLib's structured logging support
We still use our own copy of a libgsystem method for structured
logging, but since then GLib has gained (introspectable) API for
that functionality, so switch to that.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/579
2019-06-15 15:26:17 +02:00
Marco Trevisan (Treviño)
520cea9394 iconGrid: Don't hide children inside allocation loop
Hiding a child implies a parent reallocation, and IconGrid does it for the
children that doesn't fit in the available space, but this could lead to an
allocation recursion cycle. This has been introduced by commit 0e0574a0 to
reduce CPU usage not to using JS vfuncs.

To avoid this, toggle the children opacity instead so that we can achieve the
same visibility result, without any reallocation need.
In this way we also fix the case where hidden children can be shown again,
as _getVisibleChildren doesn't filter-out transparent ones, restoring the
pre-commit 0e0574a0 behavior.

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

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/559
2019-06-15 12:31:50 +00:00
Laurent Bigonville
58c4212cfa shell-app: Fix spelling error
https://gitlab.gnome.org/GNOME/gnome-shell/issues/1205
2019-06-15 12:08:40 +02:00
Marco Trevisan (Treviño)
7059e31f6a background: Group 'changed' signal emission
Background is monitoring the whole `org.gnome.desktop.background` gsettings keys
for changes connecting to the non-specialized 'changed' signal and re-emitting
this as-is.
This means that when the background is changed via control-center, we get
multiple 'changed' signal events from GSettings, and for each one of this we
recreate a Background and a BackgroundActor.

Avoid this by using an idle to delay the emission of the 'changed' signal
grouping the events.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/558
2019-06-14 12:24:20 +00:00
Marco Trevisan (Treviño)
a9234f7631 background: Use Garbage Collector to dispose background
The same Meta.Background could be used by multiple instances of background
actors, and so should not be disposed when the actor using it is destroyed.

Instead of calling `run_dispose` directly on it, just nullify the reference
on destroy method, leaving the job of doing the proper disposition to the
gabage collector that keeps the proper reference count on the Meta.Background.

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

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/558
2019-06-14 12:24:20 +00:00
Kukuh Syafaat
1e5a8b0cd7 Update Indonesian translation 2019-06-14 10:36:04 +00:00
Fabio Tomat
5ef343f245 Update Friulian translation 2019-06-11 09:26:26 +00:00
Daniel Mustieles
22e33b4c47 Updated Spanish translation 2019-06-10 12:05:19 +02:00
Olivier Fourdan
5ace4682bf accessibility: Add pointer accessibility support
Adds the UI part for the pointer accessibility features.

The various timeouts running are notified using a pie-timer showing
under the pointer.

For dwell-click type selection, we use a drop-down menu. Users can
use the dwell-click to select the next type of dwell click to be
emitted.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/474
2019-06-06 09:13:29 +02:00
Olivier Fourdan
14d9839ed3 theme: Add pointer accessibility resources
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/474
2019-06-06 09:13:29 +02:00
Cosimo Cecchi
3b6fae582b sessionMode: add a property to disable window manager menus
We will use this to disable menus in the initial-setup session.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/569
2019-06-06 01:25:04 +00:00
Simon Schampijer
3cbdf4f9a5 remoteSearch: exclude content from hidden apps
Some apps may be configured as NoDisplay=true, but still install
a search provider.
Like we do elsewhere, exclude them from showing up in the UI.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/568
2019-06-05 16:15:42 -07:00
Florian Müllner
d8825e0d12 shell: Stop using anchor point
Since the removal of the old (pre-3.16) message tray, legacy tray icons
are very unlikely to be placed in a container that is animated using the
deprecated anchor point.

Just assume that the regular stage position is good enough.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/572
2019-06-05 17:59:51 +00:00
Florian Müllner
3c5fea59df st: Stop using (deprecated) ClutterAnimation
Instead, make StAdjustment a ClutterAnimatable and use a property
transition.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/572
2019-06-05 17:59:51 +00:00
Olivier Fourdan
443c8347ea locatePointer: Add implementation in gnome-shell
The "locate pointer" functionality was implemented in gnome settings
daemon using X11 protocols and would fail when run under Wayland.

With Wayland, there is no global coordinate space exposed to the clients
so this functionality cannot be implemented as a separate program.

Instead, add the "locate pointer" functionality in gnome-shell so that
it works in both X11 and Wayland.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/981
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/413
https://gitlab.gnome.org/GNOME/mutter/merge_requests/453
https://gitlab.gnome.org/GNOME/gsettings-desktop-schemas/merge_requests/19
https://gitlab.gnome.org/GNOME/gnome-settings-daemon/merge_requests/86
2019-06-05 08:15:10 +00:00
Olivier Fourdan
ee3f52c097 layout: Use the ripples for overview
As we moved the ripples implementation different class of its own, use
that for switching to overview.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/981
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/413
https://gitlab.gnome.org/GNOME/mutter/merge_requests/453
https://gitlab.gnome.org/GNOME/gsettings-desktop-schemas/merge_requests/19
https://gitlab.gnome.org/GNOME/gnome-settings-daemon/merge_requests/86
2019-06-05 08:15:10 +00:00
Olivier Fourdan
4b01bb6f99 ripples: Add a new class ripples
So we can use the same code for both the ripples in overview and the
pointer location.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/981
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/413
https://gitlab.gnome.org/GNOME/mutter/merge_requests/453
https://gitlab.gnome.org/GNOME/gsettings-desktop-schemas/merge_requests/19
https://gitlab.gnome.org/GNOME/gnome-settings-daemon/merge_requests/86
2019-06-05 08:15:10 +00:00
Daniel Mustieles
27ef8154dc Updated Spanish translation 2019-06-03 12:25:50 +02:00
Balázs Meskó
0a7e717e0e Update Hungarian translation 2019-06-01 11:17:41 +00:00
Kukuh Syafaat
2d2824b947 Update Indonesian translation 2019-05-31 03:52:30 +00:00
Cosimo Cecchi
40c2a403ac search: reload search providers when installed applications change
Otherwise, a shell restart will be required after installing a new
application, before its results can be seen in search.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/562
2019-05-29 20:33:16 +00:00
Marco Trevisan (Treviño)
238b87d386 grabHelper: Throw an error if the owner is not an actor
Starting from commit 7bb84dae, GrabHelper requires the owner to be an Actor as
we pass this to pushModal that assumes it to be as well.

So check that GrabHelper owner is an actor and throws an error if it is not the
case. This helps in tracking down issues such as gnome-shell-extensions!68

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/565
2019-05-29 15:13:00 -05:00
Marco Trevisan (Treviño)
8c01d341c7 PopupMenuManager: Remove unneeded _owner reference
Nothing inside PopupMenuManager is using the owner, while a reference of it is
already owned by the GrabHelper, so remove this dead property.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/565
2019-05-29 15:13:00 -05:00
Florian Müllner
866629b3d3 windowManager: Disable favorite shortcuts without overview
The `switch-to-application-n` shortcuts are essentially "launch the nth
app in the dash" actions, so they are at the very least confusing when
the dash isn't available because the overview itself is disabled (for
example in initial-setup mode).

So disable the shortcuts when the overview is disabled, but delegate the
decision to a separate function so that extensions like 'panel-favorites'
which expose favorites by some other means can easily re-enable them.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1333
2019-05-29 20:03:59 +00:00
Marco Trevisan (Treviño)
2b3ab3ecec windowMenu: Do actions requiring grab once ungrabbed
Resizing or moving a window needs starting a keyboard grab. However, if the
action is triggered by a menu entry activation it might not work as we already
have already an active grab on input devices to manage the menu itself.

So, possibly wait maximum 100ms for the current grab operation to be completed
before trying go start a new one.

Needs https://gitlab.gnome.org/GNOME/mutter/merge_requests/596
Fixes https://gitlab.gnome.org/GNOME/gnome-shell/issues/1326

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/557
2019-05-29 12:04:26 -05:00
Marco Trevisan (Treviño)
759120b95f popupMenu: Connect after to item 'activate' signal
A menu item activation might lead to a call to `itemActivated` which eventually
will close the menu which leads to a `PopupMenu.removeAll` that destroys all the
items, stopping the emission of the 'activate' signal for them.

Before commit 4258ae3e this was not happening because destroy'ing a javascript
object wasn't really disposing it and thus stopping the signal emissions.

So, ensure that `itemActivated` is called after that all the other callbacks
have been consumed, and so that the menu is closed as last thing.

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

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/557
2019-05-29 12:04:26 -05:00
Robert Mader
de0e21612c meson: Do not add compiler flags if 'plain' buildtype is used
That is how the 'plain' buildtype is meant in meson.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/464
2019-05-29 17:14:56 +02:00
Robert Mader
83e83444db meson: Add some compiler arguments to debug builds
To get better debug information.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/464
2019-05-29 17:14:56 +02:00
Piotr Drąg
5060aee7b2 shellMountOperation: Use a Unicode apostrophe in a new string
See https://developer.gnome.org/hig/stable/typography.html
2019-05-28 19:14:19 +02:00
Cosimo Cecchi
12bace2721 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-05-27 08:36:17 -07:00
Cosimo Cecchi
2c45b5416e 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-05-27 08:36:11 -07:00
Cosimo Cecchi
96c2473317 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-05-27 08:36:05 -07:00
Cosimo Cecchi
6359d6ef30 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-05-27 08:35:56 -07:00
Marco Trevisan (Treviño)
2f6323afc2 modalDialog: Use a Gobject property to manage the state
Make the state read-only while add a "private" function to set it and notify
when it changes.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/55
2019-05-24 16:28:18 -05:00
Marco Trevisan (Treviño)
d25bcbc3a7 modalDialog: Inherit from St.Widget
Make the dialog a widget itself, removing the `_group` property used for
handling the actor.

Update all the inherited classes to be also GObject implementations, moving all
the signals to proper object ones.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/55
2019-05-24 16:27:25 -05:00
Carlos Garnacho
dd5d7d3b70 shell: Only initialize global->xdisplay on X11 compositors
This is just used to set up things that are relevant to X11 compositors
(XDND, XFixes input region). We can live with it unset on the wayland
compositor cases.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/378
2019-05-24 12:24:06 +02:00
Carlos Garnacho
771b1a0788 shell: Do not set XFixes input region on wayland compositors
This is just needed on the X11 compositor, wayland compositors are known
for handling their own input.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/378
2019-05-24 12:24:06 +02:00
Carlos Garnacho
5a9d094f3e shell: Use MetaDisplay input focus API
Replaces use of (now removed) MetaX11Display focus API (which happened to
work for wayland too).

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/378
2019-05-24 12:24:06 +02:00
Jonas Dreßler
9ca8433170 network: Make NMWirelessDialogItem a subclass of St.BoxLayout
In commit 41dd744b74 this item was
confused with a popup menu item. To fix this, make NMWirelessDialogItem
inherit from St.BoxLayout instead of adding the item.actor variable back
again.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/551
2019-05-22 19:55:49 +00:00
Florian Müllner
0ada312748 Bump version to 3.33.2
Update NEWS.
2019-05-22 18:23:02 +00:00
Marco Trevisan (Treviño)
88697add1b js: Throw GObject.NotImplementedError when requiring overriding
Since version 1.50.0, gjs defines GObject.NotImplementedError for throwing
errors when a "virtual" method that requires a subclass implementation is not
defined.

So use this instead of a generic JS Error in such cases.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/549
2019-05-21 15:43:21 -05:00
segfault
4730b7a094 shellMountOperation: Add spinner to password dialog
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/126
2019-05-20 19:59:04 +02:00
segfault
aa3e64aec3 shellMountOperation: Support TCRYPT
This extends the ShellMountPasswordDialog by widgets which allow
specifying parameters supported by TrueCrypt and VeraCrypt compatible
volumes (TCRYPT). This includes:

 - Whether the volume to be unlocked is hidden.
 - Whether the volume to be unlocked is a system partition.
   Note: TrueCrypt and VeraCrypt only support encrypting Windows
   systems [1], so the label for this option is "Windows System Volume".
 - Whether to use a PIM [2].
 - Whether to use keyfiles. Unfortunately, GMountOperation doesn't
   support TCRYPT keyfiles, so if this checkbox is checked, we tell the
   user that they should unlock the volume with Disks, which supports
   unlocking TCRYPT volumes with keyfiles.

[1] https://www.veracrypt.fr/en/System%20Encryption.html
[2] https://www.veracrypt.fr/en/Header%20Key%20Derivation.html

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/126
2019-05-20 19:59:04 +02:00
segfault
af26e2b212 shellMountOperation: Move password entry to a grid
This prepares for additional UI elements added for TCRYPT support.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/126
2019-05-20 19:59:04 +02:00
Cosimo Cecchi
8167f20972 workspacesView: remove unused variables 2019-05-19 16:06:39 +00:00
Milan Crha
bd4aac8f49 calendar-server: Port to libecal-2.0
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/501
2019-05-17 20:24:08 +00:00
Florian Müllner
785dd5c5f7 Revert "calendar-server: Port to libecal-2.0"
This reverts commit 71e469a59c.
2019-05-17 22:23:43 +02:00
Milan Crha
71e469a59c calendar-server: Port to libecal-2.0
Port the calendar-server code to work with the latest evolution-data-server
API changes.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/501
2019-05-17 22:17:07 +02:00
Florian Müllner
6d4b9d29b8 ci: Switch to mutter's docker image
Mutter's CI now also builds gnome-shell to ensure that a MR doesn't
break the shell. Its docker image has therefore been updated to contain
all our deps as well, so we don't need our own image anymore.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/546
2019-05-17 20:52:44 +02:00
Florian Müllner
33f5bb39cd introspect: Include sandboxed-app-id as well
App IDs in gnome-shell don't match AppStream, Flatpak or Snap IDs. For the
desktop portal, the latter two are more relevant, so include it in the
returned information.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1289
2019-05-16 13:02:08 +00:00
Florian Müllner
a1c3900630 introspect: Remove unused variable
https://gitlab.gnome.org/GNOME/gnome-shell/issues/1289
2019-05-16 13:02:08 +00:00
Daniel Mustieles
cdaf164c01 Updated Spanish translation 2019-05-16 12:41:26 +02:00
Jonas Dreßler
2bd80579ed layout: Show important actors above top_window_group
The top_window_group is used for windows like popup menus, which should
appear above shell chrome like the panel.

Since we want important actors such as the screen keyboard or modal
dialogs to be shown above those windows, add their actors after adding
global.top_window_group to this.uiGroup and provide a new function
addTopChrome() to add important chrome above the top_window_group.

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

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/358
2019-05-15 22:39:53 +00:00
Marco Trevisan (Treviño)
54039c3552 st: Introspect ScrollViewFade to read fade properties
Util.ensureActorVisibleInScrollView takes care of the potential scroll view fade
effect in order to compute the scroll offset, reading the ScrollViewFade's
`vfade-offset` property. This was correctly working until gnome 3.30 cycle.
However such property isn't defined now because since gjs 1.54, it can only
fetch introspected properties and St.ScrollViewFade was considered a private API
not exposed by gir.

Fix this by also introspecting st-scroll-view-fade sources.
Not being considered private anymore, install the header.

Fixes https://gitlab.gnome.org/GNOME/gnome-shell/issues/1061
2019-05-15 15:15:31 -05:00
Veerasamy Sevagen
b197a1affb cleanup: Fix spelling errors
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/515
2019-05-15 19:32:29 +00:00
Marco Trevisan (Treviño)
51655be6a3 keyring: Use bind_property for message and description values
This code was commented out in commit 593b431 as it was causing a crash in gjs.

As per the [1] gjs fix, this can now be safely used again.

[1] https://gitlab.gnome.org/GNOME/gjs/merge_requests/289
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/510
2019-05-15 18:37:45 +00:00
Marco Trevisan (Treviño)
9697c209c0 system: Just use buttonGroup instead of adding extra _actionsItem
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/499
2019-05-15 17:27:08 +00:00
Marco Trevisan (Treviño)
6ecb0a4546 popupMenu: Implement Switch as actor
Switch is used only by menu items, and implement it extending St.Bin

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/499
2019-05-15 17:27:08 +00:00
Marco Trevisan (Treviño)
30861d4800 popupMenu: Make sensitive a Menu and MenuItem property
Use 'sensitive' as native gobject property for PopupBaseMenuItem, while simulate
it for PopupMenuBase.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/499
2019-05-15 17:27:08 +00:00
Marco Trevisan (Treviño)
a23391ea28 PopupBaseMenuItem: Use active property for menu items
Instead of using methods and flags, just use a gobject property to keep track
of the active state.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/499
2019-05-15 17:27:08 +00:00
Marco Trevisan (Treviño)
58e0b80cac panel: Use menu items as actors
All menu items are actors now, so remove all the actor property usages.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/499
2019-05-15 17:27:08 +00:00
Marco Trevisan (Treviño)
41dd744b74 js/status: Use menu items as actors
All menu items are actors now, so remove all the actor property usages.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/499
2019-05-15 17:27:07 +00:00
Marco Trevisan (Treviño)
bdf66d7b62 popupMenu: Implement vfunc's for key focus in/out
As per the fact the menu item is an object we can just vfunc's.
This is not possible for events as specific union object is passed instead of
just the Clutter.Event.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/499
2019-05-15 17:27:07 +00:00
Marco Trevisan (Treviño)
4258ae3ec2 popupMenuItem: Make it a widget inheriting from St.BoxLayout
Don't use composition for PopupBaseMenuItem, but instead inherit from BoxLayout.
So remove the internal actor, making all the menu items actor themselves.

Add an actor property as fallback to avoid warnings for usage in menus.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/499
2019-05-15 17:27:07 +00:00
Florian Müllner
9b379c49ba systemActions: Only do prefix matches
Our search for system actions is currently inconsistent with searching
for applications: While we match terms anywhere within keywords, GIO
will only match at the beginning of words.

In order to get the same behavior, split keywords into single words
and only match terms at the beginning of a word.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/745
2019-05-15 17:20:21 +00:00
Florian Müllner
7e70dd8453 js: Use GTypeFlags to define abstract GObject classes
gjs now supports an optional GTypeFlags value for GObject subclasses
defined with GObject.registerClass(), so it is not possible to define
abstract classes on the gobject-level, just like from C.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/517
2019-05-15 17:09:30 +00:00
104 changed files with 3924 additions and 2750 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:v1 image: registry.gitlab.gnome.org/gnome/mutter/master:v2
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/gnome-shell/master:v1 image: registry.gitlab.gnome.org/gnome/mutter/master:v2
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/gnome-shell/master:v1 image: registry.gitlab.gnome.org/gnome/mutter/master:v2
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/gnome-shell/master:v1 image: registry.gitlab.gnome.org/gnome/mutter/master:v2
stage: test stage: test
before_script: before_script:
- ninja -C mutter/build install - ninja -C mutter/build install

View File

@@ -1,19 +0,0 @@
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

44
NEWS
View File

@@ -1,3 +1,47 @@
3.33.3
======
* 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 3.33.1
====== ======
* Refine the app menu [Florian; #968] * Refine the app menu [Florian; #968]

View File

@@ -20,10 +20,16 @@
<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-intl.svg</file> <file>toggle-off.svg</file>
<file>toggle-off-dark.svg</file>
<file>toggle-off-hc.svg</file> <file>toggle-off-hc.svg</file>
<file>toggle-on-intl.svg</file> <file>toggle-on.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,3 +1,5 @@
$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, desaturate(#3d3846, 10%)); $bg_color: if($variant == 'light', #f6f5f4, darken(desaturate(#3d3846, 100%), 4%));
$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, 20%)); $selected_bg_color: if($variant == 'light', #3584e4, darken(#3584e4, 10%));
$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,11 +21,15 @@ $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_bg_color: #2e3436; $osd_text_color: white;
$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.9); $osd_outer_borders_color: transparentize(white, 0.84);
$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,16 +37,13 @@
// 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%));
@@ -111,7 +108,7 @@
} }
} }
@mixin button($t, $c:$osd_bg_color, $tc:$fg_color, $edge: $borders_edge) { @mixin button($t, $c:$bg_color, $tc:$fg_color, $edge: $borders_edge) {
// //
// Button drawing function // Button drawing function
// //
@@ -130,46 +127,39 @@
$_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: $osd_fg_color; color: $tc;
background-color: $_bg; background-color: $c;
border-color: $osd_borders_color; border-color: $borders_color;
box-shadow: inset 0 1px lighten($osd_bg_color,10%); box-shadow: $_button_shadow;
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
// //
$_bg: if($c!=$osd_bg_color, transparentize($c, 0.3), color: $tc;
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 1px $selected_bg_color; box-shadow: inset 0px 0px 0px 2px $selected_bg_color;
//border-color: $selected_bg_color;
} }
@else if $t==hover { @else if $t==hover {
// //
// active osd button // active osd button
// //
$_bg: if($c!=$osd_bg_color, transparentize($c, 0.3), color: $tc;
lighten($osd_bg_color,3%)); border-color: $borders_color;
background-color: $c;
color: white; box-shadow: $_button_shadow;
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;
@@ -178,27 +168,18 @@
// //
// active osd button // active osd button
// //
$_bg: if($c!=$bg_color, $c, $osd_borders_color); color: $tc;
border-color: $borders_color;
color: white; background-color: $c;
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: $osd_borders_color; border-color: $insensitive_borders_color;
background-color: $_bg; background-color: $insensitive_bg_color;
box-shadow: none; box-shadow: none;
text-shadow: none; text-shadow: none;
icon-shadow: none; icon-shadow: none;

View File

@@ -26,6 +26,7 @@ $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

@@ -0,0 +1,28 @@
<?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>

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@@ -0,0 +1,20 @@
<?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>

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@@ -0,0 +1,26 @@
<?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>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -0,0 +1,26 @@
<?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>

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@@ -0,0 +1 @@
<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>

After

Width:  |  Height:  |  Size: 725 B

View File

@@ -1,103 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="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>

Before

Width:  |  Height:  |  Size: 3.3 KiB

View File

@@ -0,0 +1 @@
<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>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -0,0 +1 @@
<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>

After

Width:  |  Height:  |  Size: 707 B

View File

@@ -1,103 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="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>

Before

Width:  |  Height:  |  Size: 3.3 KiB

1
data/theme/toggle-on.svg Normal file
View File

@@ -0,0 +1 @@
<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>

After

Width:  |  Height:  |  Size: 473 B

View File

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

View File

@@ -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 accomodate // figure out how tall it would like to be and try to accommodate
// 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,6 +64,7 @@
<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>
@@ -81,9 +82,11 @@
<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>
@@ -120,6 +123,7 @@
<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,8 +42,6 @@ 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);
} }
@@ -55,6 +53,11 @@ 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();
@@ -76,6 +79,10 @@ 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;
} }
@@ -137,6 +144,7 @@ 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()),
@@ -153,6 +161,10 @@ 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,6 +48,28 @@ 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

@@ -71,7 +71,7 @@ function _findProviderForMccMnc(operator_name, operator_code) {
// Tries to find the operator name corresponding to the given SID // Tries to find the operator name corresponding to the given SID
// //
function _findProviderForSid(sid) { function _findProviderForSid(sid) {
if (sid == 0) if (!sid)
return null; return null;
let mpd = _getMobileProvidersDatabase(); let mpd = _getMobileProvidersDatabase();

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;sign off").split(';'), keywords: _("logout;log out;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.indexOf(t) >= 0)))) if (available && terms.every(t => keywords.some(k => k.startsWith(t))))
results.push(key); results.push(key);
return results; return results;

View File

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

View File

@@ -474,12 +474,10 @@ var CyclerList = GObject.registerClass({
} }
}); });
var CyclerPopup = GObject.registerClass( var CyclerPopup = GObject.registerClass({
class CyclerPopup extends SwitcherPopup.SwitcherPopup { GTypeFlags: GObject.TypeFlags.ABSTRACT
}, class CyclerPopup extends SwitcherPopup.SwitcherPopup {
_init() { _init() {
if (this.constructor.name === CyclerPopup.prototype.constructor.name)
throw new TypeError(`Cannot instantiate abstract class ${this.constructor.name}`);
super._init(); super._init();
this._items = this._getWindows(); this._items = this._getWindows();

View File

@@ -414,7 +414,7 @@ var AllView = class AllView extends BaseAppView {
this._refilterApps(); this._refilterApps();
} }
// Overriden from BaseAppView // Overridden 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);
} }
// Overriden from BaseAppView // Overridden 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 substract the required padding etc of the boxpointer // so we have to subtract 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];
} }

View File

@@ -1,4 +1,4 @@
const { Clutter, Gio, GLib, Meta, Shell, St } = imports.gi; const { Clutter, Gio, GLib, GObject, 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,10 +13,11 @@ var AudioDevice = {
const AudioDeviceSelectionIface = loadInterfaceXML('org.gnome.Shell.AudioDeviceSelection'); const AudioDeviceSelectionIface = loadInterfaceXML('org.gnome.Shell.AudioDeviceSelection');
var AudioDeviceSelectionDialog = var AudioDeviceSelectionDialog = GObject.registerClass({
class AudioDeviceSelectionDialog extends ModalDialog.ModalDialog { Signals: { 'device-selected': { param_types: [GObject.TYPE_UINT] } }
constructor(devices) { }, class AudioDeviceSelectionDialog extends ModalDialog.ModalDialog {
super({ styleClass: 'audio-device-selection-dialog' }); _init(devices) {
super._init({ styleClass: 'audio-device-selection-dialog' });
this._deviceItems = {}; this._deviceItems = {};
@@ -33,10 +34,6 @@ class AudioDeviceSelectionDialog extends ModalDialog.ModalDialog {
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"),
@@ -125,7 +122,7 @@ class AudioDeviceSelectionDialog extends ModalDialog.ModalDialog {
Main.overview.hide(); Main.overview.hide();
app.activate(); app.activate();
} }
}; });
var AudioDeviceSelectionDBus = class AudioDeviceSelectionDBus { var AudioDeviceSelectionDBus = class AudioDeviceSelectionDBus {
constructor() { constructor() {

View File

@@ -257,14 +257,15 @@ var Background = class Background {
this._refreshAnimation(); this._refreshAnimation();
}); });
this._settingsChangedSignalId = this._settings.connect('changed', () => { this._settingsChangedSignalId =
this.emit('changed'); this._settings.connect('changed', this._emitChangedSignal.bind(this));
});
this._load(); this._load();
} }
destroy() { destroy() {
this.background = null;
this._cancellable.cancel(); this._cancellable.cancel();
this._removeAnimationTimeout(); this._removeAnimationTimeout();
@@ -288,6 +289,22 @@ 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() {
@@ -343,7 +360,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.emit('changed'); this._emitChangedSignal();
} }
}); });
this._fileWatches[key] = signalId; this._fileWatches[key] = signalId;
@@ -699,7 +716,6 @@ 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

@@ -48,6 +48,15 @@ var BoxPointer = GObject.registerClass({
this._sourceAlignment = 0.5; this._sourceAlignment = 0.5;
this._capturedEventId = 0; this._capturedEventId = 0;
this._muteInput(); this._muteInput();
this.connect('destroy', this._onDestroy.bind(this));
}
_onDestroy() {
if (this._sourceActorDestroyId) {
this._sourceActor.disconnect(this._sourceActorDestroyId);
delete this._sourceActorDestroyId;
}
} }
get arrowSide() { get arrowSide() {
@@ -67,36 +76,6 @@ 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');
@@ -225,13 +204,10 @@ 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 = box.x2 - box.x1; let [availWidth, availHeight] = themeNode.get_content_box(box).get_size();
let availHeight = box.y2 - box.y1;
childBox.x1 = 0; childBox.x1 = 0;
childBox.y1 = 0; childBox.y1 = 0;
@@ -260,8 +236,9 @@ 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(); this._reposition(box);
this._updateFlip(); this._updateFlip(box);
this.set_allocation(box, flags);
} }
} }
@@ -448,15 +425,25 @@ var BoxPointer = GObject.registerClass({
} }
setPosition(sourceActor, alignment) { setPosition(sourceActor, alignment) {
// We need to show it now to force an allocation, if (!this._sourceActor || sourceActor != this._sourceActor) {
// so that we can query the correct size. if (this._sourceActorDestroyId) {
this.show(); this._sourceActor.disconnect(this._sourceActorDestroyId);
delete this._sourceActorDestroyId;
}
this._sourceActor = sourceActor;
if (this._sourceActor) {
this._sourceActorDestroyId = this._sourceActor.connect('destroy', () => {
this._sourceActor = null;
delete this._sourceActorDestroyId;
})
}
}
this._sourceActor = sourceActor;
this._arrowAlignment = alignment; this._arrowAlignment = alignment;
this._reposition(); this.queue_relayout();
this._updateFlip();
} }
setSourceAlignment(alignment) { setSourceAlignment(alignment) {
@@ -468,7 +455,7 @@ var BoxPointer = GObject.registerClass({
this.setPosition(this._sourceActor, this._arrowAlignment); this.setPosition(this._sourceActor, this._arrowAlignment);
} }
_reposition() { _reposition(allocationBox) {
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);
@@ -582,8 +569,7 @@ var BoxPointer = GObject.registerClass({
} }
// Actually set the position // Actually set the position
this.x = Math.floor(x); allocationBox.set_origin(Math.floor(x), Math.floor(y));
this.y = Math.floor(y);
} }
// @origin: Coordinate specifying middle of the arrow, along // @origin: Coordinate specifying middle of the arrow, along
@@ -637,15 +623,11 @@ var BoxPointer = GObject.registerClass({
return arrowSide; return arrowSide;
} }
_updateFlip() { _updateFlip(allocationBox) {
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(); this._reposition(allocationBox);
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,6 +5,7 @@ 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;
@@ -199,12 +200,20 @@ 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)
e.message.includes('Error unlocking')) { // udisks (wrong password) // libblockdev wrong password opening LUKS device
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,9 +10,10 @@ const CheckBox = imports.ui.checkBox;
var WORK_SPINNER_ICON_SIZE = 16; var WORK_SPINNER_ICON_SIZE = 16;
var KeyringDialog = class extends ModalDialog.ModalDialog { var KeyringDialog = GObject.registerClass(
constructor() { class KeyringDialog extends ModalDialog.ModalDialog {
super({ styleClass: 'prompt-dialog' }); _init() {
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));
@@ -23,20 +24,8 @@ var KeyringDialog = class 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;
@@ -224,7 +213,7 @@ var KeyringDialog = class 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, NM, Pango, Shell, St } = imports.gi; const { Clutter, Gio, GLib, GObject, 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,9 +12,10 @@ const ShellEntry = imports.ui.shellEntry;
const VPN_UI_GROUP = 'VPN Plugin UI'; const VPN_UI_GROUP = 'VPN Plugin UI';
var NetworkSecretDialog = class extends ModalDialog.ModalDialog { var NetworkSecretDialog = GObject.registerClass(
constructor(agent, requestId, connection, settingName, hints, flags, contentOverride) { class NetworkSecretDialog extends ModalDialog.ModalDialog {
super({ styleClass: 'prompt-dialog' }); _init(agent, requestId, connection, settingName, hints, flags, contentOverride) {
super._init({ styleClass: 'prompt-dialog' });
this._agent = agent; this._agent = agent;
this._requestId = requestId; this._requestId = requestId;
@@ -347,7 +348,7 @@ var NetworkSecretDialog = class 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,
Pango, PolkitAgent, Polkit, Shell, St } = imports.gi; GObject, 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,9 +15,11 @@ var DIALOG_ICON_SIZE = 48;
var WORK_SPINNER_ICON_SIZE = 16; var WORK_SPINNER_ICON_SIZE = 16;
var AuthenticationDialog = class extends ModalDialog.ModalDialog { var AuthenticationDialog = GObject.registerClass({
constructor(actionId, body, cookie, userNames) { Signals: { 'done': { param_types: [GObject.TYPE_BOOLEAN] } }
super({ styleClass: 'prompt-dialog' }); }, class AuthenticationDialog extends ModalDialog.ModalDialog {
_init(actionId, body, cookie, userNames) {
super._init({ styleClass: 'prompt-dialog' });
this.actionId = actionId; this.actionId = actionId;
this.message = body; this.message = body;
@@ -25,7 +27,7 @@ var AuthenticationDialog = class extends ModalDialog.ModalDialog {
this._wasDismissed = false; this._wasDismissed = false;
this._sessionUpdatedId = Main.sessionMode.connect('updated', () => { this._sessionUpdatedId = Main.sessionMode.connect('updated', () => {
this._group.visible = !Main.sessionMode.isLocked; this.visible = !Main.sessionMode.isLocked;
}); });
this.connect('closed', this._onDialogClosed.bind(this)); this.connect('closed', this._onDialogClosed.bind(this));
@@ -326,8 +328,7 @@ var AuthenticationDialog = class extends ModalDialog.ModalDialog {
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 availble - mission control will // We don't check if either app is available - 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 wan't to favorite the app // No drag placeholder means we don't want 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

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

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, Soup, St } = imports.gi; const { Clutter, Gio, GLib, GObject, 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 = var InstallExtensionDialog = GObject.registerClass(
class InstallExtensionDialog extends ModalDialog.ModalDialog { class InstallExtensionDialog extends ModalDialog.ModalDialog {
constructor(uuid, info, invocation) { _init(uuid, info, invocation) {
super({ styleClass: 'extension-dialog' }); super._init({ 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,6 +43,9 @@ 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

@@ -79,7 +79,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 Error('no implementation of createIcon in ' + this); throw new GObject.NotImplementedError(`createIcon in ${this.constructor.name}`);
} }
setIconSize(size) { setIconSize(size) {
@@ -322,6 +322,7 @@ 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;
@@ -331,10 +332,11 @@ 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].hide(); children[i].opacity = 0;
} else { } else {
if (!animating)
children[i].opacity = 255;
children[i].allocate(childBox, flags); children[i].allocate(childBox, flags);
children[i].show();
} }
columnIndex++; columnIndex++;
@@ -378,7 +380,7 @@ var IconGrid = GObject.registerClass({
child != null; child != null;
child = child.get_next_sibling()) { child = child.get_next_sibling()) {
if (!child.visible) if (!child.visible || !child.opacity)
continue; continue;
let childVolume = child.get_transformed_paint_volume(this); let childVolume = child.get_transformed_paint_volume(this);
@@ -416,7 +418,8 @@ var IconGrid = GObject.registerClass({
animatePulse(animationDirection) { animatePulse(animationDirection) {
if (animationDirection != AnimationDirection.IN) if (animationDirection != AnimationDirection.IN)
throw new Error("Pulse animation only implements 'in' animation direction"); throw new GObject.NotImplementedError("Pulse animation only implements " +
"'in' animation direction");
this._cancelAnimation(); this._cancelAnimation();
@@ -840,7 +843,7 @@ var PaginatedIconGrid = GObject.registerClass({
} }
} }
// Overriden from IconGrid // Overridden 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,7 +282,7 @@ 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.addChrome(this._boxPointer); Main.layoutManager.addTopChrome(this._boxPointer);
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
@@ -1306,7 +1306,7 @@ var Keyboard = class Keyboard {
this._languagePopup.destroy(); this._languagePopup.destroy();
this._languagePopup = new LanguageSelectionPopup(keyActor); this._languagePopup = new LanguageSelectionPopup(keyActor);
Main.layoutManager.addChrome(this._languagePopup.actor); Main.layoutManager.addTopChrome(this._languagePopup.actor);
this._languagePopup.open(true); this._languagePopup.open(true);
} }

View File

@@ -11,6 +11,7 @@ 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;
@@ -216,10 +217,17 @@ 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);
global.stage.add_child(this.uiGroup); // Using addChrome() to add actors to uiGroup will position actors
// 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,
@@ -247,7 +255,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.addChrome(this.keyboardBox); this.addTopChrome(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
@@ -255,9 +263,6 @@ 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);
@@ -802,6 +807,16 @@ 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
@@ -1058,8 +1073,7 @@ var LayoutManager = GObject.registerClass({
} }
} }
if (!Meta.is_wayland_compositor()) global.set_stage_input_region(rects);
global.set_stage_input_region(rects);
this._isPopupWindowVisible = isPopupMenuVisible; this._isPopupWindowVisible = isPopupMenuVisible;
let workspaceManager = global.workspace_manager; let workspaceManager = global.workspace_manager;
@@ -1104,14 +1118,15 @@ 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));
// Cache the three ripples instead of dynamically creating and destroying them. let px = 0.0;
this._ripple1 = new St.BoxLayout({ style_class: 'ripple-box', opacity: 0, visible: false }); let py = 0.0;
this._ripple2 = new St.BoxLayout({ style_class: 'ripple-box', opacity: 0, visible: false }); if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) {
this._ripple3 = new St.BoxLayout({ style_class: 'ripple-box', opacity: 0, visible: false }); px = 1.0;
py = 0.0;
}
layoutManager.uiGroup.add_actor(this._ripple1); this._ripples = new Ripples.Ripples(px, py, 'ripple-box');
layoutManager.uiGroup.add_actor(this._ripple2); this._ripples.addTo(layoutManager.uiGroup);
layoutManager.uiGroup.add_actor(this._ripple3);
} }
setBarrierSize(size) { setBarrierSize(size) {
@@ -1193,53 +1208,12 @@ 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._rippleAnimation(); this._ripples.playAnimation(this._x, this._y);
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.8; var VIGNETTE_BRIGHTNESS = 0.2;
var VIGNETTE_SHARPNESS = 0.7; var VIGNETTE_SHARPNESS = 0.7;
const VIGNETTE_DECLARATIONS = '\ const VIGNETTE_DECLARATIONS = '\

24
js/ui/locatePointer.js Normal file
View File

@@ -0,0 +1,24 @@
// -*- 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:
* Retreive the contrast of the magnified view. * Retrieve 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, Meta, Shell, St } = imports.gi; const { Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi;
const Mainloop = imports.mainloop; const Mainloop = imports.mainloop;
const AccessDialog = imports.ui.accessDialog; const AccessDialog = imports.ui.accessDialog;
@@ -37,9 +37,12 @@ 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;
@@ -74,12 +77,14 @@ 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)
@@ -92,6 +97,8 @@ 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,
@@ -165,6 +172,8 @@ 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();
@@ -183,6 +192,8 @@ 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', () => {
@@ -190,6 +201,10 @@ 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;
@@ -229,10 +244,14 @@ function _initializeUI() {
} }
if (sessionMode.currentMode != 'gdm' && if (sessionMode.currentMode != 'gdm' &&
sessionMode.currentMode != 'initial-setup') { sessionMode.currentMode != 'initial-setup') {
Shell.Global.log_structured('GNOME Shell started at ' + _startDate, GLib.log_structured(LOG_DOMAIN, GLib.LogLevelFlags.LEVEL_MESSAGE, {
['MESSAGE_ID=' + GNOMESHELL_STARTED_MESSAGE_ID]); 'MESSAGE': `GNOME Shell started at ${_startDate}`,
'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");
@@ -636,7 +655,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 identifer * Returns: A string work identifier
*/ */
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
@@ -689,12 +708,13 @@ function queueDeferredWork(workId) {
} }
} }
var RestartMessage = class extends ModalDialog.ModalDialog { var RestartMessage = GObject.registerClass(
constructor(message) { class RestartMessage extends ModalDialog.ModalDialog {
super({ shellReactive: true, _init(message) {
styleClass: 'restart-message headline', super._init({ shellReactive: true,
shouldFadeIn: false, styleClass: 'restart-message headline',
destroyOnClose: true }); shouldFadeIn: false,
destroyOnClose: true });
let label = new St.Label({ text: message }); let label = new St.Label({ text: message });
@@ -704,7 +724,7 @@ var RestartMessage = class 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

@@ -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, Shell, St } = imports.gi; const { Atk, Clutter, GObject, Shell, St } = imports.gi;
const Signals = imports.signals; const Signals = imports.signals;
const Dialog = imports.ui.dialog; const Dialog = imports.ui.dialog;
@@ -21,8 +21,20 @@ var State = {
FADED_OUT: 4 FADED_OUT: 4
}; };
var ModalDialog = class { var ModalDialog = GObject.registerClass({
constructor(params) { Properties: { 'state': GObject.ParamSpec.int('state', 'Dialog state', 'state',
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,
@@ -30,7 +42,7 @@ var ModalDialog = class {
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;
@@ -38,31 +50,25 @@ var ModalDialog = class {
this._shouldFadeOut = params.shouldFadeOut; this._shouldFadeOut = params.shouldFadeOut;
this._destroyOnClose = params.destroyOnClose; this._destroyOnClose = params.destroyOnClose;
this._group = new St.Widget({ visible: false, Main.layoutManager.modalDialogGroup.add_actor(this);
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._group.add_constraint(constraint); this.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._group.add_actor(this._backgroundBin); this.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._group, this._lightbox = new Lightbox.Lightbox(this,
{ inhibitEvents: true, { inhibitEvents: true,
radialEffect: true }); radialEffect: true });
this._lightbox.highlight(this._backgroundBin); this._lightbox.highlight(this._backgroundBin);
@@ -77,8 +83,16 @@ var ModalDialog = class {
this._savedKeyFocus = null; this._savedKeyFocus = null;
} }
destroy() { get state() {
this._group.destroy(); return this._state;
}
_setState(state) {
if (this._state == state)
return;
this._state = state;
this.notify('state');
} }
clearButtons() { clearButtons() {
@@ -96,29 +110,25 @@ var ModalDialog = class {
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.state = State.OPENING; this._setState(State.OPENING);
this.dialogLayout.opacity = 255; this.dialogLayout.opacity = 255;
if (this._lightbox) if (this._lightbox)
this._lightbox.show(); this._lightbox.show();
this._group.opacity = 0; this.opacity = 0;
this._group.show(); this.show();
Tweener.addTween(this._group, Tweener.addTween(this,
{ 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.state = State.OPENED; this._setState(State.OPENED);
this.emit('opened'); this.emit('opened');
} }
}); });
@@ -148,8 +158,8 @@ var ModalDialog = class {
} }
_closeComplete() { _closeComplete() {
this.state = State.CLOSED; this._setState(State.CLOSED);
this._group.hide(); this.hide();
this.emit('closed'); this.emit('closed');
if (this._destroyOnClose) if (this._destroyOnClose)
@@ -160,12 +170,12 @@ var ModalDialog = class {
if (this.state == State.CLOSED || this.state == State.CLOSING) if (this.state == State.CLOSED || this.state == State.CLOSING)
return; return;
this.state = State.CLOSING; this._setState(State.CLOSING);
this.popModal(timestamp); this.popModal(timestamp);
this._savedKeyFocus = null; this._savedKeyFocus = null;
if (this._shouldFadeOut) if (this._shouldFadeOut)
Tweener.addTween(this._group, Tweener.addTween(this,
{ opacity: 0, { opacity: 0,
time: OPEN_AND_CLOSE_TIME, time: OPEN_AND_CLOSE_TIME,
transition: 'easeOutQuad', transition: 'easeOutQuad',
@@ -183,11 +193,11 @@ var ModalDialog = class {
return; return;
let focus = global.stage.key_focus; let focus = global.stage.key_focus;
if (focus && this._group.contains(focus)) if (focus && this.contains(focus))
this._savedKeyFocus = focus; this._savedKeyFocus = focus;
else else
this._savedKeyFocus = null; this._savedKeyFocus = null;
Main.popModal(this._group, timestamp); Main.popModal(this, timestamp);
this._hasModal = false; this._hasModal = false;
if (!this._shellReactive) if (!this._shellReactive)
@@ -201,7 +211,7 @@ var ModalDialog = class {
let params = { actionMode: this._actionMode }; let params = { actionMode: this._actionMode };
if (timestamp) if (timestamp)
params['timestamp'] = timestamp; params['timestamp'] = timestamp;
if (!Main.pushModal(this._group, params)) if (!Main.pushModal(this, params))
return false; return false;
this._hasModal = true; this._hasModal = true;
@@ -224,10 +234,10 @@ var ModalDialog = class {
// 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 reponse has been acknowledged but will take a few // that the dialog response 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
// imediately, but the lightbox should remain until the logout is // immediately, 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)
@@ -242,9 +252,8 @@ var ModalDialog = class {
time: FADE_OUT_DIALOG_TIME, time: FADE_OUT_DIALOG_TIME,
transition: 'easeOutQuad', transition: 'easeOutQuad',
onComplete: () => { onComplete: () => {
this.state = State.FADED_OUT; this._setState(State.FADED_OUT);
} }
}); });
} }
}; });
Signals.addSignalMethods(ModalDialog.prototype);

View File

@@ -122,7 +122,7 @@ var SlidingControl = class {
} }
_getSlide() { _getSlide() {
throw new Error('getSlide() must be overridden'); throw new GObject.NotImplementedError(`_getSlide in ${this.constructor.name}`);
} }
_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.0, St.Side.TOP); super(sourceActor, 0.5, St.Side.TOP);
this.actor.add_style_class_name('app-menu'); this.actor.add_style_class_name('app-menu');
@@ -122,7 +122,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.actor.visible = (sw != null); this._detailsItem.visible = (sw != null);
} }
isEmpty() { isEmpty() {
@@ -160,7 +160,7 @@ class AppMenu extends PopupMenu.PopupMenu {
}); });
}); });
this._newWindowItem.actor.visible = this._newWindowItem.visible =
app && app.can_open_new_window() && !actions.includes('new-window'); app && app.can_open_new_window() && !actions.includes('new-window');
} }
@@ -817,6 +817,7 @@ 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(

104
js/ui/pointerA11yTimeout.js Normal file
View File

@@ -0,0 +1,104 @@
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,49 +51,64 @@ function arrowIcon(side) {
return arrow; return arrow;
} }
var PopupBaseMenuItem = class { var PopupBaseMenuItem = GObject.registerClass({
constructor(params) { Properties: {
'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',
this.actor = new St.BoxLayout({ style_class: 'popup-menu-item', reactive: params.reactive,
reactive: params.reactive, track_hover: params.reactive,
track_hover: params.reactive, can_focus: params.can_focus,
can_focus: params.can_focus, accessible_role: Atk.Role.MENU_ITEM });
accessible_role: Atk.Role.MENU_ITEM }); this._delegate = this;
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.actor.add(this._ornamentLabel); this.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.actor.add_style_class_name('popup-inactive-menu-item'); this.add_style_class_name('popup-inactive-menu-item');
if (params.style_class) if (params.style_class)
this.actor.add_style_class_name(params.style_class); this.add_style_class_name(params.style_class);
if (this._activatable) { if (this._activatable) {
this.actor.connect('button-press-event', this._onButtonPressEvent.bind(this)); this.connect('button-press-event', this._onButtonPressEvent.bind(this));
this.actor.connect('button-release-event', this._onButtonReleaseEvent.bind(this)); this.connect('button-release-event', this._onButtonReleaseEvent.bind(this));
this.actor.connect('touch-event', this._onTouchEvent.bind(this)); this.connect('touch-event', this._onTouchEvent.bind(this));
this.actor.connect('key-press-event', this._onKeyPressEvent.bind(this)); this.connect('key-press-event', this._onKeyPressEvent.bind(this));
} }
if (params.reactive && params.hover) if (params.reactive && params.hover)
this.actor.connect('notify::hover', this._onHoverChanged.bind(this)); this.bind_property('hover', this, 'active', GObject.BindingFlags.SYNC_CREATE);
}
this.actor.connect('key-focus-in', this._onKeyFocusIn.bind(this)); get actor() {
this.actor.connect('key-focus-out', this._onKeyFocusOut.bind(this)); /* This is kept for compatibility with current implementation, and we
this.actor.connect('destroy', this._onDestroy.bind(this)); don't want to warn here yet since PopupMenu depends on this */
return this;
} }
_getTopMenu() { _getTopMenu() {
@@ -109,24 +124,24 @@ var PopupBaseMenuItem = class {
_onButtonPressEvent(actor, event) { _onButtonPressEvent(actor, event) {
// This is the CSS active state // This is the CSS active state
this.actor.add_style_pseudo_class ('active'); this.add_style_pseudo_class('active');
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
} }
_onButtonReleaseEvent(actor, event) { _onButtonReleaseEvent(actor, event) {
this.actor.remove_style_pseudo_class ('active'); this.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.actor.remove_style_pseudo_class ('active'); this.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.actor.add_style_pseudo_class ('active'); this.add_style_pseudo_class('active');
} }
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
} }
@@ -151,54 +166,56 @@ var PopupBaseMenuItem = class {
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
} }
_onKeyFocusIn(actor) { vfunc_key_focus_in() {
this.setActive(true); super.vfunc_key_focus_in();
this.active = true;
} }
_onKeyFocusOut(actor) { vfunc_key_focus_out() {
this.setActive(false); super.vfunc_key_focus_out();
} this.active = false;
_onHoverChanged(actor) {
this.setActive(actor.hover);
} }
activate(event) { activate(event) {
this.emit('activate', event); this.emit('activate', event);
} }
setActive(active) { get 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.actor.add_style_class_name('selected'); this.add_style_class_name('selected');
if (this.actor.can_focus) if (this.can_focus)
this.actor.grab_key_focus(); this.grab_key_focus();
} else { } else {
this.actor.remove_style_class_name('selected'); this.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.actor.remove_style_pseudo_class ('active'); this.remove_style_pseudo_class('active');
} }
this.emit('active-changed', active); this.notify('active');
} }
} }
syncSensitive() { syncSensitive() {
let sensitive = this.getSensitive(); let sensitive = this.sensitive;
this.actor.reactive = sensitive; this.reactive = sensitive;
this.actor.can_focus = sensitive; this.can_focus = sensitive;
this.emit('sensitive-changed'); this.notify('sensitive');
return sensitive; return sensitive;
} }
getSensitive() { getSensitive() {
let parentSensitive = this._parent ? this._parent.getSensitive() : true; let parentSensitive = this._parent ? this._parent.sensitive : true;
return this._activatable && this._sensitive && parentSensitive; return this._activatable && this._sensitive && parentSensitive;
} }
@@ -210,12 +227,12 @@ var PopupBaseMenuItem = class {
this.syncSensitive(); this.syncSensitive();
} }
destroy() { get sensitive() {
this.actor.destroy(); return this.getSensitive();
} }
_onDestroy() { set sensitive(sensitive) {
this.emit('destroy'); this.setSensitive(sensitive);
} }
setOrnament(ornament) { setOrnament(ornament) {
@@ -226,36 +243,38 @@ var PopupBaseMenuItem = class {
if (ornament == Ornament.DOT) { if (ornament == Ornament.DOT) {
this._ornamentLabel.text = '\u2022'; this._ornamentLabel.text = '\u2022';
this.actor.add_accessible_state(Atk.StateType.CHECKED); this.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.actor.add_accessible_state(Atk.StateType.CHECKED); this.add_accessible_state(Atk.StateType.CHECKED);
} else if (ornament == Ornament.NONE) { } else if (ornament == Ornament.NONE) {
this._ornamentLabel.text = ''; this._ornamentLabel.text = '';
this.actor.remove_accessible_state(Atk.StateType.CHECKED); this.remove_accessible_state(Atk.StateType.CHECKED);
} }
} }
}; });
Signals.addSignalMethods(PopupBaseMenuItem.prototype);
var PopupMenuItem = class extends PopupBaseMenuItem { var PopupMenuItem = GObject.registerClass(
constructor(text, params) { class PopupMenuItem extends PopupBaseMenuItem {
super(params); _init(text, params) {
super._init(params);
this.label = new St.Label({ text: text }); this.label = new St.Label({ text: text });
this.actor.add_child(this.label); this.add_child(this.label);
this.actor.label_actor = this.label this.label_actor = this.label
} }
}; });
var PopupSeparatorMenuItem = class extends PopupBaseMenuItem {
constructor(text) { var PopupSeparatorMenuItem = GObject.registerClass(
super({ reactive: false, class PopupSeparatorMenuItem extends PopupBaseMenuItem {
can_focus: false}); _init(text) {
super._init({ reactive: false,
can_focus: false });
this.label = new St.Label({ text: text || '' }); this.label = new St.Label({ text: text || '' });
this.actor.add(this.label); this.add(this.label);
this.actor.label_actor = this.label; this.label_actor = this.label;
this.label.connect('notify::text', this.label.connect('notify::text',
this._syncVisibility.bind(this)); this._syncVisibility.bind(this));
@@ -264,75 +283,78 @@ var PopupSeparatorMenuItem = class 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.actor.add(this._separator, { expand: true }); this.add(this._separator, { expand: true });
} }
_syncVisibility() { _syncVisibility() {
this.label.visible = this.label.text != ''; this.label.visible = this.label.text != '';
} }
}; });
var Switch = class { var Switch = GObject.registerClass(
constructor(state) { class Switch extends St.Bin {
this.actor = new St.Bin({ style_class: 'toggle-switch', _init(state) {
accessible_role: Atk.Role.CHECK_BOX, super._init({ style_class: 'toggle-switch',
can_focus: true }); accessible_role: Atk.Role.CHECK_BOX,
can_focus: true });
this.setToggleState(state); this.setToggleState(state);
} }
setToggleState(state) { setToggleState(state) {
if (state) if (state)
this.actor.add_style_pseudo_class('checked'); this.add_style_pseudo_class('checked');
else else
this.actor.remove_style_pseudo_class('checked'); this.remove_style_pseudo_class('checked');
this.state = state; this.state = state;
} }
toggle() { toggle() {
this.setToggleState(!this.state); this.setToggleState(!this.state);
} }
}; });
var PopupSwitchMenuItem = class extends PopupBaseMenuItem { var PopupSwitchMenuItem = GObject.registerClass({
constructor(text, active, params) { Signals: { 'toggled': { param_types: [GObject.TYPE_BOOLEAN] }, },
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.actor.accessible_role = Atk.Role.CHECK_MENU_ITEM; this.accessible_role = Atk.Role.CHECK_MENU_ITEM;
this.checkAccessibleState(); this.checkAccessibleState();
this.actor.label_actor = this.label; this.label_actor = this.label;
this.actor.add_child(this.label); this.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.actor.add(this._statusBin, { expand: true, x_align: St.Align.END }); this.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.actor; this._statusBin.child = this._switch;
} }
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.actor.reactive = false; this.reactive = false;
this.actor.accessible_role = Atk.Role.MENU_ITEM; this.accessible_role = Atk.Role.MENU_ITEM;
} else { } else {
this._statusBin.child = this._switch.actor; this._statusBin.child = this._switch;
this.actor.reactive = true; this.reactive = true;
this.actor.accessible_role = Atk.Role.CHECK_MENU_ITEM; this.accessible_role = Atk.Role.CHECK_MENU_ITEM;
} }
this.checkAccessibleState(); this.checkAccessibleState();
} }
activate(event) { activate(event) {
if (this._switch.actor.mapped) { if (this._switch.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
@@ -359,29 +381,30 @@ var PopupSwitchMenuItem = class extends PopupBaseMenuItem {
} }
checkAccessibleState() { checkAccessibleState() {
switch (this.actor.accessible_role) { switch (this.accessible_role) {
case Atk.Role.CHECK_MENU_ITEM: case Atk.Role.CHECK_MENU_ITEM:
if (this._switch.state) if (this._switch.state)
this.actor.add_accessible_state (Atk.StateType.CHECKED); this.add_accessible_state(Atk.StateType.CHECKED);
else else
this.actor.remove_accessible_state (Atk.StateType.CHECKED); this.remove_accessible_state(Atk.StateType.CHECKED);
break; break;
default: default:
this.actor.remove_accessible_state (Atk.StateType.CHECKED); this.remove_accessible_state(Atk.StateType.CHECKED);
} }
} }
}; });
var PopupImageMenuItem = class extends PopupBaseMenuItem { var PopupImageMenuItem = GObject.registerClass(
constructor(text, icon, params) { class PopupImageMenuItem extends PopupBaseMenuItem {
super(params); _init(text, icon, 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.actor.add_child(this._icon); this.add_child(this._icon);
this.label = new St.Label({ text: text }); this.label = new St.Label({ text: text });
this.actor.add_child(this.label); this.add_child(this.label);
this.actor.label_actor = this.label; this.label_actor = this.label;
this.setIcon(icon); this.setIcon(icon);
} }
@@ -393,7 +416,7 @@ var PopupImageMenuItem = class 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) {
@@ -437,13 +460,21 @@ var PopupMenuBase = class {
} }
getSensitive() { getSensitive() {
let parentSensitive = this._parent ? this._parent.getSensitive() : true; let parentSensitive = this._parent ? this._parent.sensitive : true;
return this._sensitive && parentSensitive; return this._sensitive && parentSensitive;
} }
setSensitive(sensitive) { setSensitive(sensitive) {
this._sensitive = sensitive; this._sensitive = sensitive;
this.emit('sensitive-changed'); this.emit('notify::sensitive');
}
get sensitive() {
return this.getSensitive();
}
set sensitive(sensitive) {
this.setSensitive(sensitive);
} }
_sessionUpdated() { _sessionUpdated() {
@@ -479,7 +510,7 @@ var PopupMenuBase = class {
app.activate(); app.activate();
}); });
menuItem.actor.visible = Main.sessionMode.allowSettings; menuItem.visible = Main.sessionMode.allowSettings;
this._settingsActions[desktopFile] = menuItem; this._settingsActions[desktopFile] = menuItem;
return menuItem; return menuItem;
@@ -488,7 +519,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.actor.visible = visible; item.visible = visible;
} }
} }
@@ -511,16 +542,17 @@ var PopupMenuBase = class {
_subMenuActiveChanged(submenu, submenuItem) { _subMenuActiveChanged(submenu, submenuItem) {
if (this._activeMenuItem && this._activeMenuItem != submenuItem) if (this._activeMenuItem && this._activeMenuItem != submenuItem)
this._activeMenuItem.setActive(false); this._activeMenuItem.active = 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('active-changed', (menuItem, active) => { menuItem._activeChangeId = menuItem.connect('notify::active', (menuItem) => {
let active = menuItem.active;
if (active && this._activeMenuItem != menuItem) { if (active && this._activeMenuItem != menuItem) {
if (this._activeMenuItem) if (this._activeMenuItem)
this._activeMenuItem.setActive(false); this._activeMenuItem.active = 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) {
@@ -528,8 +560,8 @@ var PopupMenuBase = class {
this.emit('active-changed', null); this.emit('active-changed', null);
} }
}); });
menuItem._sensitiveChangeId = menuItem.connect('sensitive-changed', () => { menuItem._sensitiveChangeId = menuItem.connect('notify::sensitive', () => {
let sensitive = menuItem.getSensitive(); let sensitive = menuItem.sensitive;
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,
@@ -540,12 +572,12 @@ var PopupMenuBase = class {
menuItem.actor.grab_key_focus(); menuItem.actor.grab_key_focus();
} }
}); });
menuItem._activateId = menuItem.connect('activate', (menuItem, event) => { menuItem._activateId = menuItem.connect_after('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('sensitive-changed', () => { menuItem._parentSensitiveChangeId = this.connect('notify::sensitive', () => {
menuItem.syncSensitive(); menuItem.syncSensitive();
}); });
@@ -597,7 +629,7 @@ var PopupMenuBase = class {
return; return;
} }
menuItem.actor.show(); menuItem.show();
} }
moveMenuItem(menuItem, position) { moveMenuItem(menuItem, position) {
@@ -644,8 +676,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('sensitive-changed', () => { let subMenuSensitiveChangedId = this.connect('notify::sensitive', () => {
menuItem.emit('sensitive-changed'); menuItem.emit('notify::sensitive');
}); });
menuItem.connect('destroy', () => { menuItem.connect('destroy', () => {
@@ -851,7 +883,7 @@ var PopupMenu = class extends PopupMenuBase {
close(animate) { close(animate) {
if (this._activeMenuItem) if (this._activeMenuItem)
this._activeMenuItem.setActive(false); this._activeMenuItem.active = false;
if (this._boxPointer.visible) { if (this._boxPointer.visible) {
this._boxPointer.close(animate, () => { this._boxPointer.close(animate, () => {
@@ -884,6 +916,10 @@ 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() {}
@@ -923,7 +959,11 @@ var PopupSubMenu = class extends PopupMenuBase {
} }
getSensitive() { getSensitive() {
return this._sensitive && this.sourceActor._delegate.getSensitive(); return this._sensitive && this.sourceActor.sensitive;
}
get sensitive() {
return this.getSensitive();
} }
open(animate) { open(animate) {
@@ -990,7 +1030,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.setActive(false); this._activeMenuItem.active = false;
if (animate && this._needsScrollbar()) if (animate && this._needsScrollbar())
animate = false; animate = false;
@@ -1022,7 +1062,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.setActive(true); this.sourceActor._delegate.active = true;
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
} }
@@ -1053,25 +1093,26 @@ var PopupMenuSection = class extends PopupMenuBase {
close() { this.emit('open-state-changed', false); } close() { this.emit('open-state-changed', false); }
}; };
var PopupSubMenuMenuItem = class extends PopupBaseMenuItem { var PopupSubMenuMenuItem = GObject.registerClass(
constructor(text, wantIcon) { class PopupSubMenuMenuItem extends PopupBaseMenuItem {
super(); _init(text, wantIcon) {
super._init();
this.actor.add_style_class_name('popup-submenu-menu-item'); this.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.actor.add_child(this.icon); this.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.actor.add_child(this.label); this.add_child(this.label);
this.actor.label_actor = this.label; this.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.actor.add(expander, { expand: true }); this.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 });
@@ -1080,11 +1121,12 @@ var PopupSubMenuMenuItem = class 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.actor.add_child(this._triangleBin); this.add_child(this._triangleBin);
this.actor.add_accessible_state (Atk.StateType.EXPANDABLE); this.add_accessible_state(Atk.StateType.EXPANDABLE);
this.menu = new PopupSubMenu(this.actor, this._triangle); this.menu = new PopupSubMenu(this, 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) {
@@ -1101,24 +1143,18 @@ var PopupSubMenuMenuItem = class extends PopupBaseMenuItem {
_subMenuOpenStateChanged(menu, open) { _subMenuOpenStateChanged(menu, open) {
if (open) { if (open) {
this.actor.add_style_pseudo_class('open'); this.add_style_pseudo_class('open');
this._getTopMenu()._setOpenedSubMenu(this.menu); this._getTopMenu()._setOpenedSubMenu(this.menu);
this.actor.add_accessible_state (Atk.StateType.EXPANDED); this.add_accessible_state(Atk.StateType.EXPANDED);
this.actor.add_style_pseudo_class('checked'); this.add_style_pseudo_class('checked');
} else { } else {
this.actor.remove_style_pseudo_class('open'); this.remove_style_pseudo_class('open');
this._getTopMenu()._setOpenedSubMenu(null); this._getTopMenu()._setOpenedSubMenu(null);
this.actor.remove_accessible_state (Atk.StateType.EXPANDED); this.remove_accessible_state (Atk.StateType.EXPANDED);
this.actor.remove_style_pseudo_class('checked'); this.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);
@@ -1156,7 +1192,7 @@ var PopupSubMenuMenuItem = class 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.actor.remove_style_pseudo_class ('active'); this.remove_style_pseudo_class('active');
this._setOpenState(!this._getOpenState()); this._setOpenState(!this._getOpenState());
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
} }
@@ -1165,12 +1201,12 @@ var PopupSubMenuMenuItem = class 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.actor.remove_style_pseudo_class ('active'); this.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
@@ -1179,7 +1215,6 @@ 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._owner = owner;
this._grabHelper = new GrabHelper.GrabHelper(owner, grabParams); this._grabHelper = new GrabHelper.GrabHelper(owner, grabParams);
this._menus = []; this._menus = [];
} }

View File

@@ -89,6 +89,8 @@ 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;

97
js/ui/ripples.js Normal file
View File

@@ -0,0 +1,97 @@
// -*- 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, Meta, Shell, St } = imports.gi; const { Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi;
const Signals = imports.signals; const Signals = imports.signals;
const Main = imports.ui.main; const Main = imports.ui.main;
@@ -23,10 +23,11 @@ const EXEC_ARG_KEY = 'exec-arg';
var DIALOG_GROW_TIME = 0.1; var DIALOG_GROW_TIME = 0.1;
var RunDialog = class extends ModalDialog.ModalDialog { var RunDialog = GObject.registerClass(
constructor() { class RunDialog extends ModalDialog.ModalDialog {
super({ styleClass: 'run-dialog', _init() {
destroyOnClose: false }); super._init({ styleClass: 'run-dialog',
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 });
@@ -282,5 +283,4 @@ var RunDialog = class extends ModalDialog.ModalDialog {
super.open(); super.open();
} }
}; });
Signals.addSignalMethods(RunDialog.prototype);

View File

@@ -431,6 +431,9 @@ 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,6 +25,7 @@ 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,
@@ -47,7 +48,7 @@ const _modes = {
panel: { panel: {
left: [], left: [],
center: ['dateMenu'], center: ['dateMenu'],
right: ['a11y', 'keyboard', 'aggregateMenu'] right: ['dwellClick', 'a11y', 'keyboard', 'aggregateMenu']
}, },
panelStyle: 'login-screen' panelStyle: 'login-screen'
}, },
@@ -72,7 +73,7 @@ const _modes = {
panel: { panel: {
left: [], left: [],
center: [], center: [],
right: ['a11y', 'keyboard', 'aggregateMenu'] right: ['dwellClick', 'a11y', 'keyboard', 'aggregateMenu']
}, },
panelStyle: 'unlock-screen' panelStyle: 'unlock-screen'
}, },
@@ -86,6 +87,7 @@ 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,
@@ -99,7 +101,7 @@ const _modes = {
panel: { panel: {
left: ['activities', 'appMenu'], left: ['activities', 'appMenu'],
center: ['dateMenu'], center: ['dateMenu'],
right: ['a11y', 'keyboard', 'aggregateMenu'] right: ['dwellClick', 'a11y', 'keyboard', 'aggregateMenu']
} }
} }
}; };

View File

@@ -1,8 +1,9 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const { Clutter, Gio, GLib, Pango, Shell, St } = imports.gi; const { Clutter, Gio, GLib, GObject, 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;
@@ -14,6 +15,7 @@ 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';
@@ -148,7 +150,7 @@ var ShellMountOperation = class {
} }
this._dialogId = this._dialog.connect('response', this._dialogId = this._dialog.connect('response',
(object, choice, password, remember) => { (object, choice, password, remember, hiddenVolume, systemVolume, pim) => {
if (choice == -1) { if (choice == -1) {
this.mountOp.reply(Gio.MountOperationResult.ABORTED); this.mountOp.reply(Gio.MountOperationResult.ABORTED);
} else { } else {
@@ -158,6 +160,9 @@ 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);
} }
}); });
@@ -264,9 +269,11 @@ var ShellUnmountNotifier = class extends MessageTray.Source {
} }
}; };
var ShellMountQuestionDialog = class extends ModalDialog.ModalDialog { var ShellMountQuestionDialog = GObject.registerClass({
constructor(icon) { Signals: { 'response': { param_types: [GObject.TYPE_INT] } }
super({ styleClass: 'mount-dialog' }); }, class ShellMountQuestionDialog 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 });
@@ -276,34 +283,107 @@ var ShellMountQuestionDialog = class extends ModalDialog.ModalDialog {
_setLabelsForMessage(this._content, message); _setLabelsForMessage(this._content, message);
_setButtonsForChoices(this, choices); _setButtonsForChoices(this, choices);
} }
}; });
Signals.addSignalMethods(ShellMountQuestionDialog.prototype);
var ShellMountPasswordDialog = class extends ModalDialog.ModalDialog { var ShellMountPasswordDialog = GObject.registerClass({
constructor(message, icon, flags) { Signals: { 'response': { param_types: [GObject.TYPE_INT,
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({ styleClass: 'prompt-dialog' }); super._init({ 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;
this._passwordBox = new St.BoxLayout({ vertical: false, style_class: 'prompt-dialog-password-box' }); let layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL });
content.messageBox.add(this._passwordBox); let grid = new St.Widget({ style_class: 'prompt-dialog-grid',
layout_manager: layout });
layout.hookup_style(grid);
let rtl = grid.get_text_direction() === Clutter.TextDirection.RTL;
this._passwordLabel = new St.Label(({ style_class: 'prompt-dialog-password-label', if (flags & Gio.AskPasswordFlags.TCRYPT) {
text: _("Password") })); this._keyfilesLabel = new St.Label(({ style_class: 'prompt-dialog-keyfiles-label',
this._passwordBox.add(this._passwordLabel, { y_fill: false, y_align: St.Align.MIDDLE }); visible: false }));
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',
text: "", can_focus: true,
can_focus: true}); x_expand: 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
this._passwordBox.add(this._passwordEntry, {expand: true }); ShellEntry.addContextMenu(this._passwordEntry, { isPassword: 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.") });
@@ -313,8 +393,7 @@ var ShellMountPasswordDialog = class extends ModalDialog.ModalDialog {
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(); this._rememberChoice = new CheckBox.CheckBox(_("Remember Password"));
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);
@@ -322,25 +401,36 @@ var ShellMountPasswordDialog = class extends ModalDialog.ModalDialog {
this._rememberChoice = null; this._rememberChoice = null;
} }
let buttons = [{ label: _("Cancel"), this._defaultButtons = [{ 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.setButtons(buttons); this._usesKeyfilesButtons = [{ label: _("Cancel"),
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); this.emit('response', -1, '', false, false, false, 0);
} }
_onUnlockButton() { _onUnlockButton() {
@@ -348,18 +438,68 @@ var ShellMountPasswordDialog = class extends ModalDialog.ModalDialog {
} }
_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));
} }
};
var ShellProcessesDialog = class extends ModalDialog.ModalDialog { _onKeyfilesCheckboxClicked() {
constructor(icon) { let useKeyfiles = this._keyfilesCheckbox.actor.checked;
super({ styleClass: 'mount-dialog' }); this._passwordEntry.reactive = !useKeyfiles;
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 });
@@ -412,8 +552,7 @@ var ShellProcessesDialog = class extends ModalDialog.ModalDialog {
_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');
@@ -515,7 +654,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) => { (object, choice, password, remember, hiddenVolume, systemVolume, pim) => {
let details = {}; let details = {};
let response; let response;
@@ -527,6 +666,9 @@ 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,7 +32,7 @@ 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.0, _("Accessibility")); super._init(0.5, _("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',

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.actor.visible = !this._proxy.BluetoothHardwareAirplaneMode; this._item.visible = !this._proxy.BluetoothHardwareAirplaneMode;
else else
this._item.actor.visible = this._proxy.BluetoothHasAirplaneMode && !this._proxy.BluetoothAirplaneMode; this._item.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.actor.add(icon); this._item.add(icon);
this._item.actor.add(this._slider.actor, { expand: true }); this._item.add(this._slider.actor, { expand: true });
this._item.actor.connect('button-press-event', (actor, event) => { this._item.connect('button-press-event', (actor, event) => {
return this._slider.startDragging(event); return this._slider.startDragging(event);
}); });
this._item.actor.connect('key-press-event', (actor, event) => { this._item.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.actor.visible = visible; this._item.visible = visible;
if (visible) if (visible)
this._slider.setValue(this._proxy.Brightness / 100.0); this._slider.setValue(this._proxy.Brightness / 100.0);
} }

View File

@@ -0,0 +1,86 @@
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,17 +15,18 @@ 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 = class extends PopupMenu.PopupBaseMenuItem { var LayoutMenuItem = GObject.registerClass(
constructor(displayName, shortName) { class LayoutMenuItem extends PopupMenu.PopupBaseMenuItem {
super(); _init(displayName, shortName) {
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.actor.add(this.label, { expand: true }); this.add(this.label, { expand: true });
this.actor.add(this.indicator); this.add(this.indicator);
this.actor.label_actor = this.label; this.label_actor = this.label;
} }
}; });
var InputSource = class { var InputSource = class {
constructor(type, id, displayName, shortName, index) { constructor(type, id, displayName, shortName, index) {
@@ -809,7 +810,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.0, _("Keyboard")); super._init(0.5, _("Keyboard"));
this.connect('destroy', this._onDestroy.bind(this)); this.connect('destroy', this._onDestroy.bind(this));
@@ -857,7 +858,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.actor.visible = Main.sessionMode.allowSettings; this._showLayoutItem.visible = Main.sessionMode.allowSettings;
} }
_sourcesChanged() { _sourcesChanged() {

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, Shell } = imports.gi; const { Clutter, Gio, GLib, GObject, 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.actor.visible = false; this._item.visible = false;
return; return;
} }
this._indicator.visible = this._managerProxy.InUse; this._indicator.visible = this._managerProxy.InUse;
this._item.actor.visible = this._indicator.visible; this._item.visible = this._indicator.visible;
this._updateMenuLabels(); this._updateMenuLabels();
} }
@@ -342,9 +342,11 @@ var AppAuthorizer = class {
} }
}; };
var GeolocationDialog = class extends ModalDialog.ModalDialog { var GeolocationDialog = GObject.registerClass({
constructor(name, subtitle, reqAccuracyLevel) { Signals: { 'response': { param_types: [GObject.TYPE_UINT] } }
super({ styleClass: 'geolocation-dialog' }); }, class GeolocationDialog extends ModalDialog.ModalDialog {
_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' });
@@ -375,5 +377,4 @@ var GeolocationDialog = class extends ModalDialog.ModalDialog {
this.emit('response', GeoclueAccuracyLevel.NONE); this.emit('response', GeoclueAccuracyLevel.NONE);
this.close(); this.close();
} }
}; });
Signals.addSignalMethods(GeolocationDialog.prototype);

View File

@@ -69,9 +69,12 @@ function ssidToLabel(ssid) {
function ensureActiveConnectionProps(active, client) { function ensureActiveConnectionProps(active, client) {
if (!active._primaryDevice) { if (!active._primaryDevice) {
// This list is guaranteed to have only one device in it. let devices = active.get_devices();
let device = active.get_devices()[0]._delegate; if (devices.length > 0) {
active._primaryDevice = device; // This list is guaranteed to have at most one device in it.
let device = devices[0]._delegate;
active._primaryDevice = device;
}
} }
} }
@@ -235,14 +238,14 @@ var NMConnectionSection = class NMConnectionSection {
if (!this._connectionValid(connection)) if (!this._connectionValid(connection))
return; return;
// This function is called everytime connection is added or updated // This function is called every time the 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)
@@ -389,8 +392,8 @@ var NMConnectionDevice = class NMConnectionDevice extends NMConnectionSection {
_sync() { _sync() {
let nItems = this._connectionItems.size; let nItems = this._connectionItems.size;
this._autoConnectItem.actor.visible = (nItems == 0); this._autoConnectItem.visible = (nItems == 0);
this._deactivateItem.actor.visible = this._device.state > NM.DeviceState.DISCONNECTED; this._deactivateItem.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;
@@ -477,7 +480,7 @@ var NMDeviceWired = class extends NMConnectionDevice {
} }
_sync() { _sync() {
this.item.actor.visible = this._hasCarrier(); this.item.visible = this._hasCarrier();
super._sync(); super._sync();
} }
@@ -613,31 +616,36 @@ var NMDeviceBluetooth = class extends NMConnectionDevice {
} }
}; };
var NMWirelessDialogItem = class { var NMWirelessDialogItem = GObject.registerClass({
constructor(network) { Signals: {
'selected': {},
}
}, class NMWirelessDialogItem extends St.BoxLayout {
_init(network) {
this._network = network; this._network = network;
this._ap = network.accessPoints[0]; this._ap = network.accessPoints[0];
this.actor = new St.BoxLayout({ style_class: 'nm-dialog-item', super._init({ 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.actor.grab_key_focus(); }); action.connect('clicked', () => { this.grab_key_focus(); });
this.actor.add_action(action); this.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.actor.label_actor = this._label; this.label_actor = this._label;
this.actor.add(this._label, { x_align: St.Align.START }); this.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.actor.add(this._selectedIcon); this.add(this._selectedIcon);
this._icons = new St.BoxLayout({ style_class: 'nm-dialog-icons' }); this._icons = new St.BoxLayout({ style_class: 'nm-dialog-icons' });
this.actor.add(this._icons, { expand: true, x_fill: false, x_align: St.Align.END }); this.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)
@@ -669,12 +677,12 @@ var NMWirelessDialogItem = class {
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 = class extends ModalDialog.ModalDialog { var NMWirelessDialog = GObject.registerClass(
constructor(client, device) { class NMWirelessDialog extends ModalDialog.ModalDialog {
super({ styleClass: 'nm-dialog' }); _init(client, device) {
super._init({ styleClass: 'nm-dialog' });
this._client = client; this._client = client;
this._device = device; this._device = device;
@@ -720,9 +728,11 @@ var NMWirelessDialog = class extends ModalDialog.ModalDialog {
Main.sessionMode.disconnect(id); Main.sessionMode.disconnect(id);
this.close(); this.close();
}); });
this.connect('destroy', this._onDestroy.bind(this));
} }
destroy() { _onDestroy() {
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;
@@ -748,8 +758,6 @@ var NMWirelessDialog = class extends ModalDialog.ModalDialog {
Mainloop.source_remove(this._scanTimeoutId); Mainloop.source_remove(this._scanTimeoutId);
this._scanTimeoutId = 0; this._scanTimeoutId = 0;
} }
super.destroy();
} }
_onScanTimeout() { _onScanTimeout() {
@@ -1076,7 +1084,7 @@ var NMWirelessDialog = class 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.actor, newPos); this._itemBox.insert_child_at_index(network.item, newPos);
} }
this._syncView(); this._syncView();
@@ -1094,7 +1102,7 @@ var NMWirelessDialog = class 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.actor.destroy(); network.item.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]);
@@ -1110,7 +1118,7 @@ var NMWirelessDialog = class 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.actor); this._itemBox.add_child(network.item);
}); });
adjustment.value = scrollValue; adjustment.value = scrollValue;
@@ -1118,29 +1126,29 @@ var NMWirelessDialog = class extends ModalDialog.ModalDialog {
_selectNetwork(network) { _selectNetwork(network) {
if (this._selectedNetwork) if (this._selectedNetwork)
this._selectedNetwork.item.actor.remove_style_pseudo_class('selected'); this._selectedNetwork.item.remove_style_pseudo_class('selected');
this._selectedNetwork = network; this._selectedNetwork = network;
this._updateSensitivity(); this._updateSensitivity();
if (this._selectedNetwork) if (this._selectedNetwork)
this._selectedNetwork.item.actor.add_style_pseudo_class('selected'); this._selectedNetwork.item.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.actor); Util.ensureActorVisibleInScrollView(this._scrollView, network.item);
this._selectNetwork(network); this._selectNetwork(network);
}); });
network.item.actor.connect('destroy', () => { network.item.connect('destroy', () => {
let keyFocus = global.stage.key_focus; let keyFocus = global.stage.key_focus;
if (keyFocus && keyFocus.contains(network.item.actor)) if (keyFocus && keyFocus.contains(network.item))
this._itemBox.grab_key_focus(); this._itemBox.grab_key_focus();
}); });
} }
}; });
var NMDeviceWireless = class { var NMDeviceWireless = class {
constructor(client, device) { constructor(client, device) {
@@ -1262,7 +1270,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.actor.visible = this._client.wireless_hardware_enabled; this._toggleItem.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();
@@ -1452,7 +1460,7 @@ var NMVpnSection = class extends NMConnectionSection {
_sync() { _sync() {
let nItems = this._connectionItems.size; let nItems = this._connectionItems.size;
this.item.actor.visible = (nItems > 0); this.item.visible = (nItems > 0);
super._sync(); super._sync();
} }
@@ -1535,7 +1543,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.actor.hide(); this._summaryItem.hide();
} }
@@ -1544,7 +1552,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.actor.visible = shouldSummarize; this._summaryItem.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.actor.visible = this._indicator.visible = visible; this._item.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.actor.show(); this._item.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.actor.hide(); this._item.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.actor.visible = false; this._item.visible = false;
} else { } else {
this._indicator.visible = true; this._indicator.visible = true;
this._item.actor.visible = true; this._item.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.actor.visible = (airplaneMode && showAirplaneMode); this._item.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.actor.connect('notify::visible', this._loginScreenItem.connect('notify::visible',
() => { this._updateMultiUser(); }); () => { this._updateMultiUser(); });
this._logoutItem.actor.connect('notify::visible', this._logoutItem.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._actionsItem.actor.visible = visible; this.buttonGroup.visible = visible;
} }
_sessionUpdated() { _sessionUpdated() {
@@ -150,10 +150,10 @@ var Indicator = class extends PanelMenu.SystemIndicator {
} }
_updateMultiUser() { _updateMultiUser() {
let hasSwitchUser = this._loginScreenItem.actor.visible; let hasSwitchUser = this._loginScreenItem.visible;
let hasLogout = this._logoutItem.actor.visible; let hasLogout = this._logoutItem.visible;
this._switchUserSubMenu.actor.visible = hasSwitchUser || hasLogout; this._switchUserSubMenu.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.actor, this._loginScreenItem,
'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.actor, this._logoutItem,
'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.actor; this.buttonGroup = item;
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.actor.add(this._settingsAction, { expand: true, x_fill: false }); item.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.actor.add(this._orientationLockAction, { expand: true, x_fill: false }); item.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.actor.add(this._lockScreenAction, { expand: true, x_fill: false }); item.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,9 +300,8 @@ 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.actor.add(this._altSwitcher.actor, { expand: true, x_fill: false }); item.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.actor.add(this._icon); this.item.add(this._icon);
this.item.actor.add(this._slider.actor, { expand: true }); this.item.add(this._slider.actor, { expand: true });
this.item.actor.connect('button-press-event', (actor, event) => { this.item.connect('button-press-event', (actor, event) => {
return this._slider.startDragging(event); return this._slider.startDragging(event);
}); });
this.item.actor.connect('key-press-event', (actor, event) => { this.item.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.actor.visible = visible; this.item.visible = visible;
} }
scroll(event) { scroll(event) {

View File

@@ -30,12 +30,10 @@ function primaryModifier(mask) {
return primary; return primary;
} }
var SwitcherPopup = GObject.registerClass( var SwitcherPopup = GObject.registerClass({
class SwitcherPopup extends St.Widget { GTypeFlags: GObject.TypeFlags.ABSTRACT
}, class SwitcherPopup extends St.Widget {
_init(items) { _init(items) {
if (this.constructor.name === SwitcherPopup.prototype.constructor.name)
throw new TypeError(`Cannot instantiate abstract class ${this.constructor.name}`);
super._init({ style_class: 'switcher-popup', super._init({ style_class: 'switcher-popup',
reactive: true, reactive: true,
visible: false }); visible: false });
@@ -164,7 +162,7 @@ class SwitcherPopup extends St.Widget {
} }
_keyPressHandler(keysym, action) { _keyPressHandler(keysym, action) {
throw new Error('Not implemented'); throw new GObject.NotImplementedError(`_keyPressHandler in ${this.constructor.name}`);
} }
_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 continous // HippoAnimationManager for a more sophisticated view of continuous
// 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

@@ -69,8 +69,6 @@ var Source = class WindowAttentionSource extends MessageTray.Source {
() => { this.destroy(); })); () => { this.destroy(); }));
this.signalIDs.push(this._window.connect('unmanaged', this.signalIDs.push(this._window.connect('unmanaged',
() => { this.destroy(); })); () => { this.destroy(); }));
this.connect('destroy', this._onDestroy.bind(this));
} }
_sync() { _sync() {
@@ -79,13 +77,6 @@ var Source = class WindowAttentionSource extends MessageTray.Source {
this.destroy(); this.destroy();
} }
_onDestroy() {
for(let i = 0; i < this.signalIDs.length; i++) {
this._window.disconnect(this.signalIDs[i]);
}
this.signalIDs = [];
}
_createPolicy() { _createPolicy() {
if (this._app && this._app.get_app_info()) { if (this._app && this._app.get_app_info()) {
let id = this._app.get_id().replace(/\.desktop$/,''); let id = this._app.get_id().replace(/\.desktop$/,'');
@@ -99,6 +90,14 @@ var Source = class WindowAttentionSource extends MessageTray.Source {
return this._app.create_icon_texture(size); return this._app.create_icon_texture(size);
} }
destroy(params) {
for (let i = 0; i < this.signalIDs.length; i++)
this._window.disconnect(this.signalIDs[i]);
this.signalIDs = [];
super.destroy(params);
}
open() { open() {
Main.activateWindow(this._window); Main.activateWindow(this._window);
} }

View File

@@ -40,9 +40,10 @@ 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 = class extends ModalDialog.ModalDialog { var DisplayChangeDialog = GObject.registerClass(
constructor(wm) { class DisplayChangeDialog extends ModalDialog.ModalDialog {
super({ styleClass: 'prompt-dialog' }); _init(wm) {
super._init({ styleClass: 'prompt-dialog' });
this._wm = wm; this._wm = wm;
@@ -59,7 +60,7 @@ var DisplayChangeDialog = class 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 lenght, /* Translators: this and the following message should be limited in length,
to avoid ellipsizing the labels. to avoid ellipsizing the labels.
*/ */
this._cancelButton = this.addButton({ label: _("Revert Settings"), this._cancelButton = this.addButton({ label: _("Revert Settings"),
@@ -111,7 +112,7 @@ var DisplayChangeDialog = class 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) {
@@ -2120,7 +2121,14 @@ 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 { Meta, St } = imports.gi; const { GLib, 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 => {
window.begin_grab_op(Meta.GrabOp.KEYBOARD_MOVING, true, event.get_time()); this._grabAction(window, Meta.GrabOp.KEYBOARD_MOVING, 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 => {
window.begin_grab_op(Meta.GrabOp.KEYBOARD_RESIZING_UNKNOWN, true, event.get_time()); this._grabAction(window, Meta.GrabOp.KEYBOARD_RESIZING_UNKNOWN, event.get_time());
}); });
if (!window.allows_resize()) if (!window.allows_resize())
item.setSensitive(false); item.setSensitive(false);
@@ -169,6 +169,26 @@ 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 {
@@ -183,6 +203,9 @@ 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

@@ -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 overal layout scale. // to be applied in addition to the overall 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 Error('_computeRowSizes not implemented'); throw new GObject.NotImplementedError(`_computeRowSizes in ${this.constructor.name}`);
} }
// 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 Error('computeLayout not implemented'); throw new GObject.NotImplementedError(`computeLayout in ${this.constructor.name}`);
} }
// 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 whith fade animation. // animations with 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 outweights aspect space loss // Keep new layout only if scale gain outweighs 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 outweights scale loss // Keep new layout only if aspect space gain outweighs scale loss
return spacePower > scalePower; return spacePower > scalePower;
} else { } else {
// Lose -- worse scale and space // Lose -- worse scale and space

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; // programatically updating the adjustment this._animatingScroll = false; // programmatically 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,7 +483,6 @@ 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 });
@@ -491,8 +490,6 @@ 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.1', version: '3.33.3',
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.5.3' ecal_req = '>= 3.33.1'
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.54.0' gjs_req = '>= 1.57.3'
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.1' mutter_req = '>= 3.33.3'
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-1.2', version: ecal_req) ecal_dep = dependency('libecal-2.0', 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,47 +167,57 @@ cdata.set('HAVE_FDWALK',
cc.has_function('fdwalk') cc.has_function('fdwalk')
) )
all_warnings = [ buildtype = get_option('buildtype')
'-fno-strict-aliasing', if buildtype != 'plain'
'-Wpointer-arith', all_warnings = [
'-Wmissing-declarations', '-fno-strict-aliasing',
'-Wimplicit-function-declaration', '-Wpointer-arith',
'-Wformat=2', '-Wmissing-declarations',
'-Wformat-nonliteral', '-Wimplicit-function-declaration',
'-Wformat-security', '-Wformat=2',
'-Wstrict-prototypes', '-Wformat-nonliteral',
'-Wmissing-prototypes', '-Wformat-security',
'-Wnested-externs', '-Wstrict-prototypes',
'-Wold-style-definition', '-Wmissing-prototypes',
'-Wundef', '-Wnested-externs',
'-Wunused', '-Wold-style-definition',
'-Wcast-align', '-Wundef',
'-Wmissing-noreturn', '-Wunused',
'-Wmissing-format-attribute', '-Wcast-align',
'-Wmissing-include-dirs', '-Wmissing-noreturn',
'-Wlogical-op', '-Wmissing-format-attribute',
'-Wignored-qualifiers', '-Wmissing-include-dirs',
'-Werror=redundant-decls', '-Wlogical-op',
'-Werror=implicit', '-Wignored-qualifiers',
'-Werror=nonnull', '-Werror=redundant-decls',
'-Werror=init-self', '-Werror=implicit',
'-Werror=main', '-Werror=nonnull',
'-Werror=missing-braces', '-Werror=init-self',
'-Werror=sequence-point', '-Werror=main',
'-Werror=return-type', '-Werror=missing-braces',
'-Werror=trigraphs', '-Werror=sequence-point',
'-Werror=array-bounds', '-Werror=return-type',
'-Werror=write-strings', '-Werror=trigraphs',
'-Werror=address', '-Werror=array-bounds',
'-Werror=int-to-pointer-cast', '-Werror=write-strings',
'-Werror=pointer-to-int-cast', '-Werror=address',
'-Werror=empty-body', '-Werror=int-to-pointer-cast',
'-Werror=write-strings', '-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
supported_warnings = cc.get_supported_arguments(all_warnings) if get_option('debug')
debug_c_args = [
add_project_arguments(supported_warnings, language: 'c') '-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',

View File

@@ -54,6 +54,7 @@ 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

322
po/es.po
View File

@@ -9,8 +9,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-04-17 19:29+0000\n" "POT-Creation-Date: 2019-06-06 11:42+0000\n"
"PO-Revision-Date: 2019-04-23 10:15+0200\n" "PO-Revision-Date: 2019-06-10 12:04+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: es <gnome-es-list@gnome.org>\n"
"Language: es\n" "Language: es\n"
@@ -428,10 +428,11 @@ 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:55 #: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:52
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136 #: js/ui/components/networkAgent.js:118 js/ui/components/polkitAgent.js:138
#: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188 #: js/ui/endSessionDialog.js:431 js/ui/extensionDownloader.js:188
#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888 #: js/ui/shellMountOperation.js:404 js/ui/shellMountOperation.js:413
#: js/ui/status/network.js:894
msgid "Cancel" msgid "Cancel"
msgstr "Cancelar" msgstr "Cancelar"
@@ -439,7 +440,7 @@ msgstr "Cancelar"
msgid "Next" msgid "Next"
msgstr "Siguiente" msgstr "Siguiente"
#: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:329 #: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:408
#: js/ui/unlockDialog.js:41 #: js/ui/unlockDialog.js:41
msgid "Unlock" msgid "Unlock"
msgstr "Desbloquear" msgstr "Desbloquear"
@@ -470,8 +471,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:243 #: js/gdm/loginDialog.js:889 js/ui/components/networkAgent.js:244
#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281 #: js/ui/components/networkAgent.js:264 js/ui/components/networkAgent.js:282
msgid "Username: " msgid "Username: "
msgstr "Nombre de usuario:" msgstr "Nombre de usuario:"
@@ -522,7 +523,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;sign off" msgid "logout;log out;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
@@ -708,11 +709,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:37 js/ui/status/location.js:360 #: js/ui/accessDialog.js:38 js/ui/status/location.js:362
msgid "Deny Access" msgid "Deny Access"
msgstr "Denegar acceso" msgstr "Denegar acceso"
#: js/ui/accessDialog.js:38 js/ui/status/location.js:363 #: js/ui/accessDialog.js:39 js/ui/status/location.js:365
msgid "Grant Access" msgid "Grant Access"
msgstr "Conceder acceso" msgstr "Conceder acceso"
@@ -730,7 +731,6 @@ msgstr "Todas"
#. Translators: This is the heading of a list of open windows #. Translators: This is the heading of a list of open windows
#: js/ui/appDisplay.js:1713 js/ui/panel.js:79 #: js/ui/appDisplay.js:1713 js/ui/panel.js:79
#| msgid "Windows"
msgid "Open Windows" msgid "Open Windows"
msgstr "Ventanas abiertas" msgstr "Ventanas abiertas"
@@ -764,23 +764,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:42 #: js/ui/audioDeviceSelection.js:39
msgid "Select Audio Device" msgid "Select Audio Device"
msgstr "Seleccionar dispositivo de sonido" msgstr "Seleccionar dispositivo de sonido"
#: js/ui/audioDeviceSelection.js:53 #: js/ui/audioDeviceSelection.js:50
msgid "Sound Settings" msgid "Sound Settings"
msgstr "Configuración de sonido" msgstr "Configuración de sonido"
#: js/ui/audioDeviceSelection.js:62 #: js/ui/audioDeviceSelection.js:59
msgid "Headphones" msgid "Headphones"
msgstr "Auriculares" msgstr "Auriculares"
#: js/ui/audioDeviceSelection.js:64 #: js/ui/audioDeviceSelection.js:61
msgid "Headset" msgid "Headset"
msgstr "Manos libres" msgstr "Manos libres"
#: js/ui/audioDeviceSelection.js:66 js/ui/status/volume.js:247 #: js/ui/audioDeviceSelection.js:63 js/ui/status/volume.js:247
msgid "Microphone" msgid "Microphone"
msgstr "Micrófono" msgstr "Micrófono"
@@ -941,67 +941,75 @@ msgstr "Forzar la salida"
msgid "Wait" msgid "Wait"
msgstr "Esperar" msgstr "Esperar"
#: js/ui/components/automountManager.js:86 #: js/ui/components/automountManager.js:87
msgid "External drive connected" msgid "External drive connected"
msgstr "Dispositivo externo conectado" msgstr "Dispositivo externo conectado"
#: js/ui/components/automountManager.js:98 #: js/ui/components/automountManager.js:99
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:77 js/ui/components/polkitAgent.js:255 #: js/ui/components/keyring.js:66 js/ui/components/polkitAgent.js:257
msgid "Password:" msgid "Password:"
msgstr "Contraseña:" msgstr "Contraseña:"
#: js/ui/components/keyring.js:108 #: js/ui/components/keyring.js:97
msgid "Type again:" msgid "Type again:"
msgstr "Escriba de nuevo:" msgstr "Escriba de nuevo:"
#: js/ui/components/networkAgent.js:102 #: js/ui/components/networkAgent.js:103
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:112 js/ui/status/network.js:219 #: js/ui/components/networkAgent.js:113 js/ui/status/network.js:219
#: js/ui/status/network.js:309 js/ui/status/network.js:891 #: js/ui/status/network.js:310 js/ui/status/network.js:897
msgid "Connect" msgid "Connect"
msgstr "Conectar" msgstr "Conectar"
#. Cisco LEAP #. Cisco LEAP
#: js/ui/components/networkAgent.js:211 js/ui/components/networkAgent.js:223 #: js/ui/components/networkAgent.js:212 js/ui/components/networkAgent.js:224
#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:265 #: js/ui/components/networkAgent.js:247 js/ui/components/networkAgent.js:266
#: js/ui/components/networkAgent.js:285 js/ui/components/networkAgent.js:295 #: js/ui/components/networkAgent.js:286 js/ui/components/networkAgent.js:296
msgid "Password: " msgid "Password: "
msgstr "Contraseña: " msgstr "Contraseña: "
#. static WEP #. static WEP
#: js/ui/components/networkAgent.js:216 #: js/ui/components/networkAgent.js:217
msgid "Key: " msgid "Key: "
msgstr "Clave:" msgstr "Clave:"
#: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271 #: js/ui/components/networkAgent.js:250 js/ui/components/networkAgent.js:272
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:269 #: js/ui/components/networkAgent.js:270
msgid "Identity: " msgid "Identity: "
msgstr "Identidad:" msgstr "Identidad:"
#: js/ui/components/networkAgent.js:283 #: js/ui/components/networkAgent.js:284
msgid "Service: " msgid "Service: "
msgstr "Servicio:" msgstr "Servicio:"
#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685 #: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686
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:313 js/ui/components/networkAgent.js:686 #: js/ui/components/networkAgent.js:314 js/ui/components/networkAgent.js:687
#, 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 "
@@ -1010,53 +1018,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:317 js/ui/components/networkAgent.js:689 #: js/ui/components/networkAgent.js:318 js/ui/components/networkAgent.js:690
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:319 #: js/ui/components/networkAgent.js:320
msgid "Network name: " msgid "Network name: "
msgstr "Nombre de la red: " msgstr "Nombre de la red: "
#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:693 #: js/ui/components/networkAgent.js:325 js/ui/components/networkAgent.js:694
msgid "DSL authentication" msgid "DSL authentication"
msgstr "Autenticación DSL" msgstr "Autenticación DSL"
#: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:699 #: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700
msgid "PIN code required" msgid "PIN code required"
msgstr "Código PIN requerido" msgstr "Código PIN requerido"
#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700 #: js/ui/components/networkAgent.js:333 js/ui/components/networkAgent.js:701
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:333 #: js/ui/components/networkAgent.js:334
msgid "PIN: " msgid "PIN: "
msgstr "PIN: " msgstr "PIN: "
#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:706 #: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:707
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:341 js/ui/components/networkAgent.js:690 #: js/ui/components/networkAgent.js:342 js/ui/components/networkAgent.js:691
#: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707 #: js/ui/components/networkAgent.js:695 js/ui/components/networkAgent.js:708
#, 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:674 js/ui/status/network.js:1664 #: js/ui/components/networkAgent.js:675 js/ui/status/network.js:1670
msgid "Network Manager" msgid "Network Manager"
msgstr "Gestor de la red" msgstr "Gestor de la red"
#: js/ui/components/polkitAgent.js:34 #: js/ui/components/polkitAgent.js:36
msgid "Authentication Required" msgid "Authentication Required"
msgstr "Se necesita autenticación" msgstr "Se necesita autenticación"
#: js/ui/components/polkitAgent.js:62 #: js/ui/components/polkitAgent.js:64
msgid "Administrator" msgid "Administrator"
msgstr "Administrador" msgstr "Administrador"
#: js/ui/components/polkitAgent.js:139 #: js/ui/components/polkitAgent.js:141
msgid "Authenticate" msgid "Authenticate"
msgstr "Autenticar" msgstr "Autenticar"
@@ -1064,7 +1072,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:241 js/ui/shellMountOperation.js:309 #: js/ui/components/polkitAgent.js:243 js/ui/shellMountOperation.js:389
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."
@@ -1258,27 +1266,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:309 #: js/ui/endSessionDialog.js:310
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:326 #: js/ui/endSessionDialog.js:327
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:333 #: js/ui/endSessionDialog.js:334
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:614 #: js/ui/endSessionDialog.js:615
#, 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:617 #: js/ui/endSessionDialog.js:618
#, javascript-format #, javascript-format
msgid "%s (console)" msgid "%s (console)"
msgstr "%s (consola)" msgstr "%s (consola)"
@@ -1365,13 +1373,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:1263 #: js/ui/status/network.js:1269
msgid "Turn On" msgid "Turn On"
msgstr "Encender" msgstr "Encender"
#: 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:310 #: js/ui/status/network.js:128 js/ui/status/network.js:311
#: js/ui/status/network.js:1263 js/ui/status/network.js:1375 #: js/ui/status/network.js:1269 js/ui/status/network.js:1381
#: 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"
@@ -1433,7 +1441,7 @@ msgstr "Ver fuente"
msgid "Web Page" msgid "Web Page"
msgstr "Página web" msgstr "Página web"
#: js/ui/messageTray.js:1480 #: js/ui/messageTray.js:1479
msgid "System Information" msgid "System Information"
msgstr "Información del sistema" msgstr "Información del sistema"
@@ -1526,23 +1534,23 @@ msgctxt "System menu in the top bar"
msgid "System" msgid "System"
msgstr "Sistema" msgstr "Sistema"
#: js/ui/panel.js:864 #: js/ui/panel.js:862
msgid "Top Bar" msgid "Top Bar"
msgstr "Barra superior" msgstr "Barra superior"
#: js/ui/runDialog.js:64 #: js/ui/runDialog.js:65
msgid "Enter a Command" msgid "Enter a Command"
msgstr "Introducir un comando" msgstr "Introducir un comando"
#: js/ui/runDialog.js:104 js/ui/windowMenu.js:166 #: js/ui/runDialog.js:105 js/ui/windowMenu.js:166
msgid "Close" msgid "Close"
msgstr "Cerrar" msgstr "Cerrar"
#: js/ui/runDialog.js:266 #: js/ui/runDialog.js:267
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:271 #: js/ui/runDialog.js:272
msgid "Restarting…" msgid "Restarting…"
msgstr "Reiniciando…" msgstr "Reiniciando…"
@@ -1589,15 +1597,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:635 #: js/ui/search.js:638
msgid "Searching…" msgid "Searching…"
msgstr "Buscando…" msgstr "Buscando…"
#: js/ui/search.js:637 #: js/ui/search.js:640
msgid "No results." msgid "No results."
msgstr "No se encontraron resultados." msgstr "No se encontraron resultados."
#: js/ui/search.js:761 #: js/ui/search.js:764
#, javascript-format #, javascript-format
msgid "%d more" msgid "%d more"
msgid_plural "%d more" msgid_plural "%d more"
@@ -1620,14 +1628,61 @@ msgstr "Mostrar texto"
msgid "Hide Text" msgid "Hide Text"
msgstr "Ocultar texto" msgstr "Ocultar texto"
#: js/ui/shellMountOperation.js:296 #: js/ui/shellMountOperation.js:318
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:317 #: js/ui/shellMountOperation.js:396
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"
@@ -1664,11 +1719,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:151 #: js/ui/status/accessibility.js:135
msgid "High Contrast" msgid "High Contrast"
msgstr "Contraste alto" msgstr "Contraste alto"
#: js/ui/status/accessibility.js:182 #: js/ui/status/accessibility.js:177
msgid "Large Text" msgid "Large Text"
msgstr "Texto grande" msgstr "Texto grande"
@@ -1676,7 +1731,7 @@ msgstr "Texto grande"
msgid "Bluetooth" msgid "Bluetooth"
msgstr "Bluetooth" msgstr "Bluetooth"
#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585 #: js/ui/status/bluetooth.js:47 js/ui/status/network.js:586
msgid "Bluetooth Settings" msgid "Bluetooth Settings"
msgstr "Configuración de Bluetooth" msgstr "Configuración de Bluetooth"
@@ -1700,11 +1755,31 @@ msgstr "Encendido"
msgid "Brightness" msgid "Brightness"
msgstr "Brillo" msgstr "Brillo"
#: js/ui/status/keyboard.js:812 #: js/ui/status/dwellClick.js:13
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:834 #: js/ui/status/keyboard.js:835
msgid "Show Keyboard Layout" msgid "Show Keyboard Layout"
msgstr "Mostrar la distribución del teclado" msgstr "Mostrar la distribución del teclado"
@@ -1733,12 +1808,12 @@ msgid "Enable"
msgstr "Activar" msgstr "Activar"
#. Translators: %s is an application name #. Translators: %s is an application name
#: js/ui/status/location.js:353 #: js/ui/status/location.js:355
#, 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:354 #: js/ui/status/location.js:356
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 "
@@ -1749,13 +1824,13 @@ msgid "<unknown>"
msgstr "<desconocido>" msgstr "<desconocido>"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:416 js/ui/status/network.js:1292 #: js/ui/status/network.js:417 js/ui/status/network.js:1298
#, 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:419 #: js/ui/status/network.js:420
#, javascript-format #, javascript-format
msgid "%s Connected" msgid "%s Connected"
msgstr "%s conectada" msgstr "%s conectada"
@@ -1763,189 +1838,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:424 #: js/ui/status/network.js:425
#, 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:427 #: js/ui/status/network.js:428
#, 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:434 js/ui/status/network.js:1284 #: js/ui/status/network.js:435 js/ui/status/network.js:1290
#, 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:437 #: js/ui/status/network.js:438
#, 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:445 #: js/ui/status/network.js:446
#, 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:449 #: js/ui/status/network.js:450
#, 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:452 #: js/ui/status/network.js:453
#, 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:464 #: js/ui/status/network.js:465
msgid "Wired Settings" msgid "Wired Settings"
msgstr "Configuración de red cableada" msgstr "Configuración de red cableada"
#: js/ui/status/network.js:506 #: js/ui/status/network.js:507
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:553 js/ui/status/network.js:1289 #: js/ui/status/network.js:554 js/ui/status/network.js:1295
#, 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:557 #: js/ui/status/network.js:558
#, javascript-format #, javascript-format
msgid "%s Disabled" msgid "%s Disabled"
msgstr "%s desactivado" msgstr "%s desactivado"
#: js/ui/status/network.js:597 #: js/ui/status/network.js:598
msgid "Connect to Internet" msgid "Connect to Internet"
msgstr "Conectar a Internet" msgstr "Conectar a Internet"
#: js/ui/status/network.js:786 #: js/ui/status/network.js:792
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:787 #: js/ui/status/network.js:793
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:788 #: js/ui/status/network.js:794
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:797 #: js/ui/status/network.js:803
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:798 #: js/ui/status/network.js:804
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:799 #: js/ui/status/network.js:805
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:824 #: js/ui/status/network.js:830
msgid "Wi-Fi Networks" msgid "Wi-Fi Networks"
msgstr "Redes Wi-Fi" msgstr "Redes Wi-Fi"
#: js/ui/status/network.js:826 #: js/ui/status/network.js:832
msgid "Select a network" msgid "Select a network"
msgstr "Seleccionar una red" msgstr "Seleccionar una red"
#: js/ui/status/network.js:855 #: js/ui/status/network.js:861
msgid "No Networks" msgid "No Networks"
msgstr "No hay redes" msgstr "No hay redes"
#: js/ui/status/network.js:876 js/ui/status/rfkill.js:104 #: js/ui/status/network.js:882 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:1152 #: js/ui/status/network.js:1158
msgid "Select Network" msgid "Select Network"
msgstr "Seleccionar red" msgstr "Seleccionar red"
#: js/ui/status/network.js:1158 #: js/ui/status/network.js:1164
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:1280 #: js/ui/status/network.js:1286
#, 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:1295 #: js/ui/status/network.js:1301
#, 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:1392 #: js/ui/status/network.js:1398
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:1395 #: js/ui/status/network.js:1401
msgid "authentication required" msgid "authentication required"
msgstr "se necesita autenticación" msgstr "se necesita autenticación"
#: js/ui/status/network.js:1397 #: js/ui/status/network.js:1403
msgid "connection failed" msgid "connection failed"
msgstr "falló la conexión" msgstr "falló la conexión"
#: js/ui/status/network.js:1447 #: js/ui/status/network.js:1453
msgid "VPN Settings" msgid "VPN Settings"
msgstr "Configuración de VPN" msgstr "Configuración de VPN"
#: js/ui/status/network.js:1464 #: js/ui/status/network.js:1470
msgid "VPN" msgid "VPN"
msgstr "VPN" msgstr "VPN"
#: js/ui/status/network.js:1474 #: js/ui/status/network.js:1480
msgid "VPN Off" msgid "VPN Off"
msgstr "VPN apagada" msgstr "VPN apagada"
#: js/ui/status/network.js:1535 js/ui/status/rfkill.js:82 #: js/ui/status/network.js:1541 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:1564 #: js/ui/status/network.js:1570
#, 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:1568 #: js/ui/status/network.js:1574
#, 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:1572 #: js/ui/status/network.js:1578
#, 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:1705 #: js/ui/status/network.js:1711
msgid "Connection failed" msgid "Connection failed"
msgstr "Falló la conexión" msgstr "Falló la conexión"
#: js/ui/status/network.js:1706 #: js/ui/status/network.js:1712
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"
@@ -2127,22 +2202,22 @@ msgstr "Buscar"
msgid "“%s” is ready" msgid "“%s” is ready"
msgstr "«%s» está preparado" msgstr "«%s» está preparado"
#: js/ui/windowManager.js:53 #: js/ui/windowManager.js:54
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 lenght, #. Translators: this and the following message should be limited in length,
#. to avoid ellipsizing the labels. #. to avoid ellipsizing the labels.
#. #.
#: js/ui/windowManager.js:65 #: js/ui/windowManager.js:66
msgid "Revert Settings" msgid "Revert Settings"
msgstr "Revertir configuración" msgstr "Revertir configuración"
#: js/ui/windowManager.js:68 #: js/ui/windowManager.js:69
msgid "Keep Changes" msgid "Keep Changes"
msgstr "Mantener cambios" msgstr "Mantener cambios"
#: js/ui/windowManager.js:86 #: js/ui/windowManager.js:87
#, 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"
@@ -2151,7 +2226,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:677 #: js/ui/windowManager.js:678
#, javascript-format #, javascript-format
msgid "%d × %d" msgid "%d × %d"
msgstr "%d × %d" msgstr "%d × %d"
@@ -2252,11 +2327,11 @@ msgstr "Desconocido"
msgid "Failed to launch “%s”" msgid "Failed to launch “%s”"
msgstr "Falló al lanzar «%s»" msgstr "Falló al lanzar «%s»"
#: src/shell-keyring-prompt.c:730 #: src/shell-keyring-prompt.c:731
msgid "Passwords do not match." msgid "Passwords do not match."
msgstr "Las contraseñas no coinciden." msgstr "Las contraseñas no coinciden."
#: src/shell-keyring-prompt.c:738 #: src/shell-keyring-prompt.c:739
msgid "Password cannot be blank" msgid "Password cannot be blank"
msgstr "La contraseña no puede estar vacía" msgstr "La contraseña no puede estar vacía"
@@ -2512,9 +2587,6 @@ 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"

336
po/fur.po
View File

@@ -7,15 +7,15 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: video-subtitles master\n" "Project-Id-Version: video-subtitles 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-04-17 19:29+0000\n" "POT-Creation-Date: 2019-06-06 11:42+0000\n"
"PO-Revision-Date: 2019-04-26 16:10+0200\n" "PO-Revision-Date: 2019-06-11 11:25+0200\n"
"Last-Translator: Fabio Tomat <f.t.public@gmail.com>\n" "Last-Translator: Fabio Tomat <f.t.public@gmail.com>\n"
"Language-Team: Friulian <fur@li.org>\n" "Language-Team: Friulian <fur@li.org>\n"
"Language: fur\n" "Language: fur\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.2.1\n" "X-Generator: Poedit 2.2.3\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: data/50-gnome-shell-system.xml:6 #: data/50-gnome-shell-system.xml:6
@@ -419,10 +419,11 @@ msgstr ""
msgid "Browse in Software" msgid "Browse in Software"
msgstr "Esplore in Software" msgstr "Esplore in Software"
#: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55 #: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:52
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136 #: js/ui/components/networkAgent.js:118 js/ui/components/polkitAgent.js:138
#: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188 #: js/ui/endSessionDialog.js:431 js/ui/extensionDownloader.js:188
#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888 #: js/ui/shellMountOperation.js:404 js/ui/shellMountOperation.js:413
#: js/ui/status/network.js:894
msgid "Cancel" msgid "Cancel"
msgstr "Anule" msgstr "Anule"
@@ -430,7 +431,7 @@ msgstr "Anule"
msgid "Next" msgid "Next"
msgstr "Indenant" msgstr "Indenant"
#: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:329 #: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:408
#: js/ui/unlockDialog.js:41 #: js/ui/unlockDialog.js:41
msgid "Unlock" msgid "Unlock"
msgstr "Sbloche" msgstr "Sbloche"
@@ -461,10 +462,10 @@ msgstr "(p.e., utent 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:243 #: js/gdm/loginDialog.js:889 js/ui/components/networkAgent.js:244
#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281 #: js/ui/components/networkAgent.js:264 js/ui/components/networkAgent.js:282
msgid "Username: " msgid "Username: "
msgstr "Non utent:" msgstr "Non utent: "
#: js/gdm/loginDialog.js:1227 #: js/gdm/loginDialog.js:1227
msgid "Login Window" msgid "Login Window"
@@ -513,8 +514,8 @@ msgstr "Jessî"
#. 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;sign off" msgid "logout;log out;sign off"
msgstr "jessî;sierâ session" msgstr "jessî;sierâ session;disconeti"
#. 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
@@ -700,11 +701,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:37 js/ui/status/location.js:360 #: js/ui/accessDialog.js:38 js/ui/status/location.js:362
msgid "Deny Access" msgid "Deny Access"
msgstr "Dinee acès" msgstr "Dinee acès"
#: js/ui/accessDialog.js:38 js/ui/status/location.js:363 #: js/ui/accessDialog.js:39 js/ui/status/location.js:365
msgid "Grant Access" msgid "Grant Access"
msgstr "Garantìs l'acès" msgstr "Garantìs l'acès"
@@ -755,23 +756,23 @@ msgstr "%s al è stât zontât tai tiei preferîts."
msgid "%s has been removed from your favorites." msgid "%s has been removed from your favorites."
msgstr "%s al è stât gjavât dai tiei preferîts." msgstr "%s al è stât gjavât dai tiei preferîts."
#: js/ui/audioDeviceSelection.js:42 #: js/ui/audioDeviceSelection.js:39
msgid "Select Audio Device" msgid "Select Audio Device"
msgstr "Selezione dispositîf sonôr" msgstr "Selezione dispositîf sonôr"
#: js/ui/audioDeviceSelection.js:53 #: js/ui/audioDeviceSelection.js:50
msgid "Sound Settings" msgid "Sound Settings"
msgstr "Impostazions suns" msgstr "Impostazions suns"
#: js/ui/audioDeviceSelection.js:62 #: js/ui/audioDeviceSelection.js:59
msgid "Headphones" msgid "Headphones"
msgstr "Cufis" msgstr "Cufis"
#: js/ui/audioDeviceSelection.js:64 #: js/ui/audioDeviceSelection.js:61
msgid "Headset" msgid "Headset"
msgstr "Cufis cun microfon" msgstr "Cufis cun microfon"
#: js/ui/audioDeviceSelection.js:66 js/ui/status/volume.js:247 #: js/ui/audioDeviceSelection.js:63 js/ui/status/volume.js:247
msgid "Microphone" msgid "Microphone"
msgstr "Microfon" msgstr "Microfon"
@@ -932,67 +933,75 @@ msgstr "Sfuarce jessude"
msgid "Wait" msgid "Wait"
msgstr "Spiete" msgstr "Spiete"
#: js/ui/components/automountManager.js:86 #: js/ui/components/automountManager.js:87
msgid "External drive connected" msgid "External drive connected"
msgstr "Dispositîf esterni tacât" msgstr "Dispositîf esterni tacât"
#: js/ui/components/automountManager.js:98 #: js/ui/components/automountManager.js:99
msgid "External drive disconnected" msgid "External drive disconnected"
msgstr "Dispositîf esterni distacât" msgstr "Dispositîf esterni distacât"
#: js/ui/components/automountManager.js:211
msgid "Unable to unlock volume"
msgstr "Impussibil sblocâ il volum"
#: js/ui/components/automountManager.js:212
msgid "The installed udisks version does not support the PIM setting"
msgstr "La version di udisks instalade no supuarte la impostazion 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 "Vierç cun %s" msgstr "Vierç cun %s"
#: js/ui/components/keyring.js:77 js/ui/components/polkitAgent.js:255 #: js/ui/components/keyring.js:66 js/ui/components/polkitAgent.js:257
msgid "Password:" msgid "Password:"
msgstr "Password:" msgstr "Password:"
#: js/ui/components/keyring.js:108 #: js/ui/components/keyring.js:97
msgid "Type again:" msgid "Type again:"
msgstr "Scîf di gnûf:" msgstr "Scîf di gnûf:"
#: js/ui/components/networkAgent.js:102 #: js/ui/components/networkAgent.js:103
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 ""
"In alternative al è pussibil conetisi fracant il boton “WPS” sul router." "In alternative al è pussibil conetisi fracant il boton “WPS” sul router."
#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219 #: js/ui/components/networkAgent.js:113 js/ui/status/network.js:219
#: js/ui/status/network.js:309 js/ui/status/network.js:891 #: js/ui/status/network.js:310 js/ui/status/network.js:897
msgid "Connect" msgid "Connect"
msgstr "Conet" msgstr "Conet"
#. Cisco LEAP #. Cisco LEAP
#: js/ui/components/networkAgent.js:211 js/ui/components/networkAgent.js:223 #: js/ui/components/networkAgent.js:212 js/ui/components/networkAgent.js:224
#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:265 #: js/ui/components/networkAgent.js:247 js/ui/components/networkAgent.js:266
#: js/ui/components/networkAgent.js:285 js/ui/components/networkAgent.js:295 #: js/ui/components/networkAgent.js:286 js/ui/components/networkAgent.js:296
msgid "Password: " msgid "Password: "
msgstr "Password: " msgstr "Password: "
#. static WEP #. static WEP
#: js/ui/components/networkAgent.js:216 #: js/ui/components/networkAgent.js:217
msgid "Key: " msgid "Key: "
msgstr "Clâf:" msgstr "Clâf: "
#: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271 #: js/ui/components/networkAgent.js:250 js/ui/components/networkAgent.js:272
msgid "Private key password: " msgid "Private key password: "
msgstr "Password di clâf privade:" msgstr "Password di clâf privade: "
#: js/ui/components/networkAgent.js:269 #: js/ui/components/networkAgent.js:270
msgid "Identity: " msgid "Identity: "
msgstr "Identitât:" msgstr "Identitât: "
#: js/ui/components/networkAgent.js:283 #: js/ui/components/networkAgent.js:284
msgid "Service: " msgid "Service: "
msgstr "Servizi:" msgstr "Servizi: "
#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685 #: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686
msgid "Authentication required by wireless network" msgid "Authentication required by wireless network"
msgstr "La rêt cence fîl e domande autenticazion" msgstr "La rêt cence fîl e domande autenticazion"
#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686 #: js/ui/components/networkAgent.js:314 js/ui/components/networkAgent.js:687
#, 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 "
@@ -1001,53 +1010,53 @@ msgstr ""
"Si scugne meti une password o une clâf di cifradure par jentrâ te rêt cence " "Si scugne meti une password o une clâf di cifradure par jentrâ te rêt cence "
"fîl \"%s\"." "fîl \"%s\"."
#: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:689 #: js/ui/components/networkAgent.js:318 js/ui/components/networkAgent.js:690
msgid "Wired 802.1X authentication" msgid "Wired 802.1X authentication"
msgstr "Autenticazion vie fîl 802.1X" msgstr "Autenticazion vie fîl 802.1X"
#: js/ui/components/networkAgent.js:319 #: js/ui/components/networkAgent.js:320
msgid "Network name: " msgid "Network name: "
msgstr "Non rêt:" msgstr "Non rêt: "
#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:693 #: js/ui/components/networkAgent.js:325 js/ui/components/networkAgent.js:694
msgid "DSL authentication" msgid "DSL authentication"
msgstr "Autenticazion DSL" msgstr "Autenticazion DSL"
#: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:699 #: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700
msgid "PIN code required" msgid "PIN code required"
msgstr "Si pretint un codiç PIN" msgstr "Si pretint un codiç PIN"
#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700 #: js/ui/components/networkAgent.js:333 js/ui/components/networkAgent.js:701
msgid "PIN code is needed for the mobile broadband device" msgid "PIN code is needed for the mobile broadband device"
msgstr "Si scugne meti un codiç PIN pal dispositîf a bande largje mobil" msgstr "Si scugne meti un codiç PIN pal dispositîf a bande largje mobil"
#: js/ui/components/networkAgent.js:333 #: js/ui/components/networkAgent.js:334
msgid "PIN: " msgid "PIN: "
msgstr "PIN: " msgstr "PIN: "
#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:706 #: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:707
msgid "Mobile broadband network password" msgid "Mobile broadband network password"
msgstr "Passowrd rêt mobil a bande largje" msgstr "Passowrd rêt mobil a bande largje"
#: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:690 #: js/ui/components/networkAgent.js:342 js/ui/components/networkAgent.js:691
#: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707 #: js/ui/components/networkAgent.js:695 js/ui/components/networkAgent.js:708
#, javascript-format #, javascript-format
msgid "A password is required to connect to “%s”." msgid "A password is required to connect to “%s”."
msgstr "A covente une password par tacâsi a '%s'." msgstr "A covente une password par tacâsi a '%s'."
#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1664 #: js/ui/components/networkAgent.js:675 js/ui/status/network.js:1670
msgid "Network Manager" msgid "Network Manager"
msgstr "Ministradôr di rêt" msgstr "Ministradôr di rêt"
#: js/ui/components/polkitAgent.js:34 #: js/ui/components/polkitAgent.js:36
msgid "Authentication Required" msgid "Authentication Required"
msgstr "Autenticazion Necessarie" msgstr "Autenticazion Necessarie"
#: js/ui/components/polkitAgent.js:62 #: js/ui/components/polkitAgent.js:64
msgid "Administrator" msgid "Administrator"
msgstr "Aministradôr" msgstr "Aministradôr"
#: js/ui/components/polkitAgent.js:139 #: js/ui/components/polkitAgent.js:141
msgid "Authenticate" msgid "Authenticate"
msgstr "Autentiche" msgstr "Autentiche"
@@ -1055,7 +1064,7 @@ msgstr "Autentiche"
#. * 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:241 js/ui/shellMountOperation.js:309 #: js/ui/components/polkitAgent.js:243 js/ui/shellMountOperation.js:389
msgid "Sorry, that didnt work. Please try again." msgid "Sorry, that didnt work. Please try again."
msgstr "Mi displâs, no je lade drete. Prove di gnûf." msgstr "Mi displâs, no je lade drete. Prove di gnûf."
@@ -1249,28 +1258,28 @@ msgstr ""
"dal avanzament e pues tirâ a dilunc: siguriti di vê fat i backup e che il to " "dal avanzament e pues tirâ a dilunc: siguriti di vê fat i backup e che il to "
"computer al sedi tacât." "computer al sedi tacât."
#: js/ui/endSessionDialog.js:309 #: js/ui/endSessionDialog.js:310
msgid "Running on battery power: please plug in before installing updates." msgid "Running on battery power: please plug in before installing updates."
msgstr "" msgstr ""
"Funzionament su batarie: par plasê tache la spine prime di instalâ i " "Funzionament su batarie: par plasê tache la spine prime di instalâ i "
"inzornaments." "inzornaments."
#: js/ui/endSessionDialog.js:326 #: js/ui/endSessionDialog.js:327
msgid "Some applications are busy or have unsaved work." msgid "Some applications are busy or have unsaved work."
msgstr "Cualchi aplicazion e je impegnade opûr e à lavôrs no salvâts." msgstr "Cualchi aplicazion e je impegnade opûr e à lavôrs no salvâts."
#: js/ui/endSessionDialog.js:333 #: js/ui/endSessionDialog.js:334
msgid "Other users are logged in." msgid "Other users are logged in."
msgstr "Altris utents a son jentrâts." msgstr "Altris utents a son jentrâts."
#. 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:614 #: js/ui/endSessionDialog.js:615
#, javascript-format #, javascript-format
msgid "%s (remote)" msgid "%s (remote)"
msgstr "%s (rimot)" msgstr "%s (rimot)"
#. 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:617 #: js/ui/endSessionDialog.js:618
#, javascript-format #, javascript-format
msgid "%s (console)" msgid "%s (console)"
msgstr "%s (locâl vie tastiere)" msgstr "%s (locâl vie tastiere)"
@@ -1356,13 +1365,13 @@ msgid "Leave On"
msgstr "Lasse ativât" msgstr "Lasse ativât"
#: 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:1263 #: js/ui/status/network.js:1269
msgid "Turn On" msgid "Turn On"
msgstr "Impie" msgstr "Impie"
#: 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:310 #: js/ui/status/network.js:128 js/ui/status/network.js:311
#: js/ui/status/network.js:1263 js/ui/status/network.js:1375 #: js/ui/status/network.js:1269 js/ui/status/network.js:1381
#: 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"
@@ -1424,7 +1433,7 @@ msgstr "Viôt sorzint"
msgid "Web Page" msgid "Web Page"
msgstr "Pagjine Web" msgstr "Pagjine Web"
#: js/ui/messageTray.js:1480 #: js/ui/messageTray.js:1479
msgid "System Information" msgid "System Information"
msgstr "Informazion di sisteme" msgstr "Informazion di sisteme"
@@ -1518,24 +1527,24 @@ msgctxt "System menu in the top bar"
msgid "System" msgid "System"
msgstr "Sisteme" msgstr "Sisteme"
#: js/ui/panel.js:864 #: js/ui/panel.js:862
msgid "Top Bar" msgid "Top Bar"
msgstr "Sbare parsore" msgstr "Sbare parsore"
#: js/ui/runDialog.js:64 #: js/ui/runDialog.js:65
msgid "Enter a Command" msgid "Enter a Command"
msgstr "Scrîf un comant" msgstr "Scrîf un comant"
#: js/ui/runDialog.js:104 js/ui/windowMenu.js:166 #: js/ui/runDialog.js:105 js/ui/windowMenu.js:166
msgid "Close" msgid "Close"
msgstr "Siere" msgstr "Siere"
# torne invie o torne tache # torne invie o torne tache
#: js/ui/runDialog.js:266 #: js/ui/runDialog.js:267
msgid "Restart is not available on Wayland" msgid "Restart is not available on Wayland"
msgstr "Il tornâ a tacâ nol è disponibil in Wayland" msgstr "Il tornâ a tacâ nol è disponibil in Wayland"
#: js/ui/runDialog.js:271 #: js/ui/runDialog.js:272
msgid "Restarting…" msgid "Restarting…"
msgstr "Daûr a tornâ a inviâ…" msgstr "Daûr a tornâ a inviâ…"
@@ -1582,16 +1591,16 @@ msgstr "Impussibil blocâ"
msgid "Lock was blocked by an application" msgid "Lock was blocked by an application"
msgstr "Il bloc al è stât dineât di une aplicazion" msgstr "Il bloc al è stât dineât di une aplicazion"
#: js/ui/search.js:635 #: js/ui/search.js:638
msgid "Searching…" msgid "Searching…"
msgstr "Daûr a cirî…" msgstr "Daûr a cirî…"
#: js/ui/search.js:637 #: js/ui/search.js:640
msgid "No results." msgid "No results."
msgstr "Nissun risultât." msgstr "Nissun risultât."
# o ancjemò %d # o ancjemò %d
#: js/ui/search.js:761 #: js/ui/search.js:764
#, javascript-format #, javascript-format
msgid "%d more" msgid "%d more"
msgid_plural "%d more" msgid_plural "%d more"
@@ -1614,14 +1623,61 @@ msgstr "Mostre Test"
msgid "Hide Text" msgid "Hide Text"
msgstr "Plate Test" msgstr "Plate Test"
#: js/ui/shellMountOperation.js:296 #: js/ui/shellMountOperation.js:318
msgid "Hidden Volume"
msgstr "Volum platât"
#: js/ui/shellMountOperation.js:321
msgid "Windows System Volume"
msgstr "Volum di sisteme Windows"
#: js/ui/shellMountOperation.js:324
msgid "Uses Keyfiles"
msgstr "Al dopre i File-clâf"
#. 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 ""
"Par sblocâ un volum che al dopre i file-clâf dopre invezit il program di "
"utilitât <i>%s</i>."
#: js/ui/shellMountOperation.js:337
msgid "PIM Number"
msgstr "Numar PIM"
#: js/ui/shellMountOperation.js:355
msgid "The PIM must be a number or empty."
msgstr "Il PIM al scugne jessi un numar o vueit."
#: js/ui/shellMountOperation.js:366
msgid "Password" msgid "Password"
msgstr "Password" msgstr "Password"
#: js/ui/shellMountOperation.js:317 #: js/ui/shellMountOperation.js:396
msgid "Remember Password" msgid "Remember Password"
msgstr "Visâsi Password" msgstr "Visâsi Password"
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:418
#, javascript-format
msgid "Open %s"
msgstr "Vierç %s"
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:490
#, javascript-format
msgid "Unable to start %s"
msgstr "Impussibil inviâ %s"
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:492
#, javascript-format
msgid "Couldnt find the %s application"
msgstr "Impussibil cjatâ la aplicazion %s"
#: js/ui/status/accessibility.js:35 #: js/ui/status/accessibility.js:35
msgid "Accessibility" msgid "Accessibility"
msgstr "Acessibilitât" msgstr "Acessibilitât"
@@ -1658,11 +1714,11 @@ msgstr "Tascj che si sbalcin"
msgid "Mouse Keys" msgid "Mouse Keys"
msgstr "Mouse di tastiere" msgstr "Mouse di tastiere"
#: js/ui/status/accessibility.js:151 #: js/ui/status/accessibility.js:135
msgid "High Contrast" msgid "High Contrast"
msgstr "Contrast elevât" msgstr "Contrast elevât"
#: js/ui/status/accessibility.js:182 #: js/ui/status/accessibility.js:177
msgid "Large Text" msgid "Large Text"
msgstr "Test Larc" msgstr "Test Larc"
@@ -1670,7 +1726,7 @@ msgstr "Test Larc"
msgid "Bluetooth" msgid "Bluetooth"
msgstr "Bluetooth" msgstr "Bluetooth"
#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585 #: js/ui/status/bluetooth.js:47 js/ui/status/network.js:586
msgid "Bluetooth Settings" msgid "Bluetooth Settings"
msgstr "Impostazions Bluetooth" msgstr "Impostazions Bluetooth"
@@ -1694,11 +1750,31 @@ msgstr "Impiât"
msgid "Brightness" msgid "Brightness"
msgstr "Luminositât" msgstr "Luminositât"
#: js/ui/status/keyboard.js:812 #: js/ui/status/dwellClick.js:13
msgid "Single Click"
msgstr "Clic singul"
#: js/ui/status/dwellClick.js:18
msgid "Double Click"
msgstr "Dopli clic"
#: js/ui/status/dwellClick.js:23
msgid "Drag"
msgstr "Strissinâ"
#: js/ui/status/dwellClick.js:28
msgid "Secondary Click"
msgstr "Clic secondari"
#: js/ui/status/dwellClick.js:37
msgid "Dwell Click"
msgstr "Clic in polse"
#: js/ui/status/keyboard.js:813
msgid "Keyboard" msgid "Keyboard"
msgstr "Tastiere" msgstr "Tastiere"
#: js/ui/status/keyboard.js:834 #: js/ui/status/keyboard.js:835
msgid "Show Keyboard Layout" msgid "Show Keyboard Layout"
msgstr "Mostre la disposizion de tastiere" msgstr "Mostre la disposizion de tastiere"
@@ -1727,12 +1803,12 @@ msgid "Enable"
msgstr "Abilite" msgstr "Abilite"
#. Translators: %s is an application name #. Translators: %s is an application name
#: js/ui/status/location.js:353 #: js/ui/status/location.js:355
#, javascript-format #, javascript-format
msgid "Give %s access to your location?" msgid "Give %s access to your location?"
msgstr "Permeti a %s di cognossi la tô posizion?" msgstr "Permeti a %s di cognossi la tô posizion?"
#: js/ui/status/location.js:354 #: js/ui/status/location.js:356
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 ""
"L'acès ae posizion al pues jessi cambiât cuant che tu vuelis su impostazions " "L'acès ae posizion al pues jessi cambiât cuant che tu vuelis su impostazions "
@@ -1743,13 +1819,13 @@ msgid "<unknown>"
msgstr "<no cognossût>" msgstr "<no cognossût>"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:416 js/ui/status/network.js:1292 #: js/ui/status/network.js:417 js/ui/status/network.js:1298
#, javascript-format #, javascript-format
msgid "%s Off" msgid "%s Off"
msgstr "%s distudât" msgstr "%s distudât"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:419 #: js/ui/status/network.js:420
#, javascript-format #, javascript-format
msgid "%s Connected" msgid "%s Connected"
msgstr "%s tacât" msgstr "%s tacât"
@@ -1757,189 +1833,189 @@ msgstr "%s tacât"
#. 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:424 #: js/ui/status/network.js:425
#, javascript-format #, javascript-format
msgid "%s Unmanaged" msgid "%s Unmanaged"
msgstr "%s no ministrât" msgstr "%s no ministrât"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:427 #: js/ui/status/network.js:428
#, javascript-format #, javascript-format
msgid "%s Disconnecting" msgid "%s Disconnecting"
msgstr "%s daûr a disconeti" msgstr "%s daûr a disconeti"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:434 js/ui/status/network.js:1284 #: js/ui/status/network.js:435 js/ui/status/network.js:1290
#, javascript-format #, javascript-format
msgid "%s Connecting" msgid "%s Connecting"
msgstr "%s in conession" msgstr "%s in conession"
#. 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:437 #: js/ui/status/network.js:438
#, javascript-format #, javascript-format
msgid "%s Requires Authentication" msgid "%s Requires Authentication"
msgstr "%s al à dibisugne di autenticazion" msgstr "%s al à dibisugne di autenticazion"
#. 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:445 #: js/ui/status/network.js:446
#, javascript-format #, javascript-format
msgid "Firmware Missing For %s" msgid "Firmware Missing For %s"
msgstr "Al mancje il firmware par %s" msgstr "Al mancje il firmware par %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:449 #: js/ui/status/network.js:450
#, javascript-format #, javascript-format
msgid "%s Unavailable" msgid "%s Unavailable"
msgstr "%s no disponibil" msgstr "%s no disponibil"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:452 #: js/ui/status/network.js:453
#, javascript-format #, javascript-format
msgid "%s Connection Failed" msgid "%s Connection Failed"
msgstr "Conession falide su %s" msgstr "Conession falide su %s"
#: js/ui/status/network.js:464 #: js/ui/status/network.js:465
msgid "Wired Settings" msgid "Wired Settings"
msgstr "Impostazions rêt vie fîl" msgstr "Impostazions rêt vie fîl"
#: js/ui/status/network.js:506 #: js/ui/status/network.js:507
msgid "Mobile Broadband Settings" msgid "Mobile Broadband Settings"
msgstr "Impostazions bande largje mobil" msgstr "Impostazions bande largje mobil"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:553 js/ui/status/network.js:1289 #: js/ui/status/network.js:554 js/ui/status/network.js:1295
#, javascript-format #, javascript-format
msgid "%s Hardware Disabled" msgid "%s Hardware Disabled"
msgstr "%s disabilitât vie hardware " msgstr "%s disabilitât vie hardware"
#. 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:557 #: js/ui/status/network.js:558
#, javascript-format #, javascript-format
msgid "%s Disabled" msgid "%s Disabled"
msgstr "%s disabilitât" msgstr "%s disabilitât"
#: js/ui/status/network.js:597 #: js/ui/status/network.js:598
msgid "Connect to Internet" msgid "Connect to Internet"
msgstr "Conet a internet" msgstr "Conet a internet"
#: js/ui/status/network.js:786 #: js/ui/status/network.js:792
msgid "Airplane Mode is On" msgid "Airplane Mode is On"
msgstr "Modalitât avion piade" msgstr "Modalitât avion piade"
#: js/ui/status/network.js:787 #: js/ui/status/network.js:793
msgid "Wi-Fi is disabled when airplane mode is on." msgid "Wi-Fi is disabled when airplane mode is on."
msgstr "Il Wi-Fi al è disabilitât cuant che la modalitât avion e je impiade." msgstr "Il Wi-Fi al è disabilitât cuant che la modalitât avion e je impiade."
#: js/ui/status/network.js:788 #: js/ui/status/network.js:794
msgid "Turn Off Airplane Mode" msgid "Turn Off Airplane Mode"
msgstr "Distude modalitât avion" msgstr "Distude modalitât avion"
#: js/ui/status/network.js:797 #: js/ui/status/network.js:803
msgid "Wi-Fi is Off" msgid "Wi-Fi is Off"
msgstr "Il Wi-Fi al è distudât" msgstr "Il Wi-Fi al è distudât"
#: js/ui/status/network.js:798 #: js/ui/status/network.js:804
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 "Il Wi-Fi al scugne jessi impiât par podêsi tacâ a une rêt." msgstr "Il Wi-Fi al scugne jessi impiât par podêsi tacâ a une rêt."
#: js/ui/status/network.js:799 #: js/ui/status/network.js:805
msgid "Turn On Wi-Fi" msgid "Turn On Wi-Fi"
msgstr "Impie il Wi-Fi" msgstr "Impie il Wi-Fi"
#: js/ui/status/network.js:824 #: js/ui/status/network.js:830
msgid "Wi-Fi Networks" msgid "Wi-Fi Networks"
msgstr "Rêts Wi-Fi" msgstr "Rêts Wi-Fi"
#: js/ui/status/network.js:826 #: js/ui/status/network.js:832
msgid "Select a network" msgid "Select a network"
msgstr "Selezione une rêt" msgstr "Selezione une rêt"
#: js/ui/status/network.js:855 #: js/ui/status/network.js:861
msgid "No Networks" msgid "No Networks"
msgstr "Nissune rêt" msgstr "Nissune rêt"
#: js/ui/status/network.js:876 js/ui/status/rfkill.js:104 #: js/ui/status/network.js:882 js/ui/status/rfkill.js:104
msgid "Use hardware switch to turn off" msgid "Use hardware switch to turn off"
msgstr "Dopre interutôr fisic par distudâ" msgstr "Dopre interutôr fisic par distudâ"
#: js/ui/status/network.js:1152 #: js/ui/status/network.js:1158
msgid "Select Network" msgid "Select Network"
msgstr "Selezione rêt" msgstr "Selezione rêt"
#: js/ui/status/network.js:1158 #: js/ui/status/network.js:1164
msgid "Wi-Fi Settings" msgid "Wi-Fi Settings"
msgstr "Impostazions Wi-Fi" msgstr "Impostazions Wi-Fi"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:1280 #: js/ui/status/network.js:1286
#, javascript-format #, javascript-format
msgid "%s Hotspot Active" msgid "%s Hotspot Active"
msgstr "Hotspot %s atîf" msgstr "Hotspot %s atîf"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:1295 #: js/ui/status/network.js:1301
#, javascript-format #, javascript-format
msgid "%s Not Connected" msgid "%s Not Connected"
msgstr "%s distacât" msgstr "%s distacât"
#: js/ui/status/network.js:1392 #: js/ui/status/network.js:1398
msgid "connecting…" msgid "connecting…"
msgstr "daûr a coneti…" msgstr "daûr a coneti…"
#. 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:1395 #: js/ui/status/network.js:1401
msgid "authentication required" msgid "authentication required"
msgstr "autenticazion necessarie" msgstr "autenticazion necessarie"
#: js/ui/status/network.js:1397 #: js/ui/status/network.js:1403
msgid "connection failed" msgid "connection failed"
msgstr "conession falide" msgstr "conession falide"
#: js/ui/status/network.js:1447 #: js/ui/status/network.js:1453
msgid "VPN Settings" msgid "VPN Settings"
msgstr "Impostazions VPN" msgstr "Impostazions VPN"
#: js/ui/status/network.js:1464 #: js/ui/status/network.js:1470
msgid "VPN" msgid "VPN"
msgstr "VPN" msgstr "VPN"
#: js/ui/status/network.js:1474 #: js/ui/status/network.js:1480
msgid "VPN Off" msgid "VPN Off"
msgstr "VPN distudât" msgstr "VPN distudât"
#: js/ui/status/network.js:1535 js/ui/status/rfkill.js:82 #: js/ui/status/network.js:1541 js/ui/status/rfkill.js:82
msgid "Network Settings" msgid "Network Settings"
msgstr "Impostazions rêt" msgstr "Impostazions rêt"
#: js/ui/status/network.js:1564 #: js/ui/status/network.js:1570
#, 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 conession cablade" msgstr[0] "%s conession cablade"
msgstr[1] "%s conessions cabladis" msgstr[1] "%s conessions cabladis"
#: js/ui/status/network.js:1568 #: js/ui/status/network.js:1574
#, 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 conession cence fîi" msgstr[0] "%s conession cence fîi"
msgstr[1] "%s conessions cence fîi" msgstr[1] "%s conessions cence fîi"
#: js/ui/status/network.js:1572 #: js/ui/status/network.js:1578
#, 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 conession modem" msgstr[0] "%s conession modem"
msgstr[1] "%s conessions modem" msgstr[1] "%s conessions modem"
#: js/ui/status/network.js:1705 #: js/ui/status/network.js:1711
msgid "Connection failed" msgid "Connection failed"
msgstr "Conession falide" msgstr "Conession falide"
#: js/ui/status/network.js:1706 #: js/ui/status/network.js:1712
msgid "Activation of network connection failed" msgid "Activation of network connection failed"
msgstr "Ativazion de conession di rêt falide" msgstr "Ativazion de conession di rêt falide"
@@ -2122,22 +2198,22 @@ msgstr "Cîr"
msgid "“%s” is ready" msgid "“%s” is ready"
msgstr "“%s” al è pront" msgstr "“%s” al è pront"
#: js/ui/windowManager.js:53 #: js/ui/windowManager.js:54
msgid "Do you want to keep these display settings?" msgid "Do you want to keep these display settings?"
msgstr "Vûstu tignî chestis impostazions di visôr?" msgstr "Vûstu tignî chestis impostazions di visôr?"
#. Translators: this and the following message should be limited in lenght, #. Translators: this and the following message should be limited in length,
#. to avoid ellipsizing the labels. #. to avoid ellipsizing the labels.
#. #.
#: js/ui/windowManager.js:65 #: js/ui/windowManager.js:66
msgid "Revert Settings" msgid "Revert Settings"
msgstr "Ripristine impostazions" msgstr "Ripristine impostazions"
#: js/ui/windowManager.js:68 #: js/ui/windowManager.js:69
msgid "Keep Changes" msgid "Keep Changes"
msgstr "Ten lis modifichis" msgstr "Ten lis modifichis"
#: js/ui/windowManager.js:86 #: js/ui/windowManager.js:87
#, 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"
@@ -2148,7 +2224,7 @@ msgstr[1] ""
#. 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:678
#, javascript-format #, javascript-format
msgid "%d × %d" msgid "%d × %d"
msgstr "%d × %d" msgstr "%d × %d"
@@ -2247,11 +2323,11 @@ msgstr "No cognossût"
msgid "Failed to launch “%s”" msgid "Failed to launch “%s”"
msgstr "No soi rivât a eseguî '%s'" msgstr "No soi rivât a eseguî '%s'"
#: src/shell-keyring-prompt.c:730 #: src/shell-keyring-prompt.c:731
msgid "Passwords do not match." msgid "Passwords do not match."
msgstr "Lis password no corispuindin." msgstr "Lis password no corispuindin."
#: src/shell-keyring-prompt.c:738 #: src/shell-keyring-prompt.c:739
msgid "Password cannot be blank" msgid "Password cannot be blank"
msgstr "La password no pues jessi vueide" msgstr "La password no pues jessi vueide"

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-03-24 17:37+0000\n" "POT-Creation-Date: 2019-06-15 10:38+0000\n"
"PO-Revision-Date: 2019-03-26 12:33+0100\n" "PO-Revision-Date: 2019-06-22 01:55+0200\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.0.6\n" "X-Generator: Poedit 2.2.1\n"
#: data/50-gnome-shell-system.xml:6 #: data/50-gnome-shell-system.xml:6
msgid "System" msgid "System"
@@ -418,10 +418,11 @@ 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:55 #: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:52
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136 #: js/ui/components/networkAgent.js:118 js/ui/components/polkitAgent.js:138
#: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188 #: js/ui/endSessionDialog.js:431 js/ui/extensionDownloader.js:188
#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888 #: js/ui/shellMountOperation.js:404 js/ui/shellMountOperation.js:413
#: js/ui/status/network.js:894
msgid "Cancel" msgid "Cancel"
msgstr "Odustani" msgstr "Odustani"
@@ -429,7 +430,7 @@ msgstr "Odustani"
msgid "Next" msgid "Next"
msgstr "Sljedeće" msgstr "Sljedeće"
#: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:329 #: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:408
#: js/ui/unlockDialog.js:41 #: js/ui/unlockDialog.js:41
msgid "Unlock" msgid "Unlock"
msgstr "Otključaj" msgstr "Otključaj"
@@ -460,8 +461,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:243 #: js/gdm/loginDialog.js:889 js/ui/components/networkAgent.js:244
#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281 #: js/ui/components/networkAgent.js:264 js/ui/components/networkAgent.js:282
msgid "Username: " msgid "Username: "
msgstr "Korisničko ime: " msgstr "Korisničko ime: "
@@ -512,8 +513,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;sign off" msgid "logout;log out;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
@@ -705,11 +706,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:37 js/ui/status/location.js:360 #: js/ui/accessDialog.js:38 js/ui/status/location.js:362
msgid "Deny Access" msgid "Deny Access"
msgstr "Zabrani pristup" msgstr "Zabrani pristup"
#: js/ui/accessDialog.js:38 js/ui/status/location.js:363 #: js/ui/accessDialog.js:39 js/ui/status/location.js:365
msgid "Grant Access" msgid "Grant Access"
msgstr "Dopusti pristup" msgstr "Dopusti pristup"
@@ -725,53 +726,58 @@ msgstr "Najčešće"
msgid "All" msgid "All"
msgstr "Sve" msgstr "Sve"
#: js/ui/appDisplay.js:1737 js/ui/panel.js:83 #. Translators: This is the heading of a list of open windows
#: 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:1751 #: js/ui/appDisplay.js:1746
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:1778 js/ui/dash.js:239 #: js/ui/appDisplay.js:1773 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:1784 #: js/ui/appDisplay.js:1779
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Dodaj u omiljene" msgstr "Dodaj u omiljene"
#: js/ui/appDisplay.js:1794 js/ui/panel.js:94 #: js/ui/appDisplay.js:1789 js/ui/panel.js:97
msgid "Show Details" msgid "Show Details"
msgstr "Prikaži pojedinosti" msgstr "Prikaži pojedinosti"
#: js/ui/appFavorites.js:141 #: js/ui/appFavorites.js:149
#, 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:175 #: js/ui/appFavorites.js:183
#, 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:42 #: js/ui/audioDeviceSelection.js:39
msgid "Select Audio Device" msgid "Select Audio Device"
msgstr "Odaberi zvučni uređaj" msgstr "Odaberi zvučni uređaj"
#: js/ui/audioDeviceSelection.js:53 #: js/ui/audioDeviceSelection.js:50
msgid "Sound Settings" msgid "Sound Settings"
msgstr "Postavke zvuka" msgstr "Postavke zvuka"
#: js/ui/audioDeviceSelection.js:62 #: js/ui/audioDeviceSelection.js:59
msgid "Headphones" msgid "Headphones"
msgstr "Slušalice" msgstr "Slušalice"
#: js/ui/audioDeviceSelection.js:64 #: js/ui/audioDeviceSelection.js:61
msgid "Headset" msgid "Headset"
msgstr "Slušalice s mikrofonom" msgstr "Slušalice s mikrofonom"
#: js/ui/audioDeviceSelection.js:66 js/ui/status/volume.js:247 #: js/ui/audioDeviceSelection.js:63 js/ui/status/volume.js:247
msgid "Microphone" msgid "Microphone"
msgstr "Mikrofon" msgstr "Mikrofon"
@@ -932,67 +938,75 @@ msgstr "Prisilno zatvori"
msgid "Wait" msgid "Wait"
msgstr "Čekaj" msgstr "Čekaj"
#: js/ui/components/automountManager.js:86 #: js/ui/components/automountManager.js:87
msgid "External drive connected" msgid "External drive connected"
msgstr "Vanjski uređaj povezan" msgstr "Vanjski uređaj povezan"
#: js/ui/components/automountManager.js:98 #: js/ui/components/automountManager.js:99
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:77 js/ui/components/polkitAgent.js:255 #: js/ui/components/keyring.js:66 js/ui/components/polkitAgent.js:257
msgid "Password:" msgid "Password:"
msgstr "Lozinka:" msgstr "Lozinka:"
#: js/ui/components/keyring.js:108 #: js/ui/components/keyring.js:97
msgid "Type again:" msgid "Type again:"
msgstr "Pokušaj ponovno:" msgstr "Pokušaj ponovno:"
#: js/ui/components/networkAgent.js:102 #: js/ui/components/networkAgent.js:103
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:112 js/ui/status/network.js:219 #: js/ui/components/networkAgent.js:113 js/ui/status/network.js:219
#: js/ui/status/network.js:309 js/ui/status/network.js:891 #: js/ui/status/network.js:310 js/ui/status/network.js:897
msgid "Connect" msgid "Connect"
msgstr "Povezivanje" msgstr "Povezivanje"
#. Cisco LEAP #. Cisco LEAP
#: js/ui/components/networkAgent.js:211 js/ui/components/networkAgent.js:223 #: js/ui/components/networkAgent.js:212 js/ui/components/networkAgent.js:224
#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:265 #: js/ui/components/networkAgent.js:247 js/ui/components/networkAgent.js:266
#: js/ui/components/networkAgent.js:285 js/ui/components/networkAgent.js:295 #: js/ui/components/networkAgent.js:286 js/ui/components/networkAgent.js:296
msgid "Password: " msgid "Password: "
msgstr "Lozinka: " msgstr "Lozinka: "
#. static WEP #. static WEP
#: js/ui/components/networkAgent.js:216 #: js/ui/components/networkAgent.js:217
msgid "Key: " msgid "Key: "
msgstr "Ključ: " msgstr "Ključ: "
#: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271 #: js/ui/components/networkAgent.js:250 js/ui/components/networkAgent.js:272
msgid "Private key password: " msgid "Private key password: "
msgstr "Lozinka privatnog ključa: " msgstr "Lozinka privatnog ključa: "
#: js/ui/components/networkAgent.js:269 #: js/ui/components/networkAgent.js:270
msgid "Identity: " msgid "Identity: "
msgstr "Identitet: " msgstr "Identitet: "
#: js/ui/components/networkAgent.js:283 #: js/ui/components/networkAgent.js:284
msgid "Service: " msgid "Service: "
msgstr "Usluga: " msgstr "Usluga: "
#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685 #: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686
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:313 js/ui/components/networkAgent.js:686 #: js/ui/components/networkAgent.js:314 js/ui/components/networkAgent.js:687
#, 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 "
@@ -1000,53 +1014,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:317 js/ui/components/networkAgent.js:689 #: js/ui/components/networkAgent.js:318 js/ui/components/networkAgent.js:690
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:319 #: js/ui/components/networkAgent.js:320
msgid "Network name: " msgid "Network name: "
msgstr "Naziv mreže: " msgstr "Naziv mreže: "
#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:693 #: js/ui/components/networkAgent.js:325 js/ui/components/networkAgent.js:694
msgid "DSL authentication" msgid "DSL authentication"
msgstr "DSL ovjera" msgstr "DSL ovjera"
#: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:699 #: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700
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:332 js/ui/components/networkAgent.js:700 #: js/ui/components/networkAgent.js:333 js/ui/components/networkAgent.js:701
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:333 #: js/ui/components/networkAgent.js:334
msgid "PIN: " msgid "PIN: "
msgstr "PIN: " msgstr "PIN: "
#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:706 #: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:707
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:341 js/ui/components/networkAgent.js:690 #: js/ui/components/networkAgent.js:342 js/ui/components/networkAgent.js:691
#: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707 #: js/ui/components/networkAgent.js:695 js/ui/components/networkAgent.js:708
#, 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:674 js/ui/status/network.js:1664 #: js/ui/components/networkAgent.js:675 js/ui/status/network.js:1670
msgid "Network Manager" msgid "Network Manager"
msgstr "Mrežni upravitelj" msgstr "Mrežni upravitelj"
#: js/ui/components/polkitAgent.js:34 #: js/ui/components/polkitAgent.js:36
msgid "Authentication Required" msgid "Authentication Required"
msgstr "Potrebna je ovjera" msgstr "Potrebna je ovjera"
#: js/ui/components/polkitAgent.js:62 #: js/ui/components/polkitAgent.js:64
msgid "Administrator" msgid "Administrator"
msgstr "Administrator" msgstr "Administrator"
#: js/ui/components/polkitAgent.js:139 #: js/ui/components/polkitAgent.js:141
msgid "Authenticate" msgid "Authenticate"
msgstr "Ovjeri" msgstr "Ovjeri"
@@ -1054,7 +1068,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:241 js/ui/shellMountOperation.js:309 #: js/ui/components/polkitAgent.js:243 js/ui/shellMountOperation.js:389
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."
@@ -1104,23 +1118,23 @@ msgstr "Dodaj satove iz svijeta…"
msgid "World Clocks" msgid "World Clocks"
msgstr "Svjetski satovi" msgstr "Svjetski satovi"
#: js/ui/dateMenu.js:222 #: js/ui/dateMenu.js:228
msgid "Weather" msgid "Weather"
msgstr "Vrijeme" msgstr "Vrijeme"
#: js/ui/dateMenu.js:305 #: js/ui/dateMenu.js:311
msgid "Select a location…" msgid "Select a location…"
msgstr "Odaberi lokaciju…" msgstr "Odaberi lokaciju…"
#: js/ui/dateMenu.js:313 #: js/ui/dateMenu.js:319
msgid "Loading…" msgid "Loading…"
msgstr "Pretraživanje…" msgstr "Pretraživanje…"
#: js/ui/dateMenu.js:323 #: js/ui/dateMenu.js:329
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:325 #: js/ui/dateMenu.js:331
msgid "Weather information is currently unavailable" msgid "Weather information is currently unavailable"
msgstr "Vremenske informacije su trenutno nedostupne" msgstr "Vremenske informacije su trenutno nedostupne"
@@ -1255,28 +1269,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:309 #: js/ui/endSessionDialog.js:310
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:326 #: js/ui/endSessionDialog.js:327
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:333 #: js/ui/endSessionDialog.js:334
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:614 #: js/ui/endSessionDialog.js:615
#, 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:617 #: js/ui/endSessionDialog.js:618
#, javascript-format #, javascript-format
msgid "%s (console)" msgid "%s (console)"
msgstr "%s (konzola)" msgstr "%s (konzola)"
@@ -1361,13 +1375,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:1263 #: js/ui/status/network.js:1269
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:310 #: js/ui/status/network.js:128 js/ui/status/network.js:311
#: js/ui/status/network.js:1263 js/ui/status/network.js:1375 #: js/ui/status/network.js:1269 js/ui/status/network.js:1381
#: 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"
@@ -1429,7 +1443,7 @@ msgstr "Pogledaj izvor"
msgid "Web Page" msgid "Web Page"
msgstr "Web stranica" msgstr "Web stranica"
#: js/ui/messageTray.js:1480 #: js/ui/messageTray.js:1479
msgid "System Information" msgid "System Information"
msgstr "Informacije sustava" msgstr "Informacije sustava"
@@ -1507,47 +1521,38 @@ 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:108 #: js/ui/panel.js:113
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:471 #: js/ui/panel.js:468
msgid "Activities" msgid "Activities"
msgstr "Aktivnosti" msgstr "Aktivnosti"
#: js/ui/panel.js:746 #: js/ui/panel.js:743
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:867 #: js/ui/panel.js:862
msgid "Top Bar" msgid "Top Bar"
msgstr "Gornja traka" msgstr "Gornja traka"
#. Translators: this MUST be either "toggle-switch-us" #: js/ui/runDialog.js:65
#. (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:104 js/ui/windowMenu.js:166 #: js/ui/runDialog.js:105 js/ui/windowMenu.js:166
msgid "Close" msgid "Close"
msgstr "Zatvori" msgstr "Zatvori"
#: js/ui/runDialog.js:266 #: js/ui/runDialog.js:267
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:271 #: js/ui/runDialog.js:272
msgid "Restarting…" msgid "Restarting…"
msgstr "Ponovno pokretanje…" msgstr "Ponovno pokretanje…"
@@ -1594,17 +1599,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 apliakcija" msgstr "Zaključavanje je blokirala aplikacija"
#: js/ui/search.js:635 #: js/ui/search.js:638
msgid "Searching…" msgid "Searching…"
msgstr "Pretraživanje…" msgstr "Pretraživanje…"
#: js/ui/search.js:637 #: js/ui/search.js:640
msgid "No results." msgid "No results."
msgstr "Nema rezultata." msgstr "Nema rezultata."
#: js/ui/search.js:761 #: js/ui/search.js:764
#, javascript-format #, javascript-format
msgid "%d more" msgid "%d more"
msgid_plural "%d more" msgid_plural "%d more"
@@ -1628,14 +1633,61 @@ msgstr "Prikaži tekst"
msgid "Hide Text" msgid "Hide Text"
msgstr "Sakrij tekst" msgstr "Sakrij tekst"
#: js/ui/shellMountOperation.js:296 #: js/ui/shellMountOperation.js:318
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:317 #: js/ui/shellMountOperation.js:396
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"
@@ -1672,11 +1724,11 @@ msgstr "Odbijanje tipki"
msgid "Mouse Keys" msgid "Mouse Keys"
msgstr "Tipke miša" msgstr "Tipke miša"
#: js/ui/status/accessibility.js:151 #: js/ui/status/accessibility.js:135
msgid "High Contrast" msgid "High Contrast"
msgstr "Visok kontrast" msgstr "Visok kontrast"
#: js/ui/status/accessibility.js:182 #: js/ui/status/accessibility.js:177
msgid "Large Text" msgid "Large Text"
msgstr "Velik tekst" msgstr "Velik tekst"
@@ -1684,7 +1736,7 @@ msgstr "Velik tekst"
msgid "Bluetooth" msgid "Bluetooth"
msgstr "Bluetooth" msgstr "Bluetooth"
#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585 #: js/ui/status/bluetooth.js:47 js/ui/status/network.js:586
msgid "Bluetooth Settings" msgid "Bluetooth Settings"
msgstr "Bluetooth postavke" msgstr "Bluetooth postavke"
@@ -1709,11 +1761,31 @@ msgstr "Uključeno"
msgid "Brightness" msgid "Brightness"
msgstr "Svjetlina" msgstr "Svjetlina"
#: js/ui/status/keyboard.js:812 #: js/ui/status/dwellClick.js:13
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:834 #: js/ui/status/keyboard.js:835
msgid "Show Keyboard Layout" msgid "Show Keyboard Layout"
msgstr "Prikaži raspored tipkovnice" msgstr "Prikaži raspored tipkovnice"
@@ -1742,12 +1814,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:353 #: js/ui/status/location.js:355
#, 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:354 #: js/ui/status/location.js:356
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."
@@ -1757,13 +1829,13 @@ msgid "<unknown>"
msgstr "<nepoznato>" msgstr "<nepoznato>"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:416 js/ui/status/network.js:1292 #: js/ui/status/network.js:417 js/ui/status/network.js:1298
#, 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:419 #: js/ui/status/network.js:420
#, javascript-format #, javascript-format
msgid "%s Connected" msgid "%s Connected"
msgstr "%s povezana" msgstr "%s povezana"
@@ -1771,164 +1843,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:424 #: js/ui/status/network.js:425
#, 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:427 #: js/ui/status/network.js:428
#, 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:434 js/ui/status/network.js:1284 #: js/ui/status/network.js:435 js/ui/status/network.js:1290
#, 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:437 #: js/ui/status/network.js:438
#, 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:445 #: js/ui/status/network.js:446
#, 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:449 #: js/ui/status/network.js:450
#, 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:452 #: js/ui/status/network.js:453
#, 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:464 #: js/ui/status/network.js:465
msgid "Wired Settings" msgid "Wired Settings"
msgstr "Postavke žične mreže" msgstr "Postavke žične mreže"
#: js/ui/status/network.js:506 #: js/ui/status/network.js:507
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:553 js/ui/status/network.js:1289 #: js/ui/status/network.js:554 js/ui/status/network.js:1295
#, 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:557 #: js/ui/status/network.js:558
#, javascript-format #, javascript-format
msgid "%s Disabled" msgid "%s Disabled"
msgstr "%s onemogućeno" msgstr "%s onemogućeno"
#: js/ui/status/network.js:597 #: js/ui/status/network.js:598
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:786 #: js/ui/status/network.js:792
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:787 #: js/ui/status/network.js:793
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:788 #: js/ui/status/network.js:794
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:797 #: js/ui/status/network.js:803
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:798 #: js/ui/status/network.js:804
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:799 #: js/ui/status/network.js:805
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:824 #: js/ui/status/network.js:830
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:826 #: js/ui/status/network.js:832
msgid "Select a network" msgid "Select a network"
msgstr "Odaberi mrežu" msgstr "Odaberi mrežu"
#: js/ui/status/network.js:855 #: js/ui/status/network.js:861
msgid "No Networks" msgid "No Networks"
msgstr "Nema mreža" msgstr "Nema mreža"
#: js/ui/status/network.js:876 js/ui/status/rfkill.js:104 #: js/ui/status/network.js:882 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:1152 #: js/ui/status/network.js:1158
msgid "Select Network" msgid "Select Network"
msgstr "Odaberi mrežu" msgstr "Odaberi mrežu"
#: js/ui/status/network.js:1158 #: js/ui/status/network.js:1164
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:1280 #: js/ui/status/network.js:1286
#, 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:1295 #: js/ui/status/network.js:1301
#, 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:1392 #: js/ui/status/network.js:1398
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:1395 #: js/ui/status/network.js:1401
msgid "authentication required" msgid "authentication required"
msgstr "potrebna je ovjera" msgstr "potrebna je ovjera"
#: js/ui/status/network.js:1397 #: js/ui/status/network.js:1403
msgid "connection failed" msgid "connection failed"
msgstr "neuspješno povezivanje" msgstr "neuspješno povezivanje"
#: js/ui/status/network.js:1447 #: js/ui/status/network.js:1453
msgid "VPN Settings" msgid "VPN Settings"
msgstr "VPN postavke" msgstr "VPN postavke"
#: js/ui/status/network.js:1464 #: js/ui/status/network.js:1470
msgid "VPN" msgid "VPN"
msgstr "VPN" msgstr "VPN"
#: js/ui/status/network.js:1474 #: js/ui/status/network.js:1480
msgid "VPN Off" msgid "VPN Off"
msgstr "VPN isključen" msgstr "VPN isključen"
#: js/ui/status/network.js:1535 js/ui/status/rfkill.js:82 #: js/ui/status/network.js:1541 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:1564 #: js/ui/status/network.js:1570
#, javascript-format #, javascript-format
msgid "%s Wired Connection" msgid "%s Wired Connection"
msgid_plural "%s Wired Connections" msgid_plural "%s Wired Connections"
@@ -1936,7 +2008,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:1568 #: js/ui/status/network.js:1574
#, 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"
@@ -1944,7 +2016,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:1572 #: js/ui/status/network.js:1578
#, javascript-format #, javascript-format
msgid "%s Modem Connection" msgid "%s Modem Connection"
msgid_plural "%s Modem Connections" msgid_plural "%s Modem Connections"
@@ -1952,11 +2024,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:1701 #: js/ui/status/network.js:1711
msgid "Connection failed" msgid "Connection failed"
msgstr "Neuspješno povezivanje" msgstr "Neuspješno povezivanje"
#: js/ui/status/network.js:1702 #: js/ui/status/network.js:1712
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"
@@ -2137,22 +2209,22 @@ msgstr "Pretraži"
msgid "“%s” is ready" msgid "“%s” is ready"
msgstr "“%s” je spreman" msgstr "“%s” je spreman"
#: js/ui/windowManager.js:53 #: js/ui/windowManager.js:54
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 lenght, #. Translators: this and the following message should be limited in length,
#. to avoid ellipsizing the labels. #. to avoid ellipsizing the labels.
#. #.
#: js/ui/windowManager.js:65 #: js/ui/windowManager.js:66
msgid "Revert Settings" msgid "Revert Settings"
msgstr "Vrati postavke" msgstr "Vrati postavke"
#: js/ui/windowManager.js:68 #: js/ui/windowManager.js:69
msgid "Keep Changes" msgid "Keep Changes"
msgstr "Zadrži promjene" msgstr "Zadrži promjene"
#: js/ui/windowManager.js:86 #: js/ui/windowManager.js:87
#, 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"
@@ -2162,7 +2234,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:662 #: js/ui/windowManager.js:678
#, javascript-format #, javascript-format
msgid "%d × %d" msgid "%d × %d"
msgstr "%d × %d" msgstr "%d × %d"
@@ -2261,11 +2333,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:730 #: src/shell-keyring-prompt.c:731
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:738 #: src/shell-keyring-prompt.c:739
msgid "Password cannot be blank" msgid "Password cannot be blank"
msgstr "Lozinka ne može biti prazna" msgstr "Lozinka ne može biti prazna"
@@ -2297,6 +2369,9 @@ 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. # Balázs Meskó <meskobalazs at gmail dot com>, 2014, 2019.
# Balázs Úr <urbalazs at gmail dot com>, 2012, 2014, 2015, 2016, 2017, 2018, 2019. # Balázs Úr <ur.balazs at fsf dot hu>, 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-03-03 10:16+0000\n" "POT-Creation-Date: 2019-05-28 17:15+0000\n"
"PO-Revision-Date: 2019-02-05 21:05+0100\n" "PO-Revision-Date: 2019-06-01 13:15+0200\n"
"Last-Translator: Balázs Úr <urbalazs@gmail.com>\n" "Last-Translator: Balázs Úr <ur.balazs at fsf dot hu>\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 1.2\n" "X-Generator: Lokalize 18.12.3\n"
#: data/50-gnome-shell-system.xml:6 #: data/50-gnome-shell-system.xml:6
msgid "System" msgid "System"
@@ -373,11 +373,6 @@ 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"
@@ -423,10 +418,11 @@ 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:55 #: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:52
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136 #: js/ui/components/networkAgent.js:118 js/ui/components/polkitAgent.js:138
#: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188 #: js/ui/endSessionDialog.js:431 js/ui/extensionDownloader.js:188
#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888 #: js/ui/shellMountOperation.js:404 js/ui/shellMountOperation.js:413
#: js/ui/status/network.js:894
msgid "Cancel" msgid "Cancel"
msgstr "Mégse" msgstr "Mégse"
@@ -434,7 +430,7 @@ msgstr "Mégse"
msgid "Next" msgid "Next"
msgstr "Következő" msgstr "Következő"
#: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:329 #: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:408
#: js/ui/unlockDialog.js:41 #: js/ui/unlockDialog.js:41
msgid "Unlock" msgid "Unlock"
msgstr "Feloldás" msgstr "Feloldás"
@@ -465,8 +461,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:243 #: js/gdm/loginDialog.js:889 js/ui/components/networkAgent.js:244
#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281 #: js/ui/components/networkAgent.js:264 js/ui/components/networkAgent.js:282
msgid "Username: " msgid "Username: "
msgstr "Felhasználónév: " msgstr "Felhasználónév: "
@@ -517,7 +513,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;sign off" msgid "logout;log out;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
@@ -704,11 +700,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:37 js/ui/status/location.js:360 #: js/ui/accessDialog.js:38 js/ui/status/location.js:362
msgid "Deny Access" msgid "Deny Access"
msgstr "Hozzáférés tiltása" msgstr "Hozzáférés tiltása"
#: js/ui/accessDialog.js:38 js/ui/status/location.js:363 #: js/ui/accessDialog.js:39 js/ui/status/location.js:365
msgid "Grant Access" msgid "Grant Access"
msgstr "Hozzáférés megadása" msgstr "Hozzáférés megadása"
@@ -724,53 +720,58 @@ msgstr "Gyakori"
msgid "All" msgid "All"
msgstr "Összes" msgstr "Összes"
#: js/ui/appDisplay.js:1737 js/ui/panel.js:83 #. Translators: This is the heading of a list of open windows
#: 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:1751 #: js/ui/appDisplay.js:1746
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:1778 js/ui/dash.js:239 #: js/ui/appDisplay.js:1773 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:1784 #: js/ui/appDisplay.js:1779
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Hozzáadás a Kedvencekhez" msgstr "Hozzáadás a Kedvencekhez"
#: js/ui/appDisplay.js:1794 js/ui/panel.js:94 #: js/ui/appDisplay.js:1789 js/ui/panel.js:97
msgid "Show Details" msgid "Show Details"
msgstr "Részletek megjelenítése" msgstr "Részletek megjelenítése"
#: js/ui/appFavorites.js:141 #: js/ui/appFavorites.js:149
#, 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:175 #: js/ui/appFavorites.js:183
#, 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:42 #: js/ui/audioDeviceSelection.js:39
msgid "Select Audio Device" msgid "Select Audio Device"
msgstr "Válasszon hangeszközt" msgstr "Válasszon hangeszközt"
#: js/ui/audioDeviceSelection.js:53 #: js/ui/audioDeviceSelection.js:50
msgid "Sound Settings" msgid "Sound Settings"
msgstr "Hangbeállítások" msgstr "Hangbeállítások"
#: js/ui/audioDeviceSelection.js:62 #: js/ui/audioDeviceSelection.js:59
msgid "Headphones" msgid "Headphones"
msgstr "Fülhallgatók" msgstr "Fülhallgatók"
#: js/ui/audioDeviceSelection.js:64 #: js/ui/audioDeviceSelection.js:61
msgid "Headset" msgid "Headset"
msgstr "Fejhallgató" msgstr "Fejhallgató"
#: js/ui/audioDeviceSelection.js:66 js/ui/status/volume.js:247 #: js/ui/audioDeviceSelection.js:63 js/ui/status/volume.js:247
msgid "Microphone" msgid "Microphone"
msgstr "Mikrofon" msgstr "Mikrofon"
@@ -931,66 +932,74 @@ msgstr "Erőltetett kilépés"
msgid "Wait" msgid "Wait"
msgstr "Várakozás" msgstr "Várakozás"
#: js/ui/components/automountManager.js:86 #: js/ui/components/automountManager.js:87
msgid "External drive connected" msgid "External drive connected"
msgstr "Külső meghajtó csatlakoztatva" msgstr "Külső meghajtó csatlakoztatva"
#: js/ui/components/automountManager.js:98 #: js/ui/components/automountManager.js:99
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:77 js/ui/components/polkitAgent.js:255 #: js/ui/components/keyring.js:66 js/ui/components/polkitAgent.js:257
msgid "Password:" msgid "Password:"
msgstr "Jelszó:" msgstr "Jelszó:"
#: js/ui/components/keyring.js:108 #: js/ui/components/keyring.js:97
msgid "Type again:" msgid "Type again:"
msgstr "Írja be újra:" msgstr "Írja be újra:"
#: js/ui/components/networkAgent.js:102 #: js/ui/components/networkAgent.js:103
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:112 js/ui/status/network.js:219 #: js/ui/components/networkAgent.js:113 js/ui/status/network.js:219
#: js/ui/status/network.js:309 js/ui/status/network.js:891 #: js/ui/status/network.js:310 js/ui/status/network.js:897
msgid "Connect" msgid "Connect"
msgstr "Kapcsolódás" msgstr "Kapcsolódás"
#. Cisco LEAP #. Cisco LEAP
#: js/ui/components/networkAgent.js:211 js/ui/components/networkAgent.js:223 #: js/ui/components/networkAgent.js:212 js/ui/components/networkAgent.js:224
#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:265 #: js/ui/components/networkAgent.js:247 js/ui/components/networkAgent.js:266
#: js/ui/components/networkAgent.js:285 js/ui/components/networkAgent.js:295 #: js/ui/components/networkAgent.js:286 js/ui/components/networkAgent.js:296
msgid "Password: " msgid "Password: "
msgstr "Jelszó: " msgstr "Jelszó: "
#. static WEP #. static WEP
#: js/ui/components/networkAgent.js:216 #: js/ui/components/networkAgent.js:217
msgid "Key: " msgid "Key: "
msgstr "Kulcs: " msgstr "Kulcs: "
#: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271 #: js/ui/components/networkAgent.js:250 js/ui/components/networkAgent.js:272
msgid "Private key password: " msgid "Private key password: "
msgstr "Személyes kulcs jelszava: " msgstr "Személyes kulcs jelszava: "
#: js/ui/components/networkAgent.js:269 #: js/ui/components/networkAgent.js:270
msgid "Identity: " msgid "Identity: "
msgstr "Személyazonosság: " msgstr "Személyazonosság: "
#: js/ui/components/networkAgent.js:283 #: js/ui/components/networkAgent.js:284
msgid "Service: " msgid "Service: "
msgstr "Szolgáltatás: " msgstr "Szolgáltatás: "
#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685 #: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686
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:313 js/ui/components/networkAgent.js:686 #: js/ui/components/networkAgent.js:314 js/ui/components/networkAgent.js:687
#, 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 "
@@ -999,53 +1008,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:317 js/ui/components/networkAgent.js:689 #: js/ui/components/networkAgent.js:318 js/ui/components/networkAgent.js:690
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:319 #: js/ui/components/networkAgent.js:320
msgid "Network name: " msgid "Network name: "
msgstr "Hálózat neve: " msgstr "Hálózat neve: "
#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:693 #: js/ui/components/networkAgent.js:325 js/ui/components/networkAgent.js:694
msgid "DSL authentication" msgid "DSL authentication"
msgstr "DSL hitelesítés" msgstr "DSL hitelesítés"
#: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:699 #: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700
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:332 js/ui/components/networkAgent.js:700 #: js/ui/components/networkAgent.js:333 js/ui/components/networkAgent.js:701
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:333 #: js/ui/components/networkAgent.js:334
msgid "PIN: " msgid "PIN: "
msgstr "PIN: " msgstr "PIN: "
#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:706 #: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:707
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:341 js/ui/components/networkAgent.js:690 #: js/ui/components/networkAgent.js:342 js/ui/components/networkAgent.js:691
#: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707 #: js/ui/components/networkAgent.js:695 js/ui/components/networkAgent.js:708
#, 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:674 js/ui/status/network.js:1664 #: js/ui/components/networkAgent.js:675 js/ui/status/network.js:1670
msgid "Network Manager" msgid "Network Manager"
msgstr "Hálózatkezelő" msgstr "Hálózatkezelő"
#: js/ui/components/polkitAgent.js:34 #: js/ui/components/polkitAgent.js:36
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:62 #: js/ui/components/polkitAgent.js:64
msgid "Administrator" msgid "Administrator"
msgstr "Rendszergazda" msgstr "Rendszergazda"
#: js/ui/components/polkitAgent.js:139 #: js/ui/components/polkitAgent.js:141
msgid "Authenticate" msgid "Authenticate"
msgstr "Hitelesítés" msgstr "Hitelesítés"
@@ -1053,7 +1062,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:241 js/ui/shellMountOperation.js:309 #: js/ui/components/polkitAgent.js:243 js/ui/shellMountOperation.js:389
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."
@@ -1104,23 +1113,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:222 #: js/ui/dateMenu.js:228
msgid "Weather" msgid "Weather"
msgstr "Időjárás" msgstr "Időjárás"
#: js/ui/dateMenu.js:305 #: js/ui/dateMenu.js:311
msgid "Select a location…" msgid "Select a location…"
msgstr "Válasszon egy helyet…" msgstr "Válasszon egy helyet…"
#: js/ui/dateMenu.js:313 #: js/ui/dateMenu.js:319
msgid "Loading…" msgid "Loading…"
msgstr "Betöltés…" msgstr "Betöltés…"
#: js/ui/dateMenu.js:323 #: js/ui/dateMenu.js:329
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:325 #: js/ui/dateMenu.js:331
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"
@@ -1248,28 +1257,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:309 #: js/ui/endSessionDialog.js:310
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:326 #: js/ui/endSessionDialog.js:327
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:333 #: js/ui/endSessionDialog.js:334
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:614 #: js/ui/endSessionDialog.js:615
#, 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:617 #: js/ui/endSessionDialog.js:618
#, javascript-format #, javascript-format
msgid "%s (console)" msgid "%s (console)"
msgstr "%s (konzol)" msgstr "%s (konzol)"
@@ -1285,26 +1294,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:50 #: js/ui/inhibitShortcutsDialog.js:78
#, 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:51 #: js/ui/inhibitShortcutsDialog.js:79
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:60 #: js/ui/inhibitShortcutsDialog.js:88
#, 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:65 #: js/ui/inhibitShortcutsDialog.js:93
msgid "Deny" msgid "Deny"
msgstr "Tiltás" msgstr "Tiltás"
#: js/ui/inhibitShortcutsDialog.js:71 #: js/ui/inhibitShortcutsDialog.js:100
msgid "Allow" msgid "Allow"
msgstr "Engedélyezés" msgstr "Engedélyezés"
@@ -1355,13 +1364,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:1263 #: js/ui/status/network.js:1269
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:310 #: js/ui/status/network.js:128 js/ui/status/network.js:311
#: js/ui/status/network.js:1263 js/ui/status/network.js:1375 #: js/ui/status/network.js:1269 js/ui/status/network.js:1381
#: 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"
@@ -1371,7 +1380,7 @@ msgstr "Kikapcsolás"
msgid "Leave Off" msgid "Leave Off"
msgstr "Kikapcsolva hagyás" msgstr "Kikapcsolva hagyás"
#: js/ui/keyboard.js:203 #: js/ui/keyboard.js:200
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"
@@ -1423,7 +1432,7 @@ msgstr "Forrás megtekintése"
msgid "Web Page" msgid "Web Page"
msgstr "Weblap" msgstr "Weblap"
#: js/ui/messageTray.js:1480 #: js/ui/messageTray.js:1479
msgid "System Information" msgid "System Information"
msgstr "Rendszerinformációk" msgstr "Rendszerinformációk"
@@ -1501,47 +1510,38 @@ 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:108 #: js/ui/panel.js:113
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:471 #: js/ui/panel.js:468
msgid "Activities" msgid "Activities"
msgstr "Tevékenységek" msgstr "Tevékenységek"
#: js/ui/panel.js:746 #: js/ui/panel.js:743
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:866 #: js/ui/panel.js:861
msgid "Top Bar" msgid "Top Bar"
msgstr "Felső sáv" msgstr "Felső sáv"
#. Translators: this MUST be either "toggle-switch-us" #: js/ui/runDialog.js:65
#. (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:104 js/ui/windowMenu.js:166 #: js/ui/runDialog.js:105 js/ui/windowMenu.js:166
msgid "Close" msgid "Close"
msgstr "Bezárás" msgstr "Bezárás"
#: js/ui/runDialog.js:266 #: js/ui/runDialog.js:267
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:271 #: js/ui/runDialog.js:272
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:270 #: js/ui/screenShield.js:449 js/ui/status/system.js:271
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:834 js/ui/screenShield.js:1307 #: js/ui/screenShield.js:826 js/ui/screenShield.js:1299
msgid "Unable to lock" msgid "Unable to lock"
msgstr "Nem lehet zárolni" msgstr "Nem lehet zárolni"
#: js/ui/screenShield.js:835 js/ui/screenShield.js:1308 #: 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 "A zárolást egy alkalmazás blokkolta" msgstr "A zárolást egy alkalmazás blokkolta"
@@ -1619,14 +1619,61 @@ 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:296 #: js/ui/shellMountOperation.js:318
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:317 #: js/ui/shellMountOperation.js:396
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"
@@ -1663,11 +1710,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:151 #: js/ui/status/accessibility.js:135
msgid "High Contrast" msgid "High Contrast"
msgstr "Nagy kontraszt" msgstr "Nagy kontraszt"
#: js/ui/status/accessibility.js:182 #: js/ui/status/accessibility.js:177
msgid "Large Text" msgid "Large Text"
msgstr "Nagy szöveg" msgstr "Nagy szöveg"
@@ -1675,7 +1722,7 @@ msgstr "Nagy szöveg"
msgid "Bluetooth" msgid "Bluetooth"
msgstr "Bluetooth" msgstr "Bluetooth"
#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585 #: js/ui/status/bluetooth.js:47 js/ui/status/network.js:586
msgid "Bluetooth Settings" msgid "Bluetooth Settings"
msgstr "Bluetooth-beállítások" msgstr "Bluetooth-beállítások"
@@ -1699,11 +1746,11 @@ msgstr "Be"
msgid "Brightness" msgid "Brightness"
msgstr "Fényerő" msgstr "Fényerő"
#: js/ui/status/keyboard.js:812 #: js/ui/status/keyboard.js:813
msgid "Keyboard" msgid "Keyboard"
msgstr "Billentyűzet" msgstr "Billentyűzet"
#: js/ui/status/keyboard.js:834 #: js/ui/status/keyboard.js:835
msgid "Show Keyboard Layout" msgid "Show Keyboard Layout"
msgstr "Billentyűzetkiosztás megjelenítése" msgstr "Billentyűzetkiosztás megjelenítése"
@@ -1732,12 +1779,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:353 #: js/ui/status/location.js:355
#, 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:354 #: js/ui/status/location.js:356
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."
@@ -1747,13 +1794,13 @@ msgid "<unknown>"
msgstr "<ismeretlen>" msgstr "<ismeretlen>"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:416 js/ui/status/network.js:1292 #: js/ui/status/network.js:417 js/ui/status/network.js:1298
#, 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:419 #: js/ui/status/network.js:420
#, javascript-format #, javascript-format
msgid "%s Connected" msgid "%s Connected"
msgstr "%s kapcsolódva" msgstr "%s kapcsolódva"
@@ -1761,189 +1808,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:424 #: js/ui/status/network.js:425
#, 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:427 #: js/ui/status/network.js:428
#, 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:434 js/ui/status/network.js:1284 #: js/ui/status/network.js:435 js/ui/status/network.js:1290
#, 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:437 #: js/ui/status/network.js:438
#, 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:445 #: js/ui/status/network.js:446
#, 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:449 #: js/ui/status/network.js:450
#, 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:452 #: js/ui/status/network.js:453
#, 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:464 #: js/ui/status/network.js:465
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:506 #: js/ui/status/network.js:507
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:553 js/ui/status/network.js:1289 #: js/ui/status/network.js:554 js/ui/status/network.js:1295
#, 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:557 #: js/ui/status/network.js:558
#, javascript-format #, javascript-format
msgid "%s Disabled" msgid "%s Disabled"
msgstr "%s letiltva" msgstr "%s letiltva"
#: js/ui/status/network.js:597 #: js/ui/status/network.js:598
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:786 #: js/ui/status/network.js:792
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:787 #: js/ui/status/network.js:793
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:788 #: js/ui/status/network.js:794
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:797 #: js/ui/status/network.js:803
msgid "Wi-Fi is Off" msgid "Wi-Fi is Off"
msgstr "Wi-Fi ki" msgstr "Wi-Fi ki"
#: js/ui/status/network.js:798 #: js/ui/status/network.js:804
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:799 #: js/ui/status/network.js:805
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:824 #: js/ui/status/network.js:830
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:826 #: js/ui/status/network.js:832
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:855 #: js/ui/status/network.js:861
msgid "No Networks" msgid "No Networks"
msgstr "Nincs hálózat" msgstr "Nincs hálózat"
#: js/ui/status/network.js:876 js/ui/status/rfkill.js:104 #: js/ui/status/network.js:882 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:1152 #: js/ui/status/network.js:1158
msgid "Select Network" msgid "Select Network"
msgstr "Válasszon hálózatot" msgstr "Válasszon hálózatot"
#: js/ui/status/network.js:1158 #: js/ui/status/network.js:1164
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:1280 #: js/ui/status/network.js:1286
#, 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:1295 #: js/ui/status/network.js:1301
#, 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:1392 #: js/ui/status/network.js:1398
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:1395 #: js/ui/status/network.js:1401
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:1397 #: js/ui/status/network.js:1403
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:1447 #: js/ui/status/network.js:1453
msgid "VPN Settings" msgid "VPN Settings"
msgstr "VPN beállítások" msgstr "VPN beállítások"
#: js/ui/status/network.js:1464 #: js/ui/status/network.js:1470
msgid "VPN" msgid "VPN"
msgstr "VPN" msgstr "VPN"
#: js/ui/status/network.js:1474 #: js/ui/status/network.js:1480
msgid "VPN Off" msgid "VPN Off"
msgstr "VPN ki" msgstr "VPN ki"
#: js/ui/status/network.js:1535 js/ui/status/rfkill.js:82 #: js/ui/status/network.js:1541 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:1564 #: js/ui/status/network.js:1570
#, 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:1568 #: js/ui/status/network.js:1574
#, 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:1572 #: js/ui/status/network.js:1578
#, 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:1701 #: js/ui/status/network.js:1711
msgid "Connection failed" msgid "Connection failed"
msgstr "Kapcsolódás meghiúsult" msgstr "Kapcsolódás meghiúsult"
#: js/ui/status/network.js:1702 #: js/ui/status/network.js:1712
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"
@@ -1990,7 +2037,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
@@ -2025,15 +2072,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:255 #: js/ui/status/system.js:256
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:281 #: js/ui/status/system.js:282
msgid "Suspend" msgid "Suspend"
msgstr "Felfüggesztés" msgstr "Felfüggesztés"
#: js/ui/status/system.js:291 #: js/ui/status/system.js:292
msgid "Power Off" msgid "Power Off"
msgstr "Kikapcsolás" msgstr "Kikapcsolás"
@@ -2125,22 +2172,22 @@ msgstr "Oldalsáv"
msgid "“%s” is ready" msgid "“%s” is ready"
msgstr "„%s” kész" msgstr "„%s” kész"
#: js/ui/windowManager.js:53 #: js/ui/windowManager.js:54
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 lenght, #. Translators: this and the following message should be limited in length,
#. to avoid ellipsizing the labels. #. to avoid ellipsizing the labels.
#. #.
#: js/ui/windowManager.js:65 #: js/ui/windowManager.js:66
msgid "Revert Settings" msgid "Revert Settings"
msgstr "Beállítások visszavonása" msgstr "Beállítások visszavonása"
#: js/ui/windowManager.js:68 #: js/ui/windowManager.js:69
msgid "Keep Changes" msgid "Keep Changes"
msgstr "Módosítások megtartása" msgstr "Módosítások megtartása"
#: js/ui/windowManager.js:86 #: js/ui/windowManager.js:87
#, 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"
@@ -2149,7 +2196,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:662 #: js/ui/windowManager.js:678
#, javascript-format #, javascript-format
msgid "%d × %d" msgid "%d × %d"
msgstr "%d × %d" msgstr "%d × %d"
@@ -2222,11 +2269,6 @@ 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"
@@ -2244,21 +2286,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:260 #: src/shell-app.c:264
msgctxt "program" msgctxt "program"
msgid "Unknown" msgid "Unknown"
msgstr "Ismeretlen" msgstr "Ismeretlen"
#: src/shell-app.c:511 #: src/shell-app.c:515
#, 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:730 #: src/shell-keyring-prompt.c:731
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:738 #: src/shell-keyring-prompt.c:739
msgid "Password cannot be blank" msgid "Password cannot be blank"
msgstr "A jelszó nem lehet üres" msgstr "A jelszó nem lehet üres"

336
po/id.po
View File

@@ -9,8 +9,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-04-17 19:29+0000\n" "POT-Creation-Date: 2019-06-06 11:42+0000\n"
"PO-Revision-Date: 2019-04-25 14:54+0700\n" "PO-Revision-Date: 2019-06-14 17:35+0700\n"
"Last-Translator: Kukuh Syafaat <kukuhsyafaat@gnome.org>\n" "Last-Translator: Kukuh Syafaat <kukuhsyafaat@gnome.org>\n"
"Language-Team: Indonesian <gnome-l10n-id@googlegroups.com>\n" "Language-Team: Indonesian <gnome-l10n-id@googlegroups.com>\n"
"Language: id\n" "Language: id\n"
@@ -18,7 +18,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural= n!=1;\n" "Plural-Forms: nplurals=2; plural= n!=1;\n"
"X-Generator: Poedit 2.2.1\n" "X-Generator: Poedit 2.2.3\n"
"X-DamnedLies-Scope: partial\n" "X-DamnedLies-Scope: partial\n"
"X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-SourceCharset: UTF-8\n"
@@ -423,10 +423,11 @@ msgstr ""
msgid "Browse in Software" msgid "Browse in Software"
msgstr "Ramban di Perangkat Lunak" msgstr "Ramban di Perangkat Lunak"
#: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55 #: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:52
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136 #: js/ui/components/networkAgent.js:118 js/ui/components/polkitAgent.js:138
#: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188 #: js/ui/endSessionDialog.js:431 js/ui/extensionDownloader.js:188
#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888 #: js/ui/shellMountOperation.js:404 js/ui/shellMountOperation.js:413
#: js/ui/status/network.js:894
msgid "Cancel" msgid "Cancel"
msgstr "Batal" msgstr "Batal"
@@ -434,7 +435,7 @@ msgstr "Batal"
msgid "Next" msgid "Next"
msgstr "Selanjutnya" msgstr "Selanjutnya"
#: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:329 #: js/gdm/authPrompt.js:198 js/ui/shellMountOperation.js:408
#: js/ui/unlockDialog.js:41 #: js/ui/unlockDialog.js:41
msgid "Unlock" msgid "Unlock"
msgstr "Buka Kunci" msgstr "Buka Kunci"
@@ -465,8 +466,8 @@ msgstr "(cth., pengguna dari %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:243 #: js/gdm/loginDialog.js:889 js/ui/components/networkAgent.js:244
#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281 #: js/ui/components/networkAgent.js:264 js/ui/components/networkAgent.js:282
msgid "Username: " msgid "Username: "
msgstr "Nama pengguna: " msgstr "Nama pengguna: "
@@ -517,8 +518,8 @@ msgstr "Keluar"
#. 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;sign off" msgid "logout;log out;sign off"
msgstr "keluar" msgstr "keluar;logout;log out;sign off"
#. 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
@@ -704,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:37 js/ui/status/location.js:360 #: js/ui/accessDialog.js:38 js/ui/status/location.js:362
msgid "Deny Access" msgid "Deny Access"
msgstr "Tolak Akses" msgstr "Tolak Akses"
#: js/ui/accessDialog.js:38 js/ui/status/location.js:363 #: js/ui/accessDialog.js:39 js/ui/status/location.js:365
msgid "Grant Access" msgid "Grant Access"
msgstr "Beri Akses" msgstr "Beri Akses"
@@ -759,23 +760,23 @@ msgstr "%s telah ditambahkan ke favorit Anda."
msgid "%s has been removed from your favorites." msgid "%s has been removed from your favorites."
msgstr "%s telah dihapus dari favorit Anda." msgstr "%s telah dihapus dari favorit Anda."
#: js/ui/audioDeviceSelection.js:42 #: js/ui/audioDeviceSelection.js:39
msgid "Select Audio Device" msgid "Select Audio Device"
msgstr "Pilih Perangkat Audio" msgstr "Pilih Perangkat Audio"
#: js/ui/audioDeviceSelection.js:53 #: js/ui/audioDeviceSelection.js:50
msgid "Sound Settings" msgid "Sound Settings"
msgstr "Pengaturan Suara" msgstr "Pengaturan Suara"
#: js/ui/audioDeviceSelection.js:62 #: js/ui/audioDeviceSelection.js:59
msgid "Headphones" msgid "Headphones"
msgstr "Headphone" msgstr "Headphone"
#: js/ui/audioDeviceSelection.js:64 #: js/ui/audioDeviceSelection.js:61
msgid "Headset" msgid "Headset"
msgstr "Headset" msgstr "Headset"
#: js/ui/audioDeviceSelection.js:66 js/ui/status/volume.js:247 #: js/ui/audioDeviceSelection.js:63 js/ui/status/volume.js:247
msgid "Microphone" msgid "Microphone"
msgstr "Mikrofon" msgstr "Mikrofon"
@@ -936,68 +937,76 @@ msgstr "Tutup Paksa"
msgid "Wait" msgid "Wait"
msgstr "Tunggu" msgstr "Tunggu"
#: js/ui/components/automountManager.js:86 #: js/ui/components/automountManager.js:87
msgid "External drive connected" msgid "External drive connected"
msgstr "Drive eksternal tersambung" msgstr "Drive eksternal tersambung"
#: js/ui/components/automountManager.js:98 #: js/ui/components/automountManager.js:99
msgid "External drive disconnected" msgid "External drive disconnected"
msgstr "Drive eksternal terputus" msgstr "Drive eksternal terputus"
#: js/ui/components/automountManager.js:211
msgid "Unable to unlock volume"
msgstr "Tak bisa membuka kunci volume"
#: js/ui/components/automountManager.js:212
msgid "The installed udisks version does not support the PIM setting"
msgstr "Versi udisks yang dipasang tidak mendukung pengaturan 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 "Buka dengan %s" msgstr "Buka dengan %s"
#: js/ui/components/keyring.js:77 js/ui/components/polkitAgent.js:255 #: js/ui/components/keyring.js:66 js/ui/components/polkitAgent.js:257
msgid "Password:" msgid "Password:"
msgstr "Sandi:" msgstr "Sandi:"
#: js/ui/components/keyring.js:108 #: js/ui/components/keyring.js:97
msgid "Type again:" msgid "Type again:"
msgstr "Ketik lagi:" msgstr "Ketik lagi:"
#: js/ui/components/networkAgent.js:102 #: js/ui/components/networkAgent.js:103
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 ""
"Sebagai alternatif Anda dapat terhubung dengan menekan tombol \"WPS\" pada " "Sebagai alternatif Anda dapat terhubung dengan menekan tombol \"WPS\" pada "
"router Anda." "router Anda."
#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219 #: js/ui/components/networkAgent.js:113 js/ui/status/network.js:219
#: js/ui/status/network.js:309 js/ui/status/network.js:891 #: js/ui/status/network.js:310 js/ui/status/network.js:897
msgid "Connect" msgid "Connect"
msgstr "Sambung" msgstr "Sambung"
#. Cisco LEAP #. Cisco LEAP
#: js/ui/components/networkAgent.js:211 js/ui/components/networkAgent.js:223 #: js/ui/components/networkAgent.js:212 js/ui/components/networkAgent.js:224
#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:265 #: js/ui/components/networkAgent.js:247 js/ui/components/networkAgent.js:266
#: js/ui/components/networkAgent.js:285 js/ui/components/networkAgent.js:295 #: js/ui/components/networkAgent.js:286 js/ui/components/networkAgent.js:296
msgid "Password: " msgid "Password: "
msgstr "Sandi: " msgstr "Sandi: "
#. static WEP #. static WEP
#: js/ui/components/networkAgent.js:216 #: js/ui/components/networkAgent.js:217
msgid "Key: " msgid "Key: "
msgstr "Tombol: " msgstr "Tombol: "
#: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271 #: js/ui/components/networkAgent.js:250 js/ui/components/networkAgent.js:272
msgid "Private key password: " msgid "Private key password: "
msgstr "Sandi kunci privat: " msgstr "Sandi kunci privat: "
#: js/ui/components/networkAgent.js:269 #: js/ui/components/networkAgent.js:270
msgid "Identity: " msgid "Identity: "
msgstr "Identitas: " msgstr "Identitas: "
#: js/ui/components/networkAgent.js:283 #: js/ui/components/networkAgent.js:284
msgid "Service: " msgid "Service: "
msgstr "Layanan: " msgstr "Layanan: "
#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685
msgid "Authentication required by wireless network"
msgstr "Otentikasi diperlukan oleh jaringan nirkabel"
#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686 #: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686
msgid "Authentication required by wireless network"
msgstr "Autentikasi diperlukan oleh jaringan nirkabel"
#: js/ui/components/networkAgent.js:314 js/ui/components/networkAgent.js:687
#, 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 "
@@ -1006,61 +1015,61 @@ msgstr ""
"Sandi atau kunci enkripsi diperlukan untuk mengakses jaringan nirkabel \"%s" "Sandi atau kunci enkripsi diperlukan untuk mengakses jaringan nirkabel \"%s"
"\"." "\"."
#: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:689 #: js/ui/components/networkAgent.js:318 js/ui/components/networkAgent.js:690
msgid "Wired 802.1X authentication" msgid "Wired 802.1X authentication"
msgstr "Otentikasi 802.1X kabel" msgstr "Autentikasi 802.1X kabel"
#: js/ui/components/networkAgent.js:319 #: js/ui/components/networkAgent.js:320
msgid "Network name: " msgid "Network name: "
msgstr "Nama jaringan: " msgstr "Nama jaringan: "
#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:693 #: js/ui/components/networkAgent.js:325 js/ui/components/networkAgent.js:694
msgid "DSL authentication" msgid "DSL authentication"
msgstr "Otentikasi DSL" msgstr "Autentikasi DSL"
#: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:699 #: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700
msgid "PIN code required" msgid "PIN code required"
msgstr "Perlu kode PIN" msgstr "Perlu kode PIN"
#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700 #: js/ui/components/networkAgent.js:333 js/ui/components/networkAgent.js:701
msgid "PIN code is needed for the mobile broadband device" msgid "PIN code is needed for the mobile broadband device"
msgstr "Kode PIN diperlukan untuk perangkat data seluler" msgstr "Kode PIN diperlukan untuk perangkat data seluler"
#: js/ui/components/networkAgent.js:333 #: js/ui/components/networkAgent.js:334
msgid "PIN: " msgid "PIN: "
msgstr "PIN: " msgstr "PIN: "
#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:706 #: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:707
msgid "Mobile broadband network password" msgid "Mobile broadband network password"
msgstr "Sandi jaringan data seluler" msgstr "Sandi jaringan data seluler"
#: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:690 #: js/ui/components/networkAgent.js:342 js/ui/components/networkAgent.js:691
#: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707 #: js/ui/components/networkAgent.js:695 js/ui/components/networkAgent.js:708
#, javascript-format #, javascript-format
msgid "A password is required to connect to “%s”." msgid "A password is required to connect to “%s”."
msgstr "Perlu suatu sandi untuk menyambung ke \"%s\"." msgstr "Perlu suatu sandi untuk menyambung ke \"%s\"."
#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1664 #: js/ui/components/networkAgent.js:675 js/ui/status/network.js:1670
msgid "Network Manager" msgid "Network Manager"
msgstr "Manajer Jaringan" msgstr "Manajer Jaringan"
#: js/ui/components/polkitAgent.js:34 #: js/ui/components/polkitAgent.js:36
msgid "Authentication Required" msgid "Authentication Required"
msgstr "Diperlukan Autentikasi" msgstr "Diperlukan Autentikasi"
#: js/ui/components/polkitAgent.js:62 #: js/ui/components/polkitAgent.js:64
msgid "Administrator" msgid "Administrator"
msgstr "Administrator" msgstr "Administrator"
#: js/ui/components/polkitAgent.js:139 #: js/ui/components/polkitAgent.js:141
msgid "Authenticate" msgid "Authenticate"
msgstr "Otentikasi" msgstr "Autentikasi"
#. Translators: "that didn't work" refers to the fact that the #. Translators: "that didn't work" refers to the fact that the
#. * 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:241 js/ui/shellMountOperation.js:309 #: js/ui/components/polkitAgent.js:243 js/ui/shellMountOperation.js:389
msgid "Sorry, that didnt work. Please try again." msgid "Sorry, that didnt work. Please try again."
msgstr "Maaf, tidak berhasil. Silakan coba lagi." msgstr "Maaf, tidak berhasil. Silakan coba lagi."
@@ -1254,27 +1263,27 @@ msgstr ""
"waktu lama: pastikan bahwa Anda telah melakukan back up dan komputer " "waktu lama: pastikan bahwa Anda telah melakukan back up dan komputer "
"tersambung ke listrik." "tersambung ke listrik."
#: js/ui/endSessionDialog.js:309 #: js/ui/endSessionDialog.js:310
msgid "Running on battery power: please plug in before installing updates." msgid "Running on battery power: please plug in before installing updates."
msgstr "" msgstr ""
"Berjalan memakai daya baterai: harap tancapkan sebelum memasang pemutakhiran." "Berjalan memakai daya baterai: harap tancapkan sebelum memasang pemutakhiran."
#: js/ui/endSessionDialog.js:326 #: js/ui/endSessionDialog.js:327
msgid "Some applications are busy or have unsaved work." msgid "Some applications are busy or have unsaved work."
msgstr "Beberapa aplikasi sedang sibuk atau belum disimpan perubahannya." msgstr "Beberapa aplikasi sedang sibuk atau belum disimpan perubahannya."
#: js/ui/endSessionDialog.js:333 #: js/ui/endSessionDialog.js:334
msgid "Other users are logged in." msgid "Other users are logged in."
msgstr "Pengguna lain sedang log masuk." msgstr "Pengguna lain sedang log masuk."
#. 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:614 #: js/ui/endSessionDialog.js:615
#, javascript-format #, javascript-format
msgid "%s (remote)" msgid "%s (remote)"
msgstr "%s (jarak jauh)" msgstr "%s (jarak jauh)"
#. 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:617 #: js/ui/endSessionDialog.js:618
#, javascript-format #, javascript-format
msgid "%s (console)" msgid "%s (console)"
msgstr "%s (konsol)" msgstr "%s (konsol)"
@@ -1359,13 +1368,13 @@ msgid "Leave On"
msgstr "Biarkan Menyala" msgstr "Biarkan Menyala"
#: 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:1263 #: js/ui/status/network.js:1269
msgid "Turn On" msgid "Turn On"
msgstr "Nyalakan" msgstr "Nyalakan"
#: 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:310 #: js/ui/status/network.js:128 js/ui/status/network.js:311
#: js/ui/status/network.js:1263 js/ui/status/network.js:1375 #: js/ui/status/network.js:1269 js/ui/status/network.js:1381
#: 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"
@@ -1427,7 +1436,7 @@ msgstr "Tilik Sumber"
msgid "Web Page" msgid "Web Page"
msgstr "Halaman Web" msgstr "Halaman Web"
#: js/ui/messageTray.js:1480 #: js/ui/messageTray.js:1479
msgid "System Information" msgid "System Information"
msgstr "Informasi Sistem" msgstr "Informasi Sistem"
@@ -1520,23 +1529,23 @@ msgctxt "System menu in the top bar"
msgid "System" msgid "System"
msgstr "Sistem" msgstr "Sistem"
#: js/ui/panel.js:864 #: js/ui/panel.js:862
msgid "Top Bar" msgid "Top Bar"
msgstr "Bar Atas" msgstr "Bar Atas"
#: js/ui/runDialog.js:64 #: js/ui/runDialog.js:65
msgid "Enter a Command" msgid "Enter a Command"
msgstr "Ketikkan Perintah" msgstr "Ketikkan Perintah"
#: js/ui/runDialog.js:104 js/ui/windowMenu.js:166 #: js/ui/runDialog.js:105 js/ui/windowMenu.js:166
msgid "Close" msgid "Close"
msgstr "Tutup" msgstr "Tutup"
#: js/ui/runDialog.js:266 #: js/ui/runDialog.js:267
msgid "Restart is not available on Wayland" msgid "Restart is not available on Wayland"
msgstr "Memulai ulang tidak tersedia di Wayland" msgstr "Memulai ulang tidak tersedia di Wayland"
#: js/ui/runDialog.js:271 #: js/ui/runDialog.js:272
msgid "Restarting…" msgid "Restarting…"
msgstr "Memulai ulang…" msgstr "Memulai ulang…"
@@ -1583,15 +1592,15 @@ msgstr "Tak bisa mengunci"
msgid "Lock was blocked by an application" msgid "Lock was blocked by an application"
msgstr "Kunci diblokir oleh suatu aplikasi" msgstr "Kunci diblokir oleh suatu aplikasi"
#: js/ui/search.js:635 #: js/ui/search.js:638
msgid "Searching…" msgid "Searching…"
msgstr "Mencari…" msgstr "Mencari…"
#: js/ui/search.js:637 #: js/ui/search.js:640
msgid "No results." msgid "No results."
msgstr "Tak ada yang cocok." msgstr "Tak ada yang cocok."
#: js/ui/search.js:761 #: js/ui/search.js:764
#, javascript-format #, javascript-format
msgid "%d more" msgid "%d more"
msgid_plural "%d more" msgid_plural "%d more"
@@ -1614,14 +1623,61 @@ msgstr "Tampilkan Teks"
msgid "Hide Text" msgid "Hide Text"
msgstr "Sembunyikan Teks" msgstr "Sembunyikan Teks"
#: js/ui/shellMountOperation.js:296 #: js/ui/shellMountOperation.js:318
msgid "Hidden Volume"
msgstr "Volume Tersembunyi"
#: js/ui/shellMountOperation.js:321
msgid "Windows System Volume"
msgstr "Volume Sistem Windows"
#: js/ui/shellMountOperation.js:324
msgid "Uses Keyfiles"
msgstr "Gunakan Berkas Kunci"
#. 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 ""
"Untuk membuka kunci volume yang menggunakan berkas kunci, gunakan utilitas "
"<i>%s</i>."
#: js/ui/shellMountOperation.js:337
msgid "PIM Number"
msgstr "Nomor PIM"
#: js/ui/shellMountOperation.js:355
msgid "The PIM must be a number or empty."
msgstr "PIM harus berupa angka atau kosong."
#: js/ui/shellMountOperation.js:366
msgid "Password" msgid "Password"
msgstr "Sandi" msgstr "Sandi"
#: js/ui/shellMountOperation.js:317 #: js/ui/shellMountOperation.js:396
msgid "Remember Password" msgid "Remember Password"
msgstr "Ingat Sandi" msgstr "Ingat Sandi"
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:418
#, javascript-format
msgid "Open %s"
msgstr "Buka %s"
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:490
#, javascript-format
msgid "Unable to start %s"
msgstr "Tak bisa memulai %s"
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:492
#, javascript-format
msgid "Couldnt find the %s application"
msgstr "Tak bisa menemukan aplikasi %s"
#: js/ui/status/accessibility.js:35 #: js/ui/status/accessibility.js:35
msgid "Accessibility" msgid "Accessibility"
msgstr "Aksesibilitas" msgstr "Aksesibilitas"
@@ -1658,11 +1714,11 @@ msgstr "Tombol Pantul"
msgid "Mouse Keys" msgid "Mouse Keys"
msgstr "Tombol Tetikus" msgstr "Tombol Tetikus"
#: js/ui/status/accessibility.js:151 #: js/ui/status/accessibility.js:135
msgid "High Contrast" msgid "High Contrast"
msgstr "Kontras Tinggi" msgstr "Kontras Tinggi"
#: js/ui/status/accessibility.js:182 #: js/ui/status/accessibility.js:177
msgid "Large Text" msgid "Large Text"
msgstr "Teks Besar" msgstr "Teks Besar"
@@ -1670,7 +1726,7 @@ msgstr "Teks Besar"
msgid "Bluetooth" msgid "Bluetooth"
msgstr "Bluetooth" msgstr "Bluetooth"
#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585 #: js/ui/status/bluetooth.js:47 js/ui/status/network.js:586
msgid "Bluetooth Settings" msgid "Bluetooth Settings"
msgstr "Pengaturan Bluetooth" msgstr "Pengaturan Bluetooth"
@@ -1694,11 +1750,31 @@ msgstr "Hidup"
msgid "Brightness" msgid "Brightness"
msgstr "Kecerahan" msgstr "Kecerahan"
#: js/ui/status/keyboard.js:812 #: js/ui/status/dwellClick.js:13
msgid "Single Click"
msgstr "Klik Tunggal"
#: js/ui/status/dwellClick.js:18
msgid "Double Click"
msgstr "Klik Ganda"
#: js/ui/status/dwellClick.js:23
msgid "Drag"
msgstr "Seret"
#: js/ui/status/dwellClick.js:28
msgid "Secondary Click"
msgstr "Klik Sekunder"
#: js/ui/status/dwellClick.js:37
msgid "Dwell Click"
msgstr "Klik Menetap"
#: js/ui/status/keyboard.js:813
msgid "Keyboard" msgid "Keyboard"
msgstr "Papan Ketik" msgstr "Papan Ketik"
#: js/ui/status/keyboard.js:834 #: js/ui/status/keyboard.js:835
msgid "Show Keyboard Layout" msgid "Show Keyboard Layout"
msgstr "Tampilkan Tata Letak Papan Tik" msgstr "Tampilkan Tata Letak Papan Tik"
@@ -1727,12 +1803,12 @@ msgid "Enable"
msgstr "Fungsikan" msgstr "Fungsikan"
#. Translators: %s is an application name #. Translators: %s is an application name
#: js/ui/status/location.js:353 #: js/ui/status/location.js:355
#, javascript-format #, javascript-format
msgid "Give %s access to your location?" msgid "Give %s access to your location?"
msgstr "Beri %s akses ke lokasi Anda?" msgstr "Beri %s akses ke lokasi Anda?"
#: js/ui/status/location.js:354 #: js/ui/status/location.js:356
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 "Akses lokasi dapat diubah setiap saat dari pengaturan privasi." msgstr "Akses lokasi dapat diubah setiap saat dari pengaturan privasi."
@@ -1741,13 +1817,13 @@ msgid "<unknown>"
msgstr "<tak dikenal>" msgstr "<tak dikenal>"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:416 js/ui/status/network.js:1292 #: js/ui/status/network.js:417 js/ui/status/network.js:1298
#, javascript-format #, javascript-format
msgid "%s Off" msgid "%s Off"
msgstr "%s Mati" msgstr "%s Mati"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:419 #: js/ui/status/network.js:420
#, javascript-format #, javascript-format
msgid "%s Connected" msgid "%s Connected"
msgstr "%s Tersambung" msgstr "%s Tersambung"
@@ -1755,189 +1831,189 @@ msgstr "%s Tersambung"
#. 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:424 #: js/ui/status/network.js:425
#, javascript-format #, javascript-format
msgid "%s Unmanaged" msgid "%s Unmanaged"
msgstr "%s Tak Dikelola" msgstr "%s Tak Dikelola"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:427 #: js/ui/status/network.js:428
#, javascript-format #, javascript-format
msgid "%s Disconnecting" msgid "%s Disconnecting"
msgstr "%s Memutus" msgstr "%s Memutus"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:434 js/ui/status/network.js:1284 #: js/ui/status/network.js:435 js/ui/status/network.js:1290
#, javascript-format #, javascript-format
msgid "%s Connecting" msgid "%s Connecting"
msgstr "%s Menyambung" msgstr "%s Menyambung"
#. 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:437 #: js/ui/status/network.js:438
#, javascript-format #, javascript-format
msgid "%s Requires Authentication" msgid "%s Requires Authentication"
msgstr "%s Memerlukan Otentikasi" msgstr "%s Memerlukan Autentikasi"
#. 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:445 #: js/ui/status/network.js:446
#, javascript-format #, javascript-format
msgid "Firmware Missing For %s" msgid "Firmware Missing For %s"
msgstr "Firmware Hilang Untuk %s" msgstr "Firmware Hilang Untuk %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:449 #: js/ui/status/network.js:450
#, javascript-format #, javascript-format
msgid "%s Unavailable" msgid "%s Unavailable"
msgstr "%s Tak tersedia" msgstr "%s Tak tersedia"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:452 #: js/ui/status/network.js:453
#, javascript-format #, javascript-format
msgid "%s Connection Failed" msgid "%s Connection Failed"
msgstr "Koneksi %s Gagal" msgstr "Koneksi %s Gagal"
#: js/ui/status/network.js:464 #: js/ui/status/network.js:465
msgid "Wired Settings" msgid "Wired Settings"
msgstr "Pengaturan Kabel" msgstr "Pengaturan Kabel"
#: js/ui/status/network.js:506 #: js/ui/status/network.js:507
msgid "Mobile Broadband Settings" msgid "Mobile Broadband Settings"
msgstr "Pengaturan Data Seluler" msgstr "Pengaturan Data Seluler"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:553 js/ui/status/network.js:1289 #: js/ui/status/network.js:554 js/ui/status/network.js:1295
#, javascript-format #, javascript-format
msgid "%s Hardware Disabled" msgid "%s Hardware Disabled"
msgstr "%s Perangkat Keras Dinonaktifkan" msgstr "%s Perangkat Keras Dinonaktifkan"
#. 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:557 #: js/ui/status/network.js:558
#, javascript-format #, javascript-format
msgid "%s Disabled" msgid "%s Disabled"
msgstr "%s Dinonaktifkan" msgstr "%s Dinonaktifkan"
#: js/ui/status/network.js:597 #: js/ui/status/network.js:598
msgid "Connect to Internet" msgid "Connect to Internet"
msgstr "Sambungkan ke Internet" msgstr "Sambungkan ke Internet"
#: js/ui/status/network.js:786 #: js/ui/status/network.js:792
msgid "Airplane Mode is On" msgid "Airplane Mode is On"
msgstr "Mode Pesawat Terbang Menyala" msgstr "Mode Pesawat Terbang Menyala"
#: js/ui/status/network.js:787 #: js/ui/status/network.js:793
msgid "Wi-Fi is disabled when airplane mode is on." msgid "Wi-Fi is disabled when airplane mode is on."
msgstr "Wi-Fi dinonaktifkan ketika mode pesawat terbang menyala." msgstr "Wi-Fi dinonaktifkan ketika mode pesawat terbang menyala."
#: js/ui/status/network.js:788 #: js/ui/status/network.js:794
msgid "Turn Off Airplane Mode" msgid "Turn Off Airplane Mode"
msgstr "Matikan Mode Pesawat Terbang" msgstr "Matikan Mode Pesawat Terbang"
#: js/ui/status/network.js:797 #: js/ui/status/network.js:803
msgid "Wi-Fi is Off" msgid "Wi-Fi is Off"
msgstr "Wi-Fi Mati" msgstr "Wi-Fi Mati"
#: js/ui/status/network.js:798 #: js/ui/status/network.js:804
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 "Wi-Fi perlu dinyalakan untuk menyambung ke suatu jaringan." msgstr "Wi-Fi perlu dinyalakan untuk menyambung ke suatu jaringan."
#: js/ui/status/network.js:799 #: js/ui/status/network.js:805
msgid "Turn On Wi-Fi" msgid "Turn On Wi-Fi"
msgstr "Nyalakan Wi-Fi" msgstr "Nyalakan Wi-Fi"
#: js/ui/status/network.js:824 #: js/ui/status/network.js:830
msgid "Wi-Fi Networks" msgid "Wi-Fi Networks"
msgstr "Jaringan Wi-Fi" msgstr "Jaringan Wi-Fi"
#: js/ui/status/network.js:826 #: js/ui/status/network.js:832
msgid "Select a network" msgid "Select a network"
msgstr "Pilih jaringan" msgstr "Pilih jaringan"
#: js/ui/status/network.js:855 #: js/ui/status/network.js:861
msgid "No Networks" msgid "No Networks"
msgstr "Tiada Jaringan" msgstr "Tiada Jaringan"
#: js/ui/status/network.js:876 js/ui/status/rfkill.js:104 #: js/ui/status/network.js:882 js/ui/status/rfkill.js:104
msgid "Use hardware switch to turn off" msgid "Use hardware switch to turn off"
msgstr "Pakai saklar perangkat keras untuk mematikan" msgstr "Pakai saklar perangkat keras untuk mematikan"
#: js/ui/status/network.js:1152 #: js/ui/status/network.js:1158
msgid "Select Network" msgid "Select Network"
msgstr "Pilih Jaringan" msgstr "Pilih Jaringan"
#: js/ui/status/network.js:1158 #: js/ui/status/network.js:1164
msgid "Wi-Fi Settings" msgid "Wi-Fi Settings"
msgstr "Pengaturan Wi-Fi" msgstr "Pengaturan Wi-Fi"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:1280 #: js/ui/status/network.js:1286
#, javascript-format #, javascript-format
msgid "%s Hotspot Active" msgid "%s Hotspot Active"
msgstr "%s Hotspot Aktif" msgstr "%s Hotspot Aktif"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:1295 #: js/ui/status/network.js:1301
#, javascript-format #, javascript-format
msgid "%s Not Connected" msgid "%s Not Connected"
msgstr "%s Tak Tersambung" msgstr "%s Tak Tersambung"
#: js/ui/status/network.js:1392 #: js/ui/status/network.js:1398
msgid "connecting…" msgid "connecting…"
msgstr "menyambung…" msgstr "menyambung…"
#. 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:1395 #: js/ui/status/network.js:1401
msgid "authentication required" msgid "authentication required"
msgstr "diperlukan otentikasi" msgstr "diperlukan autentikasi"
#: js/ui/status/network.js:1397 #: js/ui/status/network.js:1403
msgid "connection failed" msgid "connection failed"
msgstr "koneksi gagal" msgstr "koneksi gagal"
#: js/ui/status/network.js:1447 #: js/ui/status/network.js:1453
msgid "VPN Settings" msgid "VPN Settings"
msgstr "Pengaturan VPN" msgstr "Pengaturan VPN"
#: js/ui/status/network.js:1464 #: js/ui/status/network.js:1470
msgid "VPN" msgid "VPN"
msgstr "VPN" msgstr "VPN"
#: js/ui/status/network.js:1474 #: js/ui/status/network.js:1480
msgid "VPN Off" msgid "VPN Off"
msgstr "VPN Mati" msgstr "VPN Mati"
#: js/ui/status/network.js:1535 js/ui/status/rfkill.js:82 #: js/ui/status/network.js:1541 js/ui/status/rfkill.js:82
msgid "Network Settings" msgid "Network Settings"
msgstr "Pengaturan Jaringan" msgstr "Pengaturan Jaringan"
#: js/ui/status/network.js:1564 #: js/ui/status/network.js:1570
#, 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 Koneksi Kabel" msgstr[0] "%s Koneksi Kabel"
msgstr[1] "%s Koneksi Kabel" msgstr[1] "%s Koneksi Kabel"
#: js/ui/status/network.js:1568 #: js/ui/status/network.js:1574
#, 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 Koneksi Wi-Fi" msgstr[0] "%s Koneksi Wi-Fi"
msgstr[1] "%s Koneksi Wi-Fi" msgstr[1] "%s Koneksi Wi-Fi"
#: js/ui/status/network.js:1572 #: js/ui/status/network.js:1578
#, 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 Koneksi Modem" msgstr[0] "%s Koneksi Modem"
msgstr[1] "%s Koneksi Modem" msgstr[1] "%s Koneksi Modem"
#: js/ui/status/network.js:1705 #: js/ui/status/network.js:1711
msgid "Connection failed" msgid "Connection failed"
msgstr "Koneksi gagal" msgstr "Koneksi gagal"
#: js/ui/status/network.js:1706 #: js/ui/status/network.js:1712
msgid "Activation of network connection failed" msgid "Activation of network connection failed"
msgstr "Aktivasi koneksi jaringan gagal" msgstr "Aktivasi koneksi jaringan gagal"
@@ -2119,22 +2195,22 @@ msgstr "Cari"
msgid "“%s” is ready" msgid "“%s” is ready"
msgstr "'%s' siap" msgstr "'%s' siap"
#: js/ui/windowManager.js:53 #: js/ui/windowManager.js:54
msgid "Do you want to keep these display settings?" msgid "Do you want to keep these display settings?"
msgstr "Apakah Anda ingin mempertahankan pengaturan tampilan ini?" msgstr "Apakah Anda ingin mempertahankan pengaturan tampilan ini?"
#. Translators: this and the following message should be limited in lenght, #. Translators: this and the following message should be limited in length,
#. to avoid ellipsizing the labels. #. to avoid ellipsizing the labels.
#. #.
#: js/ui/windowManager.js:65 #: js/ui/windowManager.js:66
msgid "Revert Settings" msgid "Revert Settings"
msgstr "Balikkan Tatanan" msgstr "Balikkan Tatanan"
#: js/ui/windowManager.js:68 #: js/ui/windowManager.js:69
msgid "Keep Changes" msgid "Keep Changes"
msgstr "Simpan Perubahan" msgstr "Simpan Perubahan"
#: js/ui/windowManager.js:86 #: js/ui/windowManager.js:87
#, 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"
@@ -2143,7 +2219,7 @@ msgstr[1] "Perubahan tatanan akan dikembalikan dalam %d detik"
#. 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:678
#, javascript-format #, javascript-format
msgid "%d × %d" msgid "%d × %d"
msgstr "%d × %d" msgstr "%d × %d"
@@ -2242,11 +2318,11 @@ msgstr "Tak dikenal"
msgid "Failed to launch “%s”" msgid "Failed to launch “%s”"
msgstr "Gagal meluncurkan \"%s\"" msgstr "Gagal meluncurkan \"%s\""
#: src/shell-keyring-prompt.c:730 #: src/shell-keyring-prompt.c:731
msgid "Passwords do not match." msgid "Passwords do not match."
msgstr "Sandi tidak cocok." msgstr "Sandi tidak cocok."
#: src/shell-keyring-prompt.c:738 #: src/shell-keyring-prompt.c:739
msgid "Password cannot be blank" msgid "Password cannot be blank"
msgstr "Sandi tidak boleh kosong" msgstr "Sandi tidak boleh kosong"

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;
ECalClient *client; EClient *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_new (source, source_type, &error); client = e_cal_client_connect_sync (source, source_type, -1, NULL, &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 = client; /* takes ownership */ data->client = E_CAL_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),

View File

@@ -102,97 +102,120 @@ typedef struct
} CollectAppointmentsData; } CollectAppointmentsData;
static time_t static time_t
get_time_from_property (icalcomponent *ical, get_time_from_property (ICalComponent *icomp,
icalproperty_kind prop_kind, ICalPropertyKind prop_kind,
struct icaltimetype (* get_prop_func) (const icalproperty *prop), ICalTime * (* get_prop_func) (ICalProperty *prop),
icaltimezone *default_zone) ICalTimezone *default_zone)
{ {
icalproperty *prop; ICalProperty *prop;
struct icaltimetype ical_time; ICalTime *itt;
icalparameter *param; ICalParameter *param;
icaltimezone *timezone = NULL; ICalTimezone *timezone = NULL;
time_t retval;
prop = icalcomponent_get_first_property (ical, prop_kind); prop = i_cal_component_get_first_property (icomp, prop_kind);
if (!prop) if (!prop)
return 0; return 0;
ical_time = get_prop_func (prop); itt = get_prop_func (prop);
param = icalproperty_get_first_parameter (prop, ICAL_TZID_PARAMETER); param = i_cal_property_get_first_parameter (prop, I_CAL_TZID_PARAMETER);
if (param) if (param)
timezone = icaltimezone_get_builtin_timezone_from_tzid (icalparameter_get_tzid (param)); timezone = i_cal_timezone_get_builtin_timezone_from_tzid (i_cal_parameter_get_tzid (param));
else if (icaltime_is_utc (ical_time)) else if (i_cal_time_is_utc (itt))
timezone = icaltimezone_get_utc_timezone (); timezone = i_cal_timezone_get_utc_timezone ();
else else
timezone = default_zone; timezone = default_zone;
return icaltime_as_timet_with_zone (ical_time, timezone); retval = i_cal_time_as_timet_with_zone (itt, timezone);
g_clear_object (&param);
g_clear_object (&prop);
g_clear_object (&itt);
return retval;
} }
static char * static char *
get_ical_uid (icalcomponent *ical) get_ical_uid (ICalComponent *icomp)
{ {
return g_strdup (icalcomponent_get_uid (ical)); return g_strdup (i_cal_component_get_uid (icomp));
} }
static char * static char *
get_ical_summary (icalcomponent *ical) get_ical_summary (ICalComponent *icomp)
{ {
icalproperty *prop; ICalProperty *prop;
char *retval;
prop = icalcomponent_get_first_property (ical, ICAL_SUMMARY_PROPERTY); prop = i_cal_component_get_first_property (icomp, I_CAL_SUMMARY_PROPERTY);
if (!prop) if (!prop)
return NULL; return NULL;
return g_strdup (icalproperty_get_summary (prop)); retval = g_strdup (i_cal_property_get_summary (prop));
g_object_unref (prop);
return retval;
} }
static char * static char *
get_ical_description (icalcomponent *ical) get_ical_description (ICalComponent *icomp)
{ {
icalproperty *prop; ICalProperty *prop;
char *retval;
prop = icalcomponent_get_first_property (ical, ICAL_DESCRIPTION_PROPERTY); prop = i_cal_component_get_first_property (icomp, I_CAL_DESCRIPTION_PROPERTY);
if (!prop) if (!prop)
return NULL; return NULL;
return g_strdup (icalproperty_get_description (prop)); retval = g_strdup (i_cal_property_get_description (prop));
g_object_unref (prop);
return retval;
} }
static inline time_t static inline time_t
get_ical_start_time (icalcomponent *ical, get_ical_start_time (ICalComponent *icomp,
icaltimezone *default_zone) ICalTimezone *default_zone)
{ {
return get_time_from_property (ical, return get_time_from_property (icomp,
ICAL_DTSTART_PROPERTY, I_CAL_DTSTART_PROPERTY,
icalproperty_get_dtstart, i_cal_property_get_dtstart,
default_zone); default_zone);
} }
static inline time_t static inline time_t
get_ical_end_time (icalcomponent *ical, get_ical_end_time (ICalComponent *icomp,
icaltimezone *default_zone) ICalTimezone *default_zone)
{ {
return get_time_from_property (ical, return get_time_from_property (icomp,
ICAL_DTEND_PROPERTY, I_CAL_DTEND_PROPERTY,
icalproperty_get_dtend, i_cal_property_get_dtend,
default_zone); default_zone);
} }
static gboolean static gboolean
get_ical_is_all_day (icalcomponent *ical, get_ical_is_all_day (ICalComponent *icomp,
time_t start_time, time_t start_time,
icaltimezone *default_zone) ICalTimezone *default_zone)
{ {
icalproperty *prop; ICalProperty *prop;
struct tm *start_tm; ICalDuration *duration;
time_t end_time; ICalTime *dtstart;
struct icaldurationtype duration; struct tm *start_tm;
struct icaltimetype start_icaltime; time_t end_time;
gboolean retval;
start_icaltime = icalcomponent_get_dtstart (ical); dtstart = i_cal_component_get_dtstart (icomp);
if (start_icaltime.is_date) if (dtstart && i_cal_time_is_date (dtstart))
return TRUE; {
g_clear_object (&dtstart);
return TRUE;
}
g_clear_object (&dtstart);
start_tm = gmtime (&start_time); start_tm = gmtime (&start_time);
if (start_tm->tm_sec != 0 || if (start_tm->tm_sec != 0 ||
@@ -200,35 +223,40 @@ get_ical_is_all_day (icalcomponent *ical,
start_tm->tm_hour != 0) start_tm->tm_hour != 0)
return FALSE; return FALSE;
if ((end_time = get_ical_end_time (ical, default_zone))) if ((end_time = get_ical_end_time (icomp, default_zone)))
return (end_time - start_time) % 86400 == 0; return (end_time - start_time) % 86400 == 0;
prop = icalcomponent_get_first_property (ical, ICAL_DURATION_PROPERTY); prop = i_cal_component_get_first_property (icomp, I_CAL_DURATION_PROPERTY);
if (!prop) if (!prop)
return FALSE; return FALSE;
duration = icalproperty_get_duration (prop); duration = i_cal_property_get_duration (prop);
return icaldurationtype_as_int (duration) % 86400 == 0; retval = duration && (i_cal_duration_as_int (duration) % 86400) == 0;
g_clear_object (&duration);
g_clear_object (&prop);
return retval;
} }
static inline time_t static inline time_t
get_ical_due_time (icalcomponent *ical, get_ical_due_time (ICalComponent *icomp,
icaltimezone *default_zone) ICalTimezone *default_zone)
{ {
return get_time_from_property (ical, return get_time_from_property (icomp,
ICAL_DUE_PROPERTY, I_CAL_DUE_PROPERTY,
icalproperty_get_due, i_cal_property_get_due,
default_zone); default_zone);
} }
static inline time_t static inline time_t
get_ical_completed_time (icalcomponent *ical, get_ical_completed_time (ICalComponent *icomp,
icaltimezone *default_zone) ICalTimezone *default_zone)
{ {
return get_time_from_property (ical, return get_time_from_property (icomp,
ICAL_COMPLETED_PROPERTY, I_CAL_COMPLETED_PROPERTY,
icalproperty_get_completed, i_cal_property_get_completed,
default_zone); default_zone);
} }
@@ -365,67 +393,69 @@ calendar_appointment_free (CalendarAppointment *appointment)
static void static void
calendar_appointment_init (CalendarAppointment *appointment, calendar_appointment_init (CalendarAppointment *appointment,
icalcomponent *ical, ICalComponent *icomp,
ECalClient *cal) ECalClient *cal)
{ {
icaltimezone *default_zone; ICalTimezone *default_zone;
const char *source_id; const char *source_id;
source_id = e_source_get_uid (e_client_get_source (E_CLIENT (cal))); source_id = e_source_get_uid (e_client_get_source (E_CLIENT (cal)));
default_zone = e_cal_client_get_default_timezone (cal); default_zone = e_cal_client_get_default_timezone (cal);
appointment->uid = get_ical_uid (ical); appointment->uid = get_ical_uid (icomp);
appointment->source_id = g_strdup (source_id); appointment->source_id = g_strdup (source_id);
appointment->backend_name = get_source_backend_name (cal); appointment->backend_name = get_source_backend_name (cal);
appointment->summary = get_ical_summary (ical); appointment->summary = get_ical_summary (icomp);
appointment->description = get_ical_description (ical); appointment->description = get_ical_description (icomp);
appointment->color_string = get_source_color (cal); appointment->color_string = get_source_color (cal);
appointment->start_time = get_ical_start_time (ical, default_zone); appointment->start_time = get_ical_start_time (icomp, default_zone);
appointment->end_time = get_ical_end_time (ical, default_zone); appointment->end_time = get_ical_end_time (icomp, default_zone);
appointment->is_all_day = get_ical_is_all_day (ical, appointment->is_all_day = get_ical_is_all_day (icomp,
appointment->start_time, appointment->start_time,
default_zone); default_zone);
} }
static CalendarAppointment * static CalendarAppointment *
calendar_appointment_new (icalcomponent *ical, calendar_appointment_new (ICalComponent *icomp,
ECalClient *cal) ECalClient *cal)
{ {
CalendarAppointment *appointment; CalendarAppointment *appointment;
appointment = g_new0 (CalendarAppointment, 1); appointment = g_new0 (CalendarAppointment, 1);
calendar_appointment_init (appointment, ical, cal); calendar_appointment_init (appointment, icomp, cal);
return appointment; return appointment;
} }
static gboolean static gboolean
generate_instances_cb (ECalComponent *comp, generate_instances_cb (ICalComponent *icomp,
time_t start, ICalTime *instance_start,
time_t end, ICalTime *instance_end,
gpointer data) gpointer user_data,
GCancellable *cancellable,
GError **error)
{ {
ECalClient *cal = ((CollectAppointmentsData *)data)->client; ECalClient *cal = ((CollectAppointmentsData *)user_data)->client;
GHashTable *appointments = ((CollectAppointmentsData *)data)->appointments; GHashTable *appointments = ((CollectAppointmentsData *)user_data)->appointments;
CalendarAppointment *appointment; CalendarAppointment *appointment;
CalendarOccurrence *occurrence; CalendarOccurrence *occurrence;
const char *uid; ICalTimezone *default_zone;
const gchar *uid;
e_cal_component_get_uid (comp, &uid); default_zone = e_cal_client_get_default_timezone (cal);
uid = i_cal_component_get_uid (icomp);
appointment = g_hash_table_lookup (appointments, uid); appointment = g_hash_table_lookup (appointments, uid);
if (appointment == NULL) if (appointment == NULL)
{ {
icalcomponent *ical = e_cal_component_get_icalcomponent (comp); appointment = calendar_appointment_new (icomp, cal);
appointment = calendar_appointment_new (ical, cal);
g_hash_table_insert (appointments, g_strdup (uid), appointment); g_hash_table_insert (appointments, g_strdup (uid), appointment);
} }
occurrence = g_new0 (CalendarOccurrence, 1); occurrence = g_new0 (CalendarOccurrence, 1);
occurrence->start_time = start; occurrence->start_time = i_cal_time_as_timet_with_zone (instance_start, default_zone);
occurrence->end_time = end; occurrence->end_time = i_cal_time_as_timet_with_zone (instance_end, default_zone);
occurrence->rid = e_cal_component_get_recurid_as_string (comp); occurrence->rid = e_cal_util_component_get_recurid_as_string (icomp);
appointment->occurrences = g_slist_append (appointment->occurrences, occurrence); appointment->occurrences = g_slist_append (appointment->occurrences, occurrence);
@@ -442,7 +472,7 @@ struct _App
time_t since; time_t since;
time_t until; time_t until;
icaltimezone *zone; ICalTimezone *zone;
CalendarSources *sources; CalendarSources *sources;
gulong sources_signal_id; gulong sources_signal_id;
@@ -468,9 +498,9 @@ app_update_timezone (App *app)
if (g_strcmp0 (location, app->timezone_location) != 0) if (g_strcmp0 (location, app->timezone_location) != 0)
{ {
if (location == NULL) if (location == NULL)
app->zone = icaltimezone_get_utc_timezone (); app->zone = i_cal_timezone_get_utc_timezone ();
else else
app->zone = icaltimezone_get_builtin_timezone (location); app->zone = i_cal_timezone_get_builtin_timezone (location);
g_free (app->timezone_location); g_free (app->timezone_location);
app->timezone_location = location; app->timezone_location = location;
print_debug ("Using timezone %s", app->timezone_location); print_debug ("Using timezone %s", app->timezone_location);
@@ -528,10 +558,10 @@ on_objects_added (ECalClientView *view,
for (l = objects; l != NULL; l = l->next) for (l = objects; l != NULL; l = l->next)
{ {
icalcomponent *ical = l->data; ICalComponent *icomp = l->data;
const char *uid; const char *uid;
uid = icalcomponent_get_uid (ical); uid = i_cal_component_get_uid (icomp);
if (g_hash_table_lookup (app->appointments, uid) == NULL) if (g_hash_table_lookup (app->appointments, uid) == NULL)
{ {
@@ -600,7 +630,7 @@ app_load_events (App *app)
since_iso8601 = isodate_from_time_t (app->since); since_iso8601 = isodate_from_time_t (app->since);
until_iso8601 = isodate_from_time_t (app->until); until_iso8601 = isodate_from_time_t (app->until);
tz_location = icaltimezone_get_location (app->zone); tz_location = i_cal_timezone_get_location (app->zone);
print_debug ("Loading events since %s until %s", print_debug ("Loading events since %s until %s",
since_iso8601, since_iso8601,
@@ -622,21 +652,12 @@ app_load_events (App *app)
e_cal_client_set_default_timezone (cal, app->zone); e_cal_client_set_default_timezone (cal, app->zone);
error = NULL;
if (!e_client_open_sync (E_CLIENT (cal), TRUE, NULL, &error))
{
ESource *source = e_client_get_source (E_CLIENT (cal));
g_warning ("Error opening calendar %s: %s\n",
e_source_get_uid (source), error->message);
g_error_free (error);
continue;
}
data.client = cal; data.client = cal;
data.appointments = app->appointments; data.appointments = app->appointments;
e_cal_client_generate_instances_sync (cal, e_cal_client_generate_instances_sync (cal,
app->since, app->since,
app->until, app->until,
NULL,
generate_instances_cb, generate_instances_cb,
&data); &data);

View File

@@ -346,6 +346,13 @@ gnome_shell_plugin_create_inhibit_shortcuts_dialog (MetaPlugin *plugin,
return _shell_wm_create_inhibit_shortcuts_dialog (get_shell_wm (), window); return _shell_wm_create_inhibit_shortcuts_dialog (get_shell_wm (), window);
} }
static void
gnome_shell_plugin_locate_pointer (MetaPlugin *plugin)
{
GnomeShellPlugin *shell_plugin = GNOME_SHELL_PLUGIN (plugin);
_shell_global_locate_pointer (shell_plugin->global);
}
static void static void
gnome_shell_plugin_class_init (GnomeShellPluginClass *klass) gnome_shell_plugin_class_init (GnomeShellPluginClass *klass)
{ {
@@ -378,6 +385,8 @@ gnome_shell_plugin_class_init (GnomeShellPluginClass *klass)
plugin_class->create_close_dialog = gnome_shell_plugin_create_close_dialog; plugin_class->create_close_dialog = gnome_shell_plugin_create_close_dialog;
plugin_class->create_inhibit_shortcuts_dialog = gnome_shell_plugin_create_inhibit_shortcuts_dialog; plugin_class->create_inhibit_shortcuts_dialog = gnome_shell_plugin_create_inhibit_shortcuts_dialog;
plugin_class->locate_pointer = gnome_shell_plugin_locate_pointer;
} }
static void static void

View File

@@ -198,6 +198,62 @@ shell_fonts_init (void)
cogl_pango_font_map_set_use_mipmapping (fontmap, FALSE); cogl_pango_font_map_set_use_mipmapping (fontmap, FALSE);
} }
static void
shell_profiler_init (void)
{
ShellGlobal *global;
GjsProfiler *profiler;
GjsContext *context;
const char *enabled;
const char *fd_str;
int fd = -1;
/* Sysprof uses the "GJS_TRACE_FD=N" environment variable to connect GJS
* profiler data to the combined Sysprof capture. Since we are in control of
* the GjsContext, we need to proxy this FD across to the GJS profiler.
*/
fd_str = g_getenv ("GJS_TRACE_FD");
enabled = g_getenv ("GJS_ENABLE_PROFILER");
if (fd_str == NULL || enabled == NULL)
return;
global = shell_global_get ();
g_return_if_fail (global);
context = _shell_global_get_gjs_context (global);
g_return_if_fail (context);
profiler = gjs_context_get_profiler (context);
g_return_if_fail (profiler);
if (fd_str)
{
fd = atoi (fd_str);
if (fd > 2)
{
gjs_profiler_set_fd (profiler, fd);
gjs_profiler_start (profiler);
}
}
}
static void
shell_profiler_shutdown (void)
{
ShellGlobal *global;
GjsProfiler *profiler;
GjsContext *context;
global = shell_global_get ();
context = _shell_global_get_gjs_context (global);
profiler = gjs_context_get_profiler (context);
if (profiler)
gjs_profiler_stop (profiler);
}
static void static void
malloc_statistics_callback (ShellPerfLog *perf_log, malloc_statistics_callback (ShellPerfLog *perf_log,
gpointer data) gpointer data)
@@ -496,7 +552,9 @@ main (int argc, char **argv)
dump_gjs_stack_on_signal (SIGSEGV); dump_gjs_stack_on_signal (SIGSEGV);
} }
shell_profiler_init ();
ecode = meta_run (); ecode = meta_run ();
shell_profiler_shutdown ();
g_debug ("Doing final cleanup"); g_debug ("Doing final cleanup");
_shell_global_destroy_gjs_context (shell_global_get ()); _shell_global_destroy_gjs_context (shell_global_get ());

View File

@@ -1114,7 +1114,7 @@ _shell_app_remove_window (ShellApp *app,
* shell_app_get_pids: * shell_app_get_pids:
* @app: a #ShellApp * @app: a #ShellApp
* *
* Returns: (transfer container) (element-type int): An unordered list of process identifers associated with this application. * Returns: (transfer container) (element-type int): An unordered list of process identifiers associated with this application.
*/ */
GSList * GSList *
shell_app_get_pids (ShellApp *app) shell_app_get_pids (ShellApp *app)
@@ -1151,11 +1151,10 @@ _shell_app_handle_startup_sequence (ShellApp *app,
if (starting && shell_app_get_state (app) == SHELL_APP_STATE_STOPPED) if (starting && shell_app_get_state (app) == SHELL_APP_STATE_STOPPED)
{ {
MetaDisplay *display = shell_global_get_display (shell_global_get ()); MetaDisplay *display = shell_global_get_display (shell_global_get ());
MetaX11Display *x11_display = meta_display_get_x11_display (display);
shell_app_state_transition (app, SHELL_APP_STATE_STARTING); shell_app_state_transition (app, SHELL_APP_STATE_STARTING);
meta_x11_display_focus_the_no_focus_window (x11_display, meta_display_unset_input_focus (display,
meta_startup_sequence_get_timestamp (sequence)); meta_startup_sequence_get_timestamp (sequence));
app->started_on_workspace = meta_startup_sequence_get_workspace (sequence); app->started_on_workspace = meta_startup_sequence_get_workspace (sequence);
} }

View File

@@ -18,4 +18,6 @@ GjsContext *_shell_global_get_gjs_context (ShellGlobal *global);
gboolean _shell_global_check_xdnd_event (ShellGlobal *global, gboolean _shell_global_check_xdnd_event (ShellGlobal *global,
XEvent *xev); XEvent *xev);
void _shell_global_locate_pointer (ShellGlobal *global);
#endif /* __SHELL_GLOBAL_PRIVATE_H__ */ #endif /* __SHELL_GLOBAL_PRIVATE_H__ */

View File

@@ -29,12 +29,6 @@
#include <meta/meta-workspace-manager.h> #include <meta/meta-workspace-manager.h>
#include <meta/meta-x11-display.h> #include <meta/meta-x11-display.h>
#ifdef HAVE_SYSTEMD
#include <systemd/sd-journal.h>
#include <errno.h>
#include <unistd.h>
#endif
/* Memory report bits */ /* Memory report bits */
#ifdef HAVE_MALLINFO #ifdef HAVE_MALLINFO
#include <malloc.h> #include <malloc.h>
@@ -61,8 +55,6 @@ struct _ShellGlobal {
MetaDisplay *meta_display; MetaDisplay *meta_display;
MetaWorkspaceManager *workspace_manager; MetaWorkspaceManager *workspace_manager;
GdkDisplay *gdk_display;
MetaX11Display *x11_display;
Display *xdisplay; Display *xdisplay;
char *session_mode; char *session_mode;
@@ -117,6 +109,7 @@ enum {
enum enum
{ {
NOTIFY_ERROR, NOTIFY_ERROR,
LOCATE_POINTER,
LAST_SIGNAL LAST_SIGNAL
}; };
@@ -359,6 +352,13 @@ shell_global_class_init (ShellGlobalClass *klass)
G_TYPE_NONE, 2, G_TYPE_NONE, 2,
G_TYPE_STRING, G_TYPE_STRING,
G_TYPE_STRING); G_TYPE_STRING);
shell_global_signals[LOCATE_POINTER] =
g_signal_new ("locate-pointer",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
0,
NULL, NULL, NULL,
G_TYPE_NONE, 0);
g_object_class_install_property (gobject_class, g_object_class_install_property (gobject_class,
PROP_SESSION_MODE, PROP_SESSION_MODE,
@@ -642,6 +642,9 @@ shell_global_set_stage_input_region (ShellGlobal *global,
g_return_if_fail (SHELL_IS_GLOBAL (global)); g_return_if_fail (SHELL_IS_GLOBAL (global));
if (meta_is_wayland_compositor ())
return;
nrects = g_slist_length (rectangles); nrects = g_slist_length (rectangles);
rects = g_new (XRectangle, nrects); rects = g_new (XRectangle, nrects);
for (r = rectangles, i = 0; r; r = r->next, i++) for (r = rectangles, i = 0; r; r = r->next, i++)
@@ -846,10 +849,6 @@ _shell_global_set_plugin (ShellGlobal *global,
display = meta_plugin_get_display (plugin); display = meta_plugin_get_display (plugin);
global->meta_display = display; global->meta_display = display;
global->workspace_manager = meta_display_get_workspace_manager (display); global->workspace_manager = meta_display_get_workspace_manager (display);
global->x11_display = meta_display_get_x11_display (display);
global->xdisplay = meta_x11_display_get_xdisplay (global->x11_display);
global->gdk_display = gdk_x11_lookup_xdisplay (global->xdisplay);
global->stage = CLUTTER_STAGE (meta_get_stage_for_display (display)); global->stage = CLUTTER_STAGE (meta_get_stage_for_display (display));
@@ -859,6 +858,8 @@ _shell_global_set_plugin (ShellGlobal *global,
} }
else else
{ {
MetaX11Display *x11_display = meta_display_get_x11_display (display);
global->xdisplay = meta_x11_display_get_xdisplay (x11_display);
global->stage_xwindow = clutter_x11_get_stage_window (global->stage); global->stage_xwindow = clutter_x11_get_stage_window (global->stage);
} }
@@ -1164,52 +1165,6 @@ shell_global_reexec_self (ShellGlobal *global)
#endif #endif
} }
/**
* shell_global_log_structured:
* @message: A message to print
* @keys: (allow-none) (array zero-terminated=1) (element-type utf8): Optional structured data
*
* Log structured data in an operating-system specific fashion. The
* parameter @opts should be an array of UTF-8 KEY=VALUE strings.
* This function does not support binary data. See
* http://www.freedesktop.org/software/systemd/man/systemd.journal-fields.html
* or more information about fields that can be used on a systemd
* system.
*
*/
void
shell_global_log_structured (const char *message,
const char *const *keys)
{
#ifdef HAVE_SYSTEMD
const char *const*iter;
char *msgkey;
guint i, n_opts;
struct iovec *iovs;
for (n_opts = 0, iter = keys; *iter; iter++, n_opts++)
;
n_opts++; /* Add one for MESSAGE= */
iovs = g_alloca (sizeof (struct iovec) * n_opts);
for (i = 0, iter = keys; *iter; iter++, i++) {
iovs[i].iov_base = (char*)keys[i];
iovs[i].iov_len = strlen (keys[i]);
}
g_assert(i == n_opts-1);
msgkey = g_strconcat ("MESSAGE=", message, NULL);
iovs[i].iov_base = msgkey;
iovs[i].iov_len = strlen (msgkey);
// The code location isn't useful since we're wrapping
sd_journal_sendv (iovs, n_opts);
g_free (msgkey);
#else
g_print ("%s\n", message);
#endif
}
/** /**
* shell_global_notify_error: * shell_global_notify_error:
* @global: a #ShellGlobal * @global: a #ShellGlobal
@@ -1561,7 +1516,8 @@ delete_variant_cb (GObject *object,
if (!g_file_delete_finish (G_FILE (object), result, &error)) if (!g_file_delete_finish (G_FILE (object), result, &error))
{ {
if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED) &&
!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND))
{ {
g_warning ("Could not delete runtime/persistent state file: %s\n", g_warning ("Could not delete runtime/persistent state file: %s\n",
error->message); error->message);
@@ -1732,3 +1688,9 @@ shell_global_get_persistent_state (ShellGlobal *global,
{ {
return load_variant (global->userdatadir_path, property_type, property_name); return load_variant (global->userdatadir_path, property_type, property_name);
} }
void
_shell_global_locate_pointer (ShellGlobal *global)
{
g_signal_emit (global, shell_global_signals[LOCATE_POINTER], 0);
}

View File

@@ -79,9 +79,6 @@ void shell_global_init_xdnd (ShellGlobal *global);
void shell_global_reexec_self (ShellGlobal *global); void shell_global_reexec_self (ShellGlobal *global);
void shell_global_log_structured (const char *message,
const char *const *keys);
const char * shell_global_get_session_mode (ShellGlobal *global); const char * shell_global_get_session_mode (ShellGlobal *global);
void shell_global_set_runtime_state (ShellGlobal *global, void shell_global_set_runtime_state (ShellGlobal *global,

View File

@@ -280,7 +280,7 @@ shell_gtk_embed_allocate (ClutterActor *actor,
{ {
ShellGtkEmbed *embed = SHELL_GTK_EMBED (actor); ShellGtkEmbed *embed = SHELL_GTK_EMBED (actor);
ShellGtkEmbedPrivate *priv = shell_gtk_embed_get_instance_private (embed); ShellGtkEmbedPrivate *priv = shell_gtk_embed_get_instance_private (embed);
float wx = 0.0, wy = 0.0, x, y, ax, ay; float wx, wy;
CLUTTER_ACTOR_CLASS (shell_gtk_embed_parent_class)-> CLUTTER_ACTOR_CLASS (shell_gtk_embed_parent_class)->
allocate (actor, box, flags); allocate (actor, box, flags);
@@ -288,16 +288,7 @@ shell_gtk_embed_allocate (ClutterActor *actor,
/* Find the actor's new coordinates in terms of the stage (which is /* Find the actor's new coordinates in terms of the stage (which is
* priv->window's parent window. * priv->window's parent window.
*/ */
while (actor) clutter_actor_get_transformed_position (actor, &wx, &wy);
{
clutter_actor_get_position (actor, &x, &y);
clutter_actor_get_anchor_point (actor, &ax, &ay);
wx += x - ax;
wy += y - ay;
actor = clutter_actor_get_parent (actor);
}
_shell_embedded_window_allocate (priv->window, _shell_embedded_window_allocate (priv->window,
(int)(0.5 + wx), (int)(0.5 + wy), (int)(0.5 + wx), (int)(0.5 + wy),

View File

@@ -115,9 +115,10 @@ remove_mnemonics (const GValue *value)
g_return_val_if_fail (G_VALUE_HOLDS_STRING (value), NULL); g_return_val_if_fail (G_VALUE_HOLDS_STRING (value), NULL);
label = g_value_get_string (value); label = g_value_get_string (value);
g_return_val_if_fail (label != NULL, NULL); if (!label)
return NULL;
/* Stripped label will have the original label lenght at most */ /* Stripped label will have the original label length at most */
stripped_label = temp = g_new (gchar, strlen(label) + 1); stripped_label = temp = g_new (gchar, strlen(label) + 1);
g_assert (stripped_label != NULL); g_assert (stripped_label != NULL);

View File

@@ -18,6 +18,7 @@ st_headers = [
'st-scrollable.h', 'st-scrollable.h',
'st-scroll-bar.h', 'st-scroll-bar.h',
'st-scroll-view.h', 'st-scroll-view.h',
'st-scroll-view-fade.h',
'st-settings.h', 'st-settings.h',
'st-shadow.h', 'st-shadow.h',
'st-texture-cache.h', 'st-texture-cache.h',
@@ -73,6 +74,7 @@ st_sources = [
'st-scrollable.c', 'st-scrollable.c',
'st-scroll-bar.c', 'st-scroll-bar.c',
'st-scroll-view.c', 'st-scroll-view.c',
'st-scroll-view-fade.c',
'st-settings.c', 'st-settings.c',
'st-shadow.c', 'st-shadow.c',
'st-texture-cache.c', 'st-texture-cache.c',
@@ -94,11 +96,6 @@ st_enums = gnome.mkenums_simple('st-enum-types',
st_gir_sources = st_sources + st_private_headers + st_headers + st_enums st_gir_sources = st_sources + st_private_headers + st_headers + st_enums
st_non_gir_sources = [
'st-scroll-view-fade.c',
'st-scroll-view-fade.h'
]
data_to_c = find_program(meson.source_root() + '/src/data-to-c.pl') data_to_c = find_program(meson.source_root() + '/src/data-to-c.pl')
custom_target('scroll-view-fade-glsl', custom_target('scroll-view-fade-glsl',
@@ -123,7 +120,7 @@ st_cflags = [
# Currently meson requires a shared library for building girs # Currently meson requires a shared library for building girs
libst = shared_library('st-1.0', libst = shared_library('st-1.0',
sources: st_gir_sources + st_non_gir_sources, sources: st_gir_sources,
c_args: st_cflags, c_args: st_cflags,
dependencies: [clutter_dep, gtk_dep, croco_dep, mutter_dep, m_dep], dependencies: [clutter_dep, gtk_dep, croco_dep, mutter_dep, m_dep],
build_rpath: mutter_typelibdir, build_rpath: mutter_typelibdir,

View File

@@ -53,7 +53,12 @@ struct _StAdjustmentPrivate
gdouble page_size; gdouble page_size;
}; };
G_DEFINE_TYPE_WITH_PRIVATE (StAdjustment, st_adjustment, G_TYPE_OBJECT) static void animatable_iface_init (ClutterAnimatableInterface *iface);
G_DEFINE_TYPE_WITH_CODE (StAdjustment, st_adjustment, G_TYPE_OBJECT,
G_ADD_PRIVATE (StAdjustment)
G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_ANIMATABLE,
animatable_iface_init));
enum enum
{ {
@@ -87,6 +92,11 @@ static gboolean st_adjustment_set_page_increment (StAdjustment *adjustment,
static gboolean st_adjustment_set_page_size (StAdjustment *adjustment, static gboolean st_adjustment_set_page_size (StAdjustment *adjustment,
gdouble size); gdouble size);
static void
animatable_iface_init (ClutterAnimatableInterface *iface)
{
}
static void static void
st_adjustment_constructed (GObject *object) st_adjustment_constructed (GObject *object)
{ {

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