Compare commits

...

138 Commits

Author SHA1 Message Date
08a159d0d8 Bump version to 3.23.2
Update NEWS.
2016-11-23 22:23:26 +01:00
26aa32c6cc build: Fix file reference 2016-11-23 22:23:26 +01:00
09e6bb5d56 appDisplay: Fix completion handler for empty animations
If an onComplete handler is passed to animate(), it is set to run at
the end of the animation via the icon grid's ::animation-done signal.
Currently the signal is connected after starting the animation, with
the result that the handler doesn't run when the animation completes
immediately (because there are no icons to animate). Fix this by only
starting the animation after connecting the signal.

https://bugzilla.gnome.org/show_bug.cgi?id=774381
2016-11-23 22:11:00 +01:00
e661d904de appDisplay: Use correct view for animation
We currently assume that the current view matches the 'app-picker-view'
setting. While that is usually the case, there is one notable exception:
While there isn't sufficient usage data (yet), we show all applications
instead of an empty frequent view regardless of the setting. We should
animate the actually visible icons in that case, not the (non-existent)
ones from the hidden frequent view.

https://bugzilla.gnome.org/show_bug.cgi?id=774381
2016-11-23 22:11:00 +01:00
407d51e871 Update Russian translation
(cherry picked from commit f395d3892c)
2016-11-23 21:08:42 +00:00
c4a07fad83 portalHelper: Use a constant for the host name and URI
https://bugzilla.gnome.org/show_bug.cgi?id=769940
2016-11-23 21:38:24 +01:00
9ea8fdc1d1 portalHelper: Address intermittent TLS failures
Users are currently experiencing intermittent (and hard to debug) TLS
errors when loading the portal authentication page. This could be
caused by using http://www.gnome.org/ for our connectivity checks
because it redirects to HTTPS.

We can completely remove TLS from the equation by not using HTTPS.
http://nmcheck.gnome.org/ is a good choice because it doesn't redirect
to HTTPS and was created for NetworkManager's connectivity check.

https://bugzilla.gnome.org/show_bug.cgi?id=769940
2016-11-23 21:38:24 +01:00
3d6bf43649 windowManager: Handle fullscreening from zero sized windows
Wayland clients can request their surfaces to be fullscreened before
commiting a buffer which means that we need to handle fullscreen
requests for which the old size is 0x0, preferably without warnings.

Since the mapping animation also runs for these windows, we can simply
bail out and ignore the fullscreen size change.

https://bugzilla.gnome.org/show_bug.cgi?id=770345
2016-11-23 18:43:11 +01:00
7bc1d57ad7 windowManager: Fix fullscreen animations of wayland clients
Wayland clients are in control of their window size so the existing
mutter plugin API, which assumes size changes are synchronous, doesn't
work for them since when our size-change handler runs the MetaWindow's
size isn't final yet.

To fix this, the mutter plugin API was extended with a size-changed
vfunc that lets us know when the MetaWindow size has actually
changed. This way we can make the window snapshot and get the old
window size on the existing size-change handler and later, on the new
size-changed handler, get the new size and start the animation.

https://bugzilla.gnome.org/show_bug.cgi?id=770345
2016-11-23 18:43:07 +01:00
68b671a4f4 shell-wm: Add a size-changed signal to handle the new plugin vfunc
https://bugzilla.gnome.org/show_bug.cgi?id=770345
2016-11-23 18:42:59 +01:00
1de1fd44c5 texture-cache: Warn when loading sliced image fails
Sliced images are loaded into a group actor with one child actor
per slice. In case loading the image fails, we currently quietly
return the empty group actor, which makes diagnosing problems
unnecessarily hard - just be a bit more verbose on failure.

https://bugzilla.gnome.org/show_bug.cgi?id=774805
2016-11-22 18:38:10 +01:00
e5101eb407 animations: Guard against empty animations
Our animation code not only relies on the animation being loaded
(which we handle), but also on having at least one frame - otherwise
the computation of the next frame index will turn up NaN through
division by zero. Guard against this case by treating empty animations
as not loaded.

https://bugzilla.gnome.org/show_bug.cgi?id=774805
2016-11-22 18:38:10 +01:00
48e0d86340 Updated Norwegian bokmål translation. 2016-11-21 08:32:50 +01:00
c64cf30160 Update Friulian translation 2016-11-20 04:05:59 +00:00
ff9d777c01 Update Finnish translation
(cherry picked from commit d0e811214b)
2016-11-19 17:11:46 +00:00
d8c33deb33 Update Kazakh translation
(cherry picked from commit 52bbee80a0)
2016-11-19 12:05:43 +00:00
c03ff0bd4f Update Brazilian Portuguese translation
(cherry picked from commit 7098d6930f)
2016-11-18 23:41:47 +00:00
d597633d8f Updated Czech translation 2016-11-18 00:44:06 +01:00
4f6eb49be3 Update Polish translation 2016-11-18 00:05:56 +01:00
d23bd4c4a6 runDialog: Mark error message as translatable
https://bugzilla.gnome.org/show_bug.cgi?id=774643
2016-11-17 22:14:30 +01:00
7f12265685 Updated Czech translation 2016-11-12 12:13:02 +01:00
250023b823 Update Friulian translation 2016-11-10 20:34:06 +00:00
3b52691ab4 Update Spanish translation 2016-11-10 15:39:40 +00:00
b6cd548186 network: Always show primary icon when connected
The top bar's network menu only supports a subset of device types
supported by NetworkManager. While not having lesser used options
in the menu itself is perfectly reasonable, not showing any network
icon at all in the top bar when the system is fully connected is
weird.

https://bugzilla.gnome.org/show_bug.cgi?id=773890
2016-11-10 14:32:07 +01:00
b3fabf11b1 network: Summarize sections with too many devices
Any network devices appear as top level items in the system status
menu, so on system with an unusually high number of devices, the
menu can end up exceeding the available screen height. While this
is a corner case, leaving important system actions unreachable is
bad. The system menu does not lend itself to scrolling, so handle
this case instead by summarizing sections ("n connections") where
the number of devices exceeds a threshold.

https://bugzilla.gnome.org/show_bug.cgi?id=773892
2016-11-10 14:32:07 +01:00
15be562fdf networkAgent: Invalidate VPN plugin cache on changes
Currently the cache is built once when the first VPN request is
handled, so plugins that are installed or uninstalled after that
aren't picked up. Fix this by invalidating the cache on changes
to the plugin directory.

https://bugzilla.gnome.org/show_bug.cgi?id=773893
2016-11-10 14:32:07 +01:00
599fa0b76c Update Russian translation
(cherry picked from commit 5858b2266a)
2016-11-08 18:24:56 +00:00
c520eb4de0 Updated Czech translation 2016-11-08 13:05:31 +01:00
e33c68a415 popupMenu: don't handle key presses directly if there are modifiers
commit 1d58ea25ab changed the
popupMenu code to handle key presses on source actors directly.

This fixed keynav into the session gear menu at the login screen.

Unfortunately, it also causes spurious pop ups if a modifier happens
to be held down.

This commit checks for modifiers and short circuits the up front
key handling if any are found.

https://bugzilla.gnome.org/show_bug.cgi?id=740043
2016-11-07 14:01:23 -05:00
97bd224261 Update Hungarian translation 2016-11-05 20:20:39 +00:00
503e086c56 Update Friulian translation 2016-11-04 20:03:16 +00:00
7dd6b7f04f theme: Update from SASS 2016-11-04 16:55:49 +01:00
0b05b7a527 viewSelection: Handle touchpad 3-finger pinches
In order to show the overview, just like touchscreens do.

https://bugzilla.gnome.org/show_bug.cgi?id=765937
2016-11-04 16:35:11 +01:00
7e5274619a windowManager: Update API call
This function has now a more generic name, so it caters for both
swipe and pinch touchpad gestures.

https://bugzilla.gnome.org/show_bug.cgi?id=765937
2016-11-04 16:35:11 +01:00
900957d658 Update gnome-shell-sass module 2016-11-04 16:33:43 +01:00
e006b9b400 ui: Add PadOsd
This is an implementation of the pad OSD that's been previously
present in gnome-settings-daemon. Since things are moving closer
to the compositor, it makes sense to have this implemented as shell
UI.

https://bugzilla.gnome.org/show_bug.cgi?id=771067
2016-11-04 16:08:10 +01:00
d042dd73aa Update Hungarian translation 2016-11-04 06:17:53 +00:00
347972e45f screenShield: Raise lightbox on blank
The lightboxes used for screen blanking are created during initialization
and shown each time the screen should blank. During the (potentially long)
time where the lightbox is hidden, any actor could be raised above the
lightbox - in particular any popup menu raises itself to the top when
opened. To not exclude those elements from screen blanking, raise the
lightbox every time it is shown.

https://bugzilla.gnome.org/show_bug.cgi?id=773875
2016-11-03 21:15:20 +01:00
7e803fdf23 Bump version to 3.23.1
Update NEWS.
2016-10-30 21:52:14 +01:00
ccacb5f6de background: Update animations when coming back from suspend
We currently reload animated backgrounds on timezone changes, but
there are other cases where the time can change unexpectedly and
the background no longer matches the time of day. One case we can
easily handle is when coming back from suspend, so do that.

https://bugzilla.gnome.org/show_bug.cgi?id=773265
2016-10-30 21:10:32 +01:00
5117139add Update Slovak translation 2016-10-30 08:18:22 +00:00
d5c0514e21 browser-plugin: The NPObject returned by NPP_GetValue should be retained
The Mozilla documentation says: "And as always when working with
reference counted NPObjects, the caller is responsible for calling
NPN_ReleaseObject on the NPObject to drop the reference."

Browsers assume that the plugin does the right thing and always call
NPN_ReleaseObject. At some point the object is released and deallocated
and both the plugin and browser still have references to the object
thinking that it's still alive. That's why the crash is sometimes in the
plugin when it tries to use the np object, and sometimes in the browser.

https://bugzilla.gnome.org/post_bug.cgi
2016-10-29 09:08:07 +02:00
d81a6bdf41 Updated Ukrainian translation 2016-10-29 02:34:48 +03:00
2812afed22 gnome-shell-extension-tool: Add a reload option
This might be a good fit for extension developers: With
this option one doesn't need to restart the whole Shell
in order to see their changes in effect.

https://bugzilla.gnome.org/show_bug.cgi?id=772593
2016-10-28 15:41:32 -02:00
f5bd86fa11 Updated Czech translation 2016-10-28 12:42:48 +02:00
b625f1692c Update Friulian translation 2016-10-25 20:20:18 +00:00
36ac1f8902 Update Turkish translation 2016-10-23 19:59:08 +00:00
bec4b5c127 Update Polish translation 2016-10-22 16:09:21 +02:00
78cd8b9f9a Fixes to Catalan translation 2016-10-22 12:55:44 +02:00
205880e74e screenShield: Only allow graphs to lift shield when locked
Since commit 67615a0cbc, any printable key can be used to lift the
screen shield rather than just escape/enter/space. While this is
convenient for unlocking where the input is forwarded to the password
entry, it is potentially dangerous when the screen is inactive but
not locked: If the user types her password, the first character will
lift the shield and the remaining input will go to the focused window.
To prevent this from happening, only allow printable keys when the
screen is actually locked and restrict the key presses that lift the
shield to the original set of escape/enter/space otherwise.

https://bugzilla.gnome.org/show_bug.cgi?id=773328
2016-10-21 22:21:55 +02:00
009d021e4f appDisplay: Add a menu item to launch on the discrete GPU
It will only show up when a discrete GPU is available (detected through
the switcheroo-control D-Bus service), and the application hasn't
alreayd been launched.

Note that this will not currently work for D-Bus activated applications,
eg. the menu item will be available, but the environment variable will
not be passed through to D-Bus to use when launching the application.

https://bugzilla.gnome.org/show_bug.cgi?id=773117
2016-10-21 19:26:49 +02:00
39a840e2c3 shell-app: Add "discrete_gpu" option when launching apps
And adapt existing callers to the new API. This will allow us to
implement a way to launch applications on the discrete GPU for systems
where an "Optimus" system exists.

https://bugzilla.gnome.org/show_bug.cgi?id=773117
2016-10-21 19:26:49 +02:00
56d0d7253b build: Fix git submodule fetching with builddir != srcdir
We were running the git submodule update in builddir, instead of srcdir,
which might have lead to submodules not updating, and submodule tags
being reverted to older versions in some contributions.

https://bugzilla.gnome.org/show_bug.cgi?id=773085
2016-10-21 12:22:15 +02:00
7a29cc47d4 build: Remove use of gjs-internals-1.0.pc
Instead use gjs-1.0.pc, the gjs-internals-1.0 API is not stable across
SpiderMonkey versions and is going away.

https://bugzilla.gnome.org/show_bug.cgi?id=772386
2016-10-18 10:21:11 -07:00
d769b72c43 extensionUtils: Use a unique 'subdir' to create new importers
Apparently importers for the 'same' path are shared, even when the
relative paths resolve to different absolute ones. Until this bug
is fixed properly, we can work around this by expressing the current
extension path as the UUID relative to the parent directory.

https://bugzilla.gnome.org/show_bug.cgi?id=772386
2016-10-18 19:19:32 +02:00
a3439a5230 zh_CN: fix translation of airplane mode 2016-10-18 17:35:29 +08:00
9f45161133 Update zh_CN translation 2016-10-18 17:30:36 +08:00
ed99bef458 extensionUtils: Remove ShellJS library
You can define a new importer object by importing a subdirectory in GJS.
This is undocumented, but it is likely to at least hold until the whole
thing moves to ES6 modules, after which we'll be able to do this purely
in JS with Reflect.Loader.

Since this was the only thing the ShellJS library did, we can remove it
altogether.

This allows us to discontinue use of the gjs-internals-1.0 embedder API.

https://bugzilla.gnome.org/show_bug.cgi?id=772386
2016-10-17 12:36:16 -07:00
c9ad54cd82 Update Friulian translation
(cherry picked from commit 0b8ae22aa3)
2016-10-17 10:24:45 +00:00
d7e42d5d6e Update Friulian translation
(cherry picked from commit 25e1b2548c)
2016-10-17 10:15:18 +00:00
5b339c8371 authPrompt.js: turn off the ellipsization of pam messages
When the user gets long failure messages from pam, the authPrompt
message label will clip the message and ellipsize with '…'.

This commit turns off ellipsization from the label, so it will
properly wrap.

https://bugzilla.gnome.org/show_bug.cgi?id=764445
2016-10-14 09:28:34 -04:00
9c6e68f3e7 bluetooth: Replace "Not In Use" status string with "On"
If Bluetooth is on but there aren't connected devices, the status in the
menu reads "Not in Use". This is potentially confusing: it's a negative
statement, even though Bluetooth is on. It also sits uneasily (and looks
even more confusing) next to the submenu item "Turn Off".

Changing the string to "On" is better.

https://bugzilla.gnome.org/show_bug.cgi?id=756432
2016-10-12 10:35:31 +02:00
70526a8025 log(): Reimplement on top of GLib.log_structured
This allows us to pass metadata fields besides the message
to log. So, if the log() call is made from an extension,
pass the extension name and UUID to the logger.

This is useful for extension developers to debug their code
as well as to instruct their users to send debug info to them
by running something like this:

journalctl GNOME_SHELL_EXTENSION_UUID=<extension@uuid>

https://bugzilla.gnome.org/show_bug.cgi?id=770717
2016-10-11 10:17:12 -03:00
c405081d89 extensionUtils: Allow getCurrentExtension() to be called from anyone
Currently it's assumed only an extension can call this method. However
it can be useful if any part of the shell want to know if it was invoked
by an extension.

https://bugzilla.gnome.org/show_bug.cgi?id=770717
2016-10-11 10:14:23 -03:00
384e01b368 network: request periodic scans while the WiFi list is open
NM upstream would like to reduce periodic scanning, and that means
that clients should request scans themselves while their WiFi list
is open.  Similar to the Windows and macOS WiFi dialogs/lists.

https://bugzilla.gnome.org/show_bug.cgi?id=767918
2016-10-11 14:43:19 +02:00
f819654ec8 osdWindow: always round-up sizes when updating allocation
This fixes the OSD window flickering horizontally at certain
resolutions.

https://bugzilla.gnome.org/show_bug.cgi?id=772287
2016-10-10 17:24:52 -07:00
4670db6629 osdWindow: relayout when scale factor changes
We currently rely on the "monitors-changed" signal of LayoutManager to
relayout the OSD window. That is not enough, since the scale factor also
changes the way the OSD window is sized, and that can be updated after
"monitors-changed" has been received.
The visual effect is that under some circumstances, the OSD window will
have the wrong size under HiDpi.

This commit fixes the issue by triggering another relayout when the
scale factor changes.

https://bugzilla.gnome.org/show_bug.cgi?id=772723
2016-10-10 17:24:52 -07:00
6ebabd50c6 Bump version to 3.22.1
Update NEWS.
2016-10-11 00:57:38 +02:00
0c22a21a24 window-tracker: Consider Flatpak ID for window matching
Our window matching currently fails frequently with Flatpak
applications, as one of the primary hints used to link windows
with .desktop files - the WM_CLASS - no longer matches when
flatpak renames the exported .desktop file. Worse, as Flatpak
applications are run in their own PID namespace, different
apps frequently share a common _NET_WM_PID, resulting in
unrelated apps being grouped together by one of the fallback
paths. To match Flatpak applications reliably, take the newly
exported Flatpak ID into account.

https://bugzilla.gnome.org/show_bug.cgi?id=772615
2016-10-10 23:40:39 +02:00
70a0c4211c Update Croatian translation 2016-10-10 18:16:38 +00:00
a21af541c4 Add Croatian translation 2016-10-09 19:23:52 +00:00
e07ba91486 Update Chinese (Taiwan) translation 2016-10-09 14:14:46 +00:00
a22e9ce9cd st: Ignore filtered selection events not meant to our clipboard window
Other windows like the mutter Xwayland selection bridges might deal with
the clipboard, which would result in events visible on st-clipboard event
filters.

In order to avoid unintended results, ignore events that are not meant for
the clipboard window.

https://bugzilla.gnome.org/show_bug.cgi?id=760745
2016-10-09 10:57:47 +02:00
d4ce51b1b7 altTab: Consider attached modals for window order
Similar to bug 667552 for the app switcher, attached modal dialogs
can result in an unexpected window order in the window switcher:
Selecting a window with an attached dialog will focus the dialog
instead, but as the dialog itself is ignored in the window list,
its last-used timestamp is not taken into account for the position
in the MRU list. Fix this by fetching the list of all NORMAL windows
and filter out skip-taskbar windows ourselves, while making sure that
windows appear in the position of their attached modal dialog where
appropriate.

https://bugzilla.gnome.org/show_bug.cgi?id=747153
2016-10-07 14:51:15 +02:00
830005069c Updated Italian translation 2016-10-06 11:48:53 +00:00
8c49267658 Updated Italian translation 2016-10-03 09:38:47 +00:00
d0bab1f7ac network: Initialize primary and VPN connections on startup
We only connect to the corresponding property notifications after both
Client and RemoteSettings are ready, so we may miss the initial signal
emission. Make sure to pick up the connections in this case to fix the
network indicator not showing up.

https://bugzilla.gnome.org/show_bug.cgi?id=772249
2016-09-30 13:50:30 +02:00
f00826f3fb shell-js: Remove usage of deprecated API
This removes all usage of SpiderMonkey API that is deprecated in mozjs24
and will be removed in mozjs31.

https://bugzilla.gnome.org/show_bug.cgi?id=742249
2016-09-27 17:14:47 -07:00
BM
717c0ea19f Update Uzbek@cyrillic translation 2016-09-25 09:16:36 -04:00
3cd8dd0f32 global: Fix a small memory leak 2016-09-21 23:38:42 +02:00
aedd616346 Update Arabic translation 2016-09-21 14:51:33 +02:00
b3de3ff00b Update Basque language 2016-09-19 13:37:26 +02:00
b66dff8aed Bump version to 3.22.0
Update NEWS.
2016-09-19 23:18:13 +02:00
ff814df03a shell-screenshot: Avoid a crash when the cursor texture is NULL
Analogously to commit 2a7f9f70b8 for the
screen recorder, as a wayland compositor, the cursor texture might not
exist.

https://bugzilla.gnome.org/show_bug.cgi?id=771656
2016-09-19 22:41:51 +02:00
c9a528025c Updated Danish translation 2016-09-19 20:35:22 +00:00
5f3ec8a6f1 Update British English translation 2016-09-18 12:43:02 +02:00
becd29c50a altTab: Skip unminimize effect when cycling to a window
Similar to windows on another workspace, selecting a minimized window
doesn't look quite right - the selected window disappears, then animates
back in. Fix this by adding support for skipping the next effect to the
wm and use it to bypass the unminimize animation.

https://bugzilla.gnome.org/show_bug.cgi?id=771536
2016-09-18 11:00:54 +02:00
a029a35050 altTab: Improve cycling to a window on another workspace
Both 'cycle-group' and 'cycle-window' shortcuts allow cycling through
windows on all workspaces. While this works, it looks quite broken
since we started showing clones for highlighting: the selected window
vanishes (when its clone is destroyed), then slides back in with its
workspace. Instead, slide the selected window to its workspace like
we do for the 'move-to-workspace-*' shortcuts.

https://bugzilla.gnome.org/show_bug.cgi?id=771536
2016-09-18 11:00:54 +02:00
d6a78d61d1 altTab: Restore correct visibility when cycling windows
Commit 3171819c improved window cycling by using a dedicated to clone
for highlighting rather than activating all cycled windows. Original
window actors are hidden while its clone is showing, and shown again
afterwards, however the latter is wrong for actors that are not supposed
to be visible (for example where the window is minimized, or on a different
workspace). Fix this by properly syncing the actor's visibility instead
of showing it unconditionally.

https://bugzilla.gnome.org/show_bug.cgi?id=771536
2016-09-18 11:00:54 +02:00
9be46bd212 Update Arabic translation 2016-09-16 21:30:26 +02:00
4df3afced0 Update Catalan translation 2016-09-16 21:26:51 +02:00
90f8e1df80 Updated Ukrainian translation 2016-09-15 18:12:16 +03:00
ea2ac89e61 Updated Ukrainian translation 2016-09-15 18:06:22 +03:00
695bfb9616 extensionPrefs: Fix extension list width
ScrolledWindow changed its allocation behavior, and the extension
list only takes up the minimum width rather than the available
width as intended. To get the previous behavior back, we need
to set the newly added :propagate-natural-width property ...

https://bugzilla.gnome.org/show_bug.cgi?id=771391
2016-09-14 09:18:23 +02:00
5dbdde8c15 Updated French translation 2016-09-13 10:19:20 +00:00
854bfc17ed Updated Scottish Gaelic translation 2016-09-13 09:48:01 +00:00
c8b192bcae Updated Danish translation 2016-09-13 01:57:54 +02:00
f07306897f Bump version to 3.21.92
Update NEWS.
2016-09-13 00:16:11 +02:00
44d731fff5 Add more options to XGETTEXT_OPTIONS in po/Makevars 2016-09-12 19:43:44 +02:00
52f939f64c Updated Greek translation 2016-09-11 21:20:39 +00:00
f1d12c18d8 Updated Russian translation 2016-09-11 17:52:46 +00:00
373ebb50eb Restore gvc submodule
Commit 68f439425b accidentally dropped the changes from the last
couple of months ...
2016-09-11 19:20:00 +02:00
b0b5be63b9 Restore gnome-shell-sass submodule
Commit 68f439425b accidentally dropped the changes from the last
couple of months ...
2016-09-11 19:17:36 +02:00
68f439425b Updated Galician translations 2016-09-11 00:35:39 +02:00
cae4d92191 loginDialog: fix cancel button in ask for username mode
If the user clicks Not Listed? to enter ask for username mode, clicks
cancel, and then attempts to log in via the user list, the user will see
"Authentication failed" after correctly typing the password, and then
will become stuck in an empty screen with just the gray noise background.

The problem is, we forgot to disconnect from the signal that's waiting
for the next button to be pressed on the username entry screen. Since
the signal handler that executes here is expecting the username to be
input, and isn't prepared for us to have switched back to user list,
various bad things happen. We try to start two gdm-password
conversations at once, for instance, one using the user's password as
the username. I stopped investigating here, because it's easy to fix by
disconnecting from the signal at the right time.

https://bugzilla.gnome.org/show_bug.cgi?id=770328
2016-09-10 16:50:53 -05:00
f336295475 Updated Korean translation 2016-09-10 18:16:31 +00:00
06d0e7d74a telepathyClient: Always clear pending messages on destroy
Since commit 82950ecea, we acknowledge pending messages when closing a
chat notification for a channel we are handling to prevent the channel
from popping up again immediately. While this isn't an issue for channels
we don't handle, the unread messages of the destroyed notification are
still considered for the messages indicator in the top bar, which is
clearly confusing (in particular when we end up showing the indicator
without any notifications in the list). As it's arguably correct to not
meddle with a channel handled by someone else, just reset the cache of
pending messages to address this issue.

https://bugzilla.gnome.org/show_bug.cgi?id=770888
2016-09-09 23:54:28 +02:00
5e0e3edc7b data: Swap default for 'disable-extension-version-check' setting
Nowadays, the user interface has mostly stabilized with most changes
happening under the hood. As a result, extensions written for previous
versions of GNOME Shell are very much expected to keep working on
updates, if it wasn't for the version check that requires a version
bump in the extension metadata. There has been a setting to disable
that check for a while, but it's existence isn't widely known (hence
the common perception that "everything breaks on updates"). While
there is still some risk that an out-of-date extension can be enabled
without error, but fails spectacularly later (where we cannot catch
the exception), it is reasonably small by now when compared to the
~95% of extensions that can be "unbroken", so swap the default value
to disable version checks by default.

https://bugzilla.gnome.org/show_bug.cgi?id=770887
2016-09-09 23:54:28 +02:00
02a51bfa65 windowManager: Fix windows not getting undimmed while hidden
Mutter's plugin destroy event doesn't happen if a window is hidden
when it gets unmanaged so we also need to handle the
MetaWindow::unmanaged signal to check whether the parent should
dimmed.

https://bugzilla.gnome.org/show_bug.cgi?id=752524
2016-09-09 17:17:07 +02:00
dbd04df311 windowManager: Fix windows not getting undimmed in some cases
meta_window_foreach_transient() iterates through all transients of a
window, not only direct transients. This means that simply checking if
a transient is an attached dialog isn't enough because it might be a
non-direct transient for the window we're checking, in which case we
don't want to dim the window.

In particular this fixes windows not getting undimmed when they have
more that one level of transient children and the direct transient gets
destroyed. In that case we would still find at least one non-direct
transient child and decide to keep the window dimmed.

https://bugzilla.gnome.org/show_bug.cgi?id=770163
2016-09-09 17:17:06 +02:00
e6adcd99c7 [l10n] update Persian translations 2016-09-09 18:36:30 +04:30
3171819c36 altTab: Don't mess up MRU order while cycling windows
Commit bd6e7f14d1 reimplemented the cycle keybindings to
fix cycling between more than two windows, but the approach
of highlighting cycled windows by actually focusing them has
the drawback that cycling messes up the MRU order of windows.
To fix this, only change the window focus when the operation
finishes, and use a dedicated actor that draws a border around
a window clone for highlighting.

https://bugzilla.gnome.org/show_bug.cgi?id=771063
2016-09-08 21:32:10 +02:00
e4976b535d WorkspaceSwitcherPopup: allow input events to pass through
There's no particular reason for this actor to be reactive and thus
preventing input events to reach actors underneath, e.g. quickly
clicking on something while the popup isn't yet finished animating
out.

https://bugzilla.gnome.org/show_bug.cgi?id=770382
2016-09-08 19:29:50 +02:00
06d1602f17 Updated French translation 2016-09-08 16:40:26 +00:00
603d0dfbc3 Update Latvian translation 2016-09-08 19:00:21 +03:00
0b6c5b4620 systray: Bail out if the plug window is gone
Instead of crashing when deferencing a NULL pointer.

Bugzilla: https://bugzilla.gnome.org/show_bug.cgi?id=755313
2016-09-08 12:08:02 +02:00
d7894dbc44 Updated Dutch translation Master 2016-09-07 17:19:57 +02:00
d25d8126ea Updated Portuguese translation 2016-09-07 05:49:14 +00:00
2402d3e115 Updated Swedish translation 2016-09-06 22:07:24 +00:00
ac4284d348 Updated Hebrew translation 2016-09-06 12:21:39 +03:00
f9ef80749a recorder: Composite captured images before passing into gstreamer
Mutter may capture the screen in multiple capture regions. If this is
done, take these images and composite them onto one large image, which
is then passed into the gstreamer source.
2016-09-06 15:22:23 +08:00
22f0d3076e screenshot: Composite multiple captures into one image
When clutter gives us multiple captures (multiple cairo_surface_t's),
composite them into one large image and use that as final screenshot
result. This makes screenshooting work when mutter uses multiple views.

https://bugzilla.gnome.org/show_bug.cgi?id=770128
2016-09-06 15:22:23 +08:00
127b6dca1c updated Punjabi Translation 2016-09-05 07:29:17 -05:00
8cfff33291 Updated Vietnamese translation
Signed-off-by: Trần Ngọc Quân <vnwildman@gmail.com>
2016-09-05 15:04:03 +07:00
21f534c7f0 Updated Turkish translation 2016-09-04 19:12:28 +00:00
9faa1db942 Updated Lithuanian translation 2016-09-04 12:28:10 +03:00
2fc9bffb23 Updated Kazakh translation 2016-09-04 04:15:00 +00:00
f16eae45a2 Updated Korean translation 2016-09-03 14:07:31 +00:00
622e73c34c Bump version to 3.21.91
Update NEWS.
2016-08-30 00:26:31 +02:00
eb1c3d7045 Updated Serbian translation 2016-08-28 09:16:02 +02:00
fc26895f70 Updated Slovenian translation 2016-08-25 22:53:27 +02:00
ca224b379f Updated Brazilian Portuguese translation 2016-08-22 21:13:36 +00:00
42b609b852 Updated Friulian translation 2016-08-22 20:53:03 +00:00
a24169e2aa Updated Spanish translation 2016-08-22 20:44:47 +02:00
144d1dca88 Updated Indonesian translation 2016-08-22 09:47:46 +00:00
38ab6ba3ec Updated Slovak translation 2016-08-21 16:01:41 +00:00
bc6a0626c1 Updated Finnish translation 2016-08-21 09:45:31 +00:00
497f4f4a3c Updated German translation 2016-08-21 09:39:47 +00:00
105 changed files with 20303 additions and 16523 deletions

94
NEWS
View File

@ -1,3 +1,97 @@
3.23.2
======
* Implement Pad configuration OSD [Carlos; #771067]
* Show overview on three-finger touchpad pinch [Carlos; #765937]
* Summarize network sections with too many devices [Florian; #773892]
* Always show primary network icon when connected [Florian; #773890]
* Fix fullscreen transitions on wayland [Rui; #770345]
* Work around portal failures by using a URL without HTPPS redirect [Debarshi; #769940]
* Fix app view hiding when no usage data is available [Florian, Xiaoguang; #774381]
* Misc. bug fixes [Florian, Ray; #773875, #740043, #773893, #774643, #774805]
Contributors:
Carlos Garnacho, Rui Matos, Florian Müllner, Debarshi Ray, Ray Strode,
Xiaoguang Wang
Translations:
Balázs Meskó [hu], Fabio Tomat [fur], Marek Cernocky [cs], Stas Solovey [ru],
Daniel Mustieles [es], Marek Černocký [cs], Piotr Drąg [pl],
Rafael Fontenelle [pt_BR], Baurzhan Muftakhidinov [kk], Jiri Grönroos [fi],
Kjartan Maraas [nb]
3.23.1
======
* Request periodic scans while WiFi list is open [Dan; #767918]
* Include extension UUID in structured log metadata [Jonh; #770717]
* Line-wrap PAM messages on login screen [Tao; #764445]
* Add a way to launch an app on the discrete GPU [Bastien; #773117]
* Only allow graphs to lift screen shield when locked [Florian; #773328]
* Add reload option to gnome-shell-extension-tool [Jonh; #772593]
* Update background animations when resuming from suspend [Florian; #773265]
* Misc. bug fixes [Cosimo, Bastien, Florian, Philip, Carlos; #772723, #772287,
#756432, #772386, #772386, #773085, #773634]
Contributors:
Cosimo Cecchi, Philip Chimento, Carlos Garcia Campos, Florian Müllner,
Bastien Nocera, Jonh Wendell, Dan Williams, Tao Yang
Translations:
Fabio Tomat [fur], Philip Chimento [zh_CN], YunQiang Su [zh_CN],
Jordi Mas [ca], Piotr Drąg [pl], Muhammet Kara [tr], Marek Černocký [cs],
Daniel Korostil [uk], Dušan Kazik [sk]
3.22.1
======
* Fix hidden network indicator on startup [Florian; #772249]
* Fix order of windows with modal dialogs in window switcher [Florian; #747153]
* Fix feedback loop between StClipboard and X11 bridge [Carlos; #760745]
* Reliably match windows from Flatpak apps [Florian; #772615]
* Misc. bug fixes [Philip; #742249]
Contributors:
Philip Chimento, Carlos Garnacho, Florian Müllner
Translations:
Inaki Larranaga Murgoitio [eu], Khaled Hosny [ar], BM [uz@cyrillic],
Milo Casagrande [it], Cheng-Chia Tseng [zh_TW], gogo [hr]
3.22.0
======
* Misc. bug fixes [Florian, Rui; #771391, #771536] #771656]
Contributors:
Rui Matos, Florian Müllner
Translations:
Ask Hjorth Larsen [da], GNOME Translation Robot [gd], Alexandre Franke [fr],
Daniel Korostil [uk], Jordi Mas [ca], Khaled Hosny [ar], David King [en_GB]
3.21.92
=======
* Adjust screen capture to work with multiple stage views [Jonas; #770128]
* Improve handling of cycle shortcuts [Florian; #771063]
* Fix windows not getting undimmed in some cases [Rui; #770163, #752524]
* Disable extension version check by default [Florian; #770887]
* Misc. bug fixes [Rui, Florian, Michael; #770382, #770888, #770328]
Contributors:
Jonas Ådahl, Michael Catanzaro, Fran Dieguez, Olivier Fourdan, Rui Matos,
Florian Müllner
Translations:
Changwoo Ryu [ko], Baurzhan Muftakhidinov [kk], Aurimas Černius [lt],
Muhammet Kara [tr], Trần Ngọc Quân [vi], A S Alam [pa], Yosef Or Boczko [he],
Anders Jonsson [sv], Tiago Santos [pt], Hannie Dumoleyn [nl],
Rūdolfs Mazurs [lv], Claude Paroz [fr], Arash Mousavi [fa],
Fran Dieguez [gl], Stas Solovey [ru], Tom Tryfonidis [el]
3.21.91
=======
Translations:
Mario Blättermann [de], Jiri Grönroos [fi], Dušan Kazik [sk],
Andika Triwidada [id], Daniel Mustieles [es], Fabio Tomat [fur],
Enrico Nicoletto [pt_BR], Matej Urbančič [sl], Мирослав Николић [sr, sr@latin]
3.21.90.1
=========
Contributors:

View File

@ -11,6 +11,8 @@ test -z "$srcdir" && srcdir=.
exit 1
}
pushd $srcdir
# Fetch submodules if needed
if test ! -f src/gvc/Makefile.am || test ! -f data/theme/gnome-shell-sass/COPYING;
then
@ -19,6 +21,8 @@ then
fi
git submodule update
popd
which gnome-autogen.sh || {
echo "You need to install gnome-common from GNOME Git (or from"
echo "your OS vendor's package manager)."

View File

@ -1029,6 +1029,7 @@ NPP_GetValue(NPP instance,
if (!instance->pdata)
return NPERR_INVALID_INSTANCE_ERROR;
funcs.retainobject (instance->pdata);
*(NPObject**)value = instance->pdata;
break;

View File

@ -1,5 +1,5 @@
AC_PREREQ(2.63)
AC_INIT([gnome-shell],[3.21.90.1],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AC_INIT([gnome-shell],[3.23.2],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AX_IS_RELEASE([git-directory])
AC_CONFIG_HEADERS([config.h])
@ -77,8 +77,8 @@ AC_MSG_RESULT($enable_systemd)
CLUTTER_MIN_VERSION=1.21.5
GOBJECT_INTROSPECTION_MIN_VERSION=1.49.1
GJS_MIN_VERSION=1.39.0
MUTTER_MIN_VERSION=3.21.90
GJS_MIN_VERSION=1.47.0
MUTTER_MIN_VERSION=3.23.2
GTK_MIN_VERSION=3.15.0
GIO_MIN_VERSION=2.45.3
LIBECAL_MIN_VERSION=3.5.3
@ -96,7 +96,7 @@ SHARED_PCS="gio-unix-2.0 >= $GIO_MIN_VERSION
libxml-2.0
gtk+-3.0 >= $GTK_MIN_VERSION
atk-bridge-2.0
gjs-internals-1.0 >= $GJS_MIN_VERSION
gjs-1.0 >= $GJS_MIN_VERSION
$recorder_modules
gdk-x11-3.0 libsoup-2.4
mutter-clutter-1.0 >= $CLUTTER_MIN_VERSION
@ -114,7 +114,7 @@ fi
PKG_CHECK_MODULES(GNOME_SHELL, $SHARED_PCS)
PKG_CHECK_MODULES(MUTTER, libmutter >= $MUTTER_MIN_VERSION)
PKG_CHECK_MODULES(GNOME_SHELL_JS, gio-2.0 gjs-internals-1.0 >= $GJS_MIN_VERSION)
PKG_CHECK_MODULES(GNOME_SHELL_JS, gio-2.0 gjs-1.0 >= $GJS_MIN_VERSION)
PKG_CHECK_MODULES(ST, mutter-clutter-1.0 gtk+-3.0 libcroco-0.6 >= 0.6.8 x11)
PKG_CHECK_MODULES(SHELL_PERF_HELPER, gtk+-3.0 gio-2.0)
PKG_CHECK_MODULES(SHELL_HOTPLUG_SNIFFER, gio-2.0 gdk-pixbuf-2.0)

View File

@ -38,6 +38,7 @@ endif
introspectiondir = $(datadir)/dbus-1/interfaces
introspection_DATA = \
org.gnome.Shell.PadOsd.xml \
org.gnome.Shell.Screencast.xml \
org.gnome.Shell.Screenshot.xml \
org.gnome.ShellSearchProvider.xml \
@ -63,6 +64,7 @@ dist_theme_files = \
theme/gnome-shell-sass/NEWS \
theme/gnome-shell-sass/README \
theme/gnome-shell-sass/gnome-shell-sass.doap \
theme/pad-osd.css \
theme/parse-sass.sh \
$(NULL)

View File

@ -22,6 +22,7 @@
<file>no-events.svg</file>
<file>no-notifications.svg</file>
<file>noise-texture.png</file>
<file>pad-osd.css</file>
<file>page-indicator-active.svg</file>
<file>page-indicator-inactive.svg</file>
<file>page-indicator-checked.svg</file>

View File

@ -0,0 +1,28 @@
<!DOCTYPE node PUBLIC
'-//freedesktop//DTD D-BUS Object Introspection 1.0//EN'
'http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd'>
<node>
<!--
org.gnome.Shell.PadOSD:
@short_description: Pad OSD interface
The interface used to show button map OSD on pad devices.
-->
<interface name='org.gnome.Shell.Wacom.PadOsd'>
<!--
Show:
@device_node: device node file, usually in /dev/input/...
@edition_mode: whether toggling edition mode on when showing
Shows the pad button map OSD for the requested device, the OSD
will be shown according the current device settings (output
mapping, left handed mode, ...)
-->
<method name='Show'>
<arg name='device_node' direction='in' type='o'/>
<arg name='edition_mode' direction='in' type='b'/>
</method>
</interface>
</node>

View File

@ -22,7 +22,7 @@
</description>
</key>
<key name="disable-extension-version-validation" type="b">
<default>false</default>
<default>true</default>
<summary>Disables the validation of extension version compatibility</summary>
<description>
GNOME Shell will only load extensions that claim to support the current

View File

@ -562,6 +562,14 @@ StScrollBar {
background-color: #eeeeec;
border-radius: 0.3em; }
/* Pad OSD */
.pad-osd-window {
padding: 32px;
background-color: rgba(0, 0, 0, 0.8); }
.combo-box-label {
width: 15em; }
/* App Switcher */
.switcher-popup {
padding: 8px;
@ -604,6 +612,10 @@ StScrollBar {
width: 96px;
height: 96px; }
/* Window Cycler */
.cycler-highlight {
border: 5px solid #215d9c; }
/* Workspace Switcher */
.workspace-switcher-group {
padding: 12px; }

View File

@ -562,6 +562,14 @@ StScrollBar {
background-color: #eeeeec;
border-radius: 0.3em; }
/* Pad OSD */
.pad-osd-window {
padding: 32px;
background-color: rgba(0, 0, 0, 0.8); }
.combo-box-label {
width: 15em; }
/* App Switcher */
.switcher-popup {
padding: 8px;
@ -604,6 +612,10 @@ StScrollBar {
width: 96px;
height: 96px; }
/* Window Cycler */
.cycler-highlight {
border: 5px solid #215d9c; }
/* Workspace Switcher */
.workspace-switcher-group {
padding: 12px; }

30
data/theme/pad-osd.css Normal file
View File

@ -0,0 +1,30 @@
.Leader {
stroke-width: .5 !important;
stroke: #535353;
fill: none !important;
}
.Button {
stroke-width: .25;
stroke: #ededed;
fill: #ededed;
}
.Ring {
stroke-width: .5 !important;
stroke: #535353 !important;
fill: none !important;
}
.Label {
stroke: none !important;
stroke-width: .1 !important;
font-size: .1 !important;
fill: transparent !important;
}
.TouchStrip, .TouchRing {
stroke-width: .1 !important;
stroke: #ededed !important;
fill: #535353 !important;
}

View File

@ -152,6 +152,7 @@ const Application = new Lang.Class({
let scroll = new Gtk.ScrolledWindow({ hscrollbar_policy: Gtk.PolicyType.NEVER,
shadow_type: Gtk.ShadowType.IN,
halign: Gtk.Align.CENTER,
propagate_natural_width: true,
margin: 18 });
this._window.add(scroll);

View File

@ -13,6 +13,7 @@ const Params = imports.misc.params;
const ShellEntry = imports.ui.shellEntry;
const Tweener = imports.ui.tweener;
const UserWidget = imports.ui.userWidget;
const Pango = imports.gi.Pango;
const DEFAULT_BUTTON_WELL_ICON_SIZE = 16;
const DEFAULT_BUTTON_WELL_ANIMATION_DELAY = 1.0;
@ -113,6 +114,7 @@ const AuthPrompt = new Lang.Class({
this._message = new St.Label({ opacity: 0,
styleClass: 'login-dialog-message' });
this._message.clutter_text.line_wrap = true;
this._message.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
this.actor.add(this._message, { x_fill: false, x_align: St.Align.START, y_align: St.Align.START });
this._buttonBox = new St.BoxLayout({ style_class: 'login-dialog-button-box',

View File

@ -804,6 +804,11 @@ const LoginDialog = new Lang.Class({
this._user = null;
if (this._nextSignalId) {
this._authPrompt.disconnect(this._nextSignalId);
this._nextSignalId = 0;
}
if (beginRequest == AuthPrompt.BeginRequestType.PROVIDE_USERNAME) {
if (!this._disableUserList)
this._showUserList();

View File

@ -72,6 +72,7 @@
<file>ui/osdMonitorLabeler.js</file>
<file>ui/overview.js</file>
<file>ui/overviewControls.js</file>
<file>ui/padOsd.js</file>
<file>ui/panel.js</file>
<file>ui/panelMenu.js</file>
<file>ui/pointerWatcher.js</file>

View File

@ -6,9 +6,7 @@
const Lang = imports.lang;
const Signals = imports.signals;
const GLib = imports.gi.GLib;
const Gio = imports.gi.Gio;
const ShellJS = imports.gi.ShellJS;
const Config = imports.misc.config;
const FileUtils = imports.misc.fileUtils;
@ -21,14 +19,25 @@ const ExtensionType = {
// Maps uuid -> metadata object
const extensions = {};
/**
* getCurrentExtension:
*
* Returns the current extension, or null if not called from an extension.
*/
function getCurrentExtension() {
let stack = (new Error()).stack;
let stack = (new Error()).stack.split('\n');
let extensionStackLine;
// Assuming we're importing this directly from an extension (and we shouldn't
// ever not be), its UUID should be directly in the path here.
let extensionStackLine = stack.split('\n')[1];
// Search for an occurrence of an extension stack frame
// Start at 1 because 0 is the stack frame of this function
for (let i = 1; i < stack.length; i++) {
if (stack[i].indexOf('/gnome-shell/extensions/') > -1) {
extensionStackLine = stack[i];
break;
}
}
if (!extensionStackLine)
throw new Error('Could not find current extension');
return null;
// The stack line is like:
// init([object Object])@/home/user/data/gnome-shell/extensions/u@u.id/prefs.js:8
@ -38,7 +47,7 @@ function getCurrentExtension() {
// @/home/user/data/gnome-shell/extensions/u@u.id/prefs.js:8
let match = new RegExp('@(.+):\\d+').exec(extensionStackLine);
if (!match)
throw new Error('Could not find current extension');
return null;
let path = match[1];
let file = Gio.File.new_for_path(path);
@ -52,7 +61,7 @@ function getCurrentExtension() {
file = file.get_parent();
}
throw new Error('Could not find current extension');
return null;
}
/**
@ -140,12 +149,13 @@ function createExtensionObject(uuid, dir, type) {
return extension;
}
var _extension = null;
function installImporter(extension) {
_extension = extension;
ShellJS.add_extension_importer('imports.misc.extensionUtils._extension', 'imports', extension.path);
_extension = null;
let oldSearchPath = imports.searchPath.slice(); // make a copy
imports.searchPath = [extension.dir.get_parent().get_path()];
// importing a "subdir" creates a new importer object that doesn't affect
// the global one
extension.imports = imports[extension.uuid];
imports.searchPath = oldSearchPath;
}
const ExtensionFinder = new Lang.Class({

View File

@ -94,7 +94,7 @@ function spawnApp(argv) {
Gio.AppInfoCreateFlags.SUPPORTS_STARTUP_NOTIFICATION);
let context = global.create_app_launch_context(0, -1);
app.launch([], context);
app.launch([], context, false);
} catch(err) {
_handleSpawnError(argv[0], err);
}

View File

@ -20,6 +20,8 @@ const PortalHelperResult = {
};
const INACTIVITY_TIMEOUT = 30000; //ms
const CONNECTIVITY_CHECK_HOST = 'nmcheck.gnome.org';
const CONNECTIVITY_CHECK_URI = 'http://' + CONNECTIVITY_CHECK_HOST;
const CONNECTIVITY_RECHECK_RATELIMIT_TIMEOUT = 30 * GLib.USEC_PER_SEC;
const HelperDBusInterface = '<node> \
@ -50,7 +52,7 @@ const PortalWindow = new Lang.Class({
this.parent({ application: application });
if (!url) {
url = 'http://www.gnome.org';
url = CONNECTIVITY_CHECK_URI;
this._originalUrlWasGnome = true;
} else {
this._originalUrlWasGnome = false;
@ -112,12 +114,12 @@ const PortalWindow = new Lang.Class({
let uri = new Soup.URI(request.get_uri());
if (!uri.host_equal(this._uri) && this._originalUrlWasGnome) {
if (uri.get_host() == 'www.gnome.org' && this._everSeenRedirect) {
if (uri.get_host() == CONNECTIVITY_CHECK_HOST && this._everSeenRedirect) {
// Yay, we got to gnome!
decision.ignore();
this._doneCallback(PortalHelperResult.COMPLETED);
return true;
} else if (uri.get_host() != 'www.gnome.org') {
} else if (uri.get_host() != CONNECTIVITY_CHECK_HOST) {
this._everSeenRedirect = true;
}
}

View File

@ -46,6 +46,19 @@ function _createWindowClone(window, size) {
y_expand: true });
};
function getWindows(workspace) {
// We ignore skip-taskbar windows in switchers, but if they are attached
// to their parent, their position in the MRU list may be more appropriate
// than the parent; so start with the complete list ...
let windows = global.display.get_tab_list(Meta.TabList.NORMAL_ALL,
workspace);
// ... map windows to their parent where appropriate ...
return windows.map(w => {
return w.is_attached_dialog() ? w.get_transient_for() : w;
// ... and filter out skip-taskbar windows and duplicates
}).filter((w, i, a) => !w.skip_taskbar && a.indexOf(w) == i);
}
const AppSwitcherPopup = new Lang.Class({
Name: 'AppSwitcherPopup',
Extends: SwitcherPopup.SwitcherPopup,
@ -354,6 +367,67 @@ const AppSwitcherPopup = new Lang.Class({
}
});
const CyclerHighlight = new Lang.Class({
Name: 'CyclerHighlight',
_init: function() {
this._window = null;
this.actor = new St.Widget({ layout_manager: new Clutter.BinLayout() });
this._clone = new Clutter.Clone();
this.actor.add_actor(this._clone);
this._highlight = new St.Widget({ style_class: 'cycler-highlight' });
this.actor.add_actor(this._highlight);
let coordinate = Clutter.BindCoordinate.ALL;
let constraint = new Clutter.BindConstraint({ coordinate: coordinate });
this._clone.bind_property('source', constraint, 'source', 0);
this.actor.add_constraint(constraint);
this.actor.connect('notify::allocation',
Lang.bind(this, this._onAllocationChanged));
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
},
set window(w) {
if (this._window == w)
return;
this._window = w;
if (this._clone.source)
this._clone.source.sync_visibility();
let windowActor = this._window ? this._window.get_compositor_private()
: null;
if (windowActor)
windowActor.hide();
this._clone.source = windowActor;
},
_onAllocationChanged: function() {
if (!this._window) {
this._highlight.set_size(0, 0);
this._highlight.hide();
} else {
let [x, y] = this.actor.allocation.get_origin();
let rect = this._window.get_frame_rect();
this._highlight.set_size(rect.width, rect.height);
this._highlight.set_position(rect.x - x, rect.y - y);
this._highlight.show();
}
},
_onDestroy: function() {
this.window = null;
}
});
const CyclerPopup = new Lang.Class({
Name: 'CyclerPopup',
Extends: SwitcherPopup.SwitcherPopup,
@ -367,6 +441,9 @@ const CyclerPopup = new Lang.Class({
if (this._items.length == 0)
return;
this._highlight = new CyclerHighlight();
global.window_group.add_actor(this._highlight.actor);
// We don't show an actual popup, so just provide what SwitcherPopup
// expects instead of inheriting from SwitcherList
this._switcherList = { actor: new St.Widget(),
@ -375,11 +452,37 @@ const CyclerPopup = new Lang.Class({
},
_highlightItem: function(index, justOutline) {
Main.activateWindow(this._items[index]);
this._highlight.window = this._items[index];
global.window_group.set_child_above_sibling(this._highlight.actor, null);
},
_finish: function() {
this._highlightItem(this._selectedIndex);
let window = this._items[this._selectedIndex];
let ws = window.get_workspace();
let activeWs = global.screen.get_active_workspace();
if (window.minimized) {
Main.wm.skipNextEffect(window.get_compositor_private());
window.unminimize();
}
if (activeWs == ws) {
Main.activateWindow(window);
} else {
// If the selected window is on a different workspace, we don't
// want it to disappear, then slide in with the workspace; instead,
// always activate it on the active workspace ...
activeWs.activate_with_focus(window, global.get_current_time());
// ... then slide it over to the original workspace if necessary
Main.wm.actionMoveWindow(window, ws);
}
this.parent();
},
_onDestroy: function() {
this._highlight.actor.destroy();
this.parent();
}
@ -427,7 +530,7 @@ const WindowSwitcherPopup = new Lang.Class({
_getWindowList: function() {
let workspace = this._settings.get_boolean('current-workspace-only') ? global.screen.get_active_workspace() : null;
return global.display.get_tab_list(Meta.TabList.NORMAL, workspace);
return getWindows(workspace);
},
_keyPressHandler: function(keysym, action) {
@ -465,7 +568,7 @@ const WindowCyclerPopup = new Lang.Class({
_getWindows: function() {
let workspace = this._settings.get_boolean('current-workspace-only') ? global.screen.get_active_workspace() : null;
return global.display.get_tab_list(Meta.TabList.NORMAL, workspace);
return getWindows(workspace);
},
_keyPressHandler: function(keysym, action) {

View File

@ -67,7 +67,7 @@ const Animation = new Lang.Class({
},
_animationsLoaded: function() {
this._isLoaded = true;
this._isLoaded = this._animations.get_n_children() > 0;
if (this._isPlaying)
this.play();

View File

@ -60,6 +60,18 @@ const PAGE_SWITCH_TIME = 0.3;
const VIEWS_SWITCH_TIME = 0.4;
const VIEWS_SWITCH_ANIMATION_DELAY = 0.1;
const SWITCHEROO_BUS_NAME = 'net.hadess.SwitcherooControl';
const SWITCHEROO_OBJECT_PATH = '/net/hadess/SwitcherooControl';
const SwitcherooProxyInterface = '<node> \
<interface name="net.hadess.SwitcherooControl"> \
<property name="HasDualGpu" type="b" access="read"/> \
</interface> \
</node>';
const SwitcherooProxy = Gio.DBusProxy.makeProxyWrapper(SwitcherooProxyInterface);
let discreteGpuAvailable = false;
function _getCategories(info) {
let categoriesStr = info.get_categories();
if (!categoriesStr)
@ -198,6 +210,14 @@ const BaseAppView = new Lang.Class({
},
animate: function(animationDirection, onComplete) {
if (onComplete) {
let animationDoneId = this._grid.connect('animation-done', Lang.bind(this,
function () {
this._grid.disconnect(animationDoneId);
onComplete();
}));
}
if (animationDirection == IconGrid.AnimationDirection.IN) {
let toAnimate = this._grid.actor.connect('notify::allocation', Lang.bind(this,
function() {
@ -213,14 +233,6 @@ const BaseAppView = new Lang.Class({
} else {
this._doSpringAnimation(animationDirection);
}
if (onComplete) {
let animationDoneId = this._grid.connect('animation-done', Lang.bind(this,
function () {
this._grid.disconnect(animationDoneId);
onComplete();
}));
}
},
animateSwitch: function(animationDirection) {
@ -969,10 +981,36 @@ const AppDisplay = new Lang.Class({
initialView = Views.ALL;
this._showView(initialView);
this._updateFrequentVisibility();
Gio.DBus.system.watch_name(SWITCHEROO_BUS_NAME,
Gio.BusNameWatcherFlags.NONE,
Lang.bind(this, this._switcherooProxyAppeared),
Lang.bind(this, function() {
this._switcherooProxy = null;
this._updateDiscreteGpuAvailable();
}));
},
_updateDiscreteGpuAvailable: function() {
if (!this._switcherooProxy)
discreteGpuAvailable = false;
else
discreteGpuAvailable = this._switcherooProxy.HasDualGpu;
},
_switcherooProxyAppeared: function() {
this._switcherooProxy = new SwitcherooProxy(Gio.DBus.system, SWITCHEROO_BUS_NAME, SWITCHEROO_OBJECT_PATH,
Lang.bind(this, function(proxy, error) {
if (error) {
log(error.message);
return;
}
this._updateDiscreteGpuAvailable();
}));
},
animate: function(animationDirection, onComplete) {
let currentView = this._views[global.settings.get_uint('app-picker-view')].view;
let currentView = this._views.filter(v => v.control.has_style_pseudo_class('checked')).pop().view;
// Animate controls opacity using iconGrid animation time, since
// it will be the time the AllView or FrequentView takes to show
@ -1861,6 +1899,19 @@ const AppIconMenu = new Lang.Class({
this._appendSeparator();
}
if (discreteGpuAvailable &&
this._source.app.state == Shell.AppState.STOPPED &&
actions.indexOf('activate-discrete-gpu') == -1) {
this._onDiscreteGpuMenuItem = this._appendMenuItem(_("Launch using Dedicated Graphics Card"));
this._onDiscreteGpuMenuItem.connect('activate', Lang.bind(this, function() {
if (this._source.app.state == Shell.AppState.STOPPED)
this._source.animateLaunch();
this._source.app.launch(0, -1, true);
this.emit('activate-window', null);
}));
}
for (let i = 0; i < actions.length; i++) {
let action = actions[i];
let item = this._appendMenuItem(appInfo.get_action_name(action));

View File

@ -102,6 +102,7 @@ const Lang = imports.lang;
const Meta = imports.gi.Meta;
const Signals = imports.signals;
const LoginManager = imports.misc.loginManager;
const Main = imports.ui.main;
const Params = imports.misc.params;
const Tweener = imports.ui.tweener;
@ -254,6 +255,13 @@ const Background = new Lang.Class({
this._loadAnimation(this._animation.file);
}));
LoginManager.getLoginManager().connect('prepare-for-sleep',
(lm, aboutToSuspend) => {
if (aboutToSuspend)
return;
this._refreshAnimation();
});
this._settingsChangedSignalId = this._settings.connect('changed', Lang.bind(this, function() {
this.emit('changed');
}));
@ -282,10 +290,16 @@ const Background = new Lang.Class({
},
updateResolution: function() {
if (this._animation) {
this._removeAnimationTimeout();
this._updateAnimation();
}
if (this._animation)
this._refreshAnimation();
},
_refreshAnimation: function() {
if (!this._animation)
return;
this._removeAnimationTimeout();
this._updateAnimation();
},
_setLoaded: function() {

View File

@ -902,7 +902,7 @@ const EventsSection = new Lang.Class({
let app = this._getCalendarApp();
if (app.get_id() == 'evolution.desktop')
app = Gio.DesktopAppInfo.new('evolution-calendar.desktop');
app.launch([], global.create_app_launch_context(0, -1));
app.launch([], global.create_app_launch_context(0, -1), false);
},
setDate: function(date) {

View File

@ -64,7 +64,8 @@ function startAppForMount(app, mount) {
try {
retval = app.launch(files,
global.create_app_launch_context(0, -1))
global.create_app_launch_context(0, -1),
false)
} catch (e) {
log('Unable to launch the application ' + app.get_name()
+ ': ' + e.toString());

View File

@ -615,6 +615,14 @@ const NetworkAgent = new Lang.Class({
this._vpnRequests = { };
this._notifications = { };
this._pluginDir = Gio.file_new_for_path(GLib.build_filenamev([Config.SYSCONFDIR, 'NetworkManager/VPN']));
try {
let monitor = this._pluginDir.monitor(Gio.FileMonitorFlags.NONE, null);
monitor.connect('changed', () => { this._vpnCacheBuilt = false; });
} catch(e) {
log('Failed to create monitor for VPN plugin dir: ' + e.message);
}
this._native.connect('new-request', Lang.bind(this, this._newRequest));
this._native.connect('cancel-request', Lang.bind(this, this._cancelRequest));
@ -765,9 +773,8 @@ const NetworkAgent = new Lang.Class({
this._vpnCacheBuilt = true;
this._vpnBinaries = { };
let dir = Gio.file_new_for_path(GLib.build_filenamev([Config.SYSCONFDIR, 'NetworkManager/VPN']));
try {
let fileEnum = dir.enumerate_children('standard::name', Gio.FileQueryInfoFlags.NONE, null);
let fileEnum = this._pluginDir.enumerate_children('standard::name', Gio.FileQueryInfoFlags.NONE, null);
let info;
while ((info = fileEnum.next_file(null))) {
@ -777,7 +784,7 @@ const NetworkAgent = new Lang.Class({
try {
let keyfile = new GLib.KeyFile();
keyfile.load_from_file(dir.get_child(name).get_path(), GLib.KeyFileFlags.NONE);
keyfile.load_from_file(this._pluginDir.get_child(name).get_path(), GLib.KeyFileFlags.NONE);
let service = keyfile.get_string('VPN Connection', 'service');
let binary = keyfile.get_string('GNOME', 'auth-dialog');
let externalUIMode = false;
@ -810,7 +817,7 @@ const NetworkAgent = new Lang.Class({
}
} catch(e) {
log('Error \'%s\' while processing VPN keyfile \'%s\''.
format(e.message, dir.get_child(name).get_path()));
format(e.message, this._pluginDir.get_child(name).get_path()));
continue;
}
}

View File

@ -475,6 +475,11 @@ const ChatSource = new Lang.Class({
this._channel.close_async(function(channel, result) {
channel.close_finish(result);
});
} else {
// Don't indicate any unread messages when the notification
// that represents them has been destroyed.
this._pendingMessages = [];
this.countUpdated();
}
// Keep source alive while the channel is open

View File

@ -61,10 +61,19 @@ function _patchLayoutClass(layoutClass, styleProps) {
};
}
function _makeLoggingFunc(func) {
return function() {
return func([].join.call(arguments, ', '));
};
function _loggingFunc() {
let fields = {'MESSAGE': [].join.call(arguments, ', ')};
let domain = "GNOME Shell";
// If the caller is an extension, add it as metadata
let extension = imports.misc.extensionUtils.getCurrentExtension();
if (extension != null) {
domain = extension.metadata.name;
fields['GNOME_SHELL_EXTENSION_UUID'] = extension.uuid;
fields['GNOME_SHELL_EXTENSION_NAME'] = extension.metadata.name;
}
GLib.log_structured(domain, GLib.LogLevelFlags.LEVEL_MESSAGE, fields);
}
function init() {
@ -72,7 +81,7 @@ function init() {
// browser convention of having that namespace be called 'window'.)
window.global = Shell.Global.get();
window.log = _makeLoggingFunc(window.log);
window.log = _loggingFunc;
window._ = Gettext.gettext;
window.C_ = Gettext.pgettext;

View File

@ -26,6 +26,7 @@ const ModalDialog = imports.ui.modalDialog;
const OsdWindow = imports.ui.osdWindow;
const OsdMonitorLabeler = imports.ui.osdMonitorLabeler;
const Overview = imports.ui.overview;
const PadOsd = imports.ui.padOsd;
const Panel = imports.ui.panel;
const Params = imports.misc.params;
const RunDialog = imports.ui.runDialog;
@ -61,6 +62,7 @@ let screenShield = null;
let notificationDaemon = null;
let windowAttentionHandler = null;
let ctrlAltTabManager = null;
let padOsdService = null;
let osdWindowManager = null;
let osdMonitorLabeler = null;
let sessionMode = null;
@ -155,6 +157,7 @@ function _initializeUI() {
// working until it's updated.
uiGroup = layoutManager.uiGroup;
padOsdService = new PadOsd.PadOsdService();
screencastService = new Screencast.ScreencastService();
xdndHandler = new XdndHandler.XdndHandler();
ctrlAltTabManager = new CtrlAltTab.CtrlAltTabManager();

View File

@ -72,8 +72,8 @@ const OsdWindowConstraint = new Lang.Class({
// Recenter
let [x, y] = actorBox.get_origin();
actorBox.set_origin(Math.floor(x + width / 2 - size / 2),
Math.floor(y + height / 2 - size / 2));
actorBox.set_origin(Math.ceil(x + width / 2 - size / 2),
Math.ceil(y + height / 2 - size / 2));
}
});
@ -109,8 +109,11 @@ const OsdWindow = new Lang.Class({
this._reset();
Main.layoutManager.connect('monitors-changed',
Lang.bind(this, this._monitorsChanged));
this._monitorsChanged();
Lang.bind(this, this._relayout));
let themeContext = St.ThemeContext.get_for_stage(global.stage);
themeContext.connect('notify::scale-factor',
Lang.bind(this, this._relayout));
this._relayout();
Main.uiGroup.add_child(this.actor);
},
@ -188,7 +191,7 @@ const OsdWindow = new Lang.Class({
this.setLevel(null);
},
_monitorsChanged: function() {
_relayout: function() {
/* assume 110x110 on a 640x480 display and scale from there */
let monitor = Main.layoutManager.monitors[this._monitorIndex];
if (!monitor)

761
js/ui/padOsd.js Normal file
View File

@ -0,0 +1,761 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Lang = imports.lang;
const Meta = imports.gi.Meta;
const Shell = imports.gi.Shell;
const Clutter = imports.gi.Clutter;
const St = imports.gi.St;
const Rsvg = imports.gi.Rsvg;
const GObject = imports.gi.GObject;
const GLib = imports.gi.GLib;
const Gtk = imports.gi.Gtk;
const Gio = imports.gi.Gio;
const GDesktopEnums = imports.gi.GDesktopEnums;
const Atk = imports.gi.Atk;
const Cairo = imports.cairo;
const Signals = imports.signals;
const Main = imports.ui.main;
const PopupMenu = imports.ui.popupMenu;
const Layout = imports.ui.layout;
const ACTIVE_COLOR = "#729fcf";
const LTR = 0;
const RTL = 1;
const CW = 0;
const CCW = 1;
const UP = 0;
const DOWN = 1;
const KeybindingEntry = new Lang.Class({
Name: 'KeybindingEntry',
_init: function () {
this.actor = new St.Entry({ hint_text: _("New shortcut…"),
style: 'width: 10em' });
this.actor.connect('captured-event', Lang.bind(this, this._onCapturedEvent));
},
_onCapturedEvent: function (actor, event) {
if (event.type() != Clutter.EventType.KEY_PRESS)
return Clutter.EVENT_PROPAGATE;
let str = Gtk.accelerator_name_with_keycode(null,
event.get_key_symbol(),
event.get_key_code(),
event.get_state());
this.actor.set_text(str);
this.emit('keybinding-edited', str);
return Clutter.EVENT_STOP;
}
});
Signals.addSignalMethods(KeybindingEntry.prototype);
const ActionComboBox = new Lang.Class({
Name: 'ActionComboBox',
_init: function () {
this.actor = new St.Button({ style_class: 'button' });
this.actor.connect('clicked', Lang.bind(this, this._onButtonClicked));
this.actor.set_toggle_mode(true);
let boxLayout = new Clutter.BoxLayout({ orientation: Clutter.Orientation.HORIZONTAL,
spacing: 6 });
let box = new St.Widget({ layout_manager: boxLayout });
this.actor.set_child(box);
this._label = new St.Label({ style_class: 'combo-box-label' });
box.add_child(this._label)
let arrow = new St.Icon({ style_class: 'popup-menu-arrow',
icon_name: 'pan-down-symbolic',
accessible_role: Atk.Role.ARROW,
y_expand: true,
y_align: Clutter.ActorAlign.CENTER });
box.add_child(arrow);
this._editMenu = new PopupMenu.PopupMenu(this.actor, 0, St.Side.TOP);
this._editMenu.connect('menu-closed', Lang.bind(this, function() { this.actor.set_checked(false); }));
this._editMenu.actor.hide();
Main.uiGroup.add_actor(this._editMenu.actor);
this._actionLabels = new Map();
this._actionLabels.set(GDesktopEnums.PadButtonAction.NONE, _("Application defined"));
this._actionLabels.set(GDesktopEnums.PadButtonAction.HELP, _("Show on-screen help"));
this._actionLabels.set(GDesktopEnums.PadButtonAction.SWITCH_MONITOR, _("Switch monitor"));
this._actionLabels.set(GDesktopEnums.PadButtonAction.KEYBINDING, _("Assign keystroke"));
for (let [action, label] of this._actionLabels.entries()) {
let selectedAction = action;
this._editMenu.addAction(label, Lang.bind(this, function() { this._onActionSelected(selectedAction) }));
}
this.setAction(GDesktopEnums.PadButtonAction.NONE);
},
_onActionSelected: function (action) {
this.setAction(action);
this.popdown();
this.emit('action-selected', action);
},
setAction: function (action) {
this._label.set_text(this._actionLabels.get(action));
},
popup: function () {
this._editMenu.open(true);
},
popdown: function () {
this._editMenu.close(true);
},
_onButtonClicked: function () {
if (this.actor.get_checked())
this.popup();
else
this.popdown();
}
});
Signals.addSignalMethods(ActionComboBox.prototype);
const ActionEditor = new Lang.Class({
Name: 'ActionEditor',
_init: function () {
let boxLayout = new Clutter.BoxLayout({ orientation: Clutter.Orientation.HORIZONTAL,
spacing: 12 });
this.actor = new St.Widget({ layout_manager: boxLayout });
this._actionComboBox = new ActionComboBox();
this._actionComboBox.connect('action-selected', Lang.bind(this, this._onActionSelected));
this.actor.add_actor(this._actionComboBox.actor);
this._keybindingEdit = new KeybindingEntry();
this._keybindingEdit.connect('keybinding-edited', Lang.bind(this, this._onKeybindingEdited));
this.actor.add_actor(this._keybindingEdit.actor);
this._doneButton = new St.Button({ label: _("Done"),
style_class: 'button',
x_expand: false});
this._doneButton.connect('clicked', Lang.bind(this, this._onEditingDone));
this.actor.add_actor(this._doneButton);
},
_updateKeybindingEntryState: function () {
if (this._currentAction == GDesktopEnums.PadButtonAction.KEYBINDING) {
this._keybindingEdit.actor.set_text(this._currentKeybinding);
this._keybindingEdit.actor.show();
this._keybindingEdit.actor.grab_key_focus();
} else {
this._keybindingEdit.actor.hide();
}
},
setSettings: function (settings) {
this._buttonSettings = settings;
this._currentAction = this._buttonSettings.get_enum('action');
this._currentKeybinding = this._buttonSettings.get_string('keybinding');
this._actionComboBox.setAction(this._currentAction);
this._updateKeybindingEntryState();
},
close: function() {
this._actionComboBox.popdown();
this.actor.hide();
},
_onKeybindingEdited: function (entry, keybinding) {
this._currentKeybinding = keybinding;
},
_onActionSelected: function (menu, action) {
this._currentAction = action;
this._updateKeybindingEntryState();
},
_storeSettings: function () {
if (!this._buttonSettings)
return;
let keybinding = null;
if (this._currentAction == GDesktopEnums.PadButtonAction.KEYBINDING)
keybinding = this._currentKeybinding;
this._buttonSettings.set_enum('action', this._currentAction);
if (keybinding)
this._buttonSettings.set_string('keybinding', keybinding);
else
this._buttonSettings.reset('keybinding');
},
_onEditingDone: function () {
this._storeSettings();
this.close();
this.emit('done');
}
});
Signals.addSignalMethods(ActionEditor.prototype);
const PadDiagram = new Lang.Class({
Name: 'PadDiagram',
Extends: St.DrawingArea,
Properties: { 'left-handed': GObject.ParamSpec.boolean('left-handed',
'left-handed', 'Left handed',
GObject.ParamFlags.READWRITE |
GObject.ParamFlags.CONSTRUCT_ONLY,
false),
'image': GObject.ParamSpec.string('image', 'image', 'Image',
GObject.ParamFlags.READWRITE |
GObject.ParamFlags.CONSTRUCT_ONLY,
null),
'editor-actor': GObject.ParamSpec.object('editor-actor',
'editor-actor',
'Editor actor',
GObject.ParamFlags.READWRITE |
GObject.ParamFlags.CONSTRUCT_ONLY,
Clutter.Actor.$gtype) },
_init: function (params) {
let file = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/pad-osd.css');
let [success, css, etag] = file.load_contents(null);
this._css = css;
this._labels = [];
this._activeButtons = [];
this.parent(params);
},
get left_handed() {
return this._leftHanded;
},
set left_handed(leftHanded) {
this._leftHanded = leftHanded;
},
get image() {
return this._imagePath;
},
set image(imagePath) {
let originalHandle = Rsvg.Handle.new_from_file(imagePath);
let dimensions = originalHandle.get_dimensions();
this._imageWidth = dimensions.width;
this._imageHeight = dimensions.height;
this._imagePath = imagePath;
this._handle = this._composeStyledDiagram();
},
get editor_actor() {
return this._editorActor;
},
set editor_actor(actor) {
actor.hide();
this._editorActor = actor;
this.add_actor(actor);
},
_wrappingSvgHeader: function () {
return ('<?xml version="1.0" encoding="UTF-8" standalone="no"?>' +
'<svg version="1.1" xmlns="http://www.w3.org/2000/svg" ' +
'xmlns:xi="http://www.w3.org/2001/XInclude" ' +
'width="' + this._imageWidth + '" height="' + this._imageHeight + '"> ' +
'<style type="text/css">');
},
_wrappingSvgFooter: function () {
return ('</style>' +
'<xi:include href="' + this._imagePath + '" />' +
'</svg>');
},
_cssString: function () {
let css = this._css;
for (let i = 0; i < this._activeButtons.length; i++) {
let ch = String.fromCharCode('A'.charCodeAt() + this._activeButtons[i]);
css += ('.' + ch + ' { ' +
' stroke: ' + ACTIVE_COLOR + ' !important; ' +
' fill: ' + ACTIVE_COLOR + ' !important; ' +
'} ');
}
return css;
},
_composeStyledDiagram: function () {
let svgData = '';
if (!GLib.file_test(this._imagePath, GLib.FileTest.EXISTS))
return null;
svgData += this._wrappingSvgHeader();
svgData += this._cssString();
svgData += this._wrappingSvgFooter();
let handle = new Rsvg.Handle();
handle.set_base_uri(GLib.path_get_dirname(this._imagePath));
handle.write(svgData);
handle.close();
return handle;
},
_updateDiagramScale: function () {
if (this._handle == null)
return;
[this._actorWidth, this._actorHeight] = this.get_size();
let dimensions = this._handle.get_dimensions();
let scaleX = this._actorWidth / dimensions.width;
let scaleY = this._actorHeight / dimensions.height;
this._scale = Math.min(scaleX, scaleY);
},
_allocateChild: function (child, x, y, direction) {
let [prefHeight, natHeight] = child.get_preferred_height(-1);
let [prefWidth, natWidth] = child.get_preferred_width(natHeight);
let childBox = new Clutter.ActorBox();
if (direction == LTR) {
childBox.x1 = x;
childBox.x2 = x + natWidth;
} else {
childBox.x1 = x - natWidth;
childBox.x2 = x;
}
childBox.y1 = y - natHeight / 2;
childBox.y2 = y + natHeight / 2;
child.allocate(childBox, 0);
},
vfunc_allocate: function (box, flags) {
this.parent(box, flags);
this._updateDiagramScale();
for (let i = 0; i < this._labels.length; i++) {
let [label, action, idx, dir] = this._labels[i];
let [found, x, y, arrangement] = this.getLabelCoords(action, idx, dir);
this._allocateChild(label, x, y, arrangement);
}
if (this._editorActor && this._curEdited) {
let [label, action, idx, dir] = this._curEdited;
let [found, x, y, arrangement] = this.getLabelCoords(action, idx, dir);
this._allocateChild(this._editorActor, x, y, arrangement);
}
},
vfunc_repaint: function () {
if (this._handle == null)
return;
if (this._scale == null)
this._updateDiagramScale();
let [width, height] = this.get_surface_size();
let dimensions = this._handle.get_dimensions();
let cr = this.get_context();
cr.save();
cr.translate(width/2, height/2);
cr.scale(this._scale, this._scale);
if (this._leftHanded)
cr.rotate(Math.PI);
cr.translate(-dimensions.width/2, -dimensions.height/2);
this._handle.render_cairo(cr);
cr.restore();
cr.$dispose();
},
_transformPoint: function (x, y) {
if (this._handle == null || this._scale == null)
return [x, y];
// I miss Cairo.Matrix
let dimensions = this._handle.get_dimensions();
x = x * this._scale + this._actorWidth / 2 - dimensions.width / 2 * this._scale;
y = y * this._scale + this._actorHeight / 2 - dimensions.height / 2 * this._scale;;
return [Math.round(x), Math.round(y)];
},
_getItemLabelCoords: function (labelName, leaderName) {
if (this._handle == null)
return [false];
let leaderPos, leaderSize, pos;
let found, direction;
[found, pos] = this._handle.get_position_sub('#' + labelName);
if (!found)
return [false];
[found, leaderPos] = this._handle.get_position_sub('#' + leaderName);
[found, leaderSize] = this._handle.get_dimensions_sub('#' + leaderName);
if (!found)
return [false];
if (pos.x > leaderPos.x + leaderSize.width)
direction = LTR;
else
direction = RTL;
if (this._leftHanded) {
direction = 1 - direction;
pos.x = this._imageWidth - pos.x;
pos.y = this._imageHeight - pos.y;
}
let [x, y] = this._transformPoint(pos.x, pos.y)
return [true, x, y, direction];
},
getButtonLabelCoords: function (button) {
let ch = String.fromCharCode('A'.charCodeAt() + button);
let labelName = 'Label' + ch;
let leaderName = 'Leader' + ch;
return this._getItemLabelCoords(labelName, leaderName);
},
getRingLabelCoords: function (number, dir) {
let numStr = number > 0 ? number.toString() : '';
let dirStr = dir == CW ? 'CW' : 'CCW';
let labelName = 'LabelRing' + numStr + dirStr;
let leaderName = 'LeaderRing' + numStr + dirStr;
return this._getItemLabelCoords(labelName, leaderName);
},
getStripLabelCoords: function (number, dir) {
let numStr = number > 0 ? (number + 1).toString() : '';
let dirStr = dir == UP ? 'Up' : 'Down';
let labelName = 'LabelStrip' + numStr + dirStr;
let leaderName = 'LeaderStrip' + numStr + dirStr;
return this._getItemLabelCoords(labelName, leaderName);
},
getLabelCoords: function (action, idx, dir) {
if (action == Meta.PadActionType.BUTTON)
return this.getButtonLabelCoords(idx);
else if (action == Meta.PadActionType.RING)
return this.getRingLabelCoords(idx, dir);
else if (action == Meta.PadActionType.STRIP)
return this.getStripLabelCoords(idx, dir);
return [false];
},
_invalidateSvg: function () {
if (this._handle == null)
return;
this._handle = this._composeStyledDiagram();
this.queue_repaint();
},
activateButton: function (button) {
this._activeButtons.push(button);
this._invalidateSvg();
},
deactivateButton: function (button) {
for (let i = 0; i < this._activeButtons.length; i++) {
if (this._activeButtons[i] == button)
this._activeButtons.splice(i, 1);
}
this._invalidateSvg();
},
addLabel: function (label, type, idx, dir) {
this._labels.push([label, type, idx, dir]);
this.add_actor(label);
},
stopEdition: function (str) {
this._editorActor.hide();
if (this._curEdited) {
let [label, action, idx, dir] = this._curEdited;
if (str != null) {
label.set_text(str);
let [found, x, y, arrangement] = this.getLabelCoords(action, idx, dir);
this._allocateChild(label, x, y, arrangement);
}
label.show();
this._curEdited = null;
}
},
startEdition: function(action, idx, dir) {
let editedLabel;
this.stopEdition();
for (let i = 0; i < this._labels.length; i++) {
let [label, itemAction, itemIdx, itemDir] = this._labels[i];
if (action == itemAction && idx == itemIdx && dir == itemDir) {
this._curEdited = this._labels[i];
editedLabel = label;
break;
}
}
if (this._curEdited == null)
return;
let [found] = this.getLabelCoords(action, idx, dir);
if (!found)
return;
this._editorActor.show();
editedLabel.hide();
}
});
const PadOsd = new Lang.Class({
Name: 'PadOsd',
_init: function (padDevice, settings, imagePath, editionMode, monitorIndex) {
this.padDevice = padDevice;
this._settings = settings;
this._imagePath = imagePath;
this._editionMode = editionMode;
this._capturedEventId = global.stage.connect('captured-event', Lang.bind(this, this._onCapturedEvent));
let deviceManager = Clutter.DeviceManager.get_default();
this._deviceRemovedId = deviceManager.connect('device-removed', Lang.bind(this, function (manager, device) {
// If the device is being removed, destroy the padOsd.
if (device == this.padDevice)
this.destroy();
}));
this.actor = new St.BoxLayout({ style_class: 'pad-osd-window',
x_expand: true,
y_expand: true,
vertical: true,
reactive: true });
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
Main.uiGroup.add_actor(this.actor);
this._monitorIndex = monitorIndex;
let constraint = new Layout.MonitorConstraint({ index: monitorIndex });
this.actor.add_constraint(constraint);
this._titleLabel = new St.Label({ style: 'font-side: larger; font-weight: bold;',
x_align: Clutter.ActorAlign.CENTER });
this._titleLabel.clutter_text.set_text(padDevice.get_device_name());
this.actor.add_actor(this._titleLabel);
this._tipLabel = new St.Label({ x_align: Clutter.ActorAlign.CENTER });
this.actor.add_actor(this._tipLabel);
this._actionEditor = new ActionEditor();
this._actionEditor.connect('done', Lang.bind(this, this._endButtonActionEdition));
this._padDiagram = new PadDiagram({ image: this._imagePath,
left_handed: settings.get_boolean('left-handed'),
editor_actor: this._actionEditor.actor,
x_expand: true,
y_expand: true });
this.actor.add_actor(this._padDiagram);
// FIXME: Fix num buttons.
let i = 0;
for (i = 0; i < 50; i++) {
let [found] = this._padDiagram.getButtonLabelCoords(i);
if (!found)
break;
this._createLabel(Meta.PadActionType.BUTTON, i);
}
for (i = 0; i < padDevice.get_n_rings(); i++) {
this._createLabel(Meta.PadActionType.RING, i, CW);
this._createLabel(Meta.PadActionType.RING, i, CCW);
}
for (i = 0; i < padDevice.get_n_strips(); i++) {
this._createLabel(Meta.PadActionType.STRIP, i, UP);
this._createLabel(Meta.PadActionType.STRIP, i, DOWN);
}
let buttonBox = new St.Widget({ layout_manager: new Clutter.BinLayout(),
x_expand: true,
x_align: Clutter.ActorAlign.CENTER,
y_align: Clutter.ActorAlign.CENTER });
this.actor.add_actor(buttonBox);
this._editButton = new St.Button({ label: _("Edit…"),
style_class: 'button',
x_align: Clutter.ActorAlign.CENTER,
can_focus: true });
this._editButton.connect('clicked', Lang.bind(this, function () { this.setEditionMode(true) }));
buttonBox.add_actor(this._editButton);
this._syncEditionMode();
Main.pushModal(this.actor);
},
_createLabel: function (type, number, dir) {
let str = global.display.get_pad_action_label(this.padDevice, type, number);
let label = new St.Label({ text: str ? str : _("None") });
this._padDiagram.addLabel(label, type, number, dir);
},
_onCapturedEvent : function (actor, event) {
if (event.type() == Clutter.EventType.PAD_BUTTON_PRESS &&
event.get_source_device() == this.padDevice) {
this._padDiagram.activateButton(event.get_button());
if (this._editionMode)
this._startButtonActionEdition(event.get_button());
return Clutter.EVENT_STOP;
} else if (event.type() == Clutter.EventType.PAD_BUTTON_RELEASE &&
event.get_source_device() == this.padDevice) {
this._padDiagram.deactivateButton(event.get_button());
return Clutter.EVENT_STOP;
} else if (event.type() == Clutter.EventType.KEY_PRESS &&
(!this._editionMode || event.get_key_symbol() == Clutter.Escape)) {
if (this._editingButtonAction != null)
this._endButtonActionEdition();
else
this.destroy();
return Clutter.EVENT_STOP;
}
return Clutter.EVENT_PROPAGATE;
},
_syncEditionMode: function () {
this._editButton.set_reactive(!this._editionMode);
this._editButton.save_easing_state();
this._editButton.set_easing_duration(200);
this._editButton.set_opacity(this._editionMode ? 128 : 255);
this._editButton.restore_easing_state();
let title;
if (this._editionMode) {
title = _("Press a button to configure");
this._tipLabel.set_text(_("Press Esc to exit"));
} else {
title = this.padDevice.get_device_name();
this._tipLabel.set_text(_("Press any key to exit"));
}
this._titleLabel.clutter_text.set_markup('<span size="larger"><b>' + title + '</b></span>');
},
_endButtonActionEdition: function () {
this._actionEditor.close();
if (this._editingButtonAction != null) {
let str = global.display.get_pad_action_label(this.padDevice,
Meta.PadActionType.BUTTON,
this._editingButtonAction);
this._padDiagram.stopEdition(str ? str : _("None"))
this._editingButtonAction = null;
}
this._editedButtonSettings = null;
},
_startButtonActionEdition: function (button) {
if (this._editingButtonAction == button)
return;
this._endButtonActionEdition();
this._editingButtonAction = button;
let ch = String.fromCharCode('A'.charCodeAt() + button);
let settingsPath = this._settings.path + "button" + ch + '/';
this._editedButtonSettings = Gio.Settings.new_with_path('org.gnome.desktop.peripherals.tablet.pad-button',
settingsPath);
this._actionEditor.setSettings(this._editedButtonSettings);
this._padDiagram.startEdition(Meta.PadActionType.BUTTON, button);
},
setEditionMode: function (editionMode) {
if (this._editionMode == editionMode)
return;
this._editionMode = editionMode;
this._syncEditionMode();
},
destroy: function () {
this.actor.destroy();
},
_onDestroy: function () {
Main.popModal(this.actor);
this._actionEditor.close();
if (this._deviceRemovedId != 0) {
let deviceManager = Clutter.DeviceManager.get_default();
deviceManager.disconnect(this._deviceRemovedId);
this._deviceRemovedId = 0;
}
if (this._capturedEventId != 0) {
global.stage.disconnect(this._capturedEventId);
this._capturedEventId = 0;
}
this.actor = null;
this.emit('closed');
}
});
Signals.addSignalMethods(PadOsd.prototype);
const PadOsdIface = '<node> \
<interface name="org.gnome.Shell.Wacom.PadOsd"> \
<method name="Show"> \
<arg name="device_node" direction="in" type="o"/> \
<arg name="edition_mode" direction="in" type="b"/> \
</method> \
</interface> \
</node>';
const PadOsdService = new Lang.Class({
Name: 'PadOsdService',
_init: function() {
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(PadOsdIface, this);
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell/Wacom');
Gio.DBus.session.own_name('org.gnome.Shell.Wacom.PadOsd', Gio.BusNameOwnerFlags.REPLACE, null, null);
},
ShowAsync: function(params, invocation) {
let [deviceNode, editionMode] = params;
let deviceManager = Clutter.DeviceManager.get_default();
let devices = deviceManager.list_devices();
let padDevice = null;
devices.forEach(Lang.bind(this, function(device) {
if (deviceNode == device.get_device_node())
padDevice = device;
}));
if (padDevice == null ||
padDevice.get_device_type() != Clutter.InputDeviceType.PAD_DEVICE) {
invocation.return_error_literal(Gio.IOErrorEnum,
Gio.IOErrorEnum.CANCELLED,
"Invalid params");
return;
}
global.display.request_pad_osd(padDevice, editionMode);
invocation.return_value(null);
}
});
Signals.addSignalMethods(PadOsdService.prototype);

View File

@ -783,6 +783,16 @@ const PopupMenu = new Lang.Class({
break;
}
let state = event.get_state();
// if user has a modifier down (except capslock)
// then don't handle the key press here
state &= ~Clutter.ModifierType.LOCK_MASK;
state &= Clutter.ModifierType.MODIFIER_MASK;
if (state)
return Clutter.EVENT_PROPAGATE;
let symbol = event.get_key_symbol();
if (symbol == Clutter.KEY_space || symbol == Clutter.KEY_Return) {
this.toggle();

View File

@ -297,7 +297,7 @@ const RemoteSearchProvider = new Lang.Class({
// the provider is not compatible with the new version of the interface, launch
// the app itself but warn so we can catch the error in logs
log('Search provider ' + this.appInfo.get_id() + ' does not implement LaunchSearch');
this.appInfo.launch([], global.create_app_launch_context(0, -1));
this.appInfo.launch([], global.create_app_launch_context(0, -1), false);
}
});

View File

@ -274,7 +274,7 @@ const RunDialog = new Lang.Class({
_restart: function() {
if (Meta.is_wayland_compositor()) {
this._showError('Restart is not available on Wayland');
this._showError(_("Restart is not available on Wayland"));
return;
}
this._shouldFadeOut = false;

View File

@ -665,7 +665,10 @@ const ScreenShield = new Lang.Class({
let isEnter = (symbol == Clutter.KEY_Return ||
symbol == Clutter.KEY_KP_Enter ||
symbol == Clutter.KEY_ISO_Enter);
if (!isEnter && !(GLib.unichar_isprint(unichar) || symbol == Clutter.KEY_Escape))
let isEscape = (symbol == Clutter.KEY_Escape);
let isLiftChar = (GLib.unichar_isprint(unichar) &&
(this._isLocked || !GLib.unichar_isgraph(unichar)));
if (!isEnter && !isEscape && !isLiftChar)
return Clutter.EVENT_PROPAGATE;
if (this._isLocked &&
@ -847,6 +850,7 @@ const ScreenShield = new Lang.Class({
},
_activateFade: function(lightbox, time) {
Main.uiGroup.set_child_above_sibling(lightbox.actor, null);
lightbox.show(time);
if (this._becameActiveId == 0)

View File

@ -137,7 +137,7 @@ const Indicator = new Lang.Class({
else if (nConnectedDevices == -1)
this._item.label.text = _("Off");
else
this._item.label.text = _("Not In Use");
this._item.label.text = _("On");
this._toggleItem.label.text = this._proxy.BluetoothAirplaneMode ? _("Turn On") : _("Turn Off");
},

View File

@ -5,6 +5,7 @@ const GObject = imports.gi.GObject;
const Gio = imports.gi.Gio;
const Gtk = imports.gi.Gtk;
const Lang = imports.lang;
const Mainloop = imports.mainloop;
const NetworkManager = imports.gi.NetworkManager;
const NMClient = imports.gi.NMClient;
const NMGtk = imports.gi.NMGtk;
@ -39,6 +40,8 @@ const NMAccessPointSecurity = {
WPA2_ENT: 6
};
const MAX_DEVICE_ITEMS = 4;
// small optimization, to avoid using [] all the time
const NM80211Mode = NetworkManager['80211Mode'];
const NM80211ApFlags = NetworkManager['80211ApFlags'];
@ -752,10 +755,9 @@ const NMWirelessDialog = new Lang.Class({
this._updateSensitivity();
this._syncView();
if (accessPoints.length == 0) {
/* If there are no visible access points, request a scan */
this._device.request_scan_simple(null);
}
this._scanTimeoutId = Mainloop.timeout_add_seconds(15, Lang.bind(this, this._onScanTimeout));
GLib.Source.set_name_by_id(this._scanTimeoutId, '[gnome-shell] this._onScanTimeout');
this._onScanTimeout();
},
destroy: function() {
@ -780,9 +782,19 @@ const NMWirelessDialog = new Lang.Class({
this._airplaneModeChangedId = 0;
}
if (this._scanTimeoutId) {
Mainloop.source_remove(this._scanTimeoutId);
this._scanTimeoutId = 0;
}
this.parent();
},
_onScanTimeout: function() {
this._device.request_scan_simple(null);
return GLib.SOURCE_CONTINUE;
},
_activeApChanged: function() {
if (this._activeNetwork)
this._activeNetwork.item.setActive(false);
@ -1491,7 +1503,7 @@ const NMVPNSection = new Lang.Class({
if (nItems > 1) {
let appSys = Shell.AppSystem.get_default();
let app = appSys.lookup_app('gnome-network-panel.desktop');
app.launch(0, -1);
app.launch(0, -1, false);
} else {
let connection = this._connections[0];
Util.spawnApp(['gnome-control-center', 'network', 'show-device',
@ -1552,6 +1564,73 @@ const NMVPNSection = new Lang.Class({
});
Signals.addSignalMethods(NMVPNSection.prototype);
const DeviceCategory = new Lang.Class({
Name: 'DeviceCategory',
Extends: PopupMenu.PopupMenuSection,
_init: function(category) {
this.parent();
this._category = category;
this.devices = [];
this.section = new PopupMenu.PopupMenuSection();
this.section.box.connect('actor-added', Lang.bind(this, this._sync));
this.section.box.connect('actor-removed', Lang.bind(this, this._sync));
this.addMenuItem(this.section);
this._summaryItem = new PopupMenu.PopupSubMenuMenuItem('', true);
this._summaryItem.icon.icon_name = this._getSummaryIcon();
this.addMenuItem(this._summaryItem);
this._summaryItem.menu.addSettingsAction(_('Network Settings'),
'gnome-network-panel.desktop');
this._summaryItem.actor.hide();
},
_sync: function() {
let nDevices = this.section.box.get_children().reduce(
function(prev, child) {
return prev + (child.visible ? 1 : 0);
}, 0);
this._summaryItem.label.text = this._getSummaryLabel(nDevices);
let shouldSummarize = nDevices > MAX_DEVICE_ITEMS;
this._summaryItem.actor.visible = shouldSummarize;
this.section.actor.visible = !shouldSummarize;
},
_getSummaryIcon: function() {
switch(this._category) {
case NMConnectionCategory.WIRED:
return 'network-wired-symbolic';
case NMConnectionCategory.WIRELESS:
case NMConnectionCategory.WWAN:
return 'network-wireless-symbolic';
}
return '';
},
_getSummaryLabel: function(nDevices) {
switch(this._category) {
case NMConnectionCategory.WIRED:
return ngettext("%s Wired Connection",
"%s Wired Connections",
nDevices).format(nDevices);
case NMConnectionCategory.WIRELESS:
return ngettext("%s Wi-Fi Connection",
"%s Wi-Fi Connections",
nDevices).format(nDevices);
case NMConnectionCategory.WWAN:
return ngettext("%s Modem Connection",
"%s Modem Connections",
nDevices).format(nDevices);
}
return '';
}
});
const NMApplet = new Lang.Class({
Name: 'NMApplet',
Extends: PanelMenu.SystemIndicator,
@ -1595,15 +1674,6 @@ const NMApplet = new Lang.Class({
this._tryLateInit();
},
_createDeviceCategory: function() {
let category = {
section: new PopupMenu.PopupMenuSection(),
devices: [ ],
};
this.menu.addMenuItem(category.section);
return category;
},
_tryLateInit: function() {
if (!this._client || !this._settings)
return;
@ -1620,9 +1690,13 @@ const NMApplet = new Lang.Class({
this._nmDevices = [];
this._devices = { };
this._devices.wired = this._createDeviceCategory();
this._devices.wireless = this._createDeviceCategory();
this._devices.wwan = this._createDeviceCategory();
let categories = [NMConnectionCategory.WIRED,
NMConnectionCategory.WIRELESS,
NMConnectionCategory.WWAN];
for (let category of categories) {
this._devices[category] = new DeviceCategory(category);
this.menu.addMenuItem(this._devices[category]);
}
this._vpnSection = new NMVPNSection(this._client);
this._vpnSection.connect('activation-failed', Lang.bind(this, this._onActivationFailed));
@ -1632,6 +1706,8 @@ const NMApplet = new Lang.Class({
this._readConnections();
this._readDevices();
this._syncNMState();
this._syncMainConnection();
this._syncVPNConnections();
this._client.connect('notify::manager-running', Lang.bind(this, this._syncNMState));
this._client.connect('notify::networking-enabled', Lang.bind(this, this._syncNMState));
@ -2008,13 +2084,24 @@ const NMApplet = new Lang.Class({
},
_updateIcon: function() {
if (!this._client.networking_enabled || !this._mainConnection) {
if (!this._client.networking_enabled) {
this._primaryIndicator.visible = false;
} else {
let dev = this._mainConnection._primaryDevice;
this._primaryIndicator.visible = (dev != null);
if (dev)
let dev = null;
if (this._mainConnection)
dev = this._mainConnection._primaryDevice;
let state = this._client.get_state();
let connected = state == NetworkManager.State.CONNECTED_GLOBAL;
this._primaryIndicator.visible = (dev != null) || connected;
if (dev) {
this._primaryIndicator.icon_name = dev.getIndicatorIcon();
} else if (connected) {
if (this._client.connectivity == NetworkManager.ConnectivityState.FULL)
this._primaryIndicator.icon_name = 'network-wired-symbolic';
else
this._primaryIndicator.icon_name = 'network-wired-no-route-symbolic';
}
}
this._vpnIndicator.icon_name = this._vpnSection.getIndicatorIcon();

View File

@ -23,6 +23,7 @@ const EdgeDragAction = imports.ui.edgeDragAction;
const IconGrid = imports.ui.iconGrid;
const SHELL_KEYBINDINGS_SCHEMA = 'org.gnome.shell.keybindings';
const PINCH_GESTURE_THRESHOLD = 0.7;
const ViewPage = {
WINDOWS: 1,
@ -51,6 +52,28 @@ function getTermsForSearchString(searchString) {
return terms;
}
const TouchpadShowOverviewAction = new Lang.Class({
Name: 'TouchpadShowOverviewAction',
_init: function(actor) {
actor.connect('captured-event', Lang.bind(this, this._handleEvent));
},
_handleEvent: function(actor, event) {
if (event.type() != Clutter.EventType.TOUCHPAD_PINCH)
return Clutter.EVENT_PROPAGATE;
if (event.get_touchpad_gesture_finger_count() != 3)
return Clutter.EVENT_PROPAGATE;
if (event.get_gesture_phase() == Clutter.TouchpadGesturePhase.END)
this.emit('activated', event.get_gesture_pinch_scale ());
return Clutter.EVENT_STOP;
}
});
Signals.addSignalMethods(TouchpadShowOverviewAction.prototype);
const ShowOverviewAction = new Lang.Class({
Name: 'ShowOverviewAction',
Extends: Clutter.GestureAction,
@ -230,11 +253,16 @@ const ViewSelector = new Lang.Class({
global.stage.add_action(gesture);
gesture = new ShowOverviewAction();
gesture.connect('activated', Lang.bind(this, function(action, areaDiff) {
if (areaDiff < 0.7)
Main.overview.show();
}));
gesture.connect('activated', Lang.bind(this, this._pinchGestureActivated));
global.stage.add_action(gesture);
gesture = new TouchpadShowOverviewAction(global.stage);
gesture.connect('activated', Lang.bind(this, this._pinchGestureActivated));
},
_pinchGestureActivated: function(action, scale) {
if (scale < PINCH_GESTURE_THRESHOLD)
Main.overview.show();
},
_toggleAppsPage: function() {

View File

@ -17,6 +17,7 @@ const Main = imports.ui.main;
const ModalDialog = imports.ui.modalDialog;
const Tweener = imports.ui.tweener;
const WindowMenu = imports.ui.windowMenu;
const PadOsd = imports.ui.padOsd;
const SHELL_KEYBINDINGS_SCHEMA = 'org.gnome.shell.keybindings';
const MINIMIZE_WINDOW_ANIMATION_TIME = 0.2;
@ -510,7 +511,7 @@ const TouchpadWorkspaceSwitchAction = new Lang.Class({
if (event.type() != Clutter.EventType.TOUCHPAD_SWIPE)
return Clutter.EVENT_PROPAGATE;
if (event.get_gesture_swipe_finger_count() != 4)
if (event.get_touchpad_gesture_finger_count() != 4)
return Clutter.EVENT_PROPAGATE;
if (event.get_gesture_phase() == Clutter.TouchpadGesturePhase.UPDATE) {
@ -683,6 +684,8 @@ const WindowManager = new Lang.Class({
this._dimmedWindows = [];
this._skippedActors = [];
this._allowedKeybindings = {};
this._isWorkspacePrepended = false;
@ -703,6 +706,7 @@ const WindowManager = new Lang.Class({
this._shellwm.connect('minimize', Lang.bind(this, this._minimizeWindow));
this._shellwm.connect('unminimize', Lang.bind(this, this._unminimizeWindow));
this._shellwm.connect('size-change', Lang.bind(this, this._sizeChangeWindow));
this._shellwm.connect('size-changed', Lang.bind(this, this._sizeChangedWindow));
this._shellwm.connect('map', Lang.bind(this, this._mapWindow));
this._shellwm.connect('destroy', Lang.bind(this, this._destroyWindow));
this._shellwm.connect('filter-keybinding', Lang.bind(this, this._filterKeybinding));
@ -915,6 +919,7 @@ const WindowManager = new Lang.Class({
Lang.bind(this, this._toggleCalendar));
global.display.connect('show-resize-popup', Lang.bind(this, this._showResizePopup));
global.display.connect('show-pad-osd', Lang.bind(this, this._showPadOsd));
Main.overview.connect('showing', Lang.bind(this, function() {
for (let i = 0; i < this._dimmedWindows.length; i++)
@ -944,7 +949,13 @@ const WindowManager = new Lang.Class({
gesture = new AppSwitchAction();
gesture.connect('activated', Lang.bind(this, this._switchApp));
global.stage.add_action(gesture);
},
_showPadOsd: function (display, device, settings, imagePath, editionMode, monitorIndex) {
this._currentPadOsd = new PadOsd.PadOsd(device, settings, imagePath, editionMode, monitorIndex);
this._currentPadOsd.connect('closed', Lang.bind(this, function() { this._currentPadOsd = null }));
return this._currentPadOsd.actor;
},
_actionSwitchWorkspace: function(action, direction) {
@ -1035,6 +1046,10 @@ const WindowManager = new Lang.Class({
this._workspaceTracker.keepWorkspaceAlive(workspace, duration);
},
skipNextEffect: function(actor) {
this._skippedActors.push(actor);
},
setCustomKeybindingHandler: function(name, modes, handler) {
if (Meta.keybindings_set_custom_handler(name, handler))
this.allowKeybinding(name, modes);
@ -1061,6 +1076,9 @@ const WindowManager = new Lang.Class({
},
_shouldAnimateActor: function(actor, types) {
if (this._removeEffect(this._skippedActors, actor))
return false;
if (!this._shouldAnimate())
return false;
@ -1238,37 +1256,17 @@ const WindowManager = new Lang.Class({
return;
}
if (whichChange == Meta.SizeChange.FULLSCREEN)
this._fullscreenWindow(shellwm, actor, oldFrameRect, oldBufferRect);
else if (whichChange == Meta.SizeChange.UNFULLSCREEN)
this._unfullscreenWindow(shellwm, actor, oldFrameRect, oldBufferRect);
if ((whichChange == Meta.SizeChange.FULLSCREEN ||
whichChange == Meta.SizeChange.UNFULLSCREEN) &&
oldFrameRect.width > 0 && oldFrameRect.height > 0)
this._fullscreenAnimation(shellwm, actor, oldFrameRect, whichChange);
else
shellwm.completed_size_change(actor);
},
_fullscreenWindow: function(shellwm, actor, oldFrameRect, oldBufferRect) {
let monitor = Main.layoutManager.monitors[actor.meta_window.get_monitor()];
actor.translation_x = oldFrameRect.x - monitor.x;
actor.translation_y = oldFrameRect.y - monitor.y;
this._fullscreenAnimation(shellwm, actor, oldFrameRect);
},
_unfullscreenWindow: function(shellwm, actor, oldFrameRect, oldBufferRect) {
let targetRect = actor.meta_window.get_frame_rect();
let monitor = Main.layoutManager.monitors[actor.meta_window.get_monitor()];
actor.translation_x = -(targetRect.x - monitor.x);
actor.translation_y = -(targetRect.y - monitor.y);
this._fullscreenAnimation(shellwm, actor, oldFrameRect);
},
_fullscreenAnimation: function(shellwm, actor, oldFrameRect) {
this._resizing.push(actor);
_fullscreenAnimation: function(shellwm, actor, oldFrameRect, change) {
// Position a clone of the window on top of the old position,
// while actor updates are frozen.
// Note that the MetaWindow has up to date sizing information for
// the new geometry already.
let targetRect = actor.meta_window.get_frame_rect();
let actorContent = Shell.util_get_content_for_window_actor(actor, oldFrameRect);
let actorClone = new St.Widget({ content: actorContent });
actorClone.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS);
@ -1276,10 +1274,26 @@ const WindowManager = new Lang.Class({
actorClone.set_size(oldFrameRect.width, oldFrameRect.height);
Main.uiGroup.add_actor(actorClone);
actor.__fullscreenClone = actorClone;
let rect = change == Meta.SizeChange.FULLSCREEN ? oldFrameRect : null;
let scaleX = targetRect.width / oldFrameRect.width;
let scaleY = targetRect.height / oldFrameRect.height;
if (this._clearFullscreenInfo(actor))
this._shellwm.completed_size_change(actor);
actor.__fullscreenInfo = { clone: actorClone,
oldRect: rect };
},
_sizeChangedWindow: function(shellwm, actor) {
if (!actor.__fullscreenInfo)
return;
let actorClone = actor.__fullscreenInfo.clone;
let targetRect = actor.meta_window.get_frame_rect();
let scaleX = targetRect.width / actorClone.width;
let scaleY = targetRect.height / actorClone.height;
this._resizing.push(actor);
// Now scale and fade out the clone
Tweener.addTween(actorClone,
@ -1292,9 +1306,17 @@ const WindowManager = new Lang.Class({
transition: 'easeOutQuad'
});
let monitor = Main.layoutManager.monitors[actor.meta_window.get_monitor()];
let oldRect = actor.__fullscreenInfo.oldRect;
if (oldRect) {
actor.translation_x = oldRect.x - monitor.x;
actor.translation_y = oldRect.y - monitor.y;
} else {
actor.translation_x = -(targetRect.x - monitor.x);
actor.translation_y = -(targetRect.y - monitor.y);
}
// Now set scale the actor to size it as the clone.
// Note that the caller of this function already set a translation
// on the actor.
actor.scale_x = 1 / scaleX;
actor.scale_y = 1 / scaleY;
@ -1320,6 +1342,15 @@ const WindowManager = new Lang.Class({
shellwm.completed_size_change(actor);
},
_clearFullscreenInfo: function(actor) {
if (actor.__fullscreenInfo) {
actor.__fullscreenInfo.clone.destroy();
delete actor.__fullscreenInfo;
return true;
}
return false;
},
_sizeChangeWindowDone: function(shellwm, actor) {
if (this._removeEffect(this._resizing, actor)) {
Tweener.removeTweens(actor);
@ -1327,31 +1358,25 @@ const WindowManager = new Lang.Class({
actor.scale_y = 1.0;
actor.translation_x = 0;
actor.translation_y = 0;
let actorClone = actor.__fullscreenClone;
if (actorClone) {
actorClone.destroy();
delete actor.__fullscreenClone;
}
this._clearFullscreenInfo(actor);
}
},
_sizeChangeWindowOverwritten: function(shellwm, actor) {
if (this._removeEffect(this._resizing, actor)) {
let actorClone = actor.__fullscreenClone;
if (actorClone) {
actorClone.destroy();
delete actor.__fullscreenClone;
}
}
if (this._removeEffect(this._resizing, actor))
this._clearFullscreenInfo(actor);
},
_hasAttachedDialogs: function(window, ignoreWindow) {
var count = 0;
window.foreach_transient(function(win) {
if (win != ignoreWindow && win.is_attached_dialog())
if (win != ignoreWindow &&
win.is_attached_dialog() &&
win.get_transient_for() == window) {
count++;
return false;
return false;
}
return true;
});
return count != 0;
},
@ -1420,6 +1445,11 @@ const WindowManager = new Lang.Class({
actor._windowType = type;
}));
actor.meta_window.connect('unmanaged', Lang.bind(this, function(window) {
let parent = window.get_transient_for();
if (parent)
this._checkDimming(parent);
}));
if (actor.meta_window.is_attached_dialog())
this._checkDimming(actor.get_meta_window().get_transient_for());

View File

@ -19,8 +19,7 @@ const WorkspaceSwitcherPopup = new Lang.Class({
Name: 'WorkspaceSwitcherPopup',
_init : function() {
this.actor = new St.Widget({ reactive: true,
x: 0,
this.actor = new St.Widget({ x: 0,
y: 0,
width: global.screen_width,
height: global.screen_height,

View File

@ -29,6 +29,7 @@ gl
gu
he
hi
hr
hu
ia
id

View File

@ -10,7 +10,7 @@ top_builddir = ..
# These options get passed to xgettext.
XGETTEXT_OPTIONS = --from-code=UTF-8 --keyword=_ --keyword=N_ \
--keyword=C_:1c,2 --keyword=NC_:1c,2 \
--keyword=g_dngettext:2,3 \
--keyword=g_dngettext:2,3 --add-comments \
--flag=g_dngettext:2:pass-c-format \
--flag=g_strdup_printf:1:c-format \
--flag=g_string_printf:2:c-format \

View File

@ -39,6 +39,7 @@ js/ui/mpris.js
js/ui/notificationDaemon.js
js/ui/overviewControls.js
js/ui/overview.js
js/ui/padOsd.js
js/ui/panel.js
js/ui/popupMenu.js
js/ui/runDialog.js

798
po/ar.po

File diff suppressed because it is too large Load Diff

719
po/ca.po
View File

@ -10,324 +10,16 @@ msgstr ""
"Project-Id-Version: HEAD\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2016-03-13 10:20+0000\n"
"PO-Revision-Date: 2016-03-13 14:47+0100\n"
"Last-Translator: Gil Forcada <gilforcada@guifi.net>\n"
"POT-Creation-Date: 2016-09-16 21:22+0200\n"
"PO-Revision-Date: 2016-09-16 21:22+0200\n"
"Last-Translator: Jordi Mas <jmas@softcatala.org>\n"
"Language-Team: Catalan <tradgnome@softcatala.org>\n"
"Language: ca\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bits\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Gtranslator 2.91.6\n"
#: ../data/50-gnome-shell-system.xml.in.h:1
msgid "System"
msgstr "Sistema"
#: ../data/50-gnome-shell-system.xml.in.h:2
msgid "Show the notification list"
msgstr "Mostra la llista de notificacions"
#: ../data/50-gnome-shell-system.xml.in.h:3
msgid "Focus the active notification"
msgstr "Posa el focus en la notificació activa"
#: ../data/50-gnome-shell-system.xml.in.h:4
msgid "Show the overview"
msgstr "Mostra la vista general"
#: ../data/50-gnome-shell-system.xml.in.h:5
msgid "Show all applications"
msgstr "Mostra totes les aplicacions"
#: ../data/50-gnome-shell-system.xml.in.h:6
msgid "Open the application menu"
msgstr "Obre el menú d'aplicació"
#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:1
msgid "GNOME Shell Extension Preferences"
msgstr "Preferències de les extensions del GNOME Shell"
#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:2
msgid "Configure GNOME Shell Extensions"
msgstr "Configureu les extensions del GNOME Shell"
#: ../data/org.gnome.Shell.desktop.in.in.h:1
msgid "GNOME Shell"
msgstr "GNOME Shell"
#: ../data/org.gnome.Shell.desktop.in.in.h:2
msgid "Window management and application launching"
msgstr "Gestor de finestres i llançador d'aplicacions"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:1
msgid "Enable internal tools useful for developers and testers from Alt-F2"
msgstr ""
"Habilita les eines internes en el diàleg de l'Alt+F2 que són útils per als "
"desenvolupadors i provadors"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:2
msgid ""
"Allows access to internal debugging and monitoring tools using the Alt-F2 "
"dialog."
msgstr ""
"Permet l'accés a les eines de depuració i de seguiment internes a través del "
"diàleg de l'Alt+F2."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:3
msgid "UUIDs of extensions to enable"
msgstr ""
"Identificadors universals únics de les extensions que s'han d'habilitar"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:4
msgid ""
"GNOME Shell extensions have a UUID property; this key lists extensions which "
"should be loaded. Any extension that wants to be loaded needs to be in this "
"list. You can also manipulate this list with the EnableExtension and "
"DisableExtension D-Bus methods on org.gnome.Shell."
msgstr ""
"Les extensions del GNOME Shell tenen un identificador universal. Aquesta "
"clau conté una llista de les extensions que s'han de carregar. Qualsevol "
"extensió que s'hagi de carregar ha de ser a la llista. Podeu modificar "
"aquesta llista amb els mètodes de D-Bus «EnableExtension» (activa una "
"extensió) i «DisableExtension» (desactiva una extensió) a org.gnome.Shell."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:5
msgid "Disables the validation of extension version compatibility"
msgstr "Desactiva la validació de la compatibilitat de versió d'extensions"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:6
msgid ""
"GNOME Shell will only load extensions that claim to support the current "
"running version. Enabling this option will disable this check and try to "
"load all extensions regardless of the versions they claim to support."
msgstr ""
"El GNOME Shell només carregarà extensions que afirmin ser compatibles amb la "
"versió en execució. Si s'activa aquesta opció, es desactivarà la comprovació "
"i es provarà de carregar totes les extensions sense tenir en compte les "
"versions amb què afirmin ser compatibles."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:7
msgid "List of desktop file IDs for favorite applications"
msgstr ""
"Llista d'identificadors de fitxers d'escriptori de les aplicacions preferides"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:8
msgid ""
"The applications corresponding to these identifiers will be displayed in the "
"favorites area."
msgstr ""
"Es mostraran, a l'àrea de preferits, les aplicacions que corresponguin a "
"aquests identificadors."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:9
msgid "App Picker View"
msgstr "Vista del seleccionador d'aplicacions"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:10
msgid "Index of the currently selected view in the application picker."
msgstr ""
"Índex de la vista seleccionada actualment en el seleccionador d'aplicacions."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:11
msgid "History for command (Alt-F2) dialog"
msgstr "Historial de les ordres utilitzades en el diàleg de l'Alt+F2"
#. Translators: looking glass is a debugger and inspector tool, see https://live.gnome.org/GnomeShell/LookingGlass
#: ../data/org.gnome.shell.gschema.xml.in.in.h:13
msgid "History for the looking glass dialog"
msgstr "Historial del depurador del GNOME Shell"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14
msgid "Always show the 'Log out' menu item in the user menu."
msgstr "Mostra sempre l'element de menú «Surt» al menú d'usuari."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
msgid ""
"This key overrides the automatic hiding of the 'Log out' menu item in single-"
"user, single-session situations."
msgstr ""
"Aquesta clau sobreescriu l'ocultació automàtica de l'element de menú «Surt» "
"quan només hi ha un usuari i un sol tipus de sessió."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
msgid ""
"Whether to remember password for mounting encrypted or remote filesystems"
msgstr ""
"Si s'han de recordar les contrasenyes dels punts de muntatge encriptats o "
"els sistemes de fitxers remots"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
msgid ""
"The shell will request a password when an encrypted device or a remote "
"filesystem is mounted. If the password can be saved for future use a "
"'Remember Password' checkbox will be present. This key sets the default "
"state of the checkbox."
msgstr ""
"El GNOME Shell us demanarà la contrasenya quan es munti un dispositiu "
"encriptat o un sistema de fitxers remot. Si es pot desar la contrasenya per "
"utilitzar-lo en el futur, es mostrarà la casella de verificació «Recorda la "
"contrasenya». Aquesta clau estableix el valor per defecte d'aquesta casella "
"de verificació."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
msgid ""
"Whether the default Bluetooth adapter had set up devices associated to it"
msgstr ""
"Si l'adaptador de Bluetooth predeterminat té dispositius configurats "
"associats"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
msgid ""
"The shell will only show a Bluetooth menu item if a Bluetooth adapter is "
"powered, or if there were devices set up associated with the default "
"adapter. This will be reset if the default adapter is ever seen not to have "
"devices associated to it."
msgstr ""
"El Shell només mostrà una entrada de menú Bluetooth si un adaptador Bluetooh "
"està engegat, o si hi ha dispositius configurats associats a l'adaptador "
"predeterminat. Això es reiniciarà si l'adaptador predeterminat té "
"dispositius associats."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
msgid "Show the week date in the calendar"
msgstr "Mostra el número de la setmana al calendari"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
msgid "If true, display the ISO week date in the calendar."
msgstr "Si és «true» (cert) es mostra el número de la setmana al calendari."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
msgid "Keybinding to open the application menu"
msgstr "Vinculació per obrir el menú d'aplicació"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
msgid "Keybinding to open the application menu."
msgstr "La vinculació per obrir el menú d'aplicació."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
msgid "Keybinding to open the \"Show Applications\" view"
msgstr "Vinculació per obrir la vista «Mostra les aplicacions»"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
msgid ""
"Keybinding to open the \"Show Applications\" view of the Activities Overview."
msgstr ""
"Vinculació per obrir la vista «Mostra les aplicacions» de les activitats de "
"la vista general."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
msgid "Keybinding to open the overview"
msgstr "Vinculació per obrir la vista general"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
msgid "Keybinding to open the Activities Overview."
msgstr "Vinculació per obrir la vista general d'activitats."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
msgid "Keybinding to toggle the visibility of the notification list"
msgstr ""
"La vinculació per commutar la visibilitat de la llista de notificacions"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
msgid "Keybinding to toggle the visibility of the notification list."
msgstr ""
"La vinculació per commutar la visibilitat de la llista de notificacions."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
msgid "Keybinding to focus the active notification"
msgstr "Vinculació per posar el focus a la notificació activa"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
msgid "Keybinding to focus the active notification."
msgstr "Vinculació per posar el focus a la notificació activa."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
msgid ""
"Keybinding that pauses and resumes all running tweens, for debugging purposes"
msgstr ""
"Vinculació que fa una pausa i continua tots els «tweens» en execució, per "
"motius de depuració"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
msgid "Which keyboard to use"
msgstr "Quin tipus de teclat s'ha d'utilitzar"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
msgid "The type of keyboard to use."
msgstr "El tipus de teclat que s'utilitzarà."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
msgid "Limit switcher to current workspace."
msgstr "Limita el canviador a l'espai de treball actual."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:36
msgid ""
"If true, only applications that have windows on the current workspace are "
"shown in the switcher. Otherwise, all applications are included."
msgstr ""
"Si és «true» (cert), només les aplicacions que tinguin finestres en l'espai "
"de treball actual es mostren en el canviador. En cas contrari es mostren "
"totes les aplicacions."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
msgid "The application icon mode."
msgstr "El mode d'icona de les aplicacions."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
msgid ""
"Configures how the windows are shown in the switcher. Valid possibilities "
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
"only' (shows only the application icon) or 'both'."
msgstr ""
"Configureu com es mostren les finestres en l'intercanviador. Els valors "
"possibles són: «thumbnail-only» (mostra una miniatura de la finestra), «app-"
"icon-only» (mostra la icona de l'aplicació) o «both» (ambdues coses: mostra "
"la miniatura de la finestra i la icona de l'aplicació)."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
msgid ""
"If true, only windows from the current workspace are shown in the switcher. "
"Otherwise, all windows are included."
msgstr ""
"Si és «true» (cert), només les finestres de l'espai de treball actual es "
"mostren en el canviador. En cas contrari, es mostren totes les finestres."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
msgid "Attach modal dialog to the parent window"
msgstr "Adjunta el diàleg modal a la finestra pare"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41
msgid ""
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
msgstr ""
"Si s'executa el GNOME Shell, aquesta clau sobreescriu la clau «org.gnome."
"mutter»."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
msgid "Enable edge tiling when dropping windows on screen edges"
msgstr ""
"Habilita la tesselització a les vores en deixar anar les finestres a les "
"vores de la pantalla"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
msgid "Workspaces are managed dynamically"
msgstr "Els espais de treball es gestionen dinàmicament"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:44
msgid "Workspaces only on primary monitor"
msgstr "Només en el monitor principal hi ha espais de treball"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:45
msgid "Delay focus changes in mouse mode until the pointer stops moving"
msgstr ""
"Retarda el canvi del focus, quan s'està en mode ratolí, fins que el punter "
"no estigui quiet"
#: ../data/org.gnome.Shell.PortalHelper.desktop.in.h:1
msgid "Network Login"
msgstr "Inici de sessió de la xarxa"
"X-Generator: Poedit 1.8.7.1\n"
#: ../js/extensionPrefs/main.js:117
#, javascript-format
@ -340,7 +32,7 @@ msgstr "Extensions del GNOME Shell"
#: ../js/gdm/authPrompt.js:147 ../js/ui/audioDeviceSelection.js:71
#: ../js/ui/components/networkAgent.js:145
#: ../js/ui/components/polkitAgent.js:179 ../js/ui/endSessionDialog.js:452
#: ../js/ui/components/polkitAgent.js:179 ../js/ui/endSessionDialog.js:483
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/network.js:916
msgid "Cancel"
@ -374,7 +66,7 @@ msgstr "No esteu llistat?"
#. Translators: this message is shown below the username entry field
#. to clue the user in on how to login to the local network realm
#: ../js/gdm/loginDialog.js:854
#: ../js/gdm/loginDialog.js:859
#, javascript-format
msgid "(e.g., user or %s)"
msgstr "(p. ex. l'usuari o %s)"
@ -382,12 +74,12 @@ msgstr "(p. ex. l'usuari o %s)"
#. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one)
#: ../js/gdm/loginDialog.js:859 ../js/ui/components/networkAgent.js:271
#: ../js/gdm/loginDialog.js:864 ../js/ui/components/networkAgent.js:271
#: ../js/ui/components/networkAgent.js:289
msgid "Username: "
msgstr "Nom d'usuari:"
#: ../js/gdm/loginDialog.js:1196
#: ../js/gdm/loginDialog.js:1201
msgid "Login Window"
msgstr "Finestra d'entrada"
@ -495,6 +187,16 @@ msgstr "%d de %B de %Y, a les %l%M %p"
msgid "Web Authentication Redirect"
msgstr "Redirecció per l'autenticació web"
#. No support for non-modal system dialogs, so ignore the option
#. let modal = options['modal'] || true;
#: ../js/ui/accessDialog.js:62 ../js/ui/status/location.js:426
msgid "Deny Access"
msgstr "Denega l'accés"
#: ../js/ui/accessDialog.js:63 ../js/ui/status/location.js:429
msgid "Grant Access"
msgstr "Permetre l'accés"
#: ../js/ui/appDisplay.js:794
msgid "Frequently used applications will appear here"
msgstr "Les aplicacions utilitzades freqüentment apareixeran aquí"
@ -561,7 +263,7 @@ msgstr "Canvia el fons de l'escriptori…"
msgid "Display Settings"
msgstr "Paràmetres de la pantalla"
#: ../js/ui/backgroundMenu.js:22 ../js/ui/status/system.js:366
#: ../js/ui/backgroundMenu.js:22 ../js/ui/status/system.js:374
msgid "Settings"
msgstr "Paràmetres"
@ -617,55 +319,55 @@ msgctxt "grid saturday"
msgid "S"
msgstr "Ds"
#: ../js/ui/calendar.js:416
#: ../js/ui/calendar.js:442
msgid "Previous month"
msgstr "Mes anterior"
#: ../js/ui/calendar.js:426
#: ../js/ui/calendar.js:452
msgid "Next month"
msgstr "Mes següent"
#: ../js/ui/calendar.js:579
#: ../js/ui/calendar.js:605
#, no-javascript-format
msgctxt "date day number format"
msgid "%d"
msgstr "%d"
#: ../js/ui/calendar.js:634
#: ../js/ui/calendar.js:660
msgid "Week %V"
msgstr "Setmana %V"
#. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters
#.
#: ../js/ui/calendar.js:695
#: ../js/ui/calendar.js:721
msgctxt "event list time"
msgid "All Day"
msgstr "Tot el dia"
#: ../js/ui/calendar.js:821
#: ../js/ui/calendar.js:836
msgid "Events"
msgstr "Cites"
#: ../js/ui/calendar.js:830
#: ../js/ui/calendar.js:845
msgctxt "calendar heading"
msgid "%A, %B %d"
msgstr "%A %d de %B"
#: ../js/ui/calendar.js:834
#: ../js/ui/calendar.js:849
msgctxt "calendar heading"
msgid "%A, %B %d, %Y"
msgstr "%A %d de %B de %Y"
#: ../js/ui/calendar.js:919
#: ../js/ui/calendar.js:931
msgid "Notifications"
msgstr "Notificacions"
#: ../js/ui/calendar.js:1070
#: ../js/ui/calendar.js:1082
msgid "No Notifications"
msgstr "Cap notificació"
#: ../js/ui/calendar.js:1073
#: ../js/ui/calendar.js:1085
msgid "No Events"
msgstr "Cap cita"
@ -803,7 +505,7 @@ msgstr "No ha funcionat. Torneu-ho a provar."
#. Translators: this is the other person changing their old IM name to their new
#. IM name.
#: ../js/ui/components/telepathyClient.js:759
#: ../js/ui/components/telepathyClient.js:765
#, javascript-format
msgid "%s is now known as %s"
msgstr "En/na %s ara es diu %s"
@ -936,7 +638,7 @@ msgstr[1] ""
"Es reiniciarà l'ordinador automàticament i s'instal·laran les "
"actualitzacions d'aquí %d segons."
#: ../js/ui/endSessionDialog.js:127
#: ../js/ui/endSessionDialog.js:127 ../js/ui/endSessionDialog.js:147
msgctxt "button"
msgid "Restart &amp; Install"
msgstr "Reinicia i instal·la"
@ -951,30 +653,45 @@ msgctxt "checkbox"
msgid "Power off after updates are installed"
msgstr "Apaga després d'instal·lar les actualitzacions"
#: ../js/ui/endSessionDialog.js:338
#: ../js/ui/endSessionDialog.js:137
msgctxt "title"
msgid "Restart & Install Upgrade"
msgstr "Reinicia i instal·la l'actualització"
#. Translators: This is the text displayed for system upgrades in the
#. shut down dialog. First %s gets replaced with the distro name and
#. second %s with the distro version to upgrade to
#: ../js/ui/endSessionDialog.js:142
#, javascript-format
msgid ""
"%s %s will be installed after restart. Upgrade installation can take a long "
"time: ensure that you have backed up and that the computer is plugged in."
msgstr ""
#: ../js/ui/endSessionDialog.js:361
msgid "Running on battery power: please plug in before installing updates."
msgstr ""
"S'està utilitzant la bateria: connecteu l'ordinador a la xarxa elèctrica "
"abans d'instal·lar les actualitzacions."
#: ../js/ui/endSessionDialog.js:355
#: ../js/ui/endSessionDialog.js:378
msgid "Some applications are busy or have unsaved work."
msgstr ""
"Hi ha algunes aplicacions que estan ocupades o que tenen documents sense "
"desar."
#: ../js/ui/endSessionDialog.js:362
#: ../js/ui/endSessionDialog.js:385
msgid "Other users are logged in."
msgstr "Altres usuaris tenen la sessió oberta."
#. Translators: Remote here refers to a remote session, like a ssh login
#: ../js/ui/endSessionDialog.js:640
#: ../js/ui/endSessionDialog.js:671
#, javascript-format
msgid "%s (remote)"
msgstr "%s (remot)"
#. Translators: Console here refers to a tty like a VT console
#: ../js/ui/endSessionDialog.js:643
#: ../js/ui/endSessionDialog.js:674
#, javascript-format
msgid "%s (console)"
msgstr "%s (consola)"
@ -988,7 +705,7 @@ msgstr "Instal·la"
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "Voleu baixar i instal·lar «%s» d'extensions.gnome.org?"
#: ../js/ui/keyboard.js:741 ../js/ui/status/keyboard.js:713
#: ../js/ui/keyboard.js:742 ../js/ui/status/keyboard.js:782
msgid "Keyboard"
msgstr "Teclat"
@ -1025,7 +742,7 @@ msgstr "Habilitat"
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:719 ../src/gvc/gvc-mixer-control.c:1828
#: ../js/ui/lookingGlass.js:719 ../src/gvc/gvc-mixer-control.c:1866
msgid "Disabled"
msgstr "Inhabilitat"
@ -1073,7 +790,7 @@ msgstr "Multimèdia"
msgid "Undo"
msgstr "Desfés"
#: ../js/ui/overview.js:117
#: ../js/ui/overview.js:113
msgid "Overview"
msgstr "Vista general"
@ -1081,7 +798,7 @@ msgstr "Vista general"
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters.
#: ../js/ui/overview.js:244
#: ../js/ui/overview.js:240
msgid "Type to search…"
msgstr "Teclegeu per cercar…"
@ -1145,11 +862,11 @@ msgid_plural "%d new notifications"
msgstr[0] "%d notificació nova"
msgstr[1] "%d notificacions noves"
#: ../js/ui/screenShield.js:432 ../js/ui/status/system.js:374
#: ../js/ui/screenShield.js:449 ../js/ui/status/system.js:382
msgid "Lock"
msgstr "Bloqueja"
#: ../js/ui/screenShield.js:684
#: ../js/ui/screenShield.js:704
msgid "GNOME needs to lock the screen"
msgstr "El GNOME necessita bloquejar la pantalla"
@ -1160,11 +877,11 @@ msgstr "El GNOME necessita bloquejar la pantalla"
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: ../js/ui/screenShield.js:805 ../js/ui/screenShield.js:1271
#: ../js/ui/screenShield.js:825 ../js/ui/screenShield.js:1291
msgid "Unable to lock"
msgstr "No es pot blocar"
#: ../js/ui/screenShield.js:806 ../js/ui/screenShield.js:1272
#: ../js/ui/screenShield.js:826 ../js/ui/screenShield.js:1292
msgid "Lock was blocked by an application"
msgstr "Una aplicació està bloquejant el bloqueig"
@ -1248,7 +965,7 @@ msgstr "Text gran"
msgid "Bluetooth"
msgstr "Bluetooth"
#: ../js/ui/status/bluetooth.js:56
#: ../js/ui/status/bluetooth.js:56 ../js/ui/status/network.js:624
msgid "Bluetooth Settings"
msgstr "Paràmetres del Bluetooth"
@ -1283,7 +1000,7 @@ msgstr "Desactiva"
msgid "Brightness"
msgstr "Brillantor"
#: ../js/ui/status/keyboard.js:736
#: ../js/ui/status/keyboard.js:805
msgid "Show Keyboard Layout"
msgstr "Mostra la disposició del teclat"
@ -1311,14 +1028,6 @@ msgstr "Ubicació inhabilitada"
msgid "Enable"
msgstr "Habilita"
#: ../js/ui/status/location.js:426
msgid "Deny Access"
msgstr "Denega l'accés"
#: ../js/ui/status/location.js:429
msgid "Grant Access"
msgstr "Permetre l'accés"
#. Translators: %s is an application name
#: ../js/ui/status/location.js:435
#, javascript-format
@ -1329,7 +1038,7 @@ msgstr "Voleu donar a %s accés a la vostra ubicació?"
msgid "Location access can be changed at any time from the privacy settings."
msgstr ""
"Podeu canviar la configuració de l'accés a la ubicació sempre que vulgueu "
"des del la configuració de la privacitat."
"des de la configuració de la privacitat."
#: ../js/ui/status/network.js:101
msgid "<unknown>"
@ -1397,7 +1106,7 @@ msgstr "%s ha fallat la connexió"
msgid "Wired Settings"
msgstr "Paràmetres de la xarxa amb fils"
#: ../js/ui/status/network.js:545 ../js/ui/status/network.js:624
#: ../js/ui/status/network.js:545
msgid "Mobile Broadband Settings"
msgstr "Configuració de la xarxa de banda ampla mòbil"
@ -1415,8 +1124,8 @@ msgid "%s Disabled"
msgstr "%s Inhabilitat"
#: ../js/ui/status/network.js:632
msgid "Use as Internet connection"
msgstr "Utilitza com a connexió a Internet"
msgid "Connect to Internet"
msgstr "Connecta a l'Internet"
#: ../js/ui/status/network.js:813
msgid "Airplane Mode is On"
@ -1424,7 +1133,7 @@ msgstr "El mode d'avió és actiu"
#: ../js/ui/status/network.js:814
msgid "Wi-Fi is disabled when airplane mode is on."
msgstr "Quan el mode d'avió és actiu es desactiva la xarxa sense fils."
msgstr "Quan el mode d'avió és actiu es desactiva la xarxa sense fil."
#: ../js/ui/status/network.js:815
msgid "Turn Off Airplane Mode"
@ -1436,11 +1145,11 @@ msgstr "La xarxa sense fil està desactivada"
#: ../js/ui/status/network.js:825
msgid "Wi-Fi needs to be turned on in order to connect to a network."
msgstr "S'ha d'activar la xarxa sense fils per poder-se connectar a una xarxa."
msgstr "S'ha d'activar la xarxa sense fil per poder-se connectar a una xarxa."
#: ../js/ui/status/network.js:826
msgid "Turn On Wi-Fi"
msgstr "Activa la xarxa sense fils"
msgstr "Activa la xarxa sense fil"
#: ../js/ui/status/network.js:851
msgid "Wi-Fi Networks"
@ -1553,27 +1262,27 @@ msgstr "%d%%"
msgid "Airplane Mode On"
msgstr "El mode d'avió és actiu"
#: ../js/ui/status/system.js:343
#: ../js/ui/status/system.js:351
msgid "Switch User"
msgstr "Canvia d'usuari"
#: ../js/ui/status/system.js:348
#: ../js/ui/status/system.js:356
msgid "Log Out"
msgstr "Surt"
#: ../js/ui/status/system.js:353
#: ../js/ui/status/system.js:361
msgid "Account Settings"
msgstr "Paràmetres del compte"
#: ../js/ui/status/system.js:370
#: ../js/ui/status/system.js:378
msgid "Orientation Lock"
msgstr "Bloqueja l'orientació"
#: ../js/ui/status/system.js:378
#: ../js/ui/status/system.js:386
msgid "Suspend"
msgstr "Atura temporalment"
#: ../js/ui/status/system.js:381
#: ../js/ui/status/system.js:389
msgid "Power Off"
msgstr "Apaga"
@ -1699,13 +1408,9 @@ msgstr "Mou a la pantalla de l'esquerra"
msgid "Move to Monitor Right"
msgstr "Mou a la pantalla de la dreta"
#: ../src/calendar-server/evolution-calendar.desktop.in.in.h:1
msgid "Evolution Calendar"
msgstr "Calendari de l'Evolution"
#. translators:
#. * The number of sound outputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1835
#: ../src/gvc/gvc-mixer-control.c:1873
#, c-format
msgid "%u Output"
msgid_plural "%u Outputs"
@ -1714,14 +1419,14 @@ msgstr[1] "%u sortides"
#. translators:
#. * The number of sound inputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1845
#: ../src/gvc/gvc-mixer-control.c:1883
#, c-format
msgid "%u Input"
msgid_plural "%u Inputs"
msgstr[0] "%u entrada"
msgstr[1] "%u entrades"
#: ../src/gvc/gvc-mixer-control.c:2371
#: ../src/gvc/gvc-mixer-control.c:2738
msgid "System Sounds"
msgstr "Sons del sistema"
@ -1741,12 +1446,12 @@ msgstr "Utilitza un mode específic, p. ex. «gdm» per la pantalla d'entrada"
msgid "List possible modes"
msgstr "Llista els modes possibles"
#: ../src/shell-app.c:246
#: ../src/shell-app.c:270
msgctxt "program"
msgid "Unknown"
msgstr "Desconegut"
#: ../src/shell-app.c:487
#: ../src/shell-app.c:511
#, c-format
msgid "Failed to launch “%s”"
msgstr "No s'ha pogut iniciar «%s»"
@ -1763,6 +1468,268 @@ msgstr "La contrasenya no pot ser buida"
msgid "Authentication dialog was dismissed by the user"
msgstr "L'usuari ha descartat el diàleg d'autenticació"
#~ msgid "System"
#~ msgstr "Sistema"
#~ msgid "Show the notification list"
#~ msgstr "Mostra la llista de notificacions"
#~ msgid "Focus the active notification"
#~ msgstr "Posa el focus en la notificació activa"
#~ msgid "Show the overview"
#~ msgstr "Mostra la vista general"
#~ msgid "Show all applications"
#~ msgstr "Mostra totes les aplicacions"
#~ msgid "Open the application menu"
#~ msgstr "Obre el menú d'aplicació"
#~ msgid "GNOME Shell Extension Preferences"
#~ msgstr "Preferències de les extensions del GNOME Shell"
#~ msgid "Configure GNOME Shell Extensions"
#~ msgstr "Configureu les extensions del GNOME Shell"
#~ msgid "GNOME Shell"
#~ msgstr "GNOME Shell"
#~ msgid "Window management and application launching"
#~ msgstr "Gestor de finestres i llançador d'aplicacions"
#~ msgid "Enable internal tools useful for developers and testers from Alt-F2"
#~ msgstr ""
#~ "Habilita les eines internes en el diàleg de l'Alt+F2 que són útils per "
#~ "als desenvolupadors i provadors"
#~ msgid ""
#~ "Allows access to internal debugging and monitoring tools using the Alt-F2 "
#~ "dialog."
#~ msgstr ""
#~ "Permet l'accés a les eines de depuració i de seguiment internes a través "
#~ "del diàleg de l'Alt+F2."
#~ msgid "UUIDs of extensions to enable"
#~ msgstr ""
#~ "Identificadors universals únics de les extensions que s'han d'habilitar"
#~ msgid ""
#~ "GNOME Shell extensions have a UUID property; this key lists extensions "
#~ "which should be loaded. Any extension that wants to be loaded needs to be "
#~ "in this list. You can also manipulate this list with the EnableExtension "
#~ "and DisableExtension D-Bus methods on org.gnome.Shell."
#~ msgstr ""
#~ "Les extensions del GNOME Shell tenen un identificador universal. Aquesta "
#~ "clau conté una llista de les extensions que s'han de carregar. Qualsevol "
#~ "extensió que s'hagi de carregar ha de ser a la llista. Podeu modificar "
#~ "aquesta llista amb els mètodes de D-Bus «EnableExtension» (activa una "
#~ "extensió) i «DisableExtension» (desactiva una extensió) a org.gnome.Shell."
#~ msgid "Disables the validation of extension version compatibility"
#~ msgstr "Desactiva la validació de la compatibilitat de versió d'extensions"
#~ msgid ""
#~ "GNOME Shell will only load extensions that claim to support the current "
#~ "running version. Enabling this option will disable this check and try to "
#~ "load all extensions regardless of the versions they claim to support."
#~ msgstr ""
#~ "El GNOME Shell només carregarà extensions que afirmin ser compatibles amb "
#~ "la versió en execució. Si s'activa aquesta opció, es desactivarà la "
#~ "comprovació i es provarà de carregar totes les extensions sense tenir en "
#~ "compte les versions amb què afirmin ser compatibles."
#~ msgid "List of desktop file IDs for favorite applications"
#~ msgstr ""
#~ "Llista d'identificadors de fitxers d'escriptori de les aplicacions "
#~ "preferides"
#~ msgid ""
#~ "The applications corresponding to these identifiers will be displayed in "
#~ "the favorites area."
#~ msgstr ""
#~ "Es mostraran, a l'àrea de preferits, les aplicacions que corresponguin a "
#~ "aquests identificadors."
#~ msgid "App Picker View"
#~ msgstr "Vista del seleccionador d'aplicacions"
#~ msgid "Index of the currently selected view in the application picker."
#~ msgstr ""
#~ "Índex de la vista seleccionada actualment en el seleccionador "
#~ "d'aplicacions."
#~ msgid "History for command (Alt-F2) dialog"
#~ msgstr "Historial de les ordres utilitzades en el diàleg de l'Alt+F2"
#~ msgid "History for the looking glass dialog"
#~ msgstr "Historial del depurador del GNOME Shell"
#~ msgid "Always show the 'Log out' menu item in the user menu."
#~ msgstr "Mostra sempre l'element de menú «Surt» al menú d'usuari."
#~ msgid ""
#~ "This key overrides the automatic hiding of the 'Log out' menu item in "
#~ "single-user, single-session situations."
#~ msgstr ""
#~ "Aquesta clau sobreescriu l'ocultació automàtica de l'element de menú "
#~ "«Surt» quan només hi ha un usuari i un sol tipus de sessió."
#~ msgid ""
#~ "Whether to remember password for mounting encrypted or remote filesystems"
#~ msgstr ""
#~ "Si s'han de recordar les contrasenyes dels punts de muntatge encriptats o "
#~ "els sistemes de fitxers remots"
#~ msgid ""
#~ "The shell will request a password when an encrypted device or a remote "
#~ "filesystem is mounted. If the password can be saved for future use a "
#~ "'Remember Password' checkbox will be present. This key sets the default "
#~ "state of the checkbox."
#~ msgstr ""
#~ "El GNOME Shell us demanarà la contrasenya quan es munti un dispositiu "
#~ "encriptat o un sistema de fitxers remot. Si es pot desar la contrasenya "
#~ "per utilitzar-lo en el futur, es mostrarà la casella de verificació "
#~ "«Recorda la contrasenya». Aquesta clau estableix el valor per defecte "
#~ "d'aquesta casella de verificació."
#~ msgid ""
#~ "Whether the default Bluetooth adapter had set up devices associated to it"
#~ msgstr ""
#~ "Si l'adaptador de Bluetooth predeterminat té dispositius configurats "
#~ "associats"
#~ msgid ""
#~ "The shell will only show a Bluetooth menu item if a Bluetooth adapter is "
#~ "powered, or if there were devices set up associated with the default "
#~ "adapter. This will be reset if the default adapter is ever seen not to "
#~ "have devices associated to it."
#~ msgstr ""
#~ "El Shell només mostrà una entrada de menú Bluetooth si un adaptador "
#~ "Bluetooh està engegat, o si hi ha dispositius configurats associats a "
#~ "l'adaptador predeterminat. Això es reiniciarà si l'adaptador "
#~ "predeterminat té dispositius associats."
#~ msgid "Show the week date in the calendar"
#~ msgstr "Mostra el número de la setmana al calendari"
#~ msgid "If true, display the ISO week date in the calendar."
#~ msgstr "Si és «true» (cert) es mostra el número de la setmana al calendari."
#~ msgid "Keybinding to open the application menu"
#~ msgstr "Vinculació per obrir el menú d'aplicació"
#~ msgid "Keybinding to open the application menu."
#~ msgstr "La vinculació per obrir el menú d'aplicació."
#~ msgid "Keybinding to open the \"Show Applications\" view"
#~ msgstr "Vinculació per obrir la vista «Mostra les aplicacions»"
#~ msgid ""
#~ "Keybinding to open the \"Show Applications\" view of the Activities "
#~ "Overview."
#~ msgstr ""
#~ "Vinculació per obrir la vista «Mostra les aplicacions» de les activitats "
#~ "de la vista general."
#~ msgid "Keybinding to open the overview"
#~ msgstr "Vinculació per obrir la vista general"
#~ msgid "Keybinding to open the Activities Overview."
#~ msgstr "Vinculació per obrir la vista general d'activitats."
#~ msgid "Keybinding to toggle the visibility of the notification list"
#~ msgstr ""
#~ "La vinculació per commutar la visibilitat de la llista de notificacions"
#~ msgid "Keybinding to toggle the visibility of the notification list."
#~ msgstr ""
#~ "La vinculació per commutar la visibilitat de la llista de notificacions."
#~ msgid "Keybinding to focus the active notification"
#~ msgstr "Vinculació per posar el focus a la notificació activa"
#~ msgid "Keybinding to focus the active notification."
#~ msgstr "Vinculació per posar el focus a la notificació activa."
#~ msgid ""
#~ "Keybinding that pauses and resumes all running tweens, for debugging "
#~ "purposes"
#~ msgstr ""
#~ "Vinculació que fa una pausa i continua tots els «tweens» en execució, per "
#~ "motius de depuració"
#~ msgid "Which keyboard to use"
#~ msgstr "Quin tipus de teclat s'ha d'utilitzar"
#~ msgid "The type of keyboard to use."
#~ msgstr "El tipus de teclat que s'utilitzarà."
#~ msgid "Limit switcher to current workspace."
#~ msgstr "Limita el canviador a l'espai de treball actual."
#~ msgid ""
#~ "If true, only applications that have windows on the current workspace are "
#~ "shown in the switcher. Otherwise, all applications are included."
#~ msgstr ""
#~ "Si és «true» (cert), només les aplicacions que tinguin finestres en "
#~ "l'espai de treball actual es mostren en el canviador. En cas contrari es "
#~ "mostren totes les aplicacions."
#~ msgid "The application icon mode."
#~ msgstr "El mode d'icona de les aplicacions."
#~ msgid ""
#~ "Configures how the windows are shown in the switcher. Valid possibilities "
#~ "are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
#~ "only' (shows only the application icon) or 'both'."
#~ msgstr ""
#~ "Configureu com es mostren les finestres en l'intercanviador. Els valors "
#~ "possibles són: «thumbnail-only» (mostra una miniatura de la finestra), "
#~ "«app-icon-only» (mostra la icona de l'aplicació) o «both» (ambdues coses: "
#~ "mostra la miniatura de la finestra i la icona de l'aplicació)."
#~ msgid ""
#~ "If true, only windows from the current workspace are shown in the "
#~ "switcher. Otherwise, all windows are included."
#~ msgstr ""
#~ "Si és «true» (cert), només les finestres de l'espai de treball actual es "
#~ "mostren en el canviador. En cas contrari, es mostren totes les finestres."
#~ msgid "Attach modal dialog to the parent window"
#~ msgstr "Adjunta el diàleg modal a la finestra pare"
#~ msgid ""
#~ "This key overrides the key in org.gnome.mutter when running GNOME Shell."
#~ msgstr ""
#~ "Si s'executa el GNOME Shell, aquesta clau sobreescriu la clau «org.gnome."
#~ "mutter»."
#~ msgid "Enable edge tiling when dropping windows on screen edges"
#~ msgstr ""
#~ "Habilita la tesselització a les vores en deixar anar les finestres a les "
#~ "vores de la pantalla"
#~ msgid "Workspaces are managed dynamically"
#~ msgstr "Els espais de treball es gestionen dinàmicament"
#~ msgid "Workspaces only on primary monitor"
#~ msgstr "Només en el monitor principal hi ha espais de treball"
#~ msgid "Delay focus changes in mouse mode until the pointer stops moving"
#~ msgstr ""
#~ "Retarda el canvi del focus, quan s'està en mode ratolí, fins que el "
#~ "punter no estigui quiet"
#~ msgid "Network Login"
#~ msgstr "Inici de sessió de la xarxa"
#~ msgid "Use as Internet connection"
#~ msgstr "Utilitza com a connexió a Internet"
#~ msgid "Evolution Calendar"
#~ msgstr "Calendari de l'Evolution"
#~ msgid "%s is requesting access to your location."
#~ msgstr "%s està demanant accés a la vostra ubicació."

319
po/cs.po
View File

@ -12,8 +12,8 @@ msgstr ""
"Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2016-08-19 21:11+0000\n"
"PO-Revision-Date: 2016-08-19 23:17+0200\n"
"POT-Creation-Date: 2016-11-17 23:06+0000\n"
"PO-Revision-Date: 2016-11-18 00:42+0100\n"
"Last-Translator: Marek Černocký <marek@manet.cz>\n"
"Language-Team: čeština <gnome-cs-list@gnome.org>\n"
"Language: cs\n"
@ -24,6 +24,30 @@ msgstr ""
"X-Generator: Gtranslator 2.91.7\n"
"X-Project-Style: gnome\n"
#: data/50-gnome-shell-system.xml:6
msgid "System"
msgstr "Systém"
#: data/50-gnome-shell-system.xml:9
msgid "Show the notification list"
msgstr "Zobrazit seznam upozornění"
#: data/50-gnome-shell-system.xml:12
msgid "Focus the active notification"
msgstr "Zaměřovat aktivní upozornění"
#: data/50-gnome-shell-system.xml:15
msgid "Show the overview"
msgstr "Zobrazit přehled"
#: data/50-gnome-shell-system.xml:18
msgid "Show all applications"
msgstr "Zobrazit všechny aplikace"
#: data/50-gnome-shell-system.xml:21
msgid "Open the application menu"
msgstr "Otevřít nabídku aplikací"
#: data/gnome-shell-extension-prefs.desktop.in.in:4
msgid "GNOME Shell Extension Preferences"
msgstr "Předvolby rozšíření GNOME Shell"
@ -284,7 +308,8 @@ msgstr "Se změnou zaměření v režimu myši čekat na zastavení pohybu ukaza
msgid "Network Login"
msgstr "Přihlášení do sítě"
#: data/org.gnome.Shell.PortalHelper.desktop.in.in:8
#. 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"
@ -298,23 +323,23 @@ msgstr ""
msgid "GNOME Shell Extensions"
msgstr "Rozšíření GNOME Shell"
#: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71
#: js/gdm/authPrompt.js:149 js/ui/audioDeviceSelection.js:71
#: js/ui/components/networkAgent.js:145 js/ui/components/polkitAgent.js:179
#: js/ui/endSessionDialog.js:483 js/ui/extensionDownloader.js:195
#: js/ui/shellMountOperation.js:399 js/ui/status/network.js:916
#: js/ui/shellMountOperation.js:399 js/ui/status/network.js:928
msgid "Cancel"
msgstr "Zrušit"
#: js/gdm/authPrompt.js:169 js/gdm/authPrompt.js:216 js/gdm/authPrompt.js:448
#: js/gdm/authPrompt.js:171 js/gdm/authPrompt.js:218 js/gdm/authPrompt.js:450
msgid "Next"
msgstr "Další"
#: js/gdm/authPrompt.js:212 js/ui/shellMountOperation.js:403
#: js/gdm/authPrompt.js:214 js/ui/shellMountOperation.js:403
#: js/ui/unlockDialog.js:59
msgid "Unlock"
msgstr "Odemknout"
#: js/gdm/authPrompt.js:214
#: js/gdm/authPrompt.js:216
msgctxt "button"
msgid "Sign In"
msgstr "Přihlásit se"
@ -332,7 +357,7 @@ msgstr "Nejste na seznamu?"
#. Translators: this message is shown below the username entry field
#. to clue the user in on how to login to the local network realm
#: js/gdm/loginDialog.js:854
#: js/gdm/loginDialog.js:859
#, javascript-format
msgid "(e.g., user or %s)"
msgstr "(např. uživatel nebo %s)"
@ -340,12 +365,12 @@ msgstr "(např. uživatel nebo %s)"
#. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one)
#: js/gdm/loginDialog.js:859 js/ui/components/networkAgent.js:271
#: js/gdm/loginDialog.js:864 js/ui/components/networkAgent.js:271
#: js/ui/components/networkAgent.js:289
msgid "Username: "
msgstr "Uživatelské jméno: "
#: js/gdm/loginDialog.js:1196
#: js/gdm/loginDialog.js:1201
msgid "Login Window"
msgstr "Přihlašovací okno"
@ -463,31 +488,35 @@ msgstr "Zamítnout přístup"
msgid "Grant Access"
msgstr "Schválit přístup"
#: js/ui/appDisplay.js:794
#: js/ui/appDisplay.js:806
msgid "Frequently used applications will appear here"
msgstr "Zde se objeví často používané aplikace"
#: js/ui/appDisplay.js:914
#: js/ui/appDisplay.js:926
msgid "Frequent"
msgstr "Časté"
#: js/ui/appDisplay.js:921
#: js/ui/appDisplay.js:933
msgid "All"
msgstr "Všechny"
#: js/ui/appDisplay.js:1853
#: js/ui/appDisplay.js:1891
msgid "New Window"
msgstr "Nové okno"
#: js/ui/appDisplay.js:1881 js/ui/dash.js:289
#: js/ui/appDisplay.js:1905
msgid "Launch using Dedicated Graphics Card"
msgstr "Spustit pomocí vyhrazené grafické karty"
#: js/ui/appDisplay.js:1932 js/ui/dash.js:289
msgid "Remove from Favorites"
msgstr "Odstranit z oblíbených"
#: js/ui/appDisplay.js:1887
#: js/ui/appDisplay.js:1938
msgid "Add to Favorites"
msgstr "Přidat mezi oblíbené"
#: js/ui/appDisplay.js:1897
#: js/ui/appDisplay.js:1948
msgid "Show Details"
msgstr "Zobrazit podrobnosti"
@ -645,7 +674,7 @@ msgstr "Externí svazek připojen"
msgid "External drive disconnected"
msgstr "Externí svazek odpojen"
#: js/ui/components/autorunManager.js:355
#: js/ui/components/autorunManager.js:356
#, javascript-format
msgid "Open with %s"
msgstr "Otevřít pomocí %s"
@ -658,8 +687,8 @@ msgstr "Heslo:"
msgid "Type again:"
msgstr "Napište znovu:"
#: js/ui/components/networkAgent.js:140 js/ui/status/network.js:269
#: js/ui/status/network.js:352 js/ui/status/network.js:919
#: js/ui/components/networkAgent.js:140 js/ui/status/network.js:272
#: js/ui/status/network.js:355 js/ui/status/network.js:931
msgid "Connect"
msgstr "Připojit"
@ -687,11 +716,11 @@ msgstr "Heslo soukromého klíče: "
msgid "Service: "
msgstr "Služba: "
#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:658
#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:666
msgid "Authentication required by wireless network"
msgstr "K bezdrátové síti je vyžadováno ověření"
#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:659
#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:667
#, javascript-format
msgid ""
"Passwords or encryption keys are required to access the wireless network "
@ -700,7 +729,7 @@ msgstr ""
"Pro přístup k bezdrátové síti „%s“ jsou vyžadována hesla nebo šifrovací "
"klíče."
#: js/ui/components/networkAgent.js:325 js/ui/components/networkAgent.js:662
#: js/ui/components/networkAgent.js:325 js/ui/components/networkAgent.js:670
msgid "Wired 802.1X authentication"
msgstr "Ověření připojení po drátu 802.1X"
@ -708,15 +737,15 @@ msgstr "Ověření připojení po drátu 802.1X"
msgid "Network name: "
msgstr "Název sítě: "
#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:666
#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:674
msgid "DSL authentication"
msgstr "Ověření DSL"
#: js/ui/components/networkAgent.js:339 js/ui/components/networkAgent.js:672
#: js/ui/components/networkAgent.js:339 js/ui/components/networkAgent.js:680
msgid "PIN code required"
msgstr "Požadován kód PIN"
#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:673
#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:681
msgid "PIN code is needed for the mobile broadband device"
msgstr "Pro mobilní širokopásmové zařízení je vyžadován kód PIN"
@ -724,17 +753,17 @@ msgstr "Pro mobilní širokopásmové zařízení je vyžadován kód PIN"
msgid "PIN: "
msgstr "PIN: "
#: js/ui/components/networkAgent.js:348 js/ui/components/networkAgent.js:679
#: js/ui/components/networkAgent.js:348 js/ui/components/networkAgent.js:687
msgid "Mobile broadband network password"
msgstr "Heslo k mobilní širokopásmové síti"
#: js/ui/components/networkAgent.js:349 js/ui/components/networkAgent.js:663
#: js/ui/components/networkAgent.js:667 js/ui/components/networkAgent.js:680
#: js/ui/components/networkAgent.js:349 js/ui/components/networkAgent.js:671
#: js/ui/components/networkAgent.js:675 js/ui/components/networkAgent.js:688
#, javascript-format
msgid "A password is required to connect to “%s”."
msgstr "Pro připojení k „%s“ je vyžadováno heslo."
#: js/ui/components/networkAgent.js:647 js/ui/status/network.js:1658
#: js/ui/components/networkAgent.js:655 js/ui/status/network.js:1734
msgid "Network Manager"
msgstr "Network Manager"
@ -760,12 +789,12 @@ msgstr "Ověření bohužel nebylo úspěšné. Zkuste to prosím znovu."
#. Translators: this is the other person changing their old IM name to their new
#. IM name.
#: js/ui/components/telepathyClient.js:760
#: js/ui/components/telepathyClient.js:765
#, javascript-format
msgid "%s is now known as %s"
msgstr "%s je teď znám jako %s"
#: js/ui/ctrlAltTab.js:29 js/ui/viewSelector.js:155
#: js/ui/ctrlAltTab.js:29 js/ui/viewSelector.js:178
msgid "Windows"
msgstr "Okna"
@ -1066,6 +1095,50 @@ msgstr "Přehled"
msgid "Type to search…"
msgstr "vyhledávejte psaním…"
#: js/ui/padOsd.js:37
msgid "New shortcut…"
msgstr "Nová klávesová zkratka…"
#: js/ui/padOsd.js:86
msgid "Application defined"
msgstr "Definováno aplikací"
#: js/ui/padOsd.js:87
msgid "Show on-screen help"
msgstr "Zobrazit nápovědu na obrazovce"
#: js/ui/padOsd.js:88
msgid "Switch monitor"
msgstr "Přepnout monitor"
#: js/ui/padOsd.js:89
msgid "Assign keystroke"
msgstr "Přířadit klávesu"
#: js/ui/padOsd.js:143
msgid "Done"
msgstr "Hotovo"
#: js/ui/padOsd.js:597
msgid "Edit…"
msgstr "Upravit…"
#: js/ui/padOsd.js:610 js/ui/padOsd.js:665
msgid "None"
msgstr "Źádná"
#: js/ui/padOsd.js:648
msgid "Press a button to configure"
msgstr "Zmáčkněte tlačítko pro nastavení"
#: js/ui/padOsd.js:649
msgid "Press Esc to exit"
msgstr "Zmáčknutím Esc ukončíte"
#: js/ui/padOsd.js:652
msgid "Press any key to exit"
msgstr "Zmáčknutím klávesy ukončíte"
#: js/ui/panel.js:358
msgid "Quit"
msgstr "Ukončit"
@ -1102,6 +1175,10 @@ msgstr "Zadejte příkaz:"
msgid "Close"
msgstr "Zavřít"
#: js/ui/runDialog.js:277
msgid "Restart is not available on Wayland"
msgstr "Restart není na Waylandu k dispozici"
#: js/ui/runDialog.js:282
msgid "Restarting…"
msgstr "Restartuje se…"
@ -1132,7 +1209,7 @@ msgstr[2] "%d nových upozornění"
msgid "Lock"
msgstr "Uzamknout"
#: js/ui/screenShield.js:704
#: js/ui/screenShield.js:707
msgid "GNOME needs to lock the screen"
msgstr "GNOME potřebuje uzamknout obrazovku"
@ -1143,11 +1220,11 @@ msgstr "GNOME potřebuje uzamknout obrazovku"
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: js/ui/screenShield.js:825 js/ui/screenShield.js:1291
#: js/ui/screenShield.js:828 js/ui/screenShield.js:1295
msgid "Unable to lock"
msgstr "Nelze uzamknout obrazovku"
#: js/ui/screenShield.js:826 js/ui/screenShield.js:1292
#: js/ui/screenShield.js:829 js/ui/screenShield.js:1296
msgid "Lock was blocked by an application"
msgstr "Zamknutí bylo zablokováno některou z aplikací"
@ -1231,7 +1308,7 @@ msgstr "Styl velkého textu"
msgid "Bluetooth"
msgstr "Bluetooth"
#: js/ui/status/bluetooth.js:56 js/ui/status/network.js:624
#: js/ui/status/bluetooth.js:56 js/ui/status/network.js:627
msgid "Bluetooth Settings"
msgstr "Nastavení Bluetooth"
@ -1249,16 +1326,16 @@ msgid "Off"
msgstr "Vypnuto"
#: js/ui/status/bluetooth.js:140
msgid "Not In Use"
msgstr "Nepoužívá se"
msgid "On"
msgstr "Zapnuto"
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:1279
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:1291
msgid "Turn On"
msgstr "Zapnout"
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:178
#: js/ui/status/network.js:353 js/ui/status/network.js:1279
#: js/ui/status/network.js:1394 js/ui/status/rfkill.js:90
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:181
#: js/ui/status/network.js:356 js/ui/status/network.js:1291
#: js/ui/status/network.js:1406 js/ui/status/rfkill.js:90
#: js/ui/status/rfkill.js:117
msgid "Turn Off"
msgstr "Vypnout"
@ -1307,18 +1384,18 @@ msgstr ""
"Přístup ke službám pro určování polohy lze kdykoliv změnit v nastavení "
"soukromí."
#: js/ui/status/network.js:101
#: js/ui/status/network.js:104
msgid "<unknown>"
msgstr "<neznámé>"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:451 js/ui/status/network.js:1308
#: js/ui/status/network.js:454 js/ui/status/network.js:1320
#, javascript-format
msgid "%s Off"
msgstr "%s je vypnuto"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:454
#: js/ui/status/network.js:457
#, javascript-format
msgid "%s Connected"
msgstr "%s je připojeno"
@ -1326,168 +1403,193 @@ msgstr "%s je připojeno"
#. 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);
#. %s is a network identifier
#: js/ui/status/network.js:459
#: js/ui/status/network.js:462
#, javascript-format
msgid "%s Unmanaged"
msgstr "%s není spravováno"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:462
#: js/ui/status/network.js:465
#, javascript-format
msgid "%s Disconnecting"
msgstr "%s se odpojuje"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:469 js/ui/status/network.js:1300
#: js/ui/status/network.js:472 js/ui/status/network.js:1312
#, javascript-format
msgid "%s Connecting"
msgstr "%s se připojuje"
#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier
#: js/ui/status/network.js:472
#: js/ui/status/network.js:475
#, javascript-format
msgid "%s Requires Authentication"
msgstr "%s požaduje ověření"
#. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing; %s is a network identifier
#: js/ui/status/network.js:480
#: js/ui/status/network.js:483
#, javascript-format
msgid "Firmware Missing For %s"
msgstr "Schází firmware pro %s"
#. 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
#: js/ui/status/network.js:484
#: js/ui/status/network.js:487
#, javascript-format
msgid "%s Unavailable"
msgstr "%s je nedostupné"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:487
#: js/ui/status/network.js:490
#, javascript-format
msgid "%s Connection Failed"
msgstr "%s selhalo připojení"
#: js/ui/status/network.js:503
#: js/ui/status/network.js:506
msgid "Wired Settings"
msgstr "Nastavení připojení po drátu"
#: js/ui/status/network.js:545
#: js/ui/status/network.js:548
msgid "Mobile Broadband Settings"
msgstr "Nastavení mobilní širokopásmové sítě"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:588 js/ui/status/network.js:1305
#: js/ui/status/network.js:591 js/ui/status/network.js:1317
#, javascript-format
msgid "%s Hardware Disabled"
msgstr "%s je hardwarově zakázáno"
#. Translators: this is for a network device that cannot be activated
#. because it's disabled by rfkill (airplane mode); %s is a network identifier
#: js/ui/status/network.js:592
#: js/ui/status/network.js:595
#, javascript-format
msgid "%s Disabled"
msgstr "%s je zakázáno"
#: js/ui/status/network.js:632
#: js/ui/status/network.js:635
msgid "Connect to Internet"
msgstr "Připojit k Internetu"
#: js/ui/status/network.js:813
#: js/ui/status/network.js:825
msgid "Airplane Mode is On"
msgstr "Režim „letadlo“ je zapnutý"
#: js/ui/status/network.js:814
#: js/ui/status/network.js:826
msgid "Wi-Fi is disabled when airplane mode is on."
msgstr "Když je zapnutý režim „letadlo“, je WiFi zakázána."
#: js/ui/status/network.js:815
#: js/ui/status/network.js:827
msgid "Turn Off Airplane Mode"
msgstr "Vypnout režim „letadlo“"
#: js/ui/status/network.js:824
#: js/ui/status/network.js:836
msgid "Wi-Fi is Off"
msgstr "WiFi je vypnutá"
#: js/ui/status/network.js:825
#: js/ui/status/network.js:837
msgid "Wi-Fi needs to be turned on in order to connect to a network."
msgstr "Abyste se připojili k síti, je zapotřebí zapnout WiFi."
#: js/ui/status/network.js:826
#: js/ui/status/network.js:838
msgid "Turn On Wi-Fi"
msgstr "Zapnout WiFi"
#: js/ui/status/network.js:851
#: js/ui/status/network.js:863
msgid "Wi-Fi Networks"
msgstr "Sítě WiFi"
#: js/ui/status/network.js:853
#: js/ui/status/network.js:865
msgid "Select a network"
msgstr "Vyberte síť"
#: js/ui/status/network.js:883
#: js/ui/status/network.js:895
msgid "No Networks"
msgstr "Žádné sítě"
#: js/ui/status/network.js:904 js/ui/status/rfkill.js:115
#: js/ui/status/network.js:916 js/ui/status/rfkill.js:115
msgid "Use hardware switch to turn off"
msgstr "K vypnutí použijte fyzický vypínač"
#: js/ui/status/network.js:1171
#: js/ui/status/network.js:1183
msgid "Select Network"
msgstr "Vybrat síť"
#: js/ui/status/network.js:1177
#: js/ui/status/network.js:1189
msgid "Wi-Fi Settings"
msgstr "Nastavení WiFi"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1296
#: js/ui/status/network.js:1308
#, javascript-format
msgid "%s Hotspot Active"
msgstr "%s je aktivní přístupový bod"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1311
#: js/ui/status/network.js:1323
#, javascript-format
msgid "%s Not Connected"
msgstr "%s není připojeno"
#: js/ui/status/network.js:1411
#: js/ui/status/network.js:1423
msgid "connecting..."
msgstr "připojuje se…"
#. Translators: this is for network connections that require some kind of key or password
#: js/ui/status/network.js:1414
#: js/ui/status/network.js:1426
msgid "authentication required"
msgstr "je požadováno ověření"
#: js/ui/status/network.js:1416
#: js/ui/status/network.js:1428
msgid "connection failed"
msgstr "připojení selhalo"
#: js/ui/status/network.js:1482 js/ui/status/rfkill.js:93
#: js/ui/status/network.js:1494 js/ui/status/network.js:1587
#: js/ui/status/rfkill.js:93
msgid "Network Settings"
msgstr "Nastavení sítě"
#: js/ui/status/network.js:1484
#: js/ui/status/network.js:1496
msgid "VPN Settings"
msgstr "Nastavení VPN"
#: js/ui/status/network.js:1503
#: js/ui/status/network.js:1515
msgid "VPN"
msgstr "VPN"
#: js/ui/status/network.js:1513
#: js/ui/status/network.js:1525
msgid "VPN Off"
msgstr "VPN je vypnuta"
#: js/ui/status/network.js:1697
#: js/ui/status/network.js:1618
#, javascript-format
msgid "%s Wired Connection"
msgid_plural "%s Wired Connections"
msgstr[0] "%s drátové připojení"
msgstr[1] "%s drátová připojení"
msgstr[2] "%s drátových připojení"
#: js/ui/status/network.js:1622
#, javascript-format
msgid "%s Wi-Fi Connection"
msgid_plural "%s Wi-Fi Connections"
msgstr[0] "%s bezdrátové připojení"
msgstr[1] "%s bezdrátová připojení"
msgstr[2] "%s bezdrátových připojení"
#: js/ui/status/network.js:1626
#, javascript-format
msgid "%s Modem Connection"
msgid_plural "%s Modem Connections"
msgstr[0] "%s modemové připojení"
msgstr[1] "%s modemová připojení"
msgstr[2] "%s modemových připojení"
#: js/ui/status/network.js:1773
msgid "Connection failed"
msgstr "Připojení selhalo"
#: js/ui/status/network.js:1698
#: js/ui/status/network.js:1774
msgid "Activation of network connection failed"
msgstr "Aktivace síťového připojení selhala"
@ -1569,11 +1671,11 @@ msgstr "Přihlásit se jako jiný uživatel"
msgid "Unlock Window"
msgstr "Odemykací okno"
#: js/ui/viewSelector.js:159
#: js/ui/viewSelector.js:182
msgid "Applications"
msgstr "Aplikace"
#: js/ui/viewSelector.js:163
#: js/ui/viewSelector.js:186
msgid "Search"
msgstr "Hledat"
@ -1582,22 +1684,22 @@ msgstr "Hledat"
msgid "“%s” is ready"
msgstr "Připraveno „%s“"
#: js/ui/windowManager.js:63
#: js/ui/windowManager.js:64
msgid "Do you want to keep these display settings?"
msgstr "Chcete zachovat nastavení displeje?"
#. Translators: this and the following message should be limited in lenght,
#. to avoid ellipsizing the labels.
#.
#: js/ui/windowManager.js:82
#: js/ui/windowManager.js:83
msgid "Revert Settings"
msgstr "Obnovit původní"
#: js/ui/windowManager.js:85
#: js/ui/windowManager.js:86
msgid "Keep Changes"
msgstr "Zachovat"
#: js/ui/windowManager.js:103
#: js/ui/windowManager.js:104
#, javascript-format
msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds"
@ -1607,7 +1709,7 @@ msgstr[2] "Nastavení se obnoví na původní za %d sekund"
#. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height.
#: js/ui/windowManager.js:658
#: js/ui/windowManager.js:659
#, javascript-format
msgid "%d x %d"
msgstr "%d×%d"
@ -1680,7 +1782,8 @@ msgstr "Přesunout o monitor doprava"
msgid "Evolution Calendar"
msgstr "Kalendář Evolution"
#: src/calendar-server/evolution-calendar.desktop.in:5
#. 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"
@ -1708,19 +1811,19 @@ msgstr[2] "%u vstupů"
msgid "System Sounds"
msgstr "Systémové zvuky"
#: src/main.c:381
#: src/main.c:380
msgid "Print version"
msgstr "Vypsat verzi"
#: src/main.c:387
#: src/main.c:386
msgid "Mode used by GDM for login screen"
msgstr "Režim použitý GDM pro přihlašovací obrazovku"
#: src/main.c:393
#: src/main.c:392
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr "Použít pro přihlašovací obrazovku zadaný režim, např. „gdm“."
#: src/main.c:399
#: src/main.c:398
msgid "List possible modes"
msgstr "Vypsat možné režimy"
@ -1745,33 +1848,3 @@ msgstr "Heslo nemůže být prázdné."
#: src/shell-polkit-authentication-agent.c:353
msgid "Authentication dialog was dismissed by the user"
msgstr "Dialogové okno ověření bylo uživatelem zrušeno"
#~ msgid "System"
#~ msgstr "Systém"
#~ msgid "Show the notification list"
#~ msgstr "Zobrazit seznam upozornění"
#~ msgid "Focus the active notification"
#~ msgstr "Zaměřovat aktivní upozornění"
#~ msgid "Show the overview"
#~ msgstr "Zobrazit přehled"
#~ msgid "Show all applications"
#~ msgstr "Zobrazit všechny aplikace"
#~ msgid "Open the application menu"
#~ msgstr "Otevřít nabídku aplikací"
#~ msgid "Show the week date in the calendar"
#~ msgstr "Zobrazovat v kalendáři čísla týdnů"
#~ msgid "If true, display the ISO week date in the calendar."
#~ msgstr "Je-li zapnuto, zobrazovat v kalendáři čísla týdnů dle ISO."
#~ msgid "Use as Internet connection"
#~ msgstr "Použít jako připojení k Internetu"
#~ msgid "%s is requesting access to your location."
#~ msgstr "Aplikace %s žádá o přístup k informacím o vaší poloze."

803
po/da.po

File diff suppressed because it is too large Load Diff

780
po/de.po

File diff suppressed because it is too large Load Diff

836
po/el.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

838
po/es.po

File diff suppressed because it is too large Load Diff

829
po/eu.po

File diff suppressed because it is too large Load Diff

1024
po/fa.po

File diff suppressed because it is too large Load Diff

757
po/fi.po

File diff suppressed because it is too large Load Diff

809
po/fr.po

File diff suppressed because it is too large Load Diff

839
po/fur.po

File diff suppressed because it is too large Load Diff

930
po/gd.po

File diff suppressed because it is too large Load Diff

813
po/gl.po

File diff suppressed because it is too large Load Diff

788
po/he.po

File diff suppressed because it is too large Load Diff

1771
po/hr.po Normal file

File diff suppressed because it is too large Load Diff

257
po/hu.po
View File

@ -11,16 +11,40 @@ msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2016-08-19 21:36+0000\n"
"PO-Revision-Date: 2016-08-19 23:59+0200\n"
"Last-Translator: Balázs Úr <urbalazs@gmail.com>\n"
"POT-Creation-Date: 2016-11-04 15:16+0000\n"
"PO-Revision-Date: 2016-11-05 11:21+0100\n"
"Last-Translator: Meskó Balázs <meskobalazs@gmail.com>\n"
"Language-Team: Hungarian <openscope at googlegroups dot com>\n"
"Language: hu\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Lokalize 1.2\n"
"X-Generator: Poedit 1.8.9\n"
#: data/50-gnome-shell-system.xml:6
msgid "System"
msgstr "Rendszer"
#: data/50-gnome-shell-system.xml:9
msgid "Show the notification list"
msgstr "Az értesítési lista megjelenítése"
#: data/50-gnome-shell-system.xml:12
msgid "Focus the active notification"
msgstr "Az aktív értesítés fókuszba"
#: data/50-gnome-shell-system.xml:15
msgid "Show the overview"
msgstr "Áttekintés megjelenítése"
#: data/50-gnome-shell-system.xml:18
msgid "Show all applications"
msgstr "Minden alkalmazás megjelenítése"
#: data/50-gnome-shell-system.xml:21
msgid "Open the application menu"
msgstr "Az alkalmazásmenü megnyitása"
#: data/gnome-shell-extension-prefs.desktop.in.in:4
msgid "GNOME Shell Extension Preferences"
@ -291,7 +315,6 @@ 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 error"
msgid "network-workgroup"
msgstr "network-workgroup"
@ -304,23 +327,23 @@ msgstr "Hiba történt a(z) %s beállításablakának betöltésekor:"
msgid "GNOME Shell Extensions"
msgstr "GNOME Shell kiterjesztések"
#: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71
#: js/gdm/authPrompt.js:149 js/ui/audioDeviceSelection.js:71
#: js/ui/components/networkAgent.js:145 js/ui/components/polkitAgent.js:179
#: js/ui/endSessionDialog.js:483 js/ui/extensionDownloader.js:195
#: js/ui/shellMountOperation.js:399 js/ui/status/network.js:916
#: js/ui/shellMountOperation.js:399 js/ui/status/network.js:926
msgid "Cancel"
msgstr "Mégse"
#: js/gdm/authPrompt.js:169 js/gdm/authPrompt.js:216 js/gdm/authPrompt.js:448
#: js/gdm/authPrompt.js:171 js/gdm/authPrompt.js:218 js/gdm/authPrompt.js:450
msgid "Next"
msgstr "Következő"
#: js/gdm/authPrompt.js:212 js/ui/shellMountOperation.js:403
#: js/gdm/authPrompt.js:214 js/ui/shellMountOperation.js:403
#: js/ui/unlockDialog.js:59
msgid "Unlock"
msgstr "Feloldás"
#: js/gdm/authPrompt.js:214
#: js/gdm/authPrompt.js:216
msgctxt "button"
msgid "Sign In"
msgstr "Bejelentkezés"
@ -338,7 +361,7 @@ msgstr "Nincs a listán?"
#. Translators: this message is shown below the username entry field
#. to clue the user in on how to login to the local network realm
#: js/gdm/loginDialog.js:854
#: js/gdm/loginDialog.js:859
#, javascript-format
msgid "(e.g., user or %s)"
msgstr "(például: felhasználó vagy %s)"
@ -346,12 +369,12 @@ msgstr "(például: felhasználó vagy %s)"
#. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one)
#: js/gdm/loginDialog.js:859 js/ui/components/networkAgent.js:271
#: js/gdm/loginDialog.js:864 js/ui/components/networkAgent.js:271
#: js/ui/components/networkAgent.js:289
msgid "Username: "
msgstr "Felhasználónév: "
#: js/gdm/loginDialog.js:1196
#: js/gdm/loginDialog.js:1201
msgid "Login Window"
msgstr "Bejelentkezési ablak"
@ -469,31 +492,35 @@ msgstr "Hozzáférés tiltása"
msgid "Grant Access"
msgstr "Hozzáférés megadása"
#: js/ui/appDisplay.js:794
#: js/ui/appDisplay.js:806
msgid "Frequently used applications will appear here"
msgstr "Itt jelennek meg a gyakran használt alkalmazások"
#: js/ui/appDisplay.js:914
#: js/ui/appDisplay.js:926
msgid "Frequent"
msgstr "Gyakori"
#: js/ui/appDisplay.js:921
#: js/ui/appDisplay.js:933
msgid "All"
msgstr "Összes"
#: js/ui/appDisplay.js:1853
#: js/ui/appDisplay.js:1891
msgid "New Window"
msgstr "Új ablak"
#: js/ui/appDisplay.js:1881 js/ui/dash.js:289
#: js/ui/appDisplay.js:1905
msgid "Launch using Dedicated Graphics Card"
msgstr "Futtatás a dedikált videokártyával"
#: js/ui/appDisplay.js:1932 js/ui/dash.js:289
msgid "Remove from Favorites"
msgstr "Eltávolítás a Kedvencek közül"
#: js/ui/appDisplay.js:1887
#: js/ui/appDisplay.js:1938
msgid "Add to Favorites"
msgstr "Hozzáadás a Kedvencekhez"
#: js/ui/appDisplay.js:1897
#: js/ui/appDisplay.js:1948
msgid "Show Details"
msgstr "Részletek megjelenítése"
@ -651,7 +678,7 @@ msgstr "Külső meghajtó csatlakoztatva"
msgid "External drive disconnected"
msgstr "Külső meghajtó leválasztva"
#: js/ui/components/autorunManager.js:355
#: js/ui/components/autorunManager.js:356
#, javascript-format
msgid "Open with %s"
msgstr "Megnyitás ezzel: %s"
@ -664,8 +691,8 @@ msgstr "Jelszó:"
msgid "Type again:"
msgstr "Írja be újra:"
#: js/ui/components/networkAgent.js:140 js/ui/status/network.js:269
#: js/ui/status/network.js:352 js/ui/status/network.js:919
#: js/ui/components/networkAgent.js:140 js/ui/status/network.js:270
#: js/ui/status/network.js:353 js/ui/status/network.js:929
msgid "Connect"
msgstr "Kapcsolódás"
@ -740,7 +767,7 @@ msgstr "Mobil széles sávú hálózat jelszava"
msgid "A password is required to connect to “%s”."
msgstr "Jelszó szükséges a kapcsolódáshoz a következőhöz: „%s”."
#: js/ui/components/networkAgent.js:647 js/ui/status/network.js:1658
#: js/ui/components/networkAgent.js:647 js/ui/status/network.js:1670
msgid "Network Manager"
msgstr "Hálózatkezelő"
@ -766,7 +793,7 @@ msgstr "A hitelesítés sikertelen. Próbálja újra."
#. Translators: this is the other person changing their old IM name to their new
#. IM name.
#: js/ui/components/telepathyClient.js:760
#: js/ui/components/telepathyClient.js:765
#, javascript-format
msgid "%s is now known as %s"
msgstr "%s mostantól %s néven ismert"
@ -1066,6 +1093,50 @@ msgstr "Áttekintés"
msgid "Type to search…"
msgstr "Gépeljen a kereséshez…"
#: js/ui/padOsd.js:37
msgid "New shortcut…"
msgstr "Új gyorsbillentyű…"
#: js/ui/padOsd.js:86
msgid "Application defined"
msgstr "Alkalmazás által meghatározott"
#: js/ui/padOsd.js:87
msgid "Show on-screen help"
msgstr "Súgó megjelenítése"
#: js/ui/padOsd.js:88
msgid "Switch monitor"
msgstr "Kijelzőváltás"
#: js/ui/padOsd.js:89
msgid "Assign keystroke"
msgstr "Billentyűleütés hozzárendelése"
#: js/ui/padOsd.js:143
msgid "Done"
msgstr "Kész"
#: js/ui/padOsd.js:597
msgid "Edit…"
msgstr "Szerkesztés…"
#: js/ui/padOsd.js:610 js/ui/padOsd.js:665
msgid "None"
msgstr "Nincs"
#: js/ui/padOsd.js:648
msgid "Press a button to configure"
msgstr "Válasszon egy beállítandó gombot"
#: js/ui/padOsd.js:649
msgid "Press Esc to exit"
msgstr "Nyomja meg az Esc gombot a kilépéshez"
#: js/ui/padOsd.js:652
msgid "Press any key to exit"
msgstr "Nyomjon meg egy gombot a kilépéshez"
#: js/ui/panel.js:358
msgid "Quit"
msgstr "Kilépés"
@ -1130,7 +1201,7 @@ msgstr[1] "%d új értesítés"
msgid "Lock"
msgstr "Zárolás"
#: js/ui/screenShield.js:704
#: js/ui/screenShield.js:707
msgid "GNOME needs to lock the screen"
msgstr "A GNOME-nak zárolnia kell a képernyőt"
@ -1141,11 +1212,11 @@ msgstr "A GNOME-nak zárolnia kell a képernyőt"
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: js/ui/screenShield.js:825 js/ui/screenShield.js:1291
#: js/ui/screenShield.js:828 js/ui/screenShield.js:1295
msgid "Unable to lock"
msgstr "Nem lehet zárolni"
#: js/ui/screenShield.js:826 js/ui/screenShield.js:1292
#: js/ui/screenShield.js:829 js/ui/screenShield.js:1296
msgid "Lock was blocked by an application"
msgstr "A zárolást egy alkalmazás blokkolta"
@ -1229,7 +1300,7 @@ msgstr "Nagy szöveg"
msgid "Bluetooth"
msgstr "Bluetooth"
#: js/ui/status/bluetooth.js:56 js/ui/status/network.js:624
#: js/ui/status/bluetooth.js:56 js/ui/status/network.js:625
msgid "Bluetooth Settings"
msgstr "Bluetooth-beállítások"
@ -1246,16 +1317,16 @@ msgid "Off"
msgstr "Ki"
#: js/ui/status/bluetooth.js:140
msgid "Not In Use"
msgstr "Nincs használatban"
msgid "On"
msgstr "Be"
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:1279
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:1289
msgid "Turn On"
msgstr "Bekapcsolás"
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:178
#: js/ui/status/network.js:353 js/ui/status/network.js:1279
#: js/ui/status/network.js:1394 js/ui/status/rfkill.js:90
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:179
#: js/ui/status/network.js:354 js/ui/status/network.js:1289
#: js/ui/status/network.js:1404 js/ui/status/rfkill.js:90
#: js/ui/status/rfkill.js:117
msgid "Turn Off"
msgstr "Kikapcsolás"
@ -1303,18 +1374,18 @@ msgid "Location access can be changed at any time from the privacy settings."
msgstr ""
"A hely hozzáférése bármikor megváltoztatható az adatvédelmi beállításokban."
#: js/ui/status/network.js:101
#: js/ui/status/network.js:102
msgid "<unknown>"
msgstr "<ismeretlen>"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:451 js/ui/status/network.js:1308
#: js/ui/status/network.js:452 js/ui/status/network.js:1318
#, javascript-format
msgid "%s Off"
msgstr "%s ki"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:454
#: js/ui/status/network.js:455
#, javascript-format
msgid "%s Connected"
msgstr "%s kapcsolódva"
@ -1322,168 +1393,168 @@ msgstr "%s kapcsolódva"
#. 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);
#. %s is a network identifier
#: js/ui/status/network.js:459
#: js/ui/status/network.js:460
#, javascript-format
msgid "%s Unmanaged"
msgstr "%s felügyeletlen"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:462
#: js/ui/status/network.js:463
#, javascript-format
msgid "%s Disconnecting"
msgstr "%s leválasztása"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:469 js/ui/status/network.js:1300
#: js/ui/status/network.js:470 js/ui/status/network.js:1310
#, javascript-format
msgid "%s Connecting"
msgstr "%s kapcsolódás"
#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier
#: js/ui/status/network.js:472
#: js/ui/status/network.js:473
#, javascript-format
msgid "%s Requires Authentication"
msgstr "%s hitelesítést igényel"
#. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing; %s is a network identifier
#: js/ui/status/network.js:480
#: js/ui/status/network.js:481
#, javascript-format
msgid "Firmware Missing For %s"
msgstr "Hiányzó firmware ennél: %s"
#. 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
#: js/ui/status/network.js:484
#: js/ui/status/network.js:485
#, javascript-format
msgid "%s Unavailable"
msgstr "%s nem érhető el"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:487
#: js/ui/status/network.js:488
#, javascript-format
msgid "%s Connection Failed"
msgstr "%s kapcsolódás meghiúsult"
#: js/ui/status/network.js:503
#: js/ui/status/network.js:504
msgid "Wired Settings"
msgstr "Vezetékes beállítások"
#: js/ui/status/network.js:545
#: js/ui/status/network.js:546
msgid "Mobile Broadband Settings"
msgstr "Mobil széles sáv beállításai"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:588 js/ui/status/network.js:1305
#: js/ui/status/network.js:589 js/ui/status/network.js:1315
#, javascript-format
msgid "%s Hardware Disabled"
msgstr "%s hardver letiltva"
#. Translators: this is for a network device that cannot be activated
#. because it's disabled by rfkill (airplane mode); %s is a network identifier
#: js/ui/status/network.js:592
#: js/ui/status/network.js:593
#, javascript-format
msgid "%s Disabled"
msgstr "%s letiltva"
#: js/ui/status/network.js:632
#: js/ui/status/network.js:633
msgid "Connect to Internet"
msgstr "Kapcsolódás az internetre"
#: js/ui/status/network.js:813
#: js/ui/status/network.js:823
msgid "Airplane Mode is On"
msgstr "Repülőgép üzemmód be"
#: js/ui/status/network.js:814
#: js/ui/status/network.js:824
msgid "Wi-Fi is disabled when airplane mode is on."
msgstr "A Wi-Fi ki van kapcsolva repülőgép üzemmódban."
#: js/ui/status/network.js:815
#: js/ui/status/network.js:825
msgid "Turn Off Airplane Mode"
msgstr "Repülőgép üzemmód kikapcsolása"
#: js/ui/status/network.js:824
#: js/ui/status/network.js:834
msgid "Wi-Fi is Off"
msgstr "Wi-Fi ki"
#: js/ui/status/network.js:825
#: js/ui/status/network.js:835
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."
#: js/ui/status/network.js:826
#: js/ui/status/network.js:836
msgid "Turn On Wi-Fi"
msgstr "Wi-Fi bekapcsolása"
#: js/ui/status/network.js:851
#: js/ui/status/network.js:861
msgid "Wi-Fi Networks"
msgstr "Wi-Fi hálózatok"
#: js/ui/status/network.js:853
#: js/ui/status/network.js:863
msgid "Select a network"
msgstr "Válasszon egy hálózatot"
#: js/ui/status/network.js:883
#: js/ui/status/network.js:893
msgid "No Networks"
msgstr "Nincs hálózat"
#: js/ui/status/network.js:904 js/ui/status/rfkill.js:115
#: js/ui/status/network.js:914 js/ui/status/rfkill.js:115
msgid "Use hardware switch to turn off"
msgstr "A hardveres kapcsolóval kapcsolja ki"
#: js/ui/status/network.js:1171
#: js/ui/status/network.js:1181
msgid "Select Network"
msgstr "Válasszon hálózatot"
#: js/ui/status/network.js:1177
#: js/ui/status/network.js:1187
msgid "Wi-Fi Settings"
msgstr "Wi-Fi beállítások"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1296
#: js/ui/status/network.js:1306
#, javascript-format
msgid "%s Hotspot Active"
msgstr "%s hotspot aktív"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1311
#: js/ui/status/network.js:1321
#, javascript-format
msgid "%s Not Connected"
msgstr "%s nincs kapcsolódva"
#: js/ui/status/network.js:1411
#: js/ui/status/network.js:1421
msgid "connecting..."
msgstr "kapcsolódás…"
#. Translators: this is for network connections that require some kind of key or password
#: js/ui/status/network.js:1414
#: js/ui/status/network.js:1424
msgid "authentication required"
msgstr "hitelesítés szükséges"
#: js/ui/status/network.js:1416
#: js/ui/status/network.js:1426
msgid "connection failed"
msgstr "a kapcsolódás meghiúsult"
#: js/ui/status/network.js:1482 js/ui/status/rfkill.js:93
#: js/ui/status/network.js:1492 js/ui/status/rfkill.js:93
msgid "Network Settings"
msgstr "Hálózati beállítások"
#: js/ui/status/network.js:1484
#: js/ui/status/network.js:1494
msgid "VPN Settings"
msgstr "VPN beállítások"
#: js/ui/status/network.js:1503
#: js/ui/status/network.js:1513
msgid "VPN"
msgstr "VPN"
#: js/ui/status/network.js:1513
#: js/ui/status/network.js:1523
msgid "VPN Off"
msgstr "VPN ki"
#: js/ui/status/network.js:1697
#: js/ui/status/network.js:1709
msgid "Connection failed"
msgstr "Kapcsolódás meghiúsult"
#: js/ui/status/network.js:1698
#: js/ui/status/network.js:1710
msgid "Activation of network connection failed"
msgstr "A hálózati kapcsolat aktiválása meghiúsult"
@ -1578,22 +1649,22 @@ msgstr "Oldalsáv"
msgid "“%s” is ready"
msgstr "„%s” kész"
#: js/ui/windowManager.js:63
#: js/ui/windowManager.js:64
msgid "Do you want to keep these display settings?"
msgstr "Meg szeretné tartani ezeket a kijelzőbeállításokat?"
#. Translators: this and the following message should be limited in lenght,
#. to avoid ellipsizing the labels.
#.
#: js/ui/windowManager.js:82
#: js/ui/windowManager.js:83
msgid "Revert Settings"
msgstr "Beállítások visszavonása"
#: js/ui/windowManager.js:85
#: js/ui/windowManager.js:86
msgid "Keep Changes"
msgstr "Módosítások megtartása"
#: js/ui/windowManager.js:103
#: js/ui/windowManager.js:104
#, javascript-format
msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds"
@ -1602,7 +1673,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
#. * the width of the window and the second is the height.
#: js/ui/windowManager.js:658
#: js/ui/windowManager.js:659
#, javascript-format
msgid "%d x %d"
msgstr "%d x %d"
@ -1702,20 +1773,20 @@ msgstr[1] "%u bemenet"
msgid "System Sounds"
msgstr "Rendszerhangok"
#: src/main.c:381
#: src/main.c:380
msgid "Print version"
msgstr "Verzió kiírása"
#: src/main.c:387
#: src/main.c:386
msgid "Mode used by GDM for login screen"
msgstr "A GDM által a bejelentkezési képernyőhöz használt mód"
#: src/main.c:393
#: src/main.c:392
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr ""
"Használjon egy adott módot, például a „gdm”-et a bejelentkező képernyőn"
#: src/main.c:399
#: src/main.c:398
msgid "List possible modes"
msgstr "Lehetséges módok listázása"
@ -1741,23 +1812,8 @@ msgstr "A jelszó nem lehet üres"
msgid "Authentication dialog was dismissed by the user"
msgstr "A hitelesítési ablakot a felhasználó bezárta"
#~ msgid "System"
#~ msgstr "Rendszer"
#~ msgid "Show the notification list"
#~ msgstr "Az értesítési lista megjelenítése"
#~ msgid "Focus the active notification"
#~ msgstr "Az aktív értesítés fókuszba"
#~ msgid "Show the overview"
#~ msgstr "Áttekintés megjelenítése"
#~ msgid "Show all applications"
#~ msgstr "Minden alkalmazás megjelenítése"
#~ msgid "Open the application menu"
#~ msgstr "Az alkalmazásmenü megnyitása"
#~ msgid "Not In Use"
#~ msgstr "Nincs használatban"
#~ msgid "Show the week date in the calendar"
#~ msgstr "Hetek számának megjelenítése a naptárban"
@ -1791,9 +1847,6 @@ msgstr "A hitelesítési ablakot a felhasználó bezárta"
#~ msgid "Airplane Mode"
#~ msgstr "Repülőgép üzemmód"
#~ msgid "On"
#~ msgstr "Be"
#~ msgctxt "event list time"
#~ msgid "%H%M"
#~ msgstr "%k.%M"

776
po/id.po

File diff suppressed because it is too large Load Diff

791
po/it.po

File diff suppressed because it is too large Load Diff

807
po/kk.po

File diff suppressed because it is too large Load Diff

814
po/ko.po

File diff suppressed because it is too large Load Diff

780
po/lt.po

File diff suppressed because it is too large Load Diff

805
po/lv.po

File diff suppressed because it is too large Load Diff

900
po/nb.po

File diff suppressed because it is too large Load Diff

808
po/nl.po

File diff suppressed because it is too large Load Diff

904
po/pa.po

File diff suppressed because it is too large Load Diff

138
po/pl.po
View File

@ -9,9 +9,10 @@
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-08-20 10:20+0200\n"
"PO-Revision-Date: 2016-08-20 10:22+0200\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2016-11-17 23:00+0000\n"
"PO-Revision-Date: 2016-11-18 00:05+0100\n"
"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
"Language-Team: Polish <community-poland@mozilla.org>\n"
"Language: pl\n"
@ -334,7 +335,7 @@ msgstr "Rozszerzenia powłoki GNOME"
#: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71
#: js/ui/components/networkAgent.js:145 js/ui/components/polkitAgent.js:179
#: js/ui/endSessionDialog.js:483 js/ui/extensionDownloader.js:195
#: js/ui/shellMountOperation.js:399 js/ui/status/network.js:916
#: js/ui/shellMountOperation.js:399 js/ui/status/network.js:926
msgid "Cancel"
msgstr "Anuluj"
@ -365,7 +366,7 @@ msgstr "Inny użytkownik?"
#. Translators: this message is shown below the username entry field
#. to clue the user in on how to login to the local network realm
#: js/gdm/loginDialog.js:854
#: js/gdm/loginDialog.js:859
#, javascript-format
msgid "(e.g., user or %s)"
msgstr "(np. użytkownik lub %s)"
@ -373,12 +374,12 @@ msgstr "(np. użytkownik lub %s)"
#. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one)
#: js/gdm/loginDialog.js:859 js/ui/components/networkAgent.js:271
#: js/gdm/loginDialog.js:864 js/ui/components/networkAgent.js:271
#: js/ui/components/networkAgent.js:289
msgid "Username: "
msgstr "Nazwa użytkownika: "
#: js/gdm/loginDialog.js:1196
#: js/gdm/loginDialog.js:1201
msgid "Login Window"
msgstr "Okno logowania"
@ -691,8 +692,8 @@ msgstr "Hasło:"
msgid "Type again:"
msgstr "Proszę wpisać ponownie:"
#: js/ui/components/networkAgent.js:140 js/ui/status/network.js:269
#: js/ui/status/network.js:352 js/ui/status/network.js:919
#: js/ui/components/networkAgent.js:140 js/ui/status/network.js:270
#: js/ui/status/network.js:353 js/ui/status/network.js:929
msgid "Connect"
msgstr "Połącz"
@ -720,11 +721,11 @@ msgstr "Hasło klucza prywatnego: "
msgid "Service: "
msgstr "Usługa: "
#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:658
#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:666
msgid "Authentication required by wireless network"
msgstr "Sieć bezprzewodowa wymaga uwierzytelnienia"
#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:659
#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:667
#, javascript-format
msgid ""
"Passwords or encryption keys are required to access the wireless network "
@ -733,7 +734,7 @@ msgstr ""
"Do uzyskania dostępu do sieci bezprzewodowej „%s” wymagane jest hasło lub "
"klucze szyfrowania."
#: js/ui/components/networkAgent.js:325 js/ui/components/networkAgent.js:662
#: js/ui/components/networkAgent.js:325 js/ui/components/networkAgent.js:670
msgid "Wired 802.1X authentication"
msgstr "Uwierzytelnianie przewodowe 802.1X"
@ -741,15 +742,15 @@ msgstr "Uwierzytelnianie przewodowe 802.1X"
msgid "Network name: "
msgstr "Nazwa sieci: "
#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:666
#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:674
msgid "DSL authentication"
msgstr "Uwierzytelnienie DSL"
#: js/ui/components/networkAgent.js:339 js/ui/components/networkAgent.js:672
#: js/ui/components/networkAgent.js:339 js/ui/components/networkAgent.js:680
msgid "PIN code required"
msgstr "Wymagany jest kod PIN"
#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:673
#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:681
msgid "PIN code is needed for the mobile broadband device"
msgstr "Do korzystania z urządzenia komórkowego wymagane jest podanie kodu PIN"
@ -757,17 +758,17 @@ msgstr "Do korzystania z urządzenia komórkowego wymagane jest podanie kodu PI
msgid "PIN: "
msgstr "Kod PIN: "
#: js/ui/components/networkAgent.js:348 js/ui/components/networkAgent.js:679
#: js/ui/components/networkAgent.js:348 js/ui/components/networkAgent.js:687
msgid "Mobile broadband network password"
msgstr "Hasło sieci komórkowej"
#: js/ui/components/networkAgent.js:349 js/ui/components/networkAgent.js:663
#: js/ui/components/networkAgent.js:667 js/ui/components/networkAgent.js:680
#: js/ui/components/networkAgent.js:349 js/ui/components/networkAgent.js:671
#: js/ui/components/networkAgent.js:675 js/ui/components/networkAgent.js:688
#, javascript-format
msgid "A password is required to connect to “%s”."
msgstr "Do połączenia z siecią „%s” wymagane jest hasło."
#: js/ui/components/networkAgent.js:647 js/ui/status/network.js:1658
#: js/ui/components/networkAgent.js:655 js/ui/status/network.js:1670
msgid "Network Manager"
msgstr "Menedżer sieci"
@ -793,7 +794,7 @@ msgstr "To nie zadziałało. Proszę spróbować ponownie."
#. Translators: this is the other person changing their old IM name to their new
#. IM name.
#: js/ui/components/telepathyClient.js:760
#: js/ui/components/telepathyClient.js:765
#, javascript-format
msgid "%s is now known as %s"
msgstr "Użytkownik %s jest teraz znany jako %s"
@ -1132,6 +1133,10 @@ msgstr "Proszę wprowadzić polecenie:"
msgid "Close"
msgstr "Zamknij"
#: js/ui/runDialog.js:277
msgid "Restart is not available on Wayland"
msgstr "Ponowne uruchamianie jest niedostępne w technologii Wayland"
#: js/ui/runDialog.js:282
msgid "Restarting…"
msgstr "Ponowne uruchamianie…"
@ -1173,11 +1178,11 @@ msgstr "Środowisko GNOME musi zablokować ekran"
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: js/ui/screenShield.js:825 js/ui/screenShield.js:1291
#: js/ui/screenShield.js:825 js/ui/screenShield.js:1292
msgid "Unable to lock"
msgstr "Nie można zablokować"
#: js/ui/screenShield.js:826 js/ui/screenShield.js:1292
#: js/ui/screenShield.js:826 js/ui/screenShield.js:1293
msgid "Lock was blocked by an application"
msgstr "Blokowanie zostało zablokowane przez program"
@ -1261,7 +1266,7 @@ msgstr "Duży tekst"
msgid "Bluetooth"
msgstr "Bluetooth"
#: js/ui/status/bluetooth.js:56 js/ui/status/network.js:624
#: js/ui/status/bluetooth.js:56 js/ui/status/network.js:625
msgid "Bluetooth Settings"
msgstr "Ustawienia Bluetooth"
@ -1282,13 +1287,13 @@ msgstr "Wyłączono"
msgid "Not In Use"
msgstr "Nieużywane"
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:1279
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:1289
msgid "Turn On"
msgstr "Włącz"
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:178
#: js/ui/status/network.js:353 js/ui/status/network.js:1279
#: js/ui/status/network.js:1394 js/ui/status/rfkill.js:90
#: js/ui/status/bluetooth.js:142 js/ui/status/network.js:179
#: js/ui/status/network.js:354 js/ui/status/network.js:1289
#: js/ui/status/network.js:1404 js/ui/status/rfkill.js:90
#: js/ui/status/rfkill.js:117
msgid "Turn Off"
msgstr "Wyłącz"
@ -1336,18 +1341,18 @@ msgid "Location access can be changed at any time from the privacy settings."
msgstr ""
"W każdej chwili można zmienić dostęp do położenia w ustawieniach prywatności."
#: js/ui/status/network.js:101
#: js/ui/status/network.js:102
msgid "<unknown>"
msgstr "<nieznane>"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:451 js/ui/status/network.js:1308
#: js/ui/status/network.js:452 js/ui/status/network.js:1318
#, javascript-format
msgid "%s Off"
msgstr "Wyłączono sieć %s"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:454
#: js/ui/status/network.js:455
#, javascript-format
msgid "%s Connected"
msgstr "Połączono z siecią %s"
@ -1355,168 +1360,168 @@ msgstr "Połączono z siecią %s"
#. 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);
#. %s is a network identifier
#: js/ui/status/network.js:459
#: js/ui/status/network.js:460
#, javascript-format
msgid "%s Unmanaged"
msgstr "Sieć %s jest niezarządzana"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:462
#: js/ui/status/network.js:463
#, javascript-format
msgid "%s Disconnecting"
msgstr "Rozłączanie z sieci %s"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:469 js/ui/status/network.js:1300
#: js/ui/status/network.js:470 js/ui/status/network.js:1310
#, javascript-format
msgid "%s Connecting"
msgstr "Łączenie z siecią %s"
#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier
#: js/ui/status/network.js:472
#: js/ui/status/network.js:473
#, javascript-format
msgid "%s Requires Authentication"
msgstr "Sieć %s wymaga uwierzytelnienia"
#. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing; %s is a network identifier
#: js/ui/status/network.js:480
#: js/ui/status/network.js:481
#, javascript-format
msgid "Firmware Missing For %s"
msgstr "Brak oprogramowania sprzętowego dla sieci %s"
#. 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
#: js/ui/status/network.js:484
#: js/ui/status/network.js:485
#, javascript-format
msgid "%s Unavailable"
msgstr "Sieć %s jest niedostępna"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:487
#: js/ui/status/network.js:488
#, javascript-format
msgid "%s Connection Failed"
msgstr "Połączenie z siecią %s się nie powiodło"
#: js/ui/status/network.js:503
#: js/ui/status/network.js:504
msgid "Wired Settings"
msgstr "Ustawienia sieci przewodowej"
#: js/ui/status/network.js:545
#: js/ui/status/network.js:546
msgid "Mobile Broadband Settings"
msgstr "Ustawienia sieci komórkowej"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:588 js/ui/status/network.js:1305
#: js/ui/status/network.js:589 js/ui/status/network.js:1315
#, javascript-format
msgid "%s Hardware Disabled"
msgstr "Wyłączono sprzęt dla sieci %s"
#. Translators: this is for a network device that cannot be activated
#. because it's disabled by rfkill (airplane mode); %s is a network identifier
#: js/ui/status/network.js:592
#: js/ui/status/network.js:593
#, javascript-format
msgid "%s Disabled"
msgstr "Wyłączono sieć %s"
#: js/ui/status/network.js:632
#: js/ui/status/network.js:633
msgid "Connect to Internet"
msgstr "Połącz z Internetem"
#: js/ui/status/network.js:813
#: js/ui/status/network.js:823
msgid "Airplane Mode is On"
msgstr "Tryb samolotowy jest włączony"
#: js/ui/status/network.js:814
#: js/ui/status/network.js:824
msgid "Wi-Fi is disabled when airplane mode is on."
msgstr "Sieć Wi-Fi jest wyłączona, kiedy tryb samolotowy jest włączony."
#: js/ui/status/network.js:815
#: js/ui/status/network.js:825
msgid "Turn Off Airplane Mode"
msgstr "Wyłącz tryb samolotowy"
#: js/ui/status/network.js:824
#: js/ui/status/network.js:834
msgid "Wi-Fi is Off"
msgstr "Sieć Wi-Fi jest wyłączona"
#: js/ui/status/network.js:825
#: js/ui/status/network.js:835
msgid "Wi-Fi needs to be turned on in order to connect to a network."
msgstr "Wi-Fi musi być włączone, aby połączyć z siecią."
#: js/ui/status/network.js:826
#: js/ui/status/network.js:836
msgid "Turn On Wi-Fi"
msgstr "Włącz sieć Wi-Fi"
#: js/ui/status/network.js:851
#: js/ui/status/network.js:861
msgid "Wi-Fi Networks"
msgstr "Sieci Wi-Fi"
#: js/ui/status/network.js:853
#: js/ui/status/network.js:863
msgid "Select a network"
msgstr "Wybór sieci"
#: js/ui/status/network.js:883
#: js/ui/status/network.js:893
msgid "No Networks"
msgstr "Brak sieci"
#: js/ui/status/network.js:904 js/ui/status/rfkill.js:115
#: js/ui/status/network.js:914 js/ui/status/rfkill.js:115
msgid "Use hardware switch to turn off"
msgstr "Należy użyć przełącznika sprzętowego, aby wyłączyć"
#: js/ui/status/network.js:1171
#: js/ui/status/network.js:1181
msgid "Select Network"
msgstr "Wybierz sieć"
#: js/ui/status/network.js:1177
#: js/ui/status/network.js:1187
msgid "Wi-Fi Settings"
msgstr "Ustawienia sieci Wi-Fi"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1296
#: js/ui/status/network.js:1306
#, javascript-format
msgid "%s Hotspot Active"
msgstr "Hotspot %s jest aktywny"
#. Translators: %s is a network identifier
#: js/ui/status/network.js:1311
#: js/ui/status/network.js:1321
#, javascript-format
msgid "%s Not Connected"
msgstr "Nie połączono z siecią %s"
#: js/ui/status/network.js:1411
#: js/ui/status/network.js:1421
msgid "connecting..."
msgstr "łączenie…"
#. Translators: this is for network connections that require some kind of key or password
#: js/ui/status/network.js:1414
#: js/ui/status/network.js:1424
msgid "authentication required"
msgstr "wymagane jest uwierzytelnienie"
#: js/ui/status/network.js:1416
#: js/ui/status/network.js:1426
msgid "connection failed"
msgstr "połączenie się nie powiodło"
#: js/ui/status/network.js:1482 js/ui/status/rfkill.js:93
#: js/ui/status/network.js:1492 js/ui/status/rfkill.js:93
msgid "Network Settings"
msgstr "Ustawienia sieci"
#: js/ui/status/network.js:1484
#: js/ui/status/network.js:1494
msgid "VPN Settings"
msgstr "Ustawienia sieci VPN"
#: js/ui/status/network.js:1503
#: js/ui/status/network.js:1513
msgid "VPN"
msgstr "VPN"
#: js/ui/status/network.js:1513
#: js/ui/status/network.js:1523
msgid "VPN Off"
msgstr "Wyłączono sieć VPN"
#: js/ui/status/network.js:1697
#: js/ui/status/network.js:1709
msgid "Connection failed"
msgstr "Połączenie się nie powiodło"
#: js/ui/status/network.js:1698
#: js/ui/status/network.js:1710
msgid "Activation of network connection failed"
msgstr "Aktywacja połączenia sieciowego się nie powiodła"
@ -1775,3 +1780,6 @@ msgstr "Hasło nie może być puste"
#: src/shell-polkit-authentication-agent.c:353
msgid "Authentication dialog was dismissed by the user"
msgstr "Okno dialogowe uwierzytelnienia zostało odrzucone przez użytkownika"
msgid "Launch using Dedicated Graphics Card"
msgstr "Uruchom za pomocą dedykowanej karty graficznej"

777
po/pt.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

834
po/ru.po

File diff suppressed because it is too large Load Diff

781
po/sk.po

File diff suppressed because it is too large Load Diff

827
po/sl.po

File diff suppressed because it is too large Load Diff

836
po/sr.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

827
po/sv.po

File diff suppressed because it is too large Load Diff

763
po/tr.po

File diff suppressed because it is too large Load Diff

844
po/uk.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

831
po/vi.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -78,7 +78,7 @@ gnome_shell_cflags = \
-DGNOME_SHELL_PKGLIBDIR=\"$(pkglibdir)\"
privlibdir = $(pkglibdir)
privlib_LTLIBRARIES = libgnome-shell-js.la libgnome-shell-menu.la libgnome-shell.la
privlib_LTLIBRARIES = libgnome-shell-menu.la libgnome-shell.la
noinst_LTLIBRARIES += libgnome-shell-base.la
shell_built_sources = \
@ -200,7 +200,7 @@ gnome_shell_CPPFLAGS = \
# Here, and after, we repeat mutter and bluetooth libraries just for the rpath
# The dependency is already pulled in by libtool
gnome_shell_LDADD = libgnome-shell.la libgnome-shell-js.la $(GNOME_SHELL_LIBS) $(MUTTER_LIBS)
gnome_shell_LDADD = libgnome-shell.la $(GNOME_SHELL_LIBS) $(MUTTER_LIBS)
gnome_shell_LDFLAGS = -rpath $(MUTTER_TYPELIB_DIR)
gnome_shell_DEPENDENCIES = libgnome-shell.la
@ -212,7 +212,7 @@ nodist_gnome_shell_extension_prefs_SOURCES = \
$(top_builddir)/js/js-resources.h \
$(NULL)
gnome_shell_extension_prefs_CPPFLAGS = $(gnome_shell_cflags)
gnome_shell_extension_prefs_LDADD = libgnome-shell-js.la $(GNOME_SHELL_LIBS)
gnome_shell_extension_prefs_LDADD = $(GNOME_SHELL_LIBS)
gnome_shell_extension_prefs_LDFLAGS = -rpath $(MUTTER_TYPELIB_DIR)
if HAVE_NETWORKMANAGER
@ -226,30 +226,13 @@ nodist_gnome_shell_portal_helper_SOURCES = \
$(top_builddir)/js/js-resources.h \
$(NULL)
gnome_shell_portal_helper_CPPFLAGS = $(gnome_shell_cflags)
gnome_shell_portal_helper_LDADD = libgnome-shell-js.la $(GNOME_SHELL_LIBS)
gnome_shell_portal_helper_LDADD = $(GNOME_SHELL_LIBS)
gnome_shell_portal_helper_LDFLAGS = -rpath $(MUTTER_TYPELIB_DIR)
endif
########################################
libgnome_shell_js_la_SOURCES = \
shell-js.h \
shell-js.cpp \
$(NULL)
libgnome_shell_js_la_LIBADD = \
$(GNOME_SHELL_JS_LIBS) \
$(NULL)
libgnome_shell_js_la_LDFLAGS = \
-avoid-version
libgnome_shell_js_la_CPPFLAGS = \
$(GNOME_SHELL_JS_CFLAGS)
########################################
shell_recorder_sources = \
shell-recorder.c \
shell-recorder.h
@ -366,13 +349,6 @@ Shell_0_1_gir_SCANNERFLAGS = \
INTROSPECTION_GIRS += Shell-0.1.gir
CLEANFILES += Shell-0.1.gir
ShellJS-0.1.gir: libgnome-shell-js.la
ShellJS_0_1_gir_CFLAGS = $(libgnome_shell_la_CPPFLAGS) -I $(srcdir)
ShellJS_0_1_gir_LIBS = libgnome-shell-js.la
ShellJS_0_1_gir_FILES = $(libgnome_shell_js_la_SOURCES)
INTROSPECTION_GIRS += ShellJS-0.1.gir
CLEANFILES += ShellJS-0.1.gir
St-1.0.gir: libst-1.0.la
St_1_0_gir_INCLUDES = Clutter-1.0 Gtk-3.0
St_1_0_gir_CFLAGS = $(st_cflags) -DST_COMPILATION

View File

@ -6,8 +6,6 @@
#include <gjs/gjs.h>
#include <glib/gi18n.h>
#include "shell-js.h"
int
main (int argc, char *argv[])
{
@ -51,18 +49,3 @@ main (int argc, char *argv[])
return 0;
}
/* HACK:
Add a dummy function that calls into libgnome-shell-js.so to ensure it's
linked to /usr/bin/gnome-shell-extension-prefs even when linking with
--as-needed. This function is never actually called.
https://bugzilla.gnome.org/show_bug.cgi?id=670477
*/
void _shell_link_to_shell_js (void);
void
_shell_link_to_shell_js (void)
{
shell_js_add_extension_importer (NULL, NULL, NULL, NULL);
}

View File

@ -17,7 +17,7 @@ except ImportError:
print('The Python simplejson module is required')
sys.exit(1)
from gi.repository import Gio
from gi.repository import Gio, GLib
SAMPLE_EXTENSION_FILES = {
"extension.js": """
@ -172,6 +172,30 @@ def disable_extension(uuid):
settings.set_strv(ENABLED_EXTENSIONS_KEY, extensions)
print("%r is now disabled." % (uuid,), file=sys.stderr)
def reload_extension(uuid):
settings = Gio.Settings(schema='org.gnome.shell')
extensions = settings.get_strv(ENABLED_EXTENSIONS_KEY)
if uuid not in extensions:
print("%r is not enabled or installed." % (uuid,), file=sys.stderr)
sys.exit(1)
proxy = Gio.DBusProxy.new_sync(Gio.bus_get_sync(Gio.BusType.SESSION, None),
Gio.DBusProxyFlags.NONE,
None,
'org.gnome.Shell',
'/org/gnome/Shell',
'org.gnome.Shell.Extensions',
None)
proxy.call_sync('ReloadExtension',
GLib.Variant('(s)', (uuid,)),
Gio.DBusCallFlags.NONE,
-1,
None)
print("%r reloaded." % (uuid,), file=sys.stderr)
def main():
parser = optparse.OptionParser()
parser.add_option("-d", "--disable-extension", dest="disable",
@ -180,6 +204,8 @@ def main():
help="Enable a GNOME Shell extension")
parser.add_option("-c", "--create-extension", dest="create", action="store_true",
help="Create a new GNOME Shell extension")
parser.add_option("-r", "--reload-extension", dest="reload",
help="Reload a GNOME Shell extension")
options, args = parser.parse_args()
if args:
@ -195,6 +221,9 @@ def main():
elif options.create:
create_extension()
elif options.reload:
reload_extension(options.reload)
else:
parser.print_usage()
sys.exit(1)

View File

@ -42,6 +42,8 @@ static void gnome_shell_plugin_minimize (MetaPlugin *plugin,
MetaWindowActor *actor);
static void gnome_shell_plugin_unminimize (MetaPlugin *plugin,
MetaWindowActor *actor);
static void gnome_shell_plugin_size_changed (MetaPlugin *plugin,
MetaWindowActor *actor);
static void gnome_shell_plugin_size_change (MetaPlugin *plugin,
MetaWindowActor *actor,
MetaSizeChange which_change,
@ -127,6 +129,7 @@ gnome_shell_plugin_class_init (GnomeShellPluginClass *klass)
plugin_class->map = gnome_shell_plugin_map;
plugin_class->minimize = gnome_shell_plugin_minimize;
plugin_class->unminimize = gnome_shell_plugin_unminimize;
plugin_class->size_changed = gnome_shell_plugin_size_changed;
plugin_class->size_change = gnome_shell_plugin_size_change;
plugin_class->destroy = gnome_shell_plugin_destroy;
@ -272,6 +275,13 @@ gnome_shell_plugin_unminimize (MetaPlugin *plugin,
}
static void
gnome_shell_plugin_size_changed (MetaPlugin *plugin,
MetaWindowActor *actor)
{
_shell_wm_size_changed (get_shell_wm (), actor);
}
static void
gnome_shell_plugin_size_change (MetaPlugin *plugin,
MetaWindowActor *actor,

View File

@ -25,7 +25,6 @@
#include "shell-global.h"
#include "shell-global-private.h"
#include "shell-js.h"
#include "shell-perf-log.h"
#include "st.h"
@ -480,17 +479,3 @@ main (int argc, char **argv)
return ecode;
}
/* HACK:
Add a dummy function that calls into libgnome-shell-js.so to ensure it's
linked to /usr/bin/gnome-shell even when linking with --as-needed.
This function is never actually called.
https://bugzilla.gnome.org/show_bug.cgi?id=670477
*/
void _shell_link_to_shell_js (void);
void
_shell_link_to_shell_js (void)
{
shell_js_add_extension_importer (NULL, NULL, NULL, NULL);
}

View File

@ -505,7 +505,7 @@ shell_app_activate_full (ShellApp *app,
case SHELL_APP_STATE_STOPPED:
{
GError *error = NULL;
if (!shell_app_launch (app, timestamp, workspace, &error))
if (!shell_app_launch (app, timestamp, workspace, FALSE, &error))
{
char *msg;
msg = g_strdup_printf (_("Failed to launch “%s”"), shell_app_get_name (app));
@ -549,7 +549,7 @@ shell_app_open_new_window (ShellApp *app,
* as say Pidgin. Ideally, we have the application express to us
* that it supports an explicit new-window action.
*/
shell_app_launch (app, 0, workspace, NULL);
shell_app_launch (app, 0, workspace, FALSE, NULL);
}
/**
@ -1200,12 +1200,14 @@ app_child_setup (gpointer user_data)
* shell_app_launch:
* @timestamp: Event timestamp, or 0 for current event timestamp
* @workspace: Start on this workspace, or -1 for default
* @discrete_gpu: Whether to start on the discrete GPU
* @error: A #GError
*/
gboolean
shell_app_launch (ShellApp *app,
guint timestamp,
int workspace,
gboolean discrete_gpu,
GError **error)
{
ShellGlobal *global;
@ -1227,6 +1229,8 @@ shell_app_launch (ShellApp *app,
global = shell_global_get ();
context = shell_global_create_app_launch_context (global, timestamp, workspace);
if (discrete_gpu)
g_app_launch_context_setenv (context, "DRI_PRIME", "1");
ret = g_desktop_app_info_launch_uris_as_manager (app->info, NULL,
context,

View File

@ -54,6 +54,7 @@ gboolean shell_app_is_on_workspace (ShellApp *app, MetaWorkspace *workspace);
gboolean shell_app_launch (ShellApp *app,
guint timestamp,
int workspace,
gboolean discrete_gpu,
GError **error);
void shell_app_launch_action (ShellApp *app,

View File

@ -277,6 +277,7 @@ shell_global_init (ShellGlobal *global)
XDisplayName (NULL));
(void) g_mkdir_with_parents (path, 0700);
global->runtime_state_path = g_file_new_for_path (path);
g_free (path);
global->settings = g_settings_new ("org.gnome.shell");

View File

@ -1,77 +0,0 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
#include "config.h"
#include "shell-js.h"
#include <gio/gio.h>
#include <gjs/gjs.h>
#include <gjs/gjs-module.h>
/**
* shell_js_add_extension_importer:
* @target_object_script: JavaScript code evaluating to a target object
* @target_property: Name of property to use for importer
* @directory: Source directory:
* @error: A #GError
*
* This function sets a property named @target_property on the object
* resulting from the evaluation of @target_object_script code, which
* acts as a GJS importer for directory @directory.
*
* Returns: %TRUE on success
*/
gboolean
shell_js_add_extension_importer (const char *target_object_script,
const char *target_property,
const char *directory,
GError **error)
{
jsval target_object;
GList *contexts;
JSContext *context;
char *search_path[2] = { 0, 0 };
gboolean ret = FALSE;
/* Take the first GjsContext from all of them --
* we should only ever have one context, so this
* should be alright. */
contexts = gjs_context_get_all ();
context = (JSContext*) gjs_context_get_native_context ((GjsContext*)contexts->data);
g_list_free_full (contexts, g_object_unref);
JS_BeginRequest (context);
/* This is a bit of a hack; ideally we'd be able to pass our target
* object directly into this function, but introspection doesn't
* support that at the moment. Instead evaluate a string to get it. */
if (!JS_EvaluateScript(context,
JS_GetGlobalObject(context),
target_object_script,
strlen (target_object_script),
"<target_object_script>",
0,
&target_object))
{
gjs_log_exception(context);
g_set_error(error,
G_IO_ERROR,
G_IO_ERROR_FAILED,
"Unable to import %s", target_object_script);
goto out;
}
if (!JSVAL_IS_OBJECT (target_object))
{
g_error ("shell_js_add_extension_importer: invalid target object");
goto out;
}
search_path[0] = (char*)directory;
gjs_define_importer (context, JSVAL_TO_OBJECT (target_object), target_property, (const char **)search_path, FALSE);
ret = TRUE;
out:
JS_EndRequest (context);
return ret;
}

View File

@ -1,16 +0,0 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
#ifndef __SHELL_JS_H__
#define __SHELL_JS_H__
#include <glib.h>
G_BEGIN_DECLS
gboolean shell_js_add_extension_importer (const char *target_object_script,
const char *target_property,
const char *directory,
GError **error);
G_END_DECLS
#endif /* __SHELL_JS_H__ */

View File

@ -22,6 +22,7 @@
#include "shell-global.h"
#include "shell-recorder-src.h"
#include "shell-recorder.h"
#include "shell-util.h"
#define A11Y_APPS_SCHEMA "org.gnome.desktop.a11y.applications"
#define MAGNIFIER_ACTIVE_KEY "screen-magnifier-enabled"
@ -437,17 +438,21 @@ recorder_record_frame (ShellRecorder *recorder,
if (n_captures == 0)
return;
/*
* TODO: Deal with each capture region separately, instead of dropping
* anything except the first one.
*/
if (n_captures == 1)
image = cairo_surface_reference (captures[0].image);
else
image = shell_util_composite_capture_images (captures,
n_captures,
recorder->area.x,
recorder->area.y,
recorder->area.width,
recorder->area.height);
image = captures[0].image;
data = cairo_image_surface_get_data (image);
size = captures[0].rect.width * captures[0].rect.height * 4;
size = (cairo_image_surface_get_height (image) *
cairo_image_surface_get_stride (image));
/* TODO: Capture more than the first framebuffer. */
for (i = 1; i < n_captures; i++)
for (i = 0; i < n_captures; i++)
cairo_surface_destroy (captures[i].image);
g_free (captures);

View File

@ -10,6 +10,7 @@
#include "shell-global.h"
#include "shell-screenshot.h"
#include "shell-util.h"
#define A11Y_APPS_SCHEMA "org.gnome.desktop.a11y.applications"
#define MAGNIFIER_ACTIVE_KEY "screen-magnifier-enabled"
@ -233,14 +234,15 @@ do_grab_screenshot (ShellScreenshot *screenshot,
if (n_captures == 0)
return;
else if (n_captures == 1)
priv->image = cairo_surface_reference (captures[0].image);
else
priv->image = shell_util_composite_capture_images (captures,
n_captures,
x, y,
width, height);
/*
* TODO: Deal with each capture region separately, instead of dropping
* anything except the first one.
*/
priv->image = captures[0].image;
for (i = 1; i < n_captures; i++)
for (i = 0; i < n_captures; i++)
cairo_surface_destroy (captures[i].image);
g_free (captures);
@ -261,6 +263,10 @@ _draw_cursor_image (MetaCursorTracker *tracker,
int x, y;
int xhot, yhot;
texture = meta_cursor_tracker_get_sprite (tracker);
if (!texture)
return;
screenshot_region = cairo_region_create_rectangle (&area);
meta_cursor_tracker_get_pointer (tracker, &x, &y, NULL);
@ -270,7 +276,6 @@ _draw_cursor_image (MetaCursorTracker *tracker,
return;
}
texture = meta_cursor_tracker_get_sprite (tracker);
meta_cursor_tracker_get_hot (tracker, &xhot, &yhot);
width = cogl_texture_get_width (texture);
height = cogl_texture_get_height (texture);

View File

@ -204,6 +204,12 @@ shell_tray_icon_click (ShellTrayIcon *icon,
gdk_error_trap_push ();
remote_window = gtk_socket_get_plug_window (GTK_SOCKET (icon->priv->socket));
if (remote_window == NULL)
{
g_warning ("shell tray: plug window is gone");
gdk_error_trap_pop_ignored ();
return;
}
xwindow = GDK_WINDOW_XID (remote_window);
xdisplay = GDK_WINDOW_XDISPLAY (remote_window);
screen = gdk_window_get_screen (remote_window);

View File

@ -446,3 +446,49 @@ shell_util_get_content_for_window_actor (MetaWindowActor *window_actor,
return content;
}
cairo_surface_t *
shell_util_composite_capture_images (ClutterCapture *captures,
int n_captures,
int x,
int y,
int width,
int height)
{
int i;
cairo_format_t format;
cairo_surface_t *image;
cairo_t *cr;
format = cairo_image_surface_get_format (captures[0].image);
image = cairo_image_surface_create (format, width, height);
cr = cairo_create (image);
for (i = 0; i < n_captures; i++)
{
ClutterCapture *capture = &captures[i];
double capture_scale = 1.0;
/*
* Ignore capture regions with scale other than 1 for now; mutter can't
* produce them yet, so there is no way to test them.
*/
cairo_surface_get_device_scale (capture->image, &capture_scale, NULL);
if ((int) capture_scale != 1)
continue;
cairo_save (cr);
cairo_translate (cr,
capture->rect.x - x,
capture->rect.y - y);
cairo_set_source_surface (cr, capture->image, 0, 0);
cairo_paint (cr);
cairo_restore (cr);
}
cairo_destroy (cr);
return image;
}

View File

@ -51,6 +51,13 @@ gboolean shell_util_need_background_refresh (void);
ClutterContent * shell_util_get_content_for_window_actor (MetaWindowActor *window_actor,
MetaRectangle *window_rect);
cairo_surface_t * shell_util_composite_capture_images (ClutterCapture *captures,
int n_captures,
int x,
int y,
int width,
int height);
G_END_DECLS
#endif /* __SHELL_UTIL_H__ */

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