Compare commits

...

73 Commits

Author SHA1 Message Date
e7a502e5c3 wip: Port extensions app/portal to GTK4 2020-08-01 04:00:16 +02:00
b689b35b7d data: Place the shell into session.slice when using systemd
This way we conform more to https://systemd.io/DESKTOP_ENVIRONMENTS

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/895
2020-07-31 13:53:31 +00:00
01a927f388 windowManager: Wait for X11 services using systemd
To do this, we now wait for the start/stop job to complete. We also have
two targets in gnome-session to ensure that everything is working as
expected.

In order to start the services, we simply request the
gnome-session-x11-services-ready.target unit, and wait for it to become
available. To stop, we use the gnome-session-x11-services.target unit
which should stop all services in a way that is entirely race free.

This requires both gnome-session and gnome-settings-daemon changes to
work (which are in the corresponding merge requests).

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/895
2020-07-31 13:53:31 +00:00
41d5b1455f data: Create generic org.gnome.Shell.target
Move the GNOME shell service file adapation for x11/wayland into the
target/service files. This means that the session definition can simply
pull in org.gnome.Shell.target, without having to care about whether it
is starting an X11 or wayland session.

Note that this currently requires fork'ing to do the test. This will
however not be needed in the long term when ConditionEnvironment becomes
available (see https://github.com/systemd/systemd/pull/15817).

We technically do not need to use template units. But doing so means
that the unit can be translated to the app id more easily (though it is
not yet completely clear how this should look like in the long term).

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/895
2020-07-31 13:53:31 +00:00
b710c6e275 data: Remove unused, commented and obsolete Conflicts lines
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/895
2020-07-31 13:53:31 +00:00
4c9f42eea9 data: Use org.gnome.Shell prefix for systemd units
In general we want to move towards using reverse domain names for
systemd units. Doing this also means we have a consistent name between
desktop file and systemd unit, allowing us to create a generator that
pulls in the unit as defined in the sessions RequiredComponents.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/895
2020-07-31 13:53:31 +00:00
2b0731ab81 Move screencasting into a separate service process
Move the screencasting into a separate D-Bus service process, using
PipeWire instead of Clutter API. The service is implemented in
Javascript using the dbusService.js helper, and implements the same API
as was done by screencast.js and the corresponding C code.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1372
2020-07-31 10:51:12 +02:00
a9b803f075 introspect: Introspect screen size
To be used by the screen cast service.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1372
2020-07-31 10:51:12 +02:00
73436b5276 dbusService: Queue shutdown check on startup
If something started the service, but crashed before managing to make a
method call, we'd end up with the service running indefinitely. Fix this
by queueing a shutdown check immediately on startup.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1372
2020-07-31 10:51:12 +02:00
20dcc8aa87 status/remote-access: Visualize recordings as screen recording
If a remote access is marked as a recording, visualize it the same way
as a built in recording. Also don't stop it if there is an actual screen
sharing going on, so that one can use a plain "recording" while still
disabling what is an actual screen sharing.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1372
2020-07-31 10:51:12 +02:00
fdac0602db background: Mark pattern backgrounds as loaded
Otherwise we don't let GNOME Shell startup to proceed. Noticed
by accidentally running on the memory GSettings backend.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1381
2020-07-30 11:48:13 +02:00
e5272c84d7 Update Turkish translation 2020-07-29 21:57:19 +00:00
1812db7aa8 panelMenu: Destroy menu before chaining up
This avoid some (harmless but annoying) warnings, and is closer to
the original code prior to commit fc342fe8c5 and 557b232c89.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/3022
2020-07-29 19:40:54 +00:00
260405a49e popupMenu: Ungrab when removing active menu
While we do have some handling for removing the active menu, it has
been a no-op for years. The bit that we really care about from the
PopupMenuManager's point of view is the existing grab though. Drop
that instead of calling _closeMenu() directly; ungrabbing will still
call the method indirectly, and it will still be a no-op :-)

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/3022
2020-07-29 19:40:54 +00:00
71d37bffdf util: Remove shell_util_get_transformed_allocation
This helper function could be replaced with the new
clutter_actor_get_transformed_extents, that does the same.

See https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1386

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1380
2020-07-29 18:09:53 +02:00
95436a08b5 Updated Spanish translation 2020-07-29 12:42:11 +02:00
13137aad9d loginDialog: Reset auth prompt on vt switch before fade in
At the moment, if a user switches to the login screen vt,
the login screen fades in whatever was on screen prior, and
then does a reset.

It makes more sense to reset first, so we fade in what the
user is going to interact with instead of what they interacted
with before.

Fixes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2997
2020-07-27 16:18:44 -04:00
71f55643b2 layout: Only show ripple animation when overview was toggled
On X11, clients can grab keyboard on pointer (for example for popup
menus), and as a result the pushModal() call when opening the overview
fails.

However when the hot corner was used to toggle the overview, we still
show the ripple animation in that case, which is confusing as the action
did not actually happen.

Fix this by only showing the ripples if the overview is animating after
calling toggle(), as that should be a reliable indication of whether
the call was successful.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/3005
2020-07-27 13:13:14 +00:00
5c550daecb backgroundManager: Always emit 'loaded' signal
As backgrounds are cached, it is possible that we never emit the
'loaded' signal added in commit f386103bc1. We are relying on the
signal though, so do the same as Background and emit the signal
from an idle if the background was already loaded.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1371
2020-07-22 11:02:24 +00:00
4e0492c517 Update Catalan translation 2020-07-22 08:47:17 +02:00
f386103bc1 Delay login animation until after wallpaper has loaded
Currently, the login animation can occur before the user's wallpaper has
been loaded. When this happens, we wind up displaying a solid blue
background for half a second or so before the proper background is
displayed. This looks jarring and bad. It's great that we can start
GNOME quickly, but starting up before the wallpaper is ready is *too*
quickly.

I've been meaning to fix this since 2014. Better late than never! We can
just have BackgroundManager emit a loaded signal the first time it loads
its first background, and have the startup animation code wait for that
before proceeding.

Some of this code is by Florian, who helped with promisifying. Thanks!

https://bugzilla.gnome.org/show_bug.cgi?id=734996
2020-07-21 20:25:31 -05:00
26e66aa4fd popupMenu: Handle keypress if numlock is enabled
On Wayland, navigating menus with the keyboard would not open drop-down
menus when NumLock is enabled.

That's old issue (gnome-shell#550) that was not completely fixed with
commit 88556226 because the lock mask needs to be filtered out in
_onKeyPress() as well.

Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/550
2020-07-21 16:38:15 +02:00
4420f52080 Update Romanian translation 2020-07-21 07:08:22 +00:00
b4082063de Update Ukrainian translation 2020-07-21 05:43:54 +00:00
bde974087a appDisplay: Append new icons at the first available page after first
As per design discussion, the first page is a somewhat of a special
page where we really don't want to change anything unless necessary.

Append new icons at the first available slot after the first page.
Make the placeholder icon be appended to the first available page
as well, since it's always used when dragging from folder dialogs.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1284
2020-07-20 16:13:20 +00:00
d93b51e135 appDisplay: Use a drag monitor to check for out-of-dialog drags
When the app folder dialog handles a drag hover, it starts a timeout
to popdown if dragging outside the "real" dialog area. However, when
dragging inside it, BaseAppView handles all drag hover events which
would disarm the popdown timeout. In cases like this, it's almost
impossible to prevent the timeout from triggering, which always pops
down the dialog.

Add a drag monitor when handling any drag hover (which only happens
when dragging outside the folder's icon grid); and eventually disarm
the popdown timeout from the monitor's motion event. Remove the drag
monitor when dragging over the folder dialog again.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1284
2020-07-20 16:13:20 +00:00
730a68dffc appDisplay: Increase folder dialog popdown timeout
App folders are now customizable, and the way to move icons to
another page is by throwing the cursor to either the left or
the right of the grid.

However, doing that triggers the popdown timeout, wich is 600ms
as of now, which is considerably short for such interaction.

Increase this timeout to 1.5 seconds.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1284
2020-07-20 16:13:20 +00:00
f06c257952 appDisplay: Allow reordering folders
Implement the methods to sort and query item positions
using the index in the GSettings key, and store the
updated positions when accepting the drop.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1284
2020-07-20 16:13:20 +00:00
7afab2c28c appDisplay: Factor out folder loading code
We'll reuse this code to implement custom positioning in
folders.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1284
2020-07-20 16:13:20 +00:00
16a18f2ae7 appDisplay: Only handle DnD when mapped
Now that the DnD code is shared between AppDisplay and
FolderView, we hit an unexpected problem: FolderView is
handling drag events even when the folder dialog is hidden.
As a side effect, this spams the journal with warnings.

Only handle drag events when mapped. On unmap, disable
the view's drag monitor, and disconnect from all drag
events.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1284
2020-07-20 16:13:20 +00:00
704e08dc08 appDisplay: Move DnD code to BaseAppView
This code will be shared with FolderView in the next commit, so
avoid duplication already and move the to-be-shared code into the
base class.

Because BaseAppView can handle vertical and horizontal orientations,
adapt the drag overshoot code to also handle horizontal overshoot.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1284
2020-07-20 16:13:20 +00:00
60311aa4d1 appDisplay: Fully hide icon when dragging
The partially visible icon causes more problems than
it solves, visually speaking. Fade it out completely
while dragging.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1284
2020-07-20 16:13:20 +00:00
cceb74706a appDisplay: Ensure icons always are at the correct position
When redisplaying, we currently only remove and add icons, but
never adjust the position of already added icons. If the icon
position changed, it wouldn't be reflected on the icon grid.

Make sure to move already added icons.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1284
2020-07-20 16:13:20 +00:00
578ae29ed2 appDisplay: Add placeholder when moving from folder dialog
When moving an icon from a folder dialog, the app grid doesn't
really have an icon to move around.

Add a placeholder icon and hijack it in the various places.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1284
2020-07-20 16:13:20 +00:00
701d110493 appDisplay: Restore dragged item's position on drag cancel
Otherwise we end up with the grid in an inconsistent state.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1284
2020-07-20 16:13:20 +00:00
d1cbf6c7a9 appDisplay: Allow overshooting any icon
Now that the icon being dragged can come from AppDisplay and also
a folder dialog, the check for when to overshoot is broken. Check
if the icon is a BaseAppView icon.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1284
2020-07-20 16:13:20 +00:00
b64ce217e4 appDisplay: Create app folder where the drop happened
Create the app folder where the icon we drop at is located. This
ensures the folder icon doesn't go into the last page, hidden and
solitary.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1284
2020-07-20 16:13:20 +00:00
783dbe2aa9 appDisplay: Don't resort folders when name changes
With a customizable app grid, we don't want folders to move
after renaming. Their position is fixed.

Remove the sort-after-rename code from AppDisplay.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1284
2020-07-20 16:13:20 +00:00
f4ce1cf462 appDisplay: Make FolderIcon draggable
By making it a subclass of AppViewItem, it automagically inherits
the DnD code.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1284
2020-07-20 16:13:20 +00:00
d04d6e069d appDisplay: Check 'app-picker-layout' to make icons draggable
Now we drag not only to the Dash, but also to the icon grid itself,
so make the app icon draggable only when either one or the other is
writable.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1284
2020-07-20 16:13:20 +00:00
40de201056 appDisplay: Factor out draggable code into AppViewItem
This will be shared by the FolderIcon.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1284
2020-07-20 16:13:20 +00:00
18234ea91a appDisplay: Use custom function to retrieve item page and position
It is important that '_loadApps()' return a sorted list -- adding the
same icons at the same positions but in different orders results in
a wrong icon grid.

Add support for using a custom positioning function, and implement it
in AppDisplay. Because FolderView doesn't implement a custom sorting
function, the items are still sorted alphabetically.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1284
2020-07-20 16:13:20 +00:00
e3f3297cba appDisplay: Save pages after dropping
Save the icon grid layout after dropping, and only in
that moment.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1284
2020-07-20 16:13:20 +00:00
e1ea1d2954 appDisplay: Introduce PageManager
The PageManager does the heavy lifting between reading the
'app-picker-layout' GSettings key, and saving the new pages.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1284
2020-07-20 16:13:20 +00:00
8e23ff8111 gschema: Introduce the 'app-picker-layout' key
This is the key that will be used to store the pages and the icons in
each page. The idea is that we we store an a{sv} variant for each page.
This variant will contain <icon id> → array of properties, where we
can store arbitrary data for each icon. The expected output of this
key is:

[
  {
    'polari.desktop': <{ 'position': 0 }>,
    'epiphany.deskop': <{ 'position': 1 }>,
  },
  {
    'telegram.desktop': <{ 'position': 2 }>,
    'builder.desktop': <{ 'position': 0 }>,
    'gitg.desktop': <{ 'position': 1 }>,
  }
]

The toplevel array is sorted, and pages of the grid always show in the
order they are stored.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1284
2020-07-20 16:13:20 +00:00
8a50a8e64c appDisplay: Allow incomplete pages
Allow incomplete pages in the main grid, but not on folders.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1284
2020-07-20 16:13:19 +00:00
fae207811a appDisplay: Move icons when hovering the grid
Implement a minimal version of the reflow-on-hover behavior,
which gives a better sense of physicality to the grid.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1284
2020-07-20 16:13:19 +00:00
1d86424942 appDisplay: Factor out item addition and removal methods
It'll be useful later.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1284
2020-07-20 16:13:19 +00:00
2bc8175219 appDisplay: Accept dropping any kind of icon over it
The grid will be able to handle them. As of now, it doesn't
do anything with folder icons, or icons in folders.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1284
2020-07-20 16:13:19 +00:00
1e31caf0b8 appDisplay: Introduce moveItem API
This is a simplistic API that basically removes the
icon from it's old location, and adds it to its new
location.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1284
2020-07-20 16:13:19 +00:00
8e24ac6b26 appDisplay: Ignore dragging over leeways
The leeways are parts of the icon that ignore incoming drag
events. This is how IconGrid and IconGridLayout treat it, and
this is how the icons should treat themselves too.

Make AppIcon ignore dragging over the left and right leeways.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1284
2020-07-20 16:13:19 +00:00
427b9ac75f iconGrid: Add drop target API
Add a new drop target API. The bulk of it is implemented by
IconGridLayout, since it's the layout manager that knows where
each icon is placed at.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1284
2020-07-20 16:13:19 +00:00
f50205e9b4 calendar-server: Remove delay before event emission
The timeout seems to have been carried over from the old code that
relied on gnome-shell calling 'GetEvents' after every 'Changed' signal
where it was used to throttle the signal. In the new code where
calendar-server is sending the changes themselves via signals this is no
longer necessary and actually causes a delay when switching between
months.

Fixes https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2992
2020-07-20 13:50:21 +02:00
168cfdd86b keyboard: Fix missing key icons in numeric level
Those were missed in commit 57669bca1b.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2631
2020-07-20 01:24:16 +02:00
d339c94c18 keyboard: Move named icons into subdirectories
While GtkIconTheme does look up icons in the toplevel icons resource
path, it will only use them as ultimate fallback. That is, if the
icon theme (or the hicolor fallback) include a "keyboard" icon, it
will be used over the "keyboard-enter-symbolic" icon in the resource.

Moving the icons to appropriate subdirectories gives them higher
priority than the fallback names, and thus fixes the issue.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2631
2020-07-20 01:08:25 +02:00
97509bf1d2 Update Brazilian Portuguese translation 2020-07-19 12:54:47 +00:00
4a9c2ee805 Update Brazilian Portuguese translation
(cherry picked from commit 222919cfc1)
2020-07-18 13:44:05 +00:00
51e1e6d15c Update Brazilian Portuguese translation
(cherry picked from commit db30fbe3e9)
2020-07-17 21:36:25 +00:00
f0d2509dc3 extensionDownloader: Fix check for updates with several extensions
When having several extensions installed checking for updates fails.
This is because we are using GET and query params and since we are
sending all the metadata of the extension the server returns 502
when the URL is too long. This error code is ignored safely.

It is only needed to send the version of the extension to check if it
has updates.

Fixes https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2962
https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1363
2020-07-15 18:26:11 -06:00
95bb194356 layout: Remove redundant background refresh
When using the NVIDIA driver, textures tend to loose their pixels when
suspending. In the past we handled this by figuring out when the NVIDIA
driver was used, and reload the background whenever we noticed we
resumed from suspend.

This shouldn't be needed anymore after
https://gitlab.gnome.org/GNOME/mutter/merge_requests/600, as it should
handle this by listening to video-memory-purged signal. Thus remove our
special handling here.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1358
2020-07-14 23:14:39 +00:00
de8b43a45d Update Greek translation 2020-07-14 20:43:58 +00:00
82be010fd8 workspace: Always set state at the end of overview transition
We don't change to the zoomed out state when fading to the overview,
however we should do that after the transition in case the user
switches to the window picker.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2969
2020-07-13 17:24:43 +00:00
2a0c116757 workspace: Reset window opacity after overview transitions
When using the fade animation when transitioning to the overview instead
of zoom, we fade out all window previews to fully transparent. But after
commit 751189253a removed the old _updateWindowPositions() function,
nothing resets the opacity again, so when switching from the app- to the
window picker, all previews are hidden.

Fix this by always resetting the window preview opacity after showing
or hiding the overview.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2969
2020-07-13 17:24:43 +00:00
6cdaec4001 workspace: Always use floating layout for fade transition
We don't animate size and position when fading, so we want all previews
to already be at their final position. However when the app picker is
opened from within the overview, window previews use the zoomed layout,
so that's the state we are then fading when leaving the overview from
the app picker.

Fix that by setting the correct state at the start of the fade transition.

(In the case of fadeToOverview(), the value should always be correct
already, but set it anyway for symmetry with fadeFromOverview())

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2969
2020-07-13 17:24:43 +00:00
ed4baec40f workspacesView: Really don't animate primary view when fading
In commit 9297d87775 we stopped syncing the primary view's actual
geometry at the start of the transition when doing a fade animation,
however the view animation may still be triggered by an allocation
change.

Prevent those unwanted size changes during fade by keeping track of
the fade state and explicitly skip syncing the geometry while a fade
is ongoing.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2969
2020-07-13 17:24:43 +00:00
9e8883c922 workspacesView: Do not skip entire overview transition
Since commit af543daf1c, we skip the overview transition when the
actual geometry hasn't been set yet. However with the new layout
manager, the only bit that still needs the separate geometry is
the transition of the view, the workspaces can do their transition
just fine.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2969
2020-07-13 17:24:42 +00:00
9bb64da895 Update Friulian translation 2020-07-12 16:08:10 +00:00
049f348e25 Update Chinese (China) translation 2020-07-12 02:35:34 +00:00
be190cc4d9 Update Chinese (China) translation 2020-07-12 02:14:16 +00:00
0893789b34 workspacesView: Update visibily when gesture drag begins
When dragging the workspaces through the swipe gesture, all
workspaces must be visible. WorkspacesView's _updateVisibility()
method special-cases this and ensures that.

However, this method is only called when (1) going to the active
workspace, and (2) when the gesture ends. That means, if there
is any workspace hidden by the time a gesture starts, it is never
shown!

Call _updateVisibility() on startTouchGesture() as well.

Related: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2969

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1360
2020-07-10 11:14:12 -03:00
7b5c6b657a Update German translation 2020-07-09 20:29:47 +00:00
9363fd3524 workspaceSwitcherPopup: Set offscreen redirect always
Because for most frames during a workspace switch it's not changing and
we can repaint it faster if it's cached on the GPU as a single texture.

This seems to reduce the render time for workspace switching by more
than 20%.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1356
2020-07-09 11:49:59 +08:00
0ad242a81e shell/window-tracker: Tighten sandbox ID prefix check
Since commit b60836932 we only allow WM_CLASS matches for sandboxed
applications if the found app's ID is prefixed by the sandbox ID.

The existing check still has a hole in it though: "org.example.Foo"
and "org.example.FooDevel" are different applications, yet the former
is a prefix of the latter.

So tighten the check by including a trailing "." in the checked prefix;
this excludes cases like the above, while still working for the regular
case of a single .desktop file because our app IDs include the ".desktop"
suffix.

Spotted by wjt.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1357
2020-07-08 12:23:10 +02:00
74 changed files with 4954 additions and 5458 deletions

View File

@ -0,0 +1,191 @@
<!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.Mutter.ScreenCast:
@short_description: Screen cast interface
This API is private and not intended to be used outside of the integrated
system that uses libmutter. No compatibility between versions are
promised.
-->
<interface name="org.gnome.Mutter.ScreenCast">
<!--
CreateSession:
@properties: Properties
@session_path: Path to the new session object
* "remote-desktop-session-id" (s): The ID of a remote desktop session.
Remote desktop driven screen casts
are started and stopped by the remote
desktop session.
* "disable-animations" (b): Set to "true" if the screen cast application
would prefer animations to be globally
disabled, while the session is running. Default
is "false". Available since version 3.
-->
<method name="CreateSession">
<arg name="properties" type="a{sv}" direction="in" />
<arg name="session_path" type="o" direction="out" />
</method>
<!--
Version:
@short_description: API version
-->
<property name="Version" type="i" access="read" />
</interface>
<!--
org.gnome.Mutter.ScreenCast.Session:
@short_description: Screen cast session
-->
<interface name="org.gnome.Mutter.ScreenCast.Session">
<!--
Start:
Start the screen cast session
-->
<method name="Start" />
<!--
Stop:
Stop the screen cast session
-->
<method name="Stop" />
<!--
Closed:
The session has closed.
-->
<signal name="Closed" />
<!--
RecordMonitor:
@connector: Connector of the monitor to record
@properties: Properties
@stream_path: Path to the new stream object
Record a single monitor.
Available @properties include:
* "cursor-mode" (u): Cursor mode. Default: 'hidden' (see below)
Available since API version 2.
* "is-recording" (b): Whether this is a screen recording. May be
be used for choosing panel icon.
Default: false. Available since API version 4.
Available cursor mode values:
0: hidden - cursor is not included in the stream
1: embedded - cursor is included in the framebuffer
2: metadata - cursor is included as metadata in the PipeWire stream
-->
<method name="RecordMonitor">
<arg name="connector" type="s" direction="in" />
<arg name="properties" type="a{sv}" direction="in" />
<arg name="stream_path" type="o" direction="out" />
</method>
<!--
RecordWindow:
@properties: Properties used determining what window to select
@stream_path: Path to the new stream object
Supported since API version 2.
Record a single window. The cursor will not be included.
Available @properties include:
* "window-id" (t): Id of the window to record.
* "cursor-mode" (u): Cursor mode. Default: 'hidden' (see RecordMonitor).
* "is-recording" (b): Whether this is a screen recording. May be
be used for choosing panel icon.
Default: false. Available since API version 4.
-->
<method name="RecordWindow">
<arg name="properties" type="a{sv}" direction="in" />
<arg name="stream_path" type="o" direction="out" />
</method>
<!--
RecordArea:
@x: X position of the recorded area
@y: Y position of the recorded area
@width: width of the recorded area
@height: height of the recorded area
@properties: Properties
@stream_path: Path to the new stream object
Record an area of the stage. The coordinates are in stage coordinates.
The size of the stream does not necessarily match the size of the
recorded area, and will depend on DPI scale of the affected monitors.
Available @properties include:
* "cursor-mode" (u): Cursor mode. Default: 'hidden' (see below)
Available since API version 2.
* "is-recording" (b): Whether this is a screen recording. May be
be used for choosing panel icon.
Default: false. Available since API version 4.
Available cursor mode values:
0: hidden - cursor is not included in the stream
1: embedded - cursor is included in the framebuffer
2: metadata - cursor is included as metadata in the PipeWire stream
-->
<method name="RecordArea">
<arg name="x" type="i" direction="in" />
<arg name="y" type="i" direction="in" />
<arg name="width" type="i" direction="in" />
<arg name="height" type="i" direction="in" />
<arg name="properties" type="a{sv}" direction="in" />
<arg name="stream_path" type="o" direction="out" />
</method>
</interface>
<!--
org.gnome.Mutter.ScreenCast.Stream:
@short_description: Screen cast stream
-->
<interface name="org.gnome.Mutter.ScreenCast.Stream">
<!--
PipeWireStreamAdded:
@short_description: Pipewire stream added
A signal emitted when PipeWire stream for the screen cast stream has
been created. The @node_id corresponds to the PipeWire stream node.
-->
<signal name="PipeWireStreamAdded">
<annotation name="org.gtk.GDBus.C.Name" value="pipewire-stream-added"/>
<arg name="node_id" type="u" direction="out" />
</signal>
<!--
Parameters:
@short_description: Optional stream parameters
Available parameters include:
* "position" (ii): Position of the source of the stream in the
compositor coordinate space.
* "size" (ii): Size of the source of the stream in the compositor
coordinate space.
-->
<property name="Parameters" type="a{sv}" access="read" />
</interface>
</node>

View File

@ -70,6 +70,14 @@
--> -->
<property name="AnimationsEnabled" type="b" access="read"/> <property name="AnimationsEnabled" type="b" access="read"/>
<!--
ScreenSize:
@short_description: The size of the screen
Since: 3
-->
<property name="ScreenSize" type="(ii)" access="read"/>
<property name="version" type="u" access="read"/> <property name="version" type="u" access="read"/>
</interface> </interface>
</node> </node>

View File

@ -28,6 +28,7 @@
<file preprocess="xml-stripblanks">org.freedesktop.UPower.xml</file> <file preprocess="xml-stripblanks">org.freedesktop.UPower.xml</file>
<file preprocess="xml-stripblanks">org.gnome.Magnifier.xml</file> <file preprocess="xml-stripblanks">org.gnome.Magnifier.xml</file>
<file preprocess="xml-stripblanks">org.gnome.Magnifier.ZoomRegion.xml</file> <file preprocess="xml-stripblanks">org.gnome.Magnifier.ZoomRegion.xml</file>
<file preprocess="xml-stripblanks">org.gnome.Mutter.ScreenCast.xml</file>
<file preprocess="xml-stripblanks">org.gnome.ScreenSaver.xml</file> <file preprocess="xml-stripblanks">org.gnome.ScreenSaver.xml</file>
<file preprocess="xml-stripblanks">org.gnome.SessionManager.EndSessionDialog.xml</file> <file preprocess="xml-stripblanks">org.gnome.SessionManager.EndSessionDialog.xml</file>
<file preprocess="xml-stripblanks">org.gnome.SessionManager.Inhibitor.xml</file> <file preprocess="xml-stripblanks">org.gnome.SessionManager.Inhibitor.xml</file>

View File

@ -6,25 +6,25 @@
<file>checkbox-off-focused.svg</file> <file>checkbox-off-focused.svg</file>
<file>checkbox-off.svg</file> <file>checkbox-off.svg</file>
<file>checkbox.svg</file> <file>checkbox.svg</file>
<file alias="icons/color-pick.svg">color-pick.svg</file> <file alias="icons/scalable/actions/color-pick.svg">color-pick.svg</file>
<file>dash-placeholder.svg</file> <file>dash-placeholder.svg</file>
<file>gnome-shell.css</file> <file>gnome-shell.css</file>
<file>gnome-shell-high-contrast.css</file> <file>gnome-shell-high-contrast.css</file>
<file alias="icons/message-indicator-symbolic.svg">message-indicator-symbolic.svg</file> <file alias="icons/scalable/status/message-indicator-symbolic.svg">message-indicator-symbolic.svg</file>
<file>no-events.svg</file> <file>no-events.svg</file>
<file>no-notifications.svg</file> <file>no-notifications.svg</file>
<file>pad-osd.css</file> <file>pad-osd.css</file>
<file alias="icons/eye-open-negative-filled-symbolic.svg">eye-open-negative-filled-symbolic.svg</file> <file alias="icons/scalable/status/eye-open-negative-filled-symbolic.svg">eye-open-negative-filled-symbolic.svg</file>
<file alias="icons/eye-not-looking-symbolic.svg">eye-not-looking-symbolic.svg</file> <file alias="icons/scalable/status/eye-not-looking-symbolic.svg">eye-not-looking-symbolic.svg</file>
<file alias="icons/pointer-double-click-symbolic.svg">pointer-double-click-symbolic.svg</file> <file alias="icons/scalable/actions/pointer-double-click-symbolic.svg">pointer-double-click-symbolic.svg</file>
<file alias="icons/pointer-drag-symbolic.svg">pointer-drag-symbolic.svg</file> <file alias="icons/scalable/actions/pointer-drag-symbolic.svg">pointer-drag-symbolic.svg</file>
<file alias="icons/pointer-primary-click-symbolic.svg">pointer-primary-click-symbolic.svg</file> <file alias="icons/scalable/actions/pointer-primary-click-symbolic.svg">pointer-primary-click-symbolic.svg</file>
<file alias="icons/pointer-secondary-click-symbolic.svg">pointer-secondary-click-symbolic.svg</file> <file alias="icons/scalable/actions/pointer-secondary-click-symbolic.svg">pointer-secondary-click-symbolic.svg</file>
<file alias="icons/keyboard-caps-lock-filled-symbolic.svg">keyboard-caps-lock-filled-symbolic.svg</file> <file alias="icons/scalable/status/keyboard-caps-lock-filled-symbolic.svg">keyboard-caps-lock-filled-symbolic.svg</file>
<file alias="icons/keyboard-enter-symbolic.svg">keyboard-enter-symbolic.svg</file> <file alias="icons/scalable/status/keyboard-enter-symbolic.svg">keyboard-enter-symbolic.svg</file>
<file alias="icons/keyboard-hide-symbolic.svg">keyboard-hide-symbolic.svg</file> <file alias="icons/scalable/status/keyboard-hide-symbolic.svg">keyboard-hide-symbolic.svg</file>
<file alias="icons/keyboard-layout-filled-symbolic.svg">keyboard-layout-filled-symbolic.svg</file> <file alias="icons/scalable/status/keyboard-layout-filled-symbolic.svg">keyboard-layout-filled-symbolic.svg</file>
<file alias="icons/keyboard-shift-filled-symbolic.svg">keyboard-shift-filled-symbolic.svg</file> <file alias="icons/scalable/status/keyboard-shift-filled-symbolic.svg">keyboard-shift-filled-symbolic.svg</file>
<file>process-working.svg</file> <file>process-working.svg</file>
<file>toggle-off.svg</file> <file>toggle-off.svg</file>
<file>toggle-off-dark.svg</file> <file>toggle-off-dark.svg</file>

View File

@ -1,10 +0,0 @@
[Unit]
Description=GNOME Shell on X11
DefaultDependencies=no
Requisite=gnome-session-initialized.target
PartOf=gnome-session-initialized.target
Before=gnome-session-initialized.target
Requires=gnome-shell-x11.service
After=gnome-shell-x11.service

View File

@ -101,22 +101,21 @@ if have_systemd
unitconf.set('bindir', bindir) unitconf.set('bindir', bindir)
configure_file( configure_file(
input: 'gnome-shell-x11.service.in', input: 'org.gnome.Shell@x11.service.in',
output: 'gnome-shell-x11.service', output: 'org.gnome.Shell@x11.service',
configuration: unitconf, configuration: unitconf,
install_dir: systemduserunitdir install_dir: systemduserunitdir
) )
configure_file( configure_file(
input: 'gnome-shell-wayland.service.in', input: 'org.gnome.Shell@wayland.service.in',
output: 'gnome-shell-wayland.service', output: 'org.gnome.Shell@wayland.service',
configuration: unitconf, configuration: unitconf,
install_dir: systemduserunitdir install_dir: systemduserunitdir
) )
units = files('gnome-shell-x11.target', units = files('org.gnome.Shell.target',
'gnome-shell-wayland.target', 'org.gnome.Shell-disable-extensions.service')
'gnome-shell-disable-extensions.service')
install_data(units, install_dir: systemduserunitdir) install_data(units, install_dir: systemduserunitdir)
endif endif

View File

@ -6,5 +6,5 @@ Requisite=gnome-session-initialized.target
PartOf=gnome-session-initialized.target PartOf=gnome-session-initialized.target
Before=gnome-session-initialized.target Before=gnome-session-initialized.target
Requires=gnome-shell-wayland.service Wants=org.gnome.Shell@wayland.service
After=gnome-shell-wayland.service Wants=org.gnome.Shell@x11.service

View File

@ -1,7 +1,7 @@
[Unit] [Unit]
Description=GNOME Shell on Wayland Description=GNOME Shell on Wayland
# On wayland, force a session shutdown # On wayland, force a session shutdown
OnFailure=gnome-shell-disable-extensions.service gnome-session-shutdown.target OnFailure=org.gnome.Shell-disable-extensions.service gnome-session-shutdown.target
OnFailureJobMode=replace-irreversibly OnFailureJobMode=replace-irreversibly
CollectMode=inactive-or-failed CollectMode=inactive-or-failed
RefuseManualStart=on RefuseManualStart=on
@ -13,18 +13,21 @@ Requisite=gnome-session-initialized.target
PartOf=gnome-session-initialized.target PartOf=gnome-session-initialized.target
Before=gnome-session-initialized.target Before=gnome-session-initialized.target
# The units already conflict because they use the same BusName
#Conflicts=gnome-shell-x11.service
[Service] [Service]
Slice=session.slice
Type=notify Type=notify
# NOTE: This can be replaced with ConditionEnvironment=XDG_SESSION_TYPE=%I
# with systemd >= 245. Also, the current solution is kind of painful
# as systemd had a bug where it retries the condition.
# Only start if the template instance matches the session type.
ExecCondition=/bin/sh -c 'test "$XDG_SESSION_TYPE" = "%I" || exit 2'
ExecStart=@bindir@/gnome-shell ExecStart=@bindir@/gnome-shell
# Exit code 1 means we are probably *not* dealing with an extension failure
SuccessExitStatus=1
# unset some environment variables that were set by the shell and won't work now that the shell is gone # unset some environment variables that were set by the shell and won't work now that the shell is gone
ExecStopPost=-systemctl --user unset-environment GNOME_SETUP_DISPLAY WAYLAND_DISPLAY DISPLAY XAUTHORITY ExecStopPost=-systemctl --user unset-environment GNOME_SETUP_DISPLAY WAYLAND_DISPLAY DISPLAY XAUTHORITY
# Exit code 1 means we are probably *not* dealing with an extension failure
SuccessExitStatus=1
# On wayland we cannot restart # On wayland we cannot restart
Restart=no Restart=no
# Kill any stubborn child processes after this long # Kill any stubborn child processes after this long

View File

@ -1,7 +1,7 @@
[Unit] [Unit]
Description=GNOME Shell on X11 Description=GNOME Shell on X11
# On X11, try to show the GNOME Session Failed screen # On X11, try to show the GNOME Session Failed screen
OnFailure=gnome-shell-disable-extensions.service gnome-session-failed.target OnFailure=org.gnome.Shell-disable-extensions.service gnome-session-failed.target
OnFailureJobMode=replace OnFailureJobMode=replace
CollectMode=inactive-or-failed CollectMode=inactive-or-failed
RefuseManualStart=on RefuseManualStart=on
@ -13,18 +13,24 @@ Requisite=gnome-session-initialized.target
PartOf=gnome-session-initialized.target PartOf=gnome-session-initialized.target
Before=gnome-session-initialized.target Before=gnome-session-initialized.target
# The units already conflict because they use the same BusName
#Conflicts=gnome-shell-wayland.service
# Limit startup frequency more than the default # Limit startup frequency more than the default
StartLimitIntervalSec=15s StartLimitIntervalSec=15s
StartLimitBurst=3 StartLimitBurst=3
[Service] [Service]
Slice=session.slice
Type=notify Type=notify
# NOTE: This can be replaced with ConditionEnvironment=XDG_SESSION_TYPE=%I
# with systemd >= 245. Also, the current solution is kind of painful
# as systemd had a bug where it retries the condition.
# Only start if the template instance matches the session type.
ExecCondition=/bin/sh -c 'test "$XDG_SESSION_TYPE" = "%I" || exit 2'
ExecStart=@bindir@/gnome-shell ExecStart=@bindir@/gnome-shell
# Exit code 1 means we are probably *not* dealing with an extension failure # Exit code 1 means we are probably *not* dealing with an extension failure
SuccessExitStatus=1 SuccessExitStatus=1
# On X11 we do not need to unset any variables
# On X11 we want to restart on-success (Alt+F2 + r) and on-failure. # On X11 we want to restart on-success (Alt+F2 + r) and on-failure.
Restart=always Restart=always
# Do not wait before restarting the shell # Do not wait before restarting the shell

View File

@ -109,6 +109,17 @@
the shell. the shell.
</description> </description>
</key> </key>
<key name="app-picker-layout" type="aa{sv}">
<default>[]</default>
<summary>Layout of the app picker</summary>
<description>
Layout of the app picker. Each entry in the array is a page. Pages are
stored in the order they appear in GNOME Shell. Each page contains an
“application id” → 'data' pair. Currently, the following values are
stored as 'data':
• “position”: the position of the application icon in the page
</description>
</key>
<child name="keybindings" schema="org.gnome.shell.keybindings"/> <child name="keybindings" schema="org.gnome.shell.keybindings"/>
</schema> </schema>

View File

@ -3,13 +3,8 @@ private_headers = [
'gactionobservable.h', 'gactionobservable.h',
'gactionobserver.h', 'gactionobserver.h',
'shell-network-agent.h', 'shell-network-agent.h',
'shell-recorder-src.h'
] ]
if not enable_recorder
private_headers += 'shell-recorder.h'
endif
exclude_directories = [ exclude_directories = [
'calendar-server', 'calendar-server',
'hotplug-sniffer', 'hotplug-sniffer',

View File

@ -25,6 +25,8 @@ var ServiceImplementation = class {
// subclasses may override this to disable automatic shutdown // subclasses may override this to disable automatic shutdown
this._autoShutdown = true; this._autoShutdown = true;
this._queueShutdownCheck();
} }
// subclasses may override this to own additional names // subclasses may override this to own additional names

View File

@ -1,2 +1,6 @@
.expander-frame > * { border-top-width: 0; } .expander-frame > * { border-top-width: 0; }
.expander-toolbar { border: 0 solid @borders; border-top-width: 1px; } .expander-toolbar {
border: 0 solid @borders;
border-top-width: 1px;
padding: 3px;
}

View File

@ -128,7 +128,7 @@ var ExtensionsService = class extends ServiceImplementation {
externalWindow = Shew.ExternalWindow.new_from_handle(parentWindow); externalWindow = Shew.ExternalWindow.new_from_handle(parentWindow);
if (externalWindow) if (externalWindow)
externalWindow.set_parent_of(window.window); externalWindow.set_parent_of(window.get_surface());
if (options.modal) if (options.modal)
window.modal = options.modal.get_boolean(); window.modal = options.modal.get_boolean();
@ -156,7 +156,6 @@ var ExtensionPrefsDialog = GObject.registerClass({
GTypeName: 'ExtensionPrefsDialog', GTypeName: 'ExtensionPrefsDialog',
Template: 'resource:///org/gnome/Shell/Extensions/ui/extension-prefs-dialog.ui', Template: 'resource:///org/gnome/Shell/Extensions/ui/extension-prefs-dialog.ui',
InternalChildren: [ InternalChildren: [
'headerBar',
'stack', 'stack',
'expander', 'expander',
'expanderArrow', 'expanderArrow',
@ -165,24 +164,24 @@ var ExtensionPrefsDialog = GObject.registerClass({
], ],
}, class ExtensionPrefsDialog extends Gtk.Window { }, class ExtensionPrefsDialog extends Gtk.Window {
_init(extension) { _init(extension) {
super._init(); super._init({
title: extension.metadata.name,
});
this._uuid = extension.uuid; this._uuid = extension.uuid;
this._url = extension.metadata.url || ''; this._url = extension.metadata.url || '';
this._headerBar.title = extension.metadata.name;
this._actionGroup = new Gio.SimpleActionGroup(); this._actionGroup = new Gio.SimpleActionGroup();
this.insert_action_group('win', this._actionGroup); this.insert_action_group('win', this._actionGroup);
this._initActions(); this._initActions();
this._addCustomStylesheet(); this._addCustomStylesheet();
this._gesture = new Gtk.GestureMultiPress({ this._gesture = new Gtk.GestureClick({
widget: this._expander,
button: 0, button: 0,
exclusive: true, exclusive: true,
}); });
this._expander.add_controller(this._gesture);
this._gesture.connect('released', (gesture, nPress) => { this._gesture.connect('released', (gesture, nPress) => {
if (nPress === 1) if (nPress === 1)
@ -205,7 +204,7 @@ var ExtensionPrefsDialog = GObject.registerClass({
prefsModule.init(extension.metadata); prefsModule.init(extension.metadata);
const widget = prefsModule.buildPrefsWidget(); const widget = prefsModule.buildPrefsWidget();
this._stack.add(widget); this._stack.add_named(widget, 'prefs');
this._stack.visible_child = widget; this._stack.visible_child = widget;
} catch (e) { } catch (e) {
this._setError(e); this._setError(e);
@ -267,7 +266,7 @@ var ExtensionPrefsDialog = GObject.registerClass({
} catch (e) { } catch (e) {
logError(e, 'Failed to add application style'); logError(e, 'Failed to add application style');
} }
Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(), Gtk.StyleContext.add_provider_for_display(Gdk.Display.get_default(),
provider, provider,
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION); Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION);
} }

View File

@ -1,7 +1,7 @@
/* exported main */ /* exported main */
imports.gi.versions.Gdk = '3.0'; imports.gi.versions.Gdk = '4.0';
imports.gi.versions.Gtk = '3.0'; imports.gi.versions.Gtk = '4.0';
const { Gtk } = imports.gi; const { Gtk } = imports.gi;
const pkg = imports.package; const pkg = imports.package;
@ -10,7 +10,7 @@ const { DBusService } = imports.dbusService;
const { ExtensionsService } = imports.extensionsService; const { ExtensionsService } = imports.extensionsService;
function main() { function main() {
Gtk.init(null); Gtk.init();
pkg.initFormat(); pkg.initFormat();
const service = new DBusService( const service = new DBusService(

View File

@ -1,38 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<interface> <interface>
<requires lib="gtk+" version="3.20"/> <requires lib="gtk+" version="3.20"/>
<template class="ExtensionPrefsDialog" parent="GtkWindow"> <template class="ExtensionPrefsDialog" parent="GtkWindow">
<property name="default_width">600</property> <property name="default_width">600</property>
<property name="default_height">400</property> <property name="default_height">400</property>
<child type="titlebar"> <child type="titlebar">
<object class="GtkHeaderBar" id="headerBar"> <object class="GtkHeaderBar">
<property name="visible">True</property> <property name="show-title-buttons">True</property>
<property name="show_close_button">True</property>
</object> </object>
</child> </child>
<child> <child>
<object class="GtkStack" id="stack"> <object class="GtkStack" id="stack">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child> <child>
<object class="GtkScrolledWindow"> <object class="GtkScrolledWindow">
<property name="visible">True</property>
<property name="hscrollbar_policy">never</property> <property name="hscrollbar_policy">never</property>
<property name="propagate_natural_height">True</property> <property name="propagate_natural_height">True</property>
<child> <child>
<object class="GtkViewport"> <object class="GtkViewport">
<property name="visible">True</property>
<child> <child>
<object class="GtkBox"> <object class="GtkBox">
<property name="visible">True</property>
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<property name="margin">100</property> <property name="margin-start">100</property>
<property name="margin_bottom">60</property> <property name="margin-end">100</property>
<property name="margin-top">100</property>
<property name="margin-bottom">60</property>
<property name="spacing">12</property> <property name="spacing">12</property>
<child> <child>
<object class="GtkLabel"> <object class="GtkLabel">
<property name="visible">True</property>
<property name="label" translatable="yes">Somethings gone wrong</property> <property name="label" translatable="yes">Somethings gone wrong</property>
<attributes> <attributes>
<attribute name="scale" value="1.44"/> <!-- x-large --> <attribute name="scale" value="1.44"/> <!-- x-large -->
@ -44,44 +38,33 @@
</child> </child>
<child> <child>
<object class="GtkLabel"> <object class="GtkLabel">
<property name="visible">True</property>
<property name="label" translatable="yes">Were very sorry, but theres been a problem: the settings for this extension cant be displayed. We recommend that you report the issue to the extension authors.</property> <property name="label" translatable="yes">Were very sorry, but theres been a problem: the settings for this extension cant be displayed. We recommend that you report the issue to the extension authors.</property>
<property name="justify">center</property> <property name="justify">center</property>
<property name="wrap">True</property> <property name="wrap">True</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
</object> </object>
</child> </child>
<child> <child>
<object class="GtkBox"> <object class="GtkBox">
<property name="visible">True</property>
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<property name="margin_top">12</property> <property name="margin-top">12</property>
<child> <child>
<object class="GtkFrame" id="expander"> <object class="GtkFrame" id="expander">
<property name="visible">True</property>
<property name="hexpand">True</property> <property name="hexpand">True</property>
<property name="shadow_type">in</property>
<child> <child>
<object class="GtkEventBox"> <object class="GtkBox">
<property name="visible">True</property> <property name="margin-start">12</property>
<property name="margin-end">12</property>
<property name="margin-top">12</property>
<property name="margin-bottom">12</property>
<property name="spacing">6</property>
<child> <child>
<object class="GtkBox"> <object class="GtkImage" id="expanderArrow">
<property name="visible">True</property> <property name="icon_name">pan-end-symbolic</property>
<property name="margin">12</property> </object>
<property name="spacing">6</property> </child>
<child> <child>
<object class="GtkImage" id="expanderArrow"> <object class="GtkLabel">
<property name="visible">True</property> <property name="label" translatable="yes">Technical Details</property>
<property name="icon_name">pan-end-symbolic</property>
</object>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="label" translatable="yes">Technical Details</property>
</object>
</child>
</object> </object>
</child> </child>
</object> </object>
@ -90,22 +73,16 @@
</child> </child>
<child> <child>
<object class="GtkRevealer" id="revealer"> <object class="GtkRevealer" id="revealer">
<property name="visible">True</property>
<child> <child>
<object class="GtkFrame"> <object class="GtkFrame">
<property name="visible">True</property>
<property name="shadow_type">in</property>
<style> <style>
<class name="expander-frame"/> <class name="expander-frame"/>
</style> </style>
<child> <child>
<object class="GtkBox"> <object class="GtkBox">
<property name="visible">True</property>
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<child> <child>
<object class="GtkTextView" id="errorView"> <object class="GtkTextView" id="errorView">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="monospace">True</property> <property name="monospace">True</property>
<property name="editable">False</property> <property name="editable">False</property>
<property name="wrap_mode">word</property> <property name="wrap_mode">word</property>
@ -116,63 +93,34 @@
</object> </object>
</child> </child>
<child> <child>
<object class="GtkToolbar"> <object class="GtkBox">
<property name="visible">True</property>
<style> <style>
<class name="expander-toolbar"/> <class name="expander-toolbar"/>
</style> </style>
<child> <child>
<object class="GtkToolItem"> <object class="GtkButton">
<property name="visible">True</property> <property name="receives_default">True</property>
<child> <property name="action_name">win.copy-error</property>
<object class="GtkButton"> <property name="has-frame">False</property>
<property name="visible">True</property> <property name="icon-name">edit-copy-symbolic</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="action_name">win.copy-error</property>
<style>
<class name="flat"/>
<class name="image-button"/>
</style>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="icon_name">edit-copy-symbolic</property>
</object>
</child>
</object>
</child>
</object> </object>
</child> </child>
<child> <child>
<object class="GtkSeparatorToolItem"> <object class="GtkLabel">
<property name="visible">True</property> <property name="hexpand">True</property>
<property name="draw">False</property>
</object> </object>
<packing>
<property name="expand">True</property>
</packing>
</child> </child>
<child> <child>
<object class="GtkToolItem"> <object class="GtkButton" id="homeButton">
<property name="visible">True</property> <property name="visible"
<child> bind-source="homeButton"
<object class="GtkButton" id="homeButton"> bind-property="sensitive"
<property name="visible" bind-flags="sync-create"/>
bind-source="homeButton" <property name="label" translatable="yes">Homepage</property>
bind-property="sensitive" <property name="tooltip_text" translatable="yes">Visit extension homepage</property>
bind-flags="sync-create"/> <property name="receives_default">True</property>
<property name="label" translatable="yes">Homepage</property> <property name="has-frame">False</property>
<property name="tooltip_text" translatable="yes">Visit extension homepage</property> <property name="action_name">win.show-url</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="no_show_all">True</property>
<property name="action_name">win.show-url</property>
<style>
<class name="flat"/>
</style>
</object>
</child>
</object> </object>
</child> </child>
</object> </object>

View File

@ -8,6 +8,12 @@ dbus_services = {
'org.gnome.Shell.Notifications': 'notifications', 'org.gnome.Shell.Notifications': 'notifications',
} }
if enable_recorder
dbus_services += {
'org.gnome.Shell.Screencast': 'screencast',
}
endif
config_dir = '@0@/..'.format(meson.current_build_dir()) config_dir = '@0@/..'.format(meson.current_build_dir())
foreach service, dir : dbus_services foreach service, dir : dbus_services

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<gresources>
<gresource prefix="/org/gnome/Shell/Screencast/js">
<file>main.js</file>
<file>screencastService.js</file>
<file>dbusService.js</file>
<file>misc/config.js</file>
<file>misc/fileUtils.js</file>
</gresource>
</gresources>

View File

@ -0,0 +1,11 @@
/* exported main */
const { DBusService } = imports.dbusService;
const { ScreencastService } = imports.screencastService;
function main() {
const service = new DBusService(
'org.gnome.Shell.Screencast',
new ScreencastService());
service.run();
}

View File

@ -0,0 +1,458 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
/* exported ScreencastService */
const { Gio, GLib, Gst } = imports.gi;
const { loadInterfaceXML, loadSubInterfaceXML } = imports.misc.fileUtils;
const { ServiceImplementation } = imports.dbusService;
const ScreencastIface = loadInterfaceXML('org.gnome.Shell.Screencast');
const IntrospectIface = loadInterfaceXML('org.gnome.Shell.Introspect');
const IntrospectProxy = Gio.DBusProxy.makeProxyWrapper(IntrospectIface);
const ScreenCastIface = loadSubInterfaceXML(
'org.gnome.Mutter.ScreenCast', 'org.gnome.Mutter.ScreenCast');
const ScreenCastSessionIface = loadSubInterfaceXML(
'org.gnome.Mutter.ScreenCast.Session', 'org.gnome.Mutter.ScreenCast');
const ScreenCastStreamIface = loadSubInterfaceXML(
'org.gnome.Mutter.ScreenCast.Stream', 'org.gnome.Mutter.ScreenCast');
const ScreenCastProxy = Gio.DBusProxy.makeProxyWrapper(ScreenCastIface);
const ScreenCastSessionProxy = Gio.DBusProxy.makeProxyWrapper(ScreenCastSessionIface);
const ScreenCastStreamProxy = Gio.DBusProxy.makeProxyWrapper(ScreenCastStreamIface);
const DEFAULT_PIPELINE = 'vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux';
const DEFAULT_FRAMERATE = 30;
const DEFAULT_DRAW_CURSOR = true;
const PipelineState = {
INIT: 0,
PLAYING: 1,
FLUSHING: 2,
STOPPED: 3,
};
const SessionState = {
INIT: 0,
ACTIVE: 1,
STOPPED: 2,
};
var Recorder = class {
constructor(sessionPath, x, y, width, height, filePath, options,
invocation,
onErrorCallback) {
this._startInvocation = invocation;
this._dbusConnection = invocation.get_connection();
this._onErrorCallback = onErrorCallback;
this._stopInvocation = null;
this._pipelineIsPlaying = false;
this._sessionIsActive = false;
this._x = x;
this._y = y;
this._width = width;
this._height = height;
this._filePath = filePath;
this._pipelineString = DEFAULT_PIPELINE;
this._framerate = DEFAULT_FRAMERATE;
this._drawCursor = DEFAULT_DRAW_CURSOR;
this._applyOptions(options);
this._watchSender(invocation.get_sender());
this._initSession(sessionPath);
}
_applyOptions(options) {
for (const option in options)
options[option] = options[option].deep_unpack();
if (options['pipeline'] !== undefined)
this._pipelineString = options['pipeline'];
if (options['framerate'] !== undefined)
this._framerate = options['framerate'];
if ('draw-cursor' in options)
this._drawCursor = options['draw-cursor'];
}
_watchSender(sender) {
this._nameWatchId = this._dbusConnection.watch_name(
sender,
Gio.BusNameWatcherFlags.NONE,
null,
this._senderVanished.bind(this));
}
_unwatchSender() {
if (this._nameWatchId !== 0) {
this._dbusConnection.unwatch_name(this._nameWatchId);
this._nameWatchId = 0;
}
}
_senderVanished() {
this._unwatchSender();
this.stopRecording(null);
}
_notifyStopped() {
this._unwatchSender();
if (this._onStartedCallback)
this._onStartedCallback(this, false);
else if (this._onStoppedCallback)
this._onStoppedCallback(this);
else
this._onErrorCallback(this);
}
_onSessionClosed() {
switch (this._pipelineState) {
case PipelineState.STOPPED:
break;
default:
this._pipeline.set_state(Gst.State.NULL);
log(`Unexpected pipeline state: ${this._pipelineState}`);
break;
}
this._notifyStopped();
}
_initSession(sessionPath) {
this._sessionProxy = new ScreenCastSessionProxy(Gio.DBus.session,
'org.gnome.Mutter.ScreenCast',
sessionPath);
this._sessionProxy.connectSignal('Closed', this._onSessionClosed.bind(this));
}
_startPipeline(nodeId) {
this._ensurePipeline(nodeId);
const bus = this._pipeline.get_bus();
bus.add_watch(bus, this._onBusMessage.bind(this));
this._pipeline.set_state(Gst.State.PLAYING);
this._pipelineState = PipelineState.PLAYING;
this._onStartedCallback(this, true);
this._onStartedCallback = null;
}
startRecording(onStartedCallback) {
this._onStartedCallback = onStartedCallback;
const [streamPath] = this._sessionProxy.RecordAreaSync(
this._x, this._y,
this._width, this._height,
{
'is-recording': GLib.Variant.new('b', true),
'cursor-mode': GLib.Variant.new('u', this._drawCursor ? 1 : 0),
});
this._streamProxy = new ScreenCastStreamProxy(Gio.DBus.session,
'org.gnome.ScreenCast.Stream',
streamPath);
this._streamProxy.connectSignal('PipeWireStreamAdded',
(proxy, sender, params) => {
const [nodeId] = params;
this._startPipeline(nodeId);
});
this._sessionProxy.StartSync();
this._sessionState = SessionState.ACTIVE;
}
stopRecording(onStoppedCallback) {
this._pipelineState = PipelineState.FLUSHING;
this._onStoppedCallback = onStoppedCallback;
this._pipeline.send_event(Gst.Event.new_eos());
}
_stopSession() {
this._sessionProxy.StopSync();
this._sessionState = SessionState.STOPPED;
}
_onBusMessage(bus, message, _) {
switch (message.type) {
case Gst.MessageType.EOS:
this._pipeline.set_state(Gst.State.NULL);
switch (this._pipelineState) {
case PipelineState.FLUSHING:
this._pipelineState = PipelineState.STOPPED;
break;
default:
break;
}
switch (this._sessionState) {
case SessionState.ACTIVE:
this._stopSession();
break;
case SessionState.STOPPED:
this._notifyStopped();
break;
default:
break;
}
break;
default:
break;
}
return true;
}
_substituteThreadCount(pipelineDescr) {
const numProcessors = GLib.get_num_processors();
const numThreads = Math.min(Math.max(1, numProcessors), 64);
return pipelineDescr.replace(/%T/, numThreads);
}
_ensurePipeline(nodeId) {
const framerate = this._framerate;
let fullPipeline = `
pipewiresrc path=${nodeId}
do-timestamp=true
keepalive-time=1000
resend-last=true !
video/x-raw,max-framerate=${framerate}/1 !
videoconvert !
${this._pipelineString} !
filesink location=${this._filePath}`;
fullPipeline = this._substituteThreadCount(fullPipeline);
this._pipeline = Gst.parse_launch_full(fullPipeline,
null,
Gst.ParseFlags.FATAL_ERRORS);
}
};
var ScreencastService = class extends ServiceImplementation {
constructor() {
super(ScreencastIface, '/org/gnome/Shell/Screencast');
Gst.init(null);
this._recorders = new Map();
this._senders = new Map();
this._lockdownSettings = new Gio.Settings({
schema_id: 'org.gnome.desktop.lockdown',
});
this._proxy = new ScreenCastProxy(Gio.DBus.session,
'org.gnome.Mutter.ScreenCast',
'/org/gnome/Mutter/ScreenCast');
this._introspectProxy = new IntrospectProxy(Gio.DBus.session,
'org.gnome.Shell.Introspect',
'/org/gnome/Shell/Introspect');
}
_removeRecorder(sender) {
this._recorders.delete(sender);
if (this._recorders.size === 0)
this.release();
}
_addRecorder(sender, recorder) {
this._recorders.set(sender, recorder);
if (this._recorders.size === 1)
this.hold();
}
_getAbsolutePath(filename) {
if (GLib.path_is_absolute(filename))
return filename;
let videoDir = GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_VIDEOS);
if (!GLib.file_test(videoDir, GLib.FileTest.EXISTS))
videoDir = GLib.get_home_dir();
return GLib.build_filenamev([videoDir, filename]);
}
_generateFilePath(template) {
let filename = '';
let escape = false;
[...template].forEach(c => {
if (escape) {
switch (c) {
case '%':
filename += '%';
break;
case 'd': {
const datetime = GLib.DateTime.new_now_local();
const datestr = datetime.format('%0x');
const datestrEscaped = datestr.replace(/\//g, '-');
filename += datestrEscaped;
break;
}
case 't': {
const datetime = GLib.DateTime.new_now_local();
const datestr = datetime.format('%0X');
const datestrEscaped = datestr.replace(/\//g, ':');
filename += datestrEscaped;
break;
}
default:
log(`Warning: Unknown escape ${c}`);
}
escape = false;
} else if (c === '%') {
escape = true;
} else {
filename += c;
}
});
if (escape)
filename += '%';
return this._getAbsolutePath(filename);
}
ScreencastAsync(params, invocation) {
let returnValue = [false, ''];
if (this._lockdownSettings.get_boolean('disable-save-to-disk')) {
invocation.return_value(GLib.Variant.new('(bs)', returnValue));
return;
}
const sender = invocation.get_sender();
if (this._recorders.get(sender)) {
invocation.return_value(GLib.Variant.new('(bs)', returnValue));
return;
}
const [sessionPath] = this._proxy.CreateSessionSync({});
const [fileTemplate, options] = params;
const [screenWidth, screenHeight] = this._introspectProxy.ScreenSize;
const filePath = this._generateFilePath(fileTemplate);
let recorder;
try {
recorder = new Recorder(
sessionPath,
0, 0,
screenWidth, screenHeight,
fileTemplate,
options,
invocation,
_recorder => this._removeRecorder(sender));
} catch (error) {
log(`Failed to create recorder: ${error.message}`);
invocation.return_value(GLib.Variant.new('(bs)', returnValue));
return;
}
this._addRecorder(sender, recorder);
try {
recorder.startRecording(
(_, result) => {
if (result) {
returnValue = [true, filePath];
invocation.return_value(GLib.Variant.new('(bs)', returnValue));
} else {
this._removeRecorder(sender);
invocation.return_value(GLib.Variant.new('(bs)', returnValue));
}
});
} catch (error) {
log(`Failed to start recorder: ${error.message}`);
this._removeRecorder(sender);
invocation.return_value(GLib.Variant.new('(bs)', returnValue));
}
}
ScreencastAreaAsync(params, invocation) {
let returnValue = [false, ''];
if (this._lockdownSettings.get_boolean('disable-save-to-disk')) {
invocation.return_value(GLib.Variant.new('(bs)', returnValue));
return;
}
const sender = invocation.get_sender();
if (this._recorders.get(sender)) {
invocation.return_value(GLib.Variant.new('(bs)', returnValue));
return;
}
const [sessionPath] = this._proxy.CreateSessionSync({});
const [x, y, width, height, fileTemplate, options] = params;
const filePath = this._generateFilePath(fileTemplate);
let recorder;
try {
recorder = new Recorder(
sessionPath,
x, y,
width, height,
filePath,
options,
invocation,
_recorder => this._removeRecorder(sender));
} catch (error) {
log(`Failed to create recorder: ${error.message}`);
invocation.return_value(GLib.Variant.new('(bs)', returnValue));
return;
}
this._addRecorder(sender, recorder);
try {
recorder.startRecording(
(_, result) => {
if (result) {
returnValue = [true, filePath];
invocation.return_value(GLib.Variant.new('(bs)', returnValue));
} else {
this._removeRecorder(sender);
invocation.return_value(GLib.Variant.new('(bs)', returnValue));
}
});
} catch (error) {
log(`Failed to start recorder: ${error.message}`);
this._removeRecorder(sender);
invocation.return_value(GLib.Variant.new('(bs)', returnValue));
}
}
StopScreencastAsync(params, invocation) {
const sender = invocation.get_sender();
const recorder = this._recorders.get(sender);
if (!recorder) {
invocation.return_value(GLib.Variant.new('(b)', [false]));
return;
}
recorder.stopRecording(() => {
this._removeRecorder(sender);
invocation.return_value(GLib.Variant.new('(b)', [true]));
});
}
};

View File

@ -953,16 +953,15 @@ var LoginDialog = GObject.registerClass({
if (this.opacity == 255 && this._authPrompt.verificationStatus == AuthPrompt.AuthPromptStatus.NOT_VERIFYING) if (this.opacity == 255 && this._authPrompt.verificationStatus == AuthPrompt.AuthPromptStatus.NOT_VERIFYING)
return; return;
if (this._authPrompt.verificationStatus !== AuthPrompt.AuthPromptStatus.NOT_VERIFYING)
this._authPrompt.reset();
this._bindOpacity(); this._bindOpacity();
this.ease({ this.ease({
opacity: 255, opacity: 255,
duration: _FADE_ANIMATION_TIME, duration: _FADE_ANIMATION_TIME,
mode: Clutter.AnimationMode.EASE_OUT_QUAD, mode: Clutter.AnimationMode.EASE_OUT_QUAD,
onComplete: () => { onComplete: () => this._unbindOpacity(),
if (this._authPrompt.verificationStatus != AuthPrompt.AuthPromptStatus.NOT_VERIFYING)
this._authPrompt.reset();
this._unbindOpacity();
},
}); });
} }

View File

@ -92,7 +92,6 @@
<file>ui/ripples.js</file> <file>ui/ripples.js</file>
<file>ui/runDialog.js</file> <file>ui/runDialog.js</file>
<file>ui/screenShield.js</file> <file>ui/screenShield.js</file>
<file>ui/screencast.js</file>
<file>ui/screenshot.js</file> <file>ui/screenshot.js</file>
<file>ui/scripting.js</file> <file>ui/scripting.js</file>
<file>ui/search.js</file> <file>ui/search.js</file>
@ -137,7 +136,6 @@
<file>ui/status/volume.js</file> <file>ui/status/volume.js</file>
<file>ui/status/bluetooth.js</file> <file>ui/status/bluetooth.js</file>
<file>ui/status/remoteAccess.js</file> <file>ui/status/remoteAccess.js</file>
<file>ui/status/screencast.js</file>
<file>ui/status/system.js</file> <file>ui/status/system.js</file>
<file>ui/status/thunderbolt.js</file> <file>ui/status/thunderbolt.js</file>
</gresource> </gresource>

View File

@ -1,6 +1,6 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
/* exported collectFromDatadirs, recursivelyDeleteDir, /* exported collectFromDatadirs, recursivelyDeleteDir,
recursivelyMoveDir, loadInterfaceXML */ recursivelyMoveDir, loadInterfaceXML, loadSubInterfaceXML */
const { Gio, GLib } = imports.gi; const { Gio, GLib } = imports.gi;
const Config = imports.misc.config; const Config = imports.misc.config;
@ -67,14 +67,19 @@ function recursivelyMoveDir(srcDir, destDir) {
} }
let _ifaceResource = null; let _ifaceResource = null;
function ensureIfaceResource() {
if (_ifaceResource)
return;
// don't use global.datadir so the method is usable from tests/tools
let dir = GLib.getenv('GNOME_SHELL_DATADIR') || Config.PKGDATADIR;
let path = `${dir}/gnome-shell-dbus-interfaces.gresource`;
_ifaceResource = Gio.Resource.load(path);
_ifaceResource._register();
}
function loadInterfaceXML(iface) { function loadInterfaceXML(iface) {
if (!_ifaceResource) { ensureIfaceResource();
// don't use global.datadir so the method is usable from tests/tools
let dir = GLib.getenv('GNOME_SHELL_DATADIR') || Config.PKGDATADIR;
let path = `${dir}/gnome-shell-dbus-interfaces.gresource`;
_ifaceResource = Gio.Resource.load(path);
_ifaceResource._register();
}
let uri = `resource:///org/gnome/shell/dbus-interfaces/${iface}.xml`; let uri = `resource:///org/gnome/shell/dbus-interfaces/${iface}.xml`;
let f = Gio.File.new_for_uri(uri); let f = Gio.File.new_for_uri(uri);
@ -88,3 +93,25 @@ function loadInterfaceXML(iface) {
return null; return null;
} }
function loadSubInterfaceXML(iface, ifaceFile) {
let xml = loadInterfaceXML(ifaceFile);
if (!xml)
return null;
let ifaceStartTag = `<interface name="${iface}">`;
let ifaceStopTag = '</interface>';
let ifaceStartIndex = xml.indexOf(ifaceStartTag);
let ifaceEndIndex = xml.indexOf(ifaceStopTag, ifaceStartIndex + 1) + ifaceStopTag.length;
let xmlHeader = '<!DOCTYPE node PUBLIC\n' +
'\'-//freedesktop//DTD D-BUS Object Introspection 1.0//EN\'\n' +
'\'http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd\'>\n' +
'<node>\n';
let xmlFooter = '</node>';
return (
xmlHeader +
xml.substr(ifaceStartIndex, ifaceEndIndex - ifaceStartIndex) +
xmlFooter);
}

View File

@ -5,7 +5,7 @@ const INTROSPECT_SCHEMA = 'org.gnome.shell';
const INTROSPECT_KEY = 'introspect'; const INTROSPECT_KEY = 'introspect';
const APP_WHITELIST = ['org.freedesktop.impl.portal.desktop.gtk']; const APP_WHITELIST = ['org.freedesktop.impl.portal.desktop.gtk'];
const INTROSPECT_DBUS_API_VERSION = 2; const INTROSPECT_DBUS_API_VERSION = 3;
const { loadInterfaceXML } = imports.misc.fileUtils; const { loadInterfaceXML } = imports.misc.fileUtils;
@ -59,6 +59,11 @@ var IntrospectService = class {
this._settings.connect('notify::enable-animations', this._settings.connect('notify::enable-animations',
this._syncAnimationsEnabled.bind(this)); this._syncAnimationsEnabled.bind(this));
this._syncAnimationsEnabled(); this._syncAnimationsEnabled();
const monitorManager = Meta.MonitorManager.get();
monitorManager.connect('monitors-changed',
this._syncScreenSize.bind(this));
this._syncScreenSize();
} }
_isStandaloneApp(app) { _isStandaloneApp(app) {
@ -209,10 +214,28 @@ var IntrospectService = class {
} }
} }
_syncScreenSize() {
const oldScreenWidth = this._screenWidth;
const oldScreenHeight = this._screenHeight;
this._screenWidth = global.screen_width;
this._screenHeight = global.screen_height;
if (oldScreenWidth !== this._screenWidth ||
oldScreenHeight !== this._screenHeight) {
const variant = new GLib.Variant('(ii)',
[this._screenWidth, this._screenHeight]);
this._dbusImpl.emit_property_changed('ScreenSize', variant);
}
}
get AnimationsEnabled() { get AnimationsEnabled() {
return this._animationsEnabled; return this._animationsEnabled;
} }
get ScreenSize() {
return [this._screenWidth, this._screenHeight];
}
get version() { get version() {
return INTROSPECT_DBUS_API_VERSION; return INTROSPECT_DBUS_API_VERSION;
} }

File diff suppressed because it is too large Load Diff

View File

@ -347,6 +347,8 @@ var Background = GObject.registerClass({
this.set_color(color); this.set_color(color);
else else
this.set_gradient(shadingType, color, secondColor); this.set_gradient(shadingType, color, secondColor);
this._setLoaded();
} }
_watchFile(file) { _watchFile(file) {
@ -765,10 +767,27 @@ var BackgroundManager = class BackgroundManager {
this._updateBackgroundActor(); this._updateBackgroundActor();
}); });
let loadedSignalId;
if (background.isLoaded) {
GLib.idle_add(GLib.PRIORITY_DEFAULT, () => {
this.emit('loaded');
return GLib.SOURCE_REMOVE;
});
} else {
loadedSignalId = background.connect('loaded', () => {
background.disconnect(loadedSignalId);
loadedSignalId = null;
this.emit('loaded');
});
}
backgroundActor.connect('destroy', () => { backgroundActor.connect('destroy', () => {
if (changeSignalId) if (changeSignalId)
background.disconnect(changeSignalId); background.disconnect(changeSignalId);
if (loadedSignalId)
background.disconnect(loadedSignalId);
if (backgroundActor.loadedSignalId) if (backgroundActor.loadedSignalId)
background.disconnect(backgroundActor.loadedSignalId); background.disconnect(backgroundActor.loadedSignalId);
}); });

View File

@ -1,7 +1,7 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
/* exported BoxPointer */ /* exported BoxPointer */
const { Clutter, GObject, Shell, St } = imports.gi; const { Clutter, GObject, St } = imports.gi;
const Main = imports.ui.main; const Main = imports.ui.main;
@ -453,15 +453,16 @@ var BoxPointer = GObject.registerClass({
let alignment = this._arrowAlignment; let alignment = this._arrowAlignment;
let monitorIndex = Main.layoutManager.findIndexForActor(sourceActor); let monitorIndex = Main.layoutManager.findIndexForActor(sourceActor);
this._sourceAllocation = Shell.util_get_transformed_allocation(sourceActor); this._sourceExtents = sourceActor.get_transformed_extents();
this._workArea = Main.layoutManager.getWorkAreaForMonitor(monitorIndex); this._workArea = Main.layoutManager.getWorkAreaForMonitor(monitorIndex);
// Position correctly relative to the sourceActor // Position correctly relative to the sourceActor
let sourceNode = sourceActor.get_theme_node(); let sourceNode = sourceActor.get_theme_node();
let sourceContentBox = sourceNode.get_content_box(sourceActor.get_allocation_box()); let sourceContentBox = sourceNode.get_content_box(sourceActor.get_allocation_box());
let sourceAllocation = this._sourceAllocation; let sourceTopLeft = this._sourceExtents.get_top_left();
let sourceCenterX = sourceAllocation.x1 + sourceContentBox.x1 + (sourceContentBox.x2 - sourceContentBox.x1) * this._sourceAlignment; let sourceBottomRight = this._sourceExtents.get_bottom_right();
let sourceCenterY = sourceAllocation.y1 + sourceContentBox.y1 + (sourceContentBox.y2 - sourceContentBox.y1) * this._sourceAlignment; let sourceCenterX = sourceTopLeft.x + sourceContentBox.x1 + (sourceContentBox.x2 - sourceContentBox.x1) * this._sourceAlignment;
let sourceCenterY = sourceTopLeft.y + sourceContentBox.y1 + (sourceContentBox.y2 - sourceContentBox.y1) * this._sourceAlignment;
let [, , natWidth, natHeight] = this.get_preferred_size(); let [, , natWidth, natHeight] = this.get_preferred_size();
// We also want to keep it onscreen, and separated from the // We also want to keep it onscreen, and separated from the
@ -481,16 +482,16 @@ var BoxPointer = GObject.registerClass({
switch (this._arrowSide) { switch (this._arrowSide) {
case St.Side.TOP: case St.Side.TOP:
resY = sourceAllocation.y2 + gap; resY = sourceBottomRight.y + gap;
break; break;
case St.Side.BOTTOM: case St.Side.BOTTOM:
resY = sourceAllocation.y1 - natHeight - gap; resY = sourceTopLeft.y - natHeight - gap;
break; break;
case St.Side.LEFT: case St.Side.LEFT:
resX = sourceAllocation.x2 + gap; resX = sourceBottomRight.x + gap;
break; break;
case St.Side.RIGHT: case St.Side.RIGHT:
resX = sourceAllocation.x1 - natWidth - gap; resX = sourceTopLeft.x - natWidth - gap;
break; break;
} }
@ -586,29 +587,30 @@ var BoxPointer = GObject.registerClass({
} }
_calculateArrowSide(arrowSide) { _calculateArrowSide(arrowSide) {
let sourceAllocation = this._sourceAllocation; let sourceTopLeft = this._sourceExtents.get_top_left();
let sourceBottomRight = this._sourceExtents.get_bottom_right();
let [, , boxWidth, boxHeight] = this.get_preferred_size(); let [, , boxWidth, boxHeight] = this.get_preferred_size();
let workarea = this._workArea; let workarea = this._workArea;
switch (arrowSide) { switch (arrowSide) {
case St.Side.TOP: case St.Side.TOP:
if (sourceAllocation.y2 + boxHeight > workarea.y + workarea.height && if (sourceBottomRight.y + boxHeight > workarea.y + workarea.height &&
boxHeight < sourceAllocation.y1 - workarea.y) boxHeight < sourceTopLeft.y - workarea.y)
return St.Side.BOTTOM; return St.Side.BOTTOM;
break; break;
case St.Side.BOTTOM: case St.Side.BOTTOM:
if (sourceAllocation.y1 - boxHeight < workarea.y && if (sourceTopLeft.y - boxHeight < workarea.y &&
boxHeight < workarea.y + workarea.height - sourceAllocation.y2) boxHeight < workarea.y + workarea.height - sourceBottomRight.y)
return St.Side.TOP; return St.Side.TOP;
break; break;
case St.Side.LEFT: case St.Side.LEFT:
if (sourceAllocation.x2 + boxWidth > workarea.x + workarea.width && if (sourceBottomRight.x + boxWidth > workarea.x + workarea.width &&
boxWidth < sourceAllocation.x1 - workarea.x) boxWidth < sourceTopLeft.x - workarea.x)
return St.Side.RIGHT; return St.Side.RIGHT;
break; break;
case St.Side.RIGHT: case St.Side.RIGHT:
if (sourceAllocation.x1 - boxWidth < workarea.x && if (sourceTopLeft.x - boxWidth < workarea.x &&
boxWidth < workarea.x + workarea.width - sourceAllocation.x2) boxWidth < workarea.x + workarea.width - sourceBottomRight.x)
return St.Side.LEFT; return St.Side.LEFT;
break; break;
} }

View File

@ -388,17 +388,16 @@ var _Draggable = class _Draggable {
const [, newAllocatedWidth] = this._dragActor.get_preferred_width(-1); const [, newAllocatedWidth] = this._dragActor.get_preferred_width(-1);
const [, newAllocatedHeight] = this._dragActor.get_preferred_height(-1); const [, newAllocatedHeight] = this._dragActor.get_preferred_height(-1);
const transformedAllocation = const transformedExtents = this._dragActor.get_transformed_extents();
Shell.util_get_transformed_allocation(this._dragActor);
// Set the actor's scale such that it will keep the same // Set the actor's scale such that it will keep the same
// transformed size when it's reparented to the uiGroup // transformed size when it's reparented to the uiGroup
this._dragActor.set_scale( this._dragActor.set_scale(
transformedAllocation.get_width() / newAllocatedWidth, transformedExtents.get_width() / newAllocatedWidth,
transformedAllocation.get_height() / newAllocatedHeight); transformedExtents.get_height() / newAllocatedHeight);
this._dragOffsetX = transformedAllocation.x1 - this._dragStartX; this._dragOffsetX = transformedExtents.origin.x - this._dragStartX;
this._dragOffsetY = transformedAllocation.y1 - this._dragStartY; this._dragOffsetY = transformedExtents.origin.y - this._dragStartY;
this._dragOrigParent.remove_actor(this._dragActor); this._dragOrigParent.remove_actor(this._dragActor);
Main.uiGroup.add_child(this._dragActor); Main.uiGroup.add_child(this._dragActor);

View File

@ -139,7 +139,9 @@ function checkForUpdates() {
return; return;
if (extension.hasUpdate) if (extension.hasUpdate)
return; return;
metadatas[uuid] = extension.metadata; metadatas[uuid] = {
version: extension.metadata.version,
};
}); });
if (Object.keys(metadatas).length === 0) if (Object.keys(metadatas).length === 0)

View File

@ -52,6 +52,17 @@ const defaultGridModes = [
}, },
]; ];
var LEFT_DIVIDER_LEEWAY = 20;
var RIGHT_DIVIDER_LEEWAY = 20;
var DragLocation = {
INVALID: 0,
START_EDGE: 1,
ON_ICON: 2,
END_EDGE: 3,
EMPTY_SPACE: 4,
};
var BaseIcon = GObject.registerClass( var BaseIcon = GObject.registerClass(
class BaseIcon extends St.Bin { class BaseIcon extends St.Bin {
_init(label, params) { _init(label, params) {
@ -946,6 +957,99 @@ var IconGridLayout = GObject.registerClass({
} }
} }
/**
* getDropTarget:
* @param {int} x: position of the horizontal axis
* @param {int} y: position of the vertical axis
*
* Retrieves the item located at (@x, @y), as well as the drag location.
* Both @x and @y are relative to the grid.
*
* @returns {[Clutter.Actor, DragLocation]} the item and drag location
* under (@x, @y)
*/
getDropTarget(x, y) {
const childSize = this._getChildrenMaxSize();
const [leftEmptySpace, topEmptySpace, hSpacing, vSpacing] =
this._calculateSpacing(childSize);
const isRtl =
Clutter.get_default_text_direction() === Clutter.TextDirection.RTL;
let page = this._orientation === Clutter.Orientation.VERTICAL
? Math.floor(y / this._pageHeight)
: Math.floor(x / this._pageWidth);
// Out of bounds
if (page >= this._pages.length)
return [null, DragLocation.INVALID];
if (isRtl && this._orientation === Clutter.Orientation.HORIZONTAL)
page = swap(page, this._pages.length);
// Page-relative coordinates from now on
x %= this._pageWidth;
y %= this._pageHeight;
if (x < leftEmptySpace || y < topEmptySpace)
return [null, DragLocation.INVALID];
const gridWidth =
childSize * this._columnsPerPage +
hSpacing * (this._columnsPerPage - 1);
const gridHeight =
childSize * this._rowsPerPage +
vSpacing * (this._rowsPerPage - 1);
if (x > leftEmptySpace + gridWidth || y > topEmptySpace + gridHeight)
return [null, DragLocation.INVALID];
const halfHSpacing = hSpacing / 2;
const halfVSpacing = vSpacing / 2;
const visibleItems = this._getVisibleChildrenForPage(page);
for (const item of visibleItems) {
const childBox = item.allocation.copy();
// Page offset
switch (this._orientation) {
case Clutter.Orientation.HORIZONTAL:
childBox.set_origin(childBox.x1 % this._pageWidth, childBox.y1);
break;
case Clutter.Orientation.VERTICAL:
childBox.set_origin(childBox.x1, childBox.y1 % this._pageHeight);
break;
}
// Outside the icon boundaries
if (x < childBox.x1 - halfHSpacing ||
x > childBox.x2 + halfHSpacing ||
y < childBox.y1 - halfVSpacing ||
y > childBox.y2 + halfVSpacing)
continue;
let dragLocation;
if (x < childBox.x1 + LEFT_DIVIDER_LEEWAY)
dragLocation = DragLocation.START_EDGE;
else if (x > childBox.x2 - RIGHT_DIVIDER_LEEWAY)
dragLocation = DragLocation.END_EDGE;
else
dragLocation = DragLocation.ON_ICON;
if (isRtl) {
if (dragLocation === DragLocation.START_EDGE)
dragLocation = DragLocation.END_EDGE;
else if (dragLocation === DragLocation.END_EDGE)
dragLocation = DragLocation.START_EDGE;
}
return [item, dragLocation];
}
return [null, DragLocation.EMPTY_SPACE];
}
// eslint-disable-next-line camelcase // eslint-disable-next-line camelcase
get allow_incomplete_pages() { get allow_incomplete_pages() {
return this._allowIncompletePages; return this._allowIncompletePages;
@ -1559,6 +1663,11 @@ var IconGrid = GObject.registerClass({
this.queue_relayout(); this.queue_relayout();
} }
getDropTarget(x, y) {
const layoutManager = this.layout_manager;
return layoutManager.getDropTarget(x, y, this._currentPage);
}
get itemsPerPage() { get itemsPerPage() {
const layoutManager = this.layout_manager; const layoutManager = this.layout_manager;
return layoutManager.rows_per_page * layoutManager.columns_per_page; return layoutManager.rows_per_page * layoutManager.columns_per_page;

View File

@ -42,7 +42,7 @@ const defaultKeysPost = [
[[{ width: 1.5, keyval: Clutter.KEY_BackSpace, icon: 'edit-clear-symbolic' }], [[{ width: 1.5, keyval: Clutter.KEY_BackSpace, icon: 'edit-clear-symbolic' }],
[{ width: 2, keyval: Clutter.KEY_Return, extraClassName: 'enter-key', icon: 'keyboard-enter-symbolic' }], [{ width: 2, keyval: Clutter.KEY_Return, extraClassName: 'enter-key', icon: 'keyboard-enter-symbolic' }],
[{ label: '=/<', width: 3, level: 3, right: true }], [{ label: '=/<', width: 3, level: 3, right: true }],
[{ action: 'emoji', icon: 'face-smile-symbolic' }, { action: 'languageMenu', extraClassName: 'layout-key' }, { action: 'hide', extraClassName: 'hide-key' }]], [{ action: 'emoji', icon: 'face-smile-symbolic' }, { action: 'languageMenu', extraClassName: 'layout-key', icon: 'keyboard-layout-filled-symbolic' }, { action: 'hide', extraClassName: 'hide-key', icon: 'go-down-symbolic' }]],
[[{ width: 1.5, keyval: Clutter.KEY_BackSpace, icon: 'edit-clear-symbolic' }], [[{ width: 1.5, keyval: Clutter.KEY_BackSpace, icon: 'edit-clear-symbolic' }],
[{ width: 2, keyval: Clutter.KEY_Return, extraClassName: 'enter-key', icon: 'keyboard-enter-symbolic' }], [{ width: 2, keyval: Clutter.KEY_Return, extraClassName: 'enter-key', icon: 'keyboard-enter-symbolic' }],
[{ label: '?123', width: 3, level: 2, right: true }], [{ label: '?123', width: 3, level: 2, right: true }],

View File

@ -6,7 +6,6 @@ const Signals = imports.signals;
const Background = imports.ui.background; const Background = imports.ui.background;
const BackgroundMenu = imports.ui.backgroundMenu; const BackgroundMenu = imports.ui.backgroundMenu;
const LoginManager = imports.misc.loginManager;
const DND = imports.ui.dnd; const DND = imports.ui.dnd;
const Main = imports.ui.main; const Main = imports.ui.main;
@ -295,18 +294,6 @@ var LayoutManager = GObject.registerClass({
monitorManager.connect('monitors-changed', monitorManager.connect('monitors-changed',
this._monitorsChanged.bind(this)); this._monitorsChanged.bind(this));
this._monitorsChanged(); this._monitorsChanged();
// NVIDIA drivers don't preserve FBO contents across
// suspend/resume, see
// https://bugzilla.gnome.org/show_bug.cgi?id=739178
if (Shell.util_need_background_refresh()) {
LoginManager.getLoginManager().connect('prepare-for-sleep',
(lm, suspending) => {
if (suspending)
return;
Meta.Background.refresh_all();
});
}
} }
// This is called by Main after everything else is constructed // This is called by Main after everything else is constructed
@ -470,6 +457,15 @@ var LayoutManager = GObject.registerClass({
} }
} }
_waitLoaded(bgManager) {
return new Promise(resolve => {
const id = bgManager.connect('loaded', () => {
bgManager.disconnect(id);
resolve();
});
});
}
_updateBackgrounds() { _updateBackgrounds() {
for (let i = 0; i < this._bgManagers.length; i++) for (let i = 0; i < this._bgManagers.length; i++)
this._bgManagers[i].destroy(); this._bgManagers[i].destroy();
@ -477,7 +473,7 @@ var LayoutManager = GObject.registerClass({
this._bgManagers = []; this._bgManagers = [];
if (Main.sessionMode.isGreeter) if (Main.sessionMode.isGreeter)
return; return Promise.resolve();
for (let i = 0; i < this.monitors.length; i++) { for (let i = 0; i < this.monitors.length; i++) {
let bgManager = this._createBackgroundManager(i); let bgManager = this._createBackgroundManager(i);
@ -486,6 +482,8 @@ var LayoutManager = GObject.registerClass({
if (i != this.primaryIndex && this._startingUp) if (i != this.primaryIndex && this._startingUp)
bgManager.backgroundActor.hide(); bgManager.backgroundActor.hide();
} }
return Promise.all(this._bgManagers.map(this._waitLoaded));
} }
_updateKeyboardBox() { _updateKeyboardBox() {
@ -644,7 +642,7 @@ var LayoutManager = GObject.registerClass({
// When starting a normal user session, we want to grow it out of the middle // When starting a normal user session, we want to grow it out of the middle
// of the screen. // of the screen.
_prepareStartupAnimation() { async _prepareStartupAnimation() {
// During the initial transition, add a simple actor to block all events, // During the initial transition, add a simple actor to block all events,
// so they don't get delivered to X11 windows that have been transformed. // so they don't get delivered to X11 windows that have been transformed.
this._coverPane = new Clutter.Actor({ opacity: 0, this._coverPane = new Clutter.Actor({ opacity: 0,
@ -661,8 +659,6 @@ var LayoutManager = GObject.registerClass({
} else if (Main.sessionMode.isGreeter) { } else if (Main.sessionMode.isGreeter) {
this.panelBox.translation_y = -this.panelBox.height; this.panelBox.translation_y = -this.panelBox.height;
} else { } else {
this._updateBackgrounds();
// We need to force an update of the regions now before we scale // We need to force an update of the regions now before we scale
// the UI group to get the correct allocation for the struts. // the UI group to get the correct allocation for the struts.
this._updateRegions(); this._updateRegions();
@ -678,6 +674,8 @@ var LayoutManager = GObject.registerClass({
this.uiGroup.scale_x = this.uiGroup.scale_y = 0.75; this.uiGroup.scale_x = this.uiGroup.scale_y = 0.75;
this.uiGroup.opacity = 0; this.uiGroup.opacity = 0;
global.window_group.set_clip(monitor.x, monitor.y, monitor.width, monitor.height); global.window_group.set_clip(monitor.x, monitor.y, monitor.width, monitor.height);
await this._updateBackgrounds();
} }
this.emit('startup-prepared'); this.emit('startup-prepared');
@ -1230,8 +1228,9 @@ class HotCorner extends Clutter.Actor {
return; return;
if (Main.overview.shouldToggleByCornerOrButton()) { if (Main.overview.shouldToggleByCornerOrButton()) {
this._ripples.playAnimation(this._x, this._y);
Main.overview.toggle(); Main.overview.toggle();
if (Main.overview.animationInProgress)
this._ripples.playAnimation(this._x, this._y);
} }
} }

View File

@ -3,10 +3,10 @@
ctrlAltTabManager, padOsdService, osdWindowManager, ctrlAltTabManager, padOsdService, osdWindowManager,
osdMonitorLabeler, shellMountOpDBusService, shellDBusService, osdMonitorLabeler, shellMountOpDBusService, shellDBusService,
shellAccessDialogDBusService, shellAudioSelectionDBusService, shellAccessDialogDBusService, shellAudioSelectionDBusService,
screenSaverDBus, screencastService, uiGroup, magnifier, screenSaverDBus, uiGroup, magnifier, xdndHandler, keyboard,
xdndHandler, keyboard, kbdA11yDialog, introspectService, kbdA11yDialog, introspectService, start, pushModal, popModal,
start, pushModal, popModal, activateWindow, createLookingGlass, activateWindow, createLookingGlass, initializeDeferredWork,
initializeDeferredWork, getThemeStylesheet, setThemeStylesheet */ getThemeStylesheet, setThemeStylesheet */
const { Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi; const { Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi;
@ -34,7 +34,6 @@ const LoginManager = imports.misc.loginManager;
const LookingGlass = imports.ui.lookingGlass; const LookingGlass = imports.ui.lookingGlass;
const NotificationDaemon = imports.ui.notificationDaemon; const NotificationDaemon = imports.ui.notificationDaemon;
const WindowAttentionHandler = imports.ui.windowAttentionHandler; const WindowAttentionHandler = imports.ui.windowAttentionHandler;
const Screencast = imports.ui.screencast;
const ScreenShield = imports.ui.screenShield; const ScreenShield = imports.ui.screenShield;
const Scripting = imports.ui.scripting; const Scripting = imports.ui.scripting;
const SessionMode = imports.ui.sessionMode; const SessionMode = imports.ui.sessionMode;
@ -74,7 +73,6 @@ var shellAudioSelectionDBusService = null;
var shellDBusService = null; var shellDBusService = null;
var shellMountOpDBusService = null; var shellMountOpDBusService = null;
var screenSaverDBus = null; var screenSaverDBus = null;
var screencastService = null;
var modalCount = 0; var modalCount = 0;
var actionMode = Shell.ActionMode.NONE; var actionMode = Shell.ActionMode.NONE;
var modalActorFocusStack = []; var modalActorFocusStack = [];
@ -200,7 +198,6 @@ function _initializeUI() {
uiGroup = layoutManager.uiGroup; uiGroup = layoutManager.uiGroup;
padOsdService = new PadOsd.PadOsdService(); padOsdService = new PadOsd.PadOsdService();
screencastService = new Screencast.ScreencastService();
xdndHandler = new XdndHandler.XdndHandler(); xdndHandler = new XdndHandler.XdndHandler();
ctrlAltTabManager = new CtrlAltTab.CtrlAltTabManager(); ctrlAltTabManager = new CtrlAltTab.CtrlAltTabManager();
osdWindowManager = new OsdWindow.OsdWindowManager(); osdWindowManager = new OsdWindow.OsdWindowManager();

View File

@ -736,13 +736,11 @@ class AggregateMenu extends PanelMenu.Button {
this._volume = new imports.ui.status.volume.Indicator(); this._volume = new imports.ui.status.volume.Indicator();
this._brightness = new imports.ui.status.brightness.Indicator(); this._brightness = new imports.ui.status.brightness.Indicator();
this._system = new imports.ui.status.system.Indicator(); this._system = new imports.ui.status.system.Indicator();
this._screencast = new imports.ui.status.screencast.Indicator();
this._location = new imports.ui.status.location.Indicator(); this._location = new imports.ui.status.location.Indicator();
this._nightLight = new imports.ui.status.nightLight.Indicator(); this._nightLight = new imports.ui.status.nightLight.Indicator();
this._thunderbolt = new imports.ui.status.thunderbolt.Indicator(); this._thunderbolt = new imports.ui.status.thunderbolt.Indicator();
this._indicators.add_child(this._thunderbolt); this._indicators.add_child(this._thunderbolt);
this._indicators.add_child(this._screencast);
this._indicators.add_child(this._location); this._indicators.add_child(this._location);
this._indicators.add_child(this._nightLight); this._indicators.add_child(this._nightLight);
if (this._network) if (this._network)

View File

@ -183,10 +183,9 @@ var Button = GObject.registerClass({
} }
_onDestroy() { _onDestroy() {
super._onDestroy();
if (this.menu) if (this.menu)
this.menu.destroy(); this.menu.destroy();
super._onDestroy();
} }
}); });

View File

@ -881,9 +881,10 @@ var PopupMenu = class extends PopupMenuBase {
let state = event.get_state(); let state = event.get_state();
// if user has a modifier down (except capslock) // if user has a modifier down (except capslock and numlock)
// then don't handle the key press here // then don't handle the key press here
state &= ~Clutter.ModifierType.LOCK_MASK; state &= ~Clutter.ModifierType.LOCK_MASK;
state &= ~Clutter.ModifierType.MOD2_MASK;
state &= Clutter.ModifierType.MODIFIER_MASK; state &= Clutter.ModifierType.MODIFIER_MASK;
if (state) if (state)
@ -1324,7 +1325,7 @@ var PopupMenuManager = class {
removeMenu(menu) { removeMenu(menu) {
if (menu == this.activeMenu) if (menu == this.activeMenu)
this._closeMenu(false, menu); this._grabHelper.ungrab({ actor: menu.actor });
let position = this._findMenu(menu); let position = this._findMenu(menu);
if (position == -1) // not a menu we manage if (position == -1) // not a menu we manage

View File

@ -1,146 +0,0 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const { Gio, GLib, Shell } = imports.gi;
const Signals = imports.signals;
const Main = imports.ui.main;
const { loadInterfaceXML } = imports.misc.fileUtils;
const ScreencastIface = loadInterfaceXML('org.gnome.Shell.Screencast');
var ScreencastService = class {
constructor() {
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(ScreencastIface, this);
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell/Screencast');
Gio.DBus.session.own_name('org.gnome.Shell.Screencast', Gio.BusNameOwnerFlags.REPLACE, null, null);
this._recorders = new Map();
this._lockdownSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.lockdown' });
Main.sessionMode.connect('updated', this._sessionUpdated.bind(this));
}
get isRecording() {
return this._recorders.size > 0;
}
_ensureRecorderForSender(sender) {
let recorder = this._recorders.get(sender);
if (!recorder) {
recorder = new Shell.Recorder({ stage: global.stage,
display: global.display });
recorder._watchNameId =
Gio.bus_watch_name(Gio.BusType.SESSION, sender, 0, null,
this._onNameVanished.bind(this));
this._recorders.set(sender, recorder);
this.emit('updated');
}
return recorder;
}
_sessionUpdated() {
if (Main.sessionMode.allowScreencast)
return;
for (let sender of this._recorders.keys())
this._stopRecordingForSender(sender);
}
_onNameVanished(connection, name) {
this._stopRecordingForSender(name);
}
_stopRecordingForSender(sender) {
let recorder = this._recorders.get(sender);
if (!recorder)
return false;
Gio.bus_unwatch_name(recorder._watchNameId);
recorder.close();
this._recorders.delete(sender);
this.emit('updated');
return true;
}
_applyOptionalParameters(recorder, options) {
for (let option in options)
options[option] = options[option].deep_unpack();
if (options['pipeline'])
recorder.set_pipeline(options['pipeline']);
if (options['framerate'])
recorder.set_framerate(options['framerate']);
if ('draw-cursor' in options)
recorder.set_draw_cursor(options['draw-cursor']);
}
ScreencastAsync(params, invocation) {
let returnValue = [false, ''];
if (!Main.sessionMode.allowScreencast ||
this._lockdownSettings.get_boolean('disable-save-to-disk')) {
invocation.return_value(GLib.Variant.new('(bs)', returnValue));
return;
}
let sender = invocation.get_sender();
let recorder = this._ensureRecorderForSender(sender);
if (!recorder.is_recording()) {
let [fileTemplate, options] = params;
recorder.set_file_template(fileTemplate);
this._applyOptionalParameters(recorder, options);
let [success, fileName] = recorder.record();
returnValue = [success, fileName ? fileName : ''];
if (!success)
this._stopRecordingForSender(sender);
}
invocation.return_value(GLib.Variant.new('(bs)', returnValue));
}
ScreencastAreaAsync(params, invocation) {
let returnValue = [false, ''];
if (!Main.sessionMode.allowScreencast ||
this._lockdownSettings.get_boolean('disable-save-to-disk')) {
invocation.return_value(GLib.Variant.new('(bs)', returnValue));
return;
}
let sender = invocation.get_sender();
let recorder = this._ensureRecorderForSender(sender);
if (!recorder.is_recording()) {
let [x, y, width, height, fileTemplate, options] = params;
if (x < 0 || y < 0 ||
width <= 0 || height <= 0 ||
x + width > global.screen_width ||
y + height > global.screen_height) {
invocation.return_error_literal(Gio.IOErrorEnum,
Gio.IOErrorEnum.CANCELLED,
"Invalid params");
return;
}
recorder.set_file_template(fileTemplate);
recorder.set_area(x, y, width, height);
this._applyOptionalParameters(recorder, options);
let [success, fileName] = recorder.record();
returnValue = [success, fileName ? fileName : ''];
if (!success)
this._stopRecordingForSender(sender);
}
invocation.return_value(GLib.Variant.new('(bs)', returnValue));
}
StopScreencastAsync(params, invocation) {
let success = this._stopRecordingForSender(invocation.get_sender());
invocation.return_value(GLib.Variant.new('(b)', [success]));
}
};
Signals.addSignalMethods(ScreencastService.prototype);

View File

@ -24,7 +24,8 @@ class RemoteAccessApplet extends PanelMenu.SystemIndicator {
return; return;
this._handles = new Set(); this._handles = new Set();
this._indicator = null; this._sharedIndicator = null;
this._recordingIndicator = null;
this._menuSection = null; this._menuSection = null;
controller.connect('new-handle', (o, handle) => { controller.connect('new-handle', (o, handle) => {
@ -33,32 +34,49 @@ class RemoteAccessApplet extends PanelMenu.SystemIndicator {
} }
_ensureControls() { _ensureControls() {
if (this._indicator) if (this._sharedIndicator && this._recordingIndicator)
return; return;
this._indicator = this._addIndicator(); this._sharedIndicator = this._addIndicator();
this._indicator.icon_name = 'screen-shared-symbolic'; this._sharedIndicator.icon_name = 'screen-shared-symbolic';
this._indicator.add_style_class_name('remote-access-indicator'); this._sharedIndicator.add_style_class_name('remote-access-indicator');
this._item =
this._sharedItem =
new PopupMenu.PopupSubMenuMenuItem(_("Screen is Being Shared"), new PopupMenu.PopupSubMenuMenuItem(_("Screen is Being Shared"),
true); true);
this._item.menu.addAction(_("Turn off"), this._sharedItem.menu.addAction(_("Turn off"),
() => { () => {
for (let handle of this._handles) for (let handle of this._handles) {
handle.stop(); if (!handle.is_recording)
}); handle.stop();
this._item.icon.icon_name = 'screen-shared-symbolic'; }
this.menu.addMenuItem(this._item); });
this._sharedItem.icon.icon_name = 'screen-shared-symbolic';
this.menu.addMenuItem(this._sharedItem);
this._recordingIndicator = this._addIndicator();
this._recordingIndicator.icon_name = 'media-record-symbolic';
this._recordingIndicator.add_style_class_name('screencast-indicator');
}
_isScreenShared() {
return [...this._handles].some(handle => !handle.is_recording);
}
_isRecording() {
return [...this._handles].some(handle => handle.is_recording);
} }
_sync() { _sync() {
if (this._handles.size == 0) { if (this._isScreenShared()) {
this._indicator.visible = false; this._sharedIndicator.visible = true;
this._item.visible = false; this._sharedItem.visible = true;
} else { } else {
this._indicator.visible = true; this._sharedIndicator.visible = false;
this._item.visible = true; this._sharedItem.visible = false;
} }
this._recordingIndicator.visible = this._isRecording();
} }
_onStopped(handle) { _onStopped(handle) {
@ -70,9 +88,7 @@ class RemoteAccessApplet extends PanelMenu.SystemIndicator {
this._handles.add(handle); this._handles.add(handle);
handle.connect('stopped', this._onStopped.bind(this)); handle.connect('stopped', this._onStopped.bind(this));
if (this._handles.size == 1) { this._ensureControls();
this._ensureControls(); this._sync();
this._sync();
}
} }
}); });

View File

@ -1,25 +0,0 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
/* exported Indicator */
const GObject = imports.gi.GObject;
const Main = imports.ui.main;
const PanelMenu = imports.ui.panelMenu;
var Indicator = GObject.registerClass(
class Indicator extends PanelMenu.SystemIndicator {
_init() {
super._init();
this._indicator = this._addIndicator();
this._indicator.icon_name = 'media-record-symbolic';
this._indicator.add_style_class_name('screencast-indicator');
this._sync();
Main.screencastService.connect('updated', this._sync.bind(this));
}
_sync() {
this._indicator.visible = Main.screencastService.isRecording;
}
});

View File

@ -42,6 +42,11 @@ const GsdWacomProxy = Gio.DBusProxy.makeProxyWrapper(GsdWacomIface);
const WINDOW_DIMMER_EFFECT_NAME = "gnome-shell-window-dimmer"; const WINDOW_DIMMER_EFFECT_NAME = "gnome-shell-window-dimmer";
Gio._promisify(Shell,
'util_start_systemd_unit', 'util_start_systemd_unit_finish');
Gio._promisify(Shell,
'util_stop_systemd_unit', 'util_stop_systemd_unit_finish');
var DisplayChangeDialog = GObject.registerClass( var DisplayChangeDialog = GObject.registerClass(
class DisplayChangeDialog extends ModalDialog.ModalDialog { class DisplayChangeDialog extends ModalDialog.ModalDialog {
_init(wm) { _init(wm) {
@ -901,46 +906,23 @@ var WindowManager = class {
global.display.connect('init-xserver', (display, task) => { global.display.connect('init-xserver', (display, task) => {
IBusManager.getIBusManager().restartDaemon(['--xim']); IBusManager.getIBusManager().restartDaemon(['--xim']);
try { /* Timeout waiting for start job completion after 5 seconds */
if (!Shell.util_start_systemd_unit('gsd-xsettings.target', 'fail')) let cancellable = new Gio.Cancellable();
log('Not starting gsd-xsettings; waiting for gnome-session to do so'); GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, 5, () => {
cancellable.cancel();
return GLib.SOURCE_REMOVE;
});
/* Leave this watchdog timeout so don't block indefinitely here */ this._startX11Services(task, cancellable);
let timeoutId = GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, 5, () => {
Gio.DBus.session.unwatch_name(watchId);
log('Warning: Failed to start gsd-xsettings');
task.return_boolean(true);
timeoutId = 0;
return GLib.SOURCE_REMOVE;
});
/* When gsd-xsettings daemon is started, we are good to resume */
let watchId = Gio.DBus.session.watch_name(
'org.gnome.SettingsDaemon.XSettings',
Gio.BusNameWatcherFlags.NONE,
() => {
Gio.DBus.session.unwatch_name(watchId);
if (timeoutId > 0) {
task.return_boolean(true);
GLib.source_remove(timeoutId);
}
},
null);
} catch (e) {
log('Error starting gsd-xsettings: %s'.format(e.message));
task.return_boolean(true);
}
return true; return true;
}); });
global.display.connect('x11-display-closing', () => { global.display.connect('x11-display-closing', () => {
if (!Meta.is_wayland_compositor()) if (!Meta.is_wayland_compositor())
return; return;
try {
Shell.util_stop_systemd_unit('gsd-xsettings.target', 'fail'); this._stopX11Services(null);
} catch (e) {
log('Error stopping gsd-xsettings: %s'.format(e.message));
}
IBusManager.getIBusManager().restartDaemon(); IBusManager.getIBusManager().restartDaemon();
}); });
@ -1008,6 +990,36 @@ var WindowManager = class {
global.stage.add_action(topDragAction); global.stage.add_action(topDragAction);
} }
async _startX11Services(task, cancellable) {
try {
await Shell.util_start_systemd_unit(
'gnome-session-x11-services-ready.target', 'fail', cancellable);
} catch (e) {
// Ignore NOT_SUPPORTED error, which indicates we are not systemd
// managed and gnome-session will have taken care of everything
// already.
// Note that we do log cancellation from here.
if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_SUPPORTED))
log('Error starting X11 services: %s'.format(e.message));
} finally {
task.return_boolean(true);
}
}
async _stopX11Services(cancellable) {
try {
await Shell.util_stop_systemd_unit(
'gnome-session-x11-services.target', 'fail', cancellable);
} catch (e) {
// Ignore NOT_SUPPORTED error, which indicates we are not systemd
// managed and gnome-session will have taken care of everything
// already.
// Note that we do log cancellation from here.
if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_SUPPORTED))
log('Error stopping X11 services: %s'.format(e.message));
}
}
_showPadOsd(display, device, settings, imagePath, editionMode, monitorIndex) { _showPadOsd(display, device, settings, imagePath, editionMode, monitorIndex) {
this._currentPadOsd = new PadOsd.PadOsd(device, settings, imagePath, editionMode, monitorIndex); this._currentPadOsd = new PadOsd.PadOsd(device, settings, imagePath, editionMode, monitorIndex);
this._currentPadOsd.connect('closed', () => (this._currentPadOsd = null)); this._currentPadOsd.connect('closed', () => (this._currentPadOsd = null));

View File

@ -1027,6 +1027,8 @@ class Workspace extends St.Widget {
if (this.metaWorkspace !== null && !this.metaWorkspace.active) if (this.metaWorkspace !== null && !this.metaWorkspace.active)
return; return;
this.layout_manager.stateAdjustment.value = 0;
// Special case maximized windows, since it doesn't make sense // Special case maximized windows, since it doesn't make sense
// to animate windows below in the stack // to animate windows below in the stack
let topMaximizedWindow; let topMaximizedWindow;
@ -1079,6 +1081,8 @@ class Workspace extends St.Widget {
if (this.metaWorkspace !== null && !this.metaWorkspace.active) if (this.metaWorkspace !== null && !this.metaWorkspace.active)
return; return;
this.layout_manager.stateAdjustment.value = 0;
// Special case maximized windows, since it doesn't make sense // Special case maximized windows, since it doesn't make sense
// to animate windows below in the stack // to animate windows below in the stack
let topMaximizedWindow; let topMaximizedWindow;
@ -1190,10 +1194,14 @@ class Workspace extends St.Widget {
_doneLeavingOverview() { _doneLeavingOverview() {
this.layout_manager.layout_frozen = false; this.layout_manager.layout_frozen = false;
this.layout_manager.stateAdjustment.value = 0;
this._windows.forEach(w => (w.opacity = 255));
} }
_doneShowingOverview() { _doneShowingOverview() {
this.layout_manager.layout_frozen = false; this.layout_manager.layout_frozen = false;
this.layout_manager.stateAdjustment.value = 1;
this._windows.forEach(w => (w.opacity = 255));
} }
_isMyWindow(window) { _isMyWindow(window) {

View File

@ -11,7 +11,10 @@ var DISPLAY_TIMEOUT = 600;
var WorkspaceSwitcherPopupList = GObject.registerClass( var WorkspaceSwitcherPopupList = GObject.registerClass(
class WorkspaceSwitcherPopupList extends St.Widget { class WorkspaceSwitcherPopupList extends St.Widget {
_init() { _init() {
super._init({ style_class: 'workspace-switcher' }); super._init({
style_class: 'workspace-switcher',
offscreen_redirect: Clutter.OffscreenRedirect.ALWAYS,
});
this._itemSpacing = 0; this._itemSpacing = 0;
this._childHeight = 0; this._childHeight = 0;

View File

@ -241,6 +241,8 @@ class WorkspacesView extends WorkspacesViewBase {
startTouchGesture() { startTouchGesture() {
this._gestureActive = true; this._gestureActive = true;
this._updateVisibility();
} }
endTouchGesture() { endTouchGesture() {
@ -381,8 +383,10 @@ class WorkspacesDisplay extends St.Widget {
this._windowDragEndId = this._windowDragEndId =
Main.overview.connect('window-drag-begin', Main.overview.connect('window-drag-begin',
this._windowDragEnd.bind(this)); this._windowDragEnd.bind(this));
this._overviewShownId = Main.overview.connect('shown', this._overviewShownId = Main.overview.connect('shown', () => {
this._syncWorkspacesActualGeometry.bind(this)); this._inWindowFade = false;
this._syncWorkspacesActualGeometry();
});
this._primaryIndex = Main.layoutManager.primaryIndex; this._primaryIndex = Main.layoutManager.primaryIndex;
this._workspacesViews = []; this._workspacesViews = [];
@ -401,6 +405,7 @@ class WorkspacesDisplay extends St.Widget {
this._actualGeometry = null; this._actualGeometry = null;
this._inWindowDrag = false; this._inWindowDrag = false;
this._inWindowFade = false;
this._gestureActive = false; // touch(pad) gestures this._gestureActive = false; // touch(pad) gestures
this._canScroll = true; // limiting scrolling speed this._canScroll = true; // limiting scrolling speed
@ -549,20 +554,20 @@ class WorkspacesDisplay extends St.Widget {
this.show(); this.show();
this._updateWorkspacesViews(); this._updateWorkspacesViews();
if (this._actualGeometry) { for (let i = 0; i < this._workspacesViews.length; i++) {
for (let i = 0; i < this._workspacesViews.length; i++) { let animationType;
let animationType; if (fadeOnPrimary && i == this._primaryIndex)
if (fadeOnPrimary && i == this._primaryIndex) animationType = AnimationType.FADE;
animationType = AnimationType.FADE; else
else animationType = AnimationType.ZOOM;
animationType = AnimationType.ZOOM; this._workspacesViews[i].animateToOverview(animationType);
this._workspacesViews[i].animateToOverview(animationType);
}
if (!fadeOnPrimary)
this._syncWorkspacesActualGeometry();
} }
this._inWindowFade = fadeOnPrimary;
if (this._actualGeometry && !fadeOnPrimary)
this._syncWorkspacesActualGeometry();
this._restackedNotifyId = this._restackedNotifyId =
Main.overview.connect('windows-restacked', Main.overview.connect('windows-restacked',
this._onRestacked.bind(this)); this._onRestacked.bind(this));
@ -583,6 +588,8 @@ class WorkspacesDisplay extends St.Widget {
this._workspacesViews[i].animateFromOverview(animationType); this._workspacesViews[i].animateFromOverview(animationType);
} }
this._inWindowFade = fadeOnPrimary;
const { primaryIndex } = Main.layoutManager; const { primaryIndex } = Main.layoutManager;
const { x, y, width, height } = const { x, y, width, height } =
Main.layoutManager.getWorkAreaForMonitor(primaryIndex); Main.layoutManager.getWorkAreaForMonitor(primaryIndex);
@ -707,7 +714,7 @@ class WorkspacesDisplay extends St.Widget {
_syncWorkspacesActualGeometry() { _syncWorkspacesActualGeometry() {
const primaryView = this._getPrimaryView(); const primaryView = this._getPrimaryView();
if (!primaryView) if (!primaryView || this._inWindowFade)
return; return;
primaryView.ease({ primaryView.ease({

View File

@ -96,9 +96,10 @@ gnome_desktop_dep = dependency('gnome-desktop-3.0', version: gnome_desktop_req)
bt_dep = dependency('gnome-bluetooth-1.0', version: bt_req, required: false) bt_dep = dependency('gnome-bluetooth-1.0', version: bt_req, required: false)
gst_dep = dependency('gstreamer-1.0', version: gst_req, required: false) gst_dep = dependency('gstreamer-1.0', version: gst_req, required: false)
gst_base_dep = dependency('gstreamer-base-1.0', required: false) gst_base_dep = dependency('gstreamer-base-1.0', required: false)
pipewire_dep = dependency('libpipewire-0.3', required: false)
recorder_deps = [] recorder_deps = []
enable_recorder = gst_dep.found() and gst_base_dep.found() enable_recorder = gst_dep.found() and gst_base_dep.found() and pipewire_dep.found()
if enable_recorder if enable_recorder
recorder_deps += [gst_dep, gst_base_dep, gtk_dep, x11_dep] recorder_deps += [gst_dep, gst_base_dep, gtk_dep, x11_dep]
endif endif

315
po/ca.po
View File

@ -10,7 +10,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: HEAD\n" "Project-Id-Version: HEAD\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2020-06-05 23:11+0000\n" "POT-Creation-Date: 2020-07-22 01:49+0000\n"
"PO-Revision-Date: 2020-05-15 20:39+0200\n" "PO-Revision-Date: 2020-05-15 20:39+0200\n"
"Last-Translator: Robert Antoni Buj Gelonch <rbuj@fedoraproject.org>\n" "Last-Translator: Robert Antoni Buj Gelonch <rbuj@fedoraproject.org>\n"
"Language-Team: Catalan <tradgnome@softcatala.org>\n" "Language-Team: Catalan <tradgnome@softcatala.org>\n"
@ -64,8 +64,8 @@ msgid ""
"Allows access to internal debugging and monitoring tools using the Alt-F2 " "Allows access to internal debugging and monitoring tools using the Alt-F2 "
"dialog." "dialog."
msgstr "" msgstr ""
"Permet l'accés a les eines de depuració i de seguiment internes a través del " "Permet l'accés a les eines de depuració i de seguiment internes a través del"
"diàleg de l'Alt+F2." " diàleg de l'Alt+F2."
#: data/org.gnome.shell.gschema.xml.in:16 #: data/org.gnome.shell.gschema.xml.in:16
msgid "UUIDs of extensions to enable" msgid "UUIDs of extensions to enable"
@ -74,9 +74,9 @@ msgstr ""
#: data/org.gnome.shell.gschema.xml.in:17 #: data/org.gnome.shell.gschema.xml.in:17
msgid "" msgid ""
"GNOME Shell extensions have a UUID property; this key lists extensions which " "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 " " 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 " " list. You can also manipulate this list with the EnableExtension and "
"DisableExtension D-Bus methods on org.gnome.Shell." "DisableExtension D-Bus methods on org.gnome.Shell."
msgstr "" msgstr ""
"Les extensions del GNOME Shell tenen un identificador universal. Aquesta " "Les extensions del GNOME Shell tenen un identificador universal. Aquesta "
@ -92,18 +92,19 @@ msgstr ""
#: data/org.gnome.shell.gschema.xml.in:27 #: data/org.gnome.shell.gschema.xml.in:27
msgid "" msgid ""
"GNOME Shell extensions have a UUID property; this key lists extensions which " "GNOME Shell extensions have a UUID property; this key lists extensions which"
"should be disabled, even if loaded as part of the current mode. You can also " " should be disabled, even if loaded as part of the current mode. You can "
"manipulate this list with the EnableExtension and DisableExtension D-Bus " "also manipulate this list with the EnableExtension and DisableExtension "
"methods on org.gnome.Shell. This key takes precedence over the “enabled-" "D-Bus methods on org.gnome.Shell. This key takes precedence over the "
"extensions” setting." "“enabled-extensions” setting."
msgstr "" msgstr ""
"Les extensions del GNOME Shell tenen un identificador universal. Aquesta " "Les extensions del GNOME Shell tenen un identificador universal. Aquesta "
"clau conté una llista de les extensions que s'han de carregar. Qualsevol " "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 " "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 " "aquesta llista amb els mètodes de D-Bus «EnableExtension» (activa una "
"extensió) i «DisableExtension» (desactiva una extensió) a org.gnome.Shell." "extensió) i «DisableExtension» (desactiva una extensió) a "
"Aquesta clau té preferència sobre el paràmetre «enabled-extensions»." "org.gnome.Shell.Aquesta clau té preferència sobre el paràmetre «enabled-"
"extensions»."
#: data/org.gnome.shell.gschema.xml.in:37 #: data/org.gnome.shell.gschema.xml.in:37
msgid "Disable user extensions" msgid "Disable user extensions"
@ -127,20 +128,21 @@ msgid ""
"running version. Enabling this option will disable this check and try to " "running version. Enabling this option will disable this check and try to "
"load all extensions regardless of the versions they claim to support." "load all extensions regardless of the versions they claim to support."
msgstr "" msgstr ""
"El GNOME Shell només carregarà extensions que afirmin ser compatibles amb la " "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ó " " versió en execució. Si s'activa aquesta opció, es desactivarà la "
"i es provarà de carregar totes les extensions sense tenir en compte les " "comprovació i es provarà de carregar totes les extensions sense tenir en "
"versions amb què afirmin ser compatibles." "compte les versions amb què afirmin ser compatibles."
#: data/org.gnome.shell.gschema.xml.in:54 #: data/org.gnome.shell.gschema.xml.in:54
msgid "List of desktop file IDs for favorite applications" msgid "List of desktop file IDs for favorite applications"
msgstr "" msgstr ""
"Llista d'identificadors de fitxers d'escriptori de les aplicacions preferides" "Llista d'identificadors de fitxers d'escriptori de les aplicacions "
"preferides"
#: data/org.gnome.shell.gschema.xml.in:55 #: data/org.gnome.shell.gschema.xml.in:55
msgid "" msgid ""
"The applications corresponding to these identifiers will be displayed in the " "The applications corresponding to these identifiers will be displayed in the"
"favorites area." " favorites area."
msgstr "" msgstr ""
"Es mostraran, a l'àrea de preferits, les aplicacions que corresponguin a " "Es mostraran, a l'àrea de preferits, les aplicacions que corresponguin a "
"aquests identificadors." "aquests identificadors."
@ -158,7 +160,8 @@ msgstr ""
msgid "History for command (Alt-F2) dialog" msgid "History for command (Alt-F2) dialog"
msgstr "Historial de les ordres utilitzades en el diàleg de l'Alt+F2" 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://wiki.gnome.org/Projects/GnomeShell/LookingGlass #. Translators: looking glass is a debugger and inspector tool, see
#. https://wiki.gnome.org/Projects/GnomeShell/LookingGlass
#: data/org.gnome.shell.gschema.xml.in:74 #: data/org.gnome.shell.gschema.xml.in:74
msgid "History for the looking glass dialog" msgid "History for the looking glass dialog"
msgstr "Historial del depurador del GNOME Shell" msgstr "Historial del depurador del GNOME Shell"
@ -169,8 +172,8 @@ msgstr "Mostra sempre l'element de menú «Surt» al menú d'usuari."
#: data/org.gnome.shell.gschema.xml.in:79 #: data/org.gnome.shell.gschema.xml.in:79
msgid "" msgid ""
"This key overrides the automatic hiding of the “Log out” menu item in single-" "This key overrides the automatic hiding of the “Log out” menu item in "
"user, single-session situations." "single-user, single-session situations."
msgstr "" msgstr ""
"Aquesta clau sobreescriu l'ocultació automàtica de l'element de menú «Surt» " "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ó." "quan només hi ha un usuari i un sol tipus de sessió."
@ -179,7 +182,7 @@ msgstr ""
msgid "" msgid ""
"Whether to remember password for mounting encrypted or remote filesystems" "Whether to remember password for mounting encrypted or remote filesystems"
msgstr "" msgstr ""
"Si s'han de recordar les contrasenyes dels punts de muntatge encriptats o " "Si s'han de recordar les contrasenyes dels punts de muntatge xifrat o "
"els sistemes de fitxers remots" "els sistemes de fitxers remots"
#: data/org.gnome.shell.gschema.xml.in:87 #: data/org.gnome.shell.gschema.xml.in:87
@ -190,7 +193,7 @@ msgid ""
"state of the checkbox." "state of the checkbox."
msgstr "" msgstr ""
"El GNOME Shell us demanarà la contrasenya quan es munti un dispositiu " "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 " "xifrat o un sistema de fitxers remot. Si es pot desar la contrasenya per "
"a utilitzar-la en el futur, es mostrarà la casella de selecció «Recorda la " "a utilitzar-la en el futur, es mostrarà la casella de selecció «Recorda la "
"contrasenya». Aquesta clau estableix el valor per defecte d'aquesta casella " "contrasenya». Aquesta clau estableix el valor per defecte d'aquesta casella "
"de selecció." "de selecció."
@ -226,93 +229,110 @@ msgstr ""
"Habilita una API D-BUS que permet la introspecció de l'estat de l'aplicació " "Habilita una API D-BUS que permet la introspecció de l'estat de l'aplicació "
"del Shell." "del Shell."
#: data/org.gnome.shell.gschema.xml.in:119 #: data/org.gnome.shell.gschema.xml.in:114
msgid "Layout of the app picker"
msgstr "Disposició del selector d'aplicacions"
#: data/org.gnome.shell.gschema.xml.in:115
msgid ""
"Layout of the app picker. Each entry in the array is a page. Pages are "
"stored in the order they appear in GNOME Shell. Each page contains an "
"“application id” → 'data' pair. Currently, the following values are stored "
"as 'data': • “position”: the position of the application icon in the page"
msgstr ""
"Disposició del selector d'aplicacions. Cada entrada de la matriu és una "
"pàgina. Les pàgines s'emmagatzemen en l'ordre en què apareixen al GNOME "
"Shell. Cada pàgina conté un «id de l'aplicació» → parell de «dades». "
"Actualment els valors següents s'emmagatzemen com a «dades»: • «posició» la "
"posició de la icona de l'aplicació a la pàgina"
#: data/org.gnome.shell.gschema.xml.in:130
msgid "Keybinding to open the application menu" msgid "Keybinding to open the application menu"
msgstr "Vinculació per a obrir el menú d'aplicació" msgstr "Vinculació per a obrir el menú d'aplicació"
#: data/org.gnome.shell.gschema.xml.in:120 #: data/org.gnome.shell.gschema.xml.in:131
msgid "Keybinding to open the application menu." msgid "Keybinding to open the application menu."
msgstr "La vinculació per a obrir el menú d'aplicació." msgstr "La vinculació per a obrir el menú d'aplicació."
#: data/org.gnome.shell.gschema.xml.in:126 #: data/org.gnome.shell.gschema.xml.in:137
msgid "Keybinding to open the “Show Applications” view" msgid "Keybinding to open the “Show Applications” view"
msgstr "Vinculació de tecles per a obrir la vista «Mostra les aplicacions»" msgstr "Vinculació de tecles per a obrir la vista «Mostra les aplicacions»"
#: data/org.gnome.shell.gschema.xml.in:127 #: data/org.gnome.shell.gschema.xml.in:138
msgid "" msgid ""
"Keybinding to open the “Show Applications” view of the Activities Overview." "Keybinding to open the “Show Applications” view of the Activities Overview."
msgstr "" msgstr ""
"Vinculació de tecles per a obrir la vista «Mostra les aplicacions» de les " "Vinculació de tecles per a obrir la vista «Mostra les aplicacions» de les "
"activitats de la vista general." "activitats de la vista general."
#: data/org.gnome.shell.gschema.xml.in:134 #: data/org.gnome.shell.gschema.xml.in:145
msgid "Keybinding to open the overview" msgid "Keybinding to open the overview"
msgstr "Vinculació per a obrir la vista general" msgstr "Vinculació per a obrir la vista general"
#: data/org.gnome.shell.gschema.xml.in:135 #: data/org.gnome.shell.gschema.xml.in:146
msgid "Keybinding to open the Activities Overview." msgid "Keybinding to open the Activities Overview."
msgstr "Vinculació per a obrir la vista general d'activitats." msgstr "Vinculació per a obrir la vista general d'activitats."
#: data/org.gnome.shell.gschema.xml.in:141 #: data/org.gnome.shell.gschema.xml.in:152
msgid "Keybinding to toggle the visibility of the notification list" msgid "Keybinding to toggle the visibility of the notification list"
msgstr "" msgstr ""
"La vinculació per a commutar la visibilitat de la llista de notificacions" "La vinculació per a commutar la visibilitat de la llista de notificacions"
#: data/org.gnome.shell.gschema.xml.in:142 #: data/org.gnome.shell.gschema.xml.in:153
msgid "Keybinding to toggle the visibility of the notification list." msgid "Keybinding to toggle the visibility of the notification list."
msgstr "" msgstr ""
"La vinculació per a commutar la visibilitat de la llista de notificacions." "La vinculació per a commutar la visibilitat de la llista de notificacions."
#: data/org.gnome.shell.gschema.xml.in:148 #: data/org.gnome.shell.gschema.xml.in:159
msgid "Keybinding to focus the active notification" msgid "Keybinding to focus the active notification"
msgstr "Vinculació per a posar el focus a la notificació activa" msgstr "Vinculació per a posar el focus a la notificació activa"
#: data/org.gnome.shell.gschema.xml.in:149 #: data/org.gnome.shell.gschema.xml.in:160
msgid "Keybinding to focus the active notification." msgid "Keybinding to focus the active notification."
msgstr "Vinculació per a posar el focus a la notificació activa." msgstr "Vinculació per a posar el focus a la notificació activa."
#: data/org.gnome.shell.gschema.xml.in:155 #: data/org.gnome.shell.gschema.xml.in:166
msgid "Switch to application 1" msgid "Switch to application 1"
msgstr "Commuta a l'aplicació 1" msgstr "Commuta a l'aplicació 1"
#: data/org.gnome.shell.gschema.xml.in:159 #: data/org.gnome.shell.gschema.xml.in:170
msgid "Switch to application 2" msgid "Switch to application 2"
msgstr "Commuta a l'aplicació 2" msgstr "Commuta a l'aplicació 2"
#: data/org.gnome.shell.gschema.xml.in:163 #: data/org.gnome.shell.gschema.xml.in:174
msgid "Switch to application 3" msgid "Switch to application 3"
msgstr "Commuta a l'aplicació 3" msgstr "Commuta a l'aplicació 3"
#: data/org.gnome.shell.gschema.xml.in:167 #: data/org.gnome.shell.gschema.xml.in:178
msgid "Switch to application 4" msgid "Switch to application 4"
msgstr "Commuta a l'aplicació 4" msgstr "Commuta a l'aplicació 4"
#: data/org.gnome.shell.gschema.xml.in:171 #: data/org.gnome.shell.gschema.xml.in:182
msgid "Switch to application 5" msgid "Switch to application 5"
msgstr "Commuta a l'aplicació 5" msgstr "Commuta a l'aplicació 5"
#: data/org.gnome.shell.gschema.xml.in:175 #: data/org.gnome.shell.gschema.xml.in:186
msgid "Switch to application 6" msgid "Switch to application 6"
msgstr "Commuta a l'aplicació 6" msgstr "Commuta a l'aplicació 6"
#: data/org.gnome.shell.gschema.xml.in:179 #: data/org.gnome.shell.gschema.xml.in:190
msgid "Switch to application 7" msgid "Switch to application 7"
msgstr "Commuta a l'aplicació 7" msgstr "Commuta a l'aplicació 7"
#: data/org.gnome.shell.gschema.xml.in:183 #: data/org.gnome.shell.gschema.xml.in:194
msgid "Switch to application 8" msgid "Switch to application 8"
msgstr "Commuta a l'aplicació 8" msgstr "Commuta a l'aplicació 8"
#: data/org.gnome.shell.gschema.xml.in:187 #: data/org.gnome.shell.gschema.xml.in:198
msgid "Switch to application 9" msgid "Switch to application 9"
msgstr "Commuta a l'aplicació 9" msgstr "Commuta a l'aplicació 9"
#: data/org.gnome.shell.gschema.xml.in:196 #: data/org.gnome.shell.gschema.xml.in:207
#: data/org.gnome.shell.gschema.xml.in:223 #: data/org.gnome.shell.gschema.xml.in:234
msgid "Limit switcher to current workspace." msgid "Limit switcher to current workspace."
msgstr "Limita el canviador a l'espai de treball actual." msgstr "Limita el canviador a l'espai de treball actual."
#: data/org.gnome.shell.gschema.xml.in:197 #: data/org.gnome.shell.gschema.xml.in:208
msgid "" msgid ""
"If true, only applications that have windows on the current workspace are " "If true, only applications that have windows on the current workspace are "
"shown in the switcher. Otherwise, all applications are included." "shown in the switcher. Otherwise, all applications are included."
@ -321,21 +341,21 @@ msgstr ""
"de treball actual es mostren en el canviador. En cas contrari es mostren " "de treball actual es mostren en el canviador. En cas contrari es mostren "
"totes les aplicacions." "totes les aplicacions."
#: data/org.gnome.shell.gschema.xml.in:214 #: data/org.gnome.shell.gschema.xml.in:225
msgid "The application icon mode." msgid "The application icon mode."
msgstr "El mode d'icona de les aplicacions." msgstr "El mode d'icona de les aplicacions."
#: data/org.gnome.shell.gschema.xml.in:215 #: data/org.gnome.shell.gschema.xml.in:226
msgid "" msgid ""
"Configures how the windows are shown in the switcher. Valid possibilities " "Configures how the windows are shown in the switcher. Valid possibilities "
"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" "are “thumbnail-only” (shows a thumbnail of the window), “app-icon-only” "
"only” (shows only the application icon) or “both”." "(shows only the application icon) or “both”."
msgstr "" msgstr ""
"Configureu com es mostren les finestres en l'intercanviador. Els valors " "Configureu com es mostren les finestres en l'intercanviador. Els valors "
"possibles són: «thumbnail-only» (mostra una miniatura de la finestra), «app-" "possibles són: «thumbnail-only» (mostra una miniatura de la finestra), «app-"
"icon-only» (mostra la icona de l'aplicació) o «both» (ambdues coses)." "icon-only» (mostra la icona de l'aplicació) o «both» (ambdues coses)."
#: data/org.gnome.shell.gschema.xml.in:224 #: data/org.gnome.shell.gschema.xml.in:235
msgid "" msgid ""
"If true, only windows from the current workspace are shown in the switcher. " "If true, only windows from the current workspace are shown in the switcher. "
"Otherwise, all windows are included." "Otherwise, all windows are included."
@ -343,60 +363,60 @@ msgstr ""
"Si és «true» (cert), només les finestres de l'espai de treball actual es " "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." "mostren en el canviador. En cas contrari, es mostren totes les finestres."
#: data/org.gnome.shell.gschema.xml.in:234 #: data/org.gnome.shell.gschema.xml.in:245
msgid "Locations" msgid "Locations"
msgstr "Ubicacions" msgstr "Ubicacions"
#: data/org.gnome.shell.gschema.xml.in:235 #: data/org.gnome.shell.gschema.xml.in:246
msgid "The locations to show in world clocks" msgid "The locations to show in world clocks"
msgstr "Les ubicacions a mostrar en els rellotges del món" msgstr "Les ubicacions a mostrar en els rellotges del món"
#: data/org.gnome.shell.gschema.xml.in:245 #: data/org.gnome.shell.gschema.xml.in:256
msgid "Automatic location" msgid "Automatic location"
msgstr "Ubicació automàtica" msgstr "Ubicació automàtica"
#: data/org.gnome.shell.gschema.xml.in:246 #: data/org.gnome.shell.gschema.xml.in:257
msgid "Whether to fetch the current location or not" msgid "Whether to fetch the current location or not"
msgstr "Si s'ha d'obtenir la ubicació actual o no" msgstr "Si s'ha d'obtenir la ubicació actual o no"
#: data/org.gnome.shell.gschema.xml.in:253 #: data/org.gnome.shell.gschema.xml.in:264
msgid "Location" msgid "Location"
msgstr "Ubicació" msgstr "Ubicació"
#: data/org.gnome.shell.gschema.xml.in:254 #: data/org.gnome.shell.gschema.xml.in:265
msgid "The location for which to show a forecast" msgid "The location for which to show a forecast"
msgstr "La ubicació a mostrar la predicció del temps" msgstr "La ubicació a mostrar la predicció del temps"
#: data/org.gnome.shell.gschema.xml.in:266 #: data/org.gnome.shell.gschema.xml.in:277
msgid "Attach modal dialog to the parent window" msgid "Attach modal dialog to the parent window"
msgstr "Adjunta el diàleg modal a la finestra pare" msgstr "Adjunta el diàleg modal a la finestra pare"
#: data/org.gnome.shell.gschema.xml.in:267 #: data/org.gnome.shell.gschema.xml.in:278
#: data/org.gnome.shell.gschema.xml.in:276 #: data/org.gnome.shell.gschema.xml.in:287
#: data/org.gnome.shell.gschema.xml.in:284 #: data/org.gnome.shell.gschema.xml.in:295
#: data/org.gnome.shell.gschema.xml.in:292 #: data/org.gnome.shell.gschema.xml.in:303
#: data/org.gnome.shell.gschema.xml.in:300 #: data/org.gnome.shell.gschema.xml.in:311
msgid "" msgid ""
"This key overrides the key in org.gnome.mutter when running GNOME Shell." "This key overrides the key in org.gnome.mutter when running GNOME Shell."
msgstr "" msgstr ""
"Si s'executa el GNOME Shell, aquesta clau sobreescriu la clau «org.gnome." "Si s'executa el GNOME Shell, aquesta clau sobreescriu la clau "
"mutter»." "«org.gnome.mutter»."
#: data/org.gnome.shell.gschema.xml.in:275 #: data/org.gnome.shell.gschema.xml.in:286
msgid "Enable edge tiling when dropping windows on screen edges" msgid "Enable edge tiling when dropping windows on screen edges"
msgstr "" msgstr ""
"Habilita el mosaic a les vores en deixar anar les finestres a les vores de " "Habilita el mosaic a les vores en deixar anar les finestres a les vores de "
"la pantalla" "la pantalla"
#: data/org.gnome.shell.gschema.xml.in:283 #: data/org.gnome.shell.gschema.xml.in:294
msgid "Workspaces are managed dynamically" msgid "Workspaces are managed dynamically"
msgstr "Els espais de treball es gestionen dinàmicament" msgstr "Els espais de treball es gestionen dinàmicament"
#: data/org.gnome.shell.gschema.xml.in:291 #: data/org.gnome.shell.gschema.xml.in:302
msgid "Workspaces only on primary monitor" msgid "Workspaces only on primary monitor"
msgstr "Només en el monitor principal hi ha espais de treball" msgstr "Només en el monitor principal hi ha espais de treball"
#: data/org.gnome.shell.gschema.xml.in:299 #: data/org.gnome.shell.gschema.xml.in:310
msgid "Delay focus changes in mouse mode until the pointer stops moving" msgid "Delay focus changes in mouse mode until the pointer stops moving"
msgstr "" msgstr ""
"Retarda el canvi del focus, quan s'està en mode ratolí, fins que el punter " "Retarda el canvi del focus, quan s'està en mode ratolí, fins que el punter "
@ -434,7 +454,7 @@ msgstr "Visiteu la pàgina d'inici de l'extensió"
#: js/gdm/authPrompt.js:135 js/ui/audioDeviceSelection.js:57 #: js/gdm/authPrompt.js:135 js/ui/audioDeviceSelection.js:57
#: js/ui/components/networkAgent.js:110 js/ui/components/polkitAgent.js:139 #: js/ui/components/networkAgent.js:110 js/ui/components/polkitAgent.js:139
#: js/ui/endSessionDialog.js:369 js/ui/extensionDownloader.js:181 #: js/ui/endSessionDialog.js:369 js/ui/extensionDownloader.js:183
#: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386 #: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386
#: js/ui/status/network.js:916 subprojects/extensions-app/js/main.js:149 #: js/ui/status/network.js:916 subprojects/extensions-app/js/main.js:149
msgid "Cancel" msgid "Cancel"
@ -476,7 +496,7 @@ msgstr "Nom d'usuari"
msgid "Login Window" msgid "Login Window"
msgstr "Finestra d'entrada" msgstr "Finestra d'entrada"
#: js/gdm/util.js:345 #: js/gdm/util.js:355
msgid "Authentication error" msgid "Authentication error"
msgstr "Error d'autenticació" msgstr "Error d'autenticació"
@ -485,7 +505,7 @@ msgstr "Error d'autenticació"
#. as a cue to display our own message. #. as a cue to display our own message.
#. Translators: this message is shown below the password entry field #. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead #. to indicate the user can swipe their finger instead
#: js/gdm/util.js:471 #: js/gdm/util.js:481
msgid "(or swipe finger)" msgid "(or swipe finger)"
msgstr "(o passeu el dit)" msgstr "(o passeu el dit)"
@ -495,7 +515,8 @@ msgctxt "search-result"
msgid "Power Off" msgid "Power Off"
msgstr "Apaga" msgstr "Apaga"
#. Translators: A list of keywords that match the power-off action, separated by semicolons #. Translators: A list of keywords that match the power-off action, separated
#. by semicolons
#: js/misc/systemActions.js:96 #: js/misc/systemActions.js:96
msgid "power off;shutdown;reboot;restart;halt;stop" msgid "power off;shutdown;reboot;restart;halt;stop"
msgstr "apaga;atura;reinicia" msgstr "apaga;atura;reinicia"
@ -506,7 +527,8 @@ msgctxt "search-result"
msgid "Lock Screen" msgid "Lock Screen"
msgstr "Bloqueja la pantalla" msgstr "Bloqueja la pantalla"
#. Translators: A list of keywords that match the lock screen action, separated by semicolons #. Translators: A list of keywords that match the lock screen action,
#. separated by semicolons
#: js/misc/systemActions.js:104 #: js/misc/systemActions.js:104
msgid "lock screen" msgid "lock screen"
msgstr "bloca la pantalla" msgstr "bloca la pantalla"
@ -517,7 +539,8 @@ msgctxt "search-result"
msgid "Log Out" msgid "Log Out"
msgstr "Surt" msgstr "Surt"
#. Translators: A list of keywords that match the logout action, separated by semicolons #. Translators: A list of keywords that match the logout action, separated by
#. semicolons
#: js/misc/systemActions.js:112 #: js/misc/systemActions.js:112
msgid "logout;log out;sign off" msgid "logout;log out;sign off"
msgstr "desconnecta;sortida;surt" msgstr "desconnecta;sortida;surt"
@ -528,7 +551,8 @@ msgctxt "search-result"
msgid "Suspend" msgid "Suspend"
msgstr "Atura temporalment" msgstr "Atura temporalment"
#. Translators: A list of keywords that match the suspend action, separated by semicolons #. Translators: A list of keywords that match the suspend action, separated by
#. semicolons
#: js/misc/systemActions.js:120 #: js/misc/systemActions.js:120
msgid "suspend;sleep" msgid "suspend;sleep"
msgstr "atura temporalment;dorm" msgstr "atura temporalment;dorm"
@ -539,12 +563,14 @@ msgctxt "search-result"
msgid "Switch User" msgid "Switch User"
msgstr "Canvia d'usuari" msgstr "Canvia d'usuari"
#. Translators: A list of keywords that match the switch user action, separated by semicolons #. Translators: A list of keywords that match the switch user action,
#. separated by semicolons
#: js/misc/systemActions.js:128 #: js/misc/systemActions.js:128
msgid "switch user" msgid "switch user"
msgstr "canvia d'usuari" msgstr "canvia d'usuari"
#. Translators: A list of keywords that match the lock orientation action, separated by semicolons #. Translators: A list of keywords that match the lock orientation action,
#. separated by semicolons
#: js/misc/systemActions.js:135 #: js/misc/systemActions.js:135
msgid "lock orientation;unlock orientation;screen;rotation" msgid "lock orientation;unlock orientation;screen;rotation"
msgstr "bloqueja l'orientació;desbloqueja l'orientació;pantalla;rotació" msgstr "bloqueja l'orientació;desbloqueja l'orientació;pantalla;rotació"
@ -720,36 +746,36 @@ msgstr "Denega l'accés"
msgid "Grant Access" msgid "Grant Access"
msgstr "Permet l'accés" msgstr "Permet l'accés"
#: js/ui/appDisplay.js:956 #: js/ui/appDisplay.js:1297
msgid "Unnamed Folder" msgid "Unnamed Folder"
msgstr "Carpeta sense nom" msgstr "Carpeta sense nom"
#. Translators: This is the heading of a list of open windows #. Translators: This is the heading of a list of open windows
#: js/ui/appDisplay.js:2215 js/ui/panel.js:75 #: js/ui/appDisplay.js:2767 js/ui/panel.js:75
msgid "Open Windows" msgid "Open Windows"
msgstr "Obre finestres" msgstr "Obre finestres"
#: js/ui/appDisplay.js:2234 js/ui/panel.js:82 #: js/ui/appDisplay.js:2786 js/ui/panel.js:82
msgid "New Window" msgid "New Window"
msgstr "Finestra nova" msgstr "Finestra nova"
#: js/ui/appDisplay.js:2250 #: js/ui/appDisplay.js:2802
msgid "Launch using Integrated Graphics Card" msgid "Launch using Integrated Graphics Card"
msgstr "Inicia usant una targeta gràfica integrada" msgstr "Inicia usant una targeta gràfica integrada"
#: js/ui/appDisplay.js:2251 #: js/ui/appDisplay.js:2803
msgid "Launch using Discrete Graphics Card" msgid "Launch using Discrete Graphics Card"
msgstr "Inicia usant una targeta gràfica discreta" msgstr "Inicia usant una targeta gràfica discreta"
#: js/ui/appDisplay.js:2279 js/ui/dash.js:239 #: js/ui/appDisplay.js:2831 js/ui/dash.js:239
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Suprimeix dels preferits" msgstr "Suprimeix dels preferits"
#: js/ui/appDisplay.js:2285 #: js/ui/appDisplay.js:2837
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Afegeix als preferits" msgstr "Afegeix als preferits"
#: js/ui/appDisplay.js:2295 js/ui/panel.js:93 #: js/ui/appDisplay.js:2847 js/ui/panel.js:93
msgid "Show Details" msgid "Show Details"
msgstr "Mostra els detalls" msgstr "Mostra els detalls"
@ -779,7 +805,7 @@ msgstr "Auriculars"
msgid "Headset" msgid "Headset"
msgstr "Auriculars amb micròfon" msgstr "Auriculars amb micròfon"
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:273 #: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:272
msgid "Microphone" msgid "Microphone"
msgstr "Micròfon" msgstr "Micròfon"
@ -795,7 +821,8 @@ msgstr "Paràmetres de la pantalla"
msgid "Settings" msgid "Settings"
msgstr "Paràmetres" msgstr "Paràmetres"
#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). #. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0"
#. (Sunday) "6" (Saturday) "06" (Sunday and Saturday).
#: js/ui/calendar.js:36 #: js/ui/calendar.js:36
msgctxt "calendar-no-work" msgctxt "calendar-no-work"
msgid "06" msgid "06"
@ -805,7 +832,6 @@ msgstr "06"
#. * #. *
#. * NOTE: These grid abbreviations are always shown together #. * NOTE: These grid abbreviations are always shown together
#. * and in order, e.g. "S M T W T F S". #. * and in order, e.g. "S M T W T F S".
#.
#: js/ui/calendar.js:65 #: js/ui/calendar.js:65
msgctxt "grid sunday" msgctxt "grid sunday"
msgid "S" msgid "S"
@ -852,7 +878,6 @@ msgstr "Ds"
#. * standalone, when this is a month of the current year. #. * standalone, when this is a month of the current year.
#. * "%OB" is the new format specifier introduced in glibc 2.27, #. * "%OB" is the new format specifier introduced in glibc 2.27,
#. * in most cases you should not change it. #. * in most cases you should not change it.
#.
#: js/ui/calendar.js:392 #: js/ui/calendar.js:392
msgid "%OB" msgid "%OB"
msgstr "%OB" msgstr "%OB"
@ -865,7 +890,6 @@ msgstr "%OB"
#. * "%OB" is the new format specifier introduced in glibc 2.27, #. * "%OB" is the new format specifier introduced in glibc 2.27,
#. * in most cases you should not use the old "%B" here unless you #. * in most cases you should not use the old "%B" here unless you
#. * absolutely know what you are doing. #. * absolutely know what you are doing.
#.
#: js/ui/calendar.js:402 #: js/ui/calendar.js:402
msgid "%OB %Y" msgid "%OB %Y"
msgstr "%OB de %Y" msgstr "%OB de %Y"
@ -947,7 +971,8 @@ msgstr "Obre amb %s"
#: js/ui/components/networkAgent.js:92 #: js/ui/components/networkAgent.js:92
msgid "" msgid ""
"Alternatively you can connect by pushing the “WPS” button on your router." "Alternatively you can connect by pushing the “WPS” button on your router."
msgstr "També us podeu connectar prement el botó «WPS» del vostre encaminador." msgstr ""
"També us podeu connectar prement el botó «WPS» del vostre encaminador."
#: js/ui/components/networkAgent.js:104 js/ui/status/network.js:227 #: js/ui/components/networkAgent.js:104 js/ui/status/network.js:227
#: js/ui/status/network.js:318 js/ui/status/network.js:919 #: js/ui/status/network.js:318 js/ui/status/network.js:919
@ -982,7 +1007,7 @@ msgid ""
"“%s”." "“%s”."
msgstr "" msgstr ""
"Per a accedir a la xarxa sense fil «%s» calen les contrasenyes o les claus " "Per a accedir a la xarxa sense fil «%s» calen les contrasenyes o les claus "
"d'encriptació." "de xifratge."
#: js/ui/components/networkAgent.js:318 js/ui/components/networkAgent.js:685 #: js/ui/components/networkAgent.js:318 js/ui/components/networkAgent.js:685
msgid "Wired 802.1X authentication" msgid "Wired 802.1X authentication"
@ -1043,7 +1068,8 @@ msgstr "Autentica"
msgid "Sorry, that didnt work. Please try again." msgid "Sorry, that didnt work. Please try again."
msgstr "No ha funcionat. Torneu-ho a provar." msgstr "No ha funcionat. Torneu-ho a provar."
#. Translators: this is the other person changing their old IM name to their new #. Translators: this is the other person changing their old IM name to their
#. new
#. IM name. #. IM name.
#: js/ui/components/telepathyClient.js:822 #: js/ui/components/telepathyClient.js:822
#, javascript-format #, javascript-format
@ -1068,7 +1094,6 @@ msgstr "Quadre d'aplicacions"
#. * shown - it is shown just below the time in the top bar (e.g., #. * shown - it is shown just below the time in the top bar (e.g.,
#. * "Tue 9:29 AM"). The string itself should become a full date, e.g., #. * "Tue 9:29 AM"). The string itself should become a full date, e.g.,
#. * "February 17 2015". #. * "February 17 2015".
#.
#: js/ui/dateMenu.js:79 #: js/ui/dateMenu.js:79
msgid "%B %-d %Y" msgid "%B %-d %Y"
msgstr "%-d %B de %Y" msgstr "%-d %B de %Y"
@ -1076,18 +1101,19 @@ msgstr "%-d %B de %Y"
#. Translators: This is the accessible name of the date button shown #. Translators: This is the accessible name of the date button shown
#. * below the time in the shell; it should combine the weekday and the #. * below the time in the shell; it should combine the weekday and the
#. * date, e.g. "Tuesday February 17 2015". #. * date, e.g. "Tuesday February 17 2015".
#.
#: js/ui/dateMenu.js:86 #: js/ui/dateMenu.js:86
msgid "%A %B %e %Y" msgid "%A %B %e %Y"
msgstr "%A, %-e %B de %Y" msgstr "%A, %-e %B de %Y"
#. Translators: Shown on calendar heading when selected day occurs on current year #. Translators: Shown on calendar heading when selected day occurs on current
#. year
#: js/ui/dateMenu.js:151 #: js/ui/dateMenu.js:151
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%B %-d" msgid "%B %-d"
msgstr "%-d %B" msgstr "%-d %B"
#. Translators: Shown on calendar heading when selected day occurs on different year #. Translators: Shown on calendar heading when selected day occurs on
#. different year
#: js/ui/dateMenu.js:154 #: js/ui/dateMenu.js:154
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%B %-d %Y" msgid "%B %-d %Y"
@ -1103,7 +1129,6 @@ msgstr "Demà"
#. Translators: Shown in calendar event list for all day events #. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters #. * Keep it short, best if you can use less then 10 characters
#.
#: js/ui/dateMenu.js:180 #: js/ui/dateMenu.js:180
msgctxt "event list time" msgctxt "event list time"
msgid "All Day" msgid "All Day"
@ -1222,7 +1247,8 @@ msgstr "Reinicia i instal·la les actualitzacions"
#: js/ui/endSessionDialog.js:91 #: js/ui/endSessionDialog.js:91
#, javascript-format #, javascript-format
msgid "The system will automatically restart and install updates in %d second." msgid ""
"The system will automatically restart and install updates in %d second."
msgid_plural "" msgid_plural ""
"The system will automatically restart and install updates in %d seconds." "The system will automatically restart and install updates in %d seconds."
msgstr[0] "" msgstr[0] ""
@ -1293,15 +1319,15 @@ msgstr "%s (remot)"
msgid "%s (console)" msgid "%s (console)"
msgstr "%s (consola)" msgstr "%s (consola)"
#: js/ui/extensionDownloader.js:185 #: js/ui/extensionDownloader.js:187
msgid "Install" msgid "Install"
msgstr "Instal·la" msgstr "Instal·la"
#: js/ui/extensionDownloader.js:191 #: js/ui/extensionDownloader.js:193
msgid "Install Extension" msgid "Install Extension"
msgstr "Instal·la l'extensió" msgstr "Instal·la l'extensió"
#: js/ui/extensionDownloader.js:192 #: js/ui/extensionDownloader.js:194
#, javascript-format #, javascript-format
msgid "Download and install “%s” from extensions.gnome.org?" msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "Voleu baixar i instal·lar «%s» d'extensions.gnome.org?" msgstr "Voleu baixar i instal·lar «%s» d'extensions.gnome.org?"
@ -1336,11 +1362,11 @@ msgstr "Una aplicació vol inhabilitar les dreceres"
msgid "You can restore shortcuts by pressing %s." msgid "You can restore shortcuts by pressing %s."
msgstr "Podeu restaurar les dreceres si premeu %s." msgstr "Podeu restaurar les dreceres si premeu %s."
#: js/ui/inhibitShortcutsDialog.js:98 #: js/ui/inhibitShortcutsDialog.js:100
msgid "Deny" msgid "Deny"
msgstr "Denega" msgstr "Denega"
#: js/ui/inhibitShortcutsDialog.js:105 #: js/ui/inhibitShortcutsDialog.js:107
msgid "Allow" msgid "Allow"
msgstr "Permet" msgstr "Permet"
@ -1354,8 +1380,8 @@ msgstr "Tecles lentes inactives"
#: js/ui/kbdA11yDialog.js:34 #: js/ui/kbdA11yDialog.js:34
msgid "" msgid ""
"You just held down the Shift key for 8 seconds. This is the shortcut for the " "You just held down the Shift key for 8 seconds. This is the shortcut for the"
"Slow Keys feature, which affects the way your keyboard works." " Slow Keys feature, which affects the way your keyboard works."
msgstr "" msgstr ""
"Heu mantingut premuda la tecla de majúscules durant 8 segons. Aquesta és la " "Heu mantingut premuda la tecla de majúscules durant 8 segons. Aquesta és la "
"drecera per a la funcionalitat «tecles lentes», que afecta la forma de " "drecera per a la funcionalitat «tecles lentes», que afecta la forma de "
@ -1374,8 +1400,8 @@ msgid ""
"You just pressed the Shift key 5 times in a row. This is the shortcut for " "You just pressed the Shift key 5 times in a row. This is the shortcut for "
"the Sticky Keys feature, which affects the way your keyboard works." "the Sticky Keys feature, which affects the way your keyboard works."
msgstr "" msgstr ""
"Heu premut la tecla de majúscules 5 cops seguides. Aquesta és la drecera per " "Heu premut la tecla de majúscules 5 cops seguides. Aquesta és la drecera per"
"la funcionalitat de les tecles enganxoses, que afecta la manera en què " " la funcionalitat de les tecles enganxoses, que afecta la manera en què "
"funciona el teclat." "funciona el teclat."
#: js/ui/kbdA11yDialog.js:46 #: js/ui/kbdA11yDialog.js:46
@ -1409,7 +1435,7 @@ msgstr "Desactiva"
msgid "Leave Off" msgid "Leave Off"
msgstr "Deixa-ho desactivat" msgstr "Deixa-ho desactivat"
#: js/ui/keyboard.js:207 #: js/ui/keyboard.js:225
msgid "Region & Language Settings" msgid "Region & Language Settings"
msgstr "Configuració de regió i idioma" msgstr "Configuració de regió i idioma"
@ -1471,8 +1497,8 @@ msgid ""
"Running a session as a privileged user should be avoided for security " "Running a session as a privileged user should be avoided for security "
"reasons. If possible, you should log in as a normal user." "reasons. If possible, you should log in as a normal user."
msgstr "" msgstr ""
"Cal evitar iniciar sessions com a usuari privilegiat per raons de seguretat. " "Cal evitar iniciar sessions com a usuari privilegiat per raons de seguretat."
"Si és possible, entreu com a un usuari normal." " Si és possible, entreu com a un usuari normal."
#: js/ui/main.js:337 #: js/ui/main.js:337
msgid "Screen Lock disabled" msgid "Screen Lock disabled"
@ -1482,7 +1508,7 @@ msgstr "La pantalla de bloqueig està inhabilitada"
msgid "Screen Locking requires the GNOME display manager." msgid "Screen Locking requires the GNOME display manager."
msgstr "El bloqueig de pantalla requereix el gestor de pantalla del GNOME." msgstr "El bloqueig de pantalla requereix el gestor de pantalla del GNOME."
#: js/ui/messageTray.js:1547 #: js/ui/messageTray.js:1476
msgid "System Information" msgid "System Information"
msgstr "Informació de l'ordinador" msgstr "Informació de l'ordinador"
@ -1494,13 +1520,13 @@ msgstr "Artista desconegut"
msgid "Unknown title" msgid "Unknown title"
msgstr "Títol desconegut" msgstr "Títol desconegut"
#: js/ui/overview.js:73 #: js/ui/overview.js:74
msgid "Undo" msgid "Undo"
msgstr "Desfés" msgstr "Desfés"
#. Translators: This is the main view to select #. Translators: This is the main view to select
#. activities. See also note for "Activities" string. #. activities. See also note for "Activities" string.
#: js/ui/overview.js:86 #: js/ui/overview.js:87
msgid "Overview" msgid "Overview"
msgstr "Vista general" msgstr "Vista general"
@ -1508,7 +1534,7 @@ msgstr "Vista general"
#. in the search entry when no search is #. in the search entry when no search is
#. active; it should not exceed ~30 #. active; it should not exceed ~30
#. characters. #. characters.
#: js/ui/overview.js:107 #: js/ui/overview.js:108
msgid "Type to search" msgid "Type to search"
msgstr "Teclegeu per a cercar" msgstr "Teclegeu per a cercar"
@ -1599,7 +1625,6 @@ msgstr "El GNOME necessita bloquejar la pantalla"
#. screenshield. The user is probably very upset at this #. screenshield. The user is probably very upset at this
#. point, but any application using global grabs is broken #. point, but any application using global grabs is broken
#. Just tell him to stop using this app #. Just tell him to stop using this app
#.
#. XXX: another option is to kick the user into the gdm login #. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs #. screen, where we're not affected by grabs
#: js/ui/screenShield.js:244 js/ui/screenShield.js:602 #: js/ui/screenShield.js:244 js/ui/screenShield.js:602
@ -1841,14 +1866,15 @@ msgstr "<desconegut>"
msgid "%s Off" msgid "%s Off"
msgstr "%s apagat" msgstr "%s apagat"
# N.T.: p. ex. Connectat amb fil
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
# N.T.: p. ex. Connectat amb fil
#: js/ui/status/network.js:427 #: js/ui/status/network.js:427
#, javascript-format #, javascript-format
msgid "%s Connected" msgid "%s Connected"
msgstr "Connectat %s" msgstr "Connectat %s"
#. Translators: this is for network devices that are physically present but are not #. Translators: this is for network devices that are physically present but
#. are not
#. under NetworkManager's control (and thus cannot be used in the menu); #. under NetworkManager's control (and thus cannot be used in the menu);
#. %s is a network identifier #. %s is a network identifier
#: js/ui/status/network.js:432 #: js/ui/status/network.js:432
@ -1868,20 +1894,23 @@ msgstr "%s s'està desconnectant"
msgid "%s Connecting" msgid "%s Connecting"
msgstr "%s s'està connectant" msgstr "%s s'està connectant"
#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier #. Translators: this is for network connections that require some kind of key
#. or password; %s is a network identifier
#: js/ui/status/network.js:445 #: js/ui/status/network.js:445
#, javascript-format #, javascript-format
msgid "%s Requires Authentication" msgid "%s Requires Authentication"
msgstr "%s requereix autenticació" msgstr "%s requereix autenticació"
#. Translators: this is for devices that require some kind of firmware or kernel #. Translators: this is for devices that require some kind of firmware or
#. kernel
#. module, which is missing; %s is a network identifier #. module, which is missing; %s is a network identifier
#: js/ui/status/network.js:453 #: js/ui/status/network.js:453
#, javascript-format #, javascript-format
msgid "Firmware Missing For %s" msgid "Firmware Missing For %s"
msgstr "Manca el microprogramari per %s" msgstr "Manca el microprogramari per %s"
#. Translators: this is for a network device that cannot be activated (for example it #. Translators: this is for a network device that cannot be activated (for
#. example it
#. is disabled by rfkill, or it has no coverage; %s is a network identifier #. is disabled by rfkill, or it has no coverage; %s is a network identifier
#: js/ui/status/network.js:457 #: js/ui/status/network.js:457
#, javascript-format #, javascript-format
@ -1984,7 +2013,8 @@ msgstr "%s no està connectat"
msgid "connecting…" msgid "connecting…"
msgstr "s'està connectant..." msgstr "s'està connectant..."
#. Translators: this is for network connections that require some kind of key or password #. Translators: this is for network connections that require some kind of key
#. or password
#: js/ui/status/network.js:1423 #: js/ui/status/network.js:1423
msgid "authentication required" msgid "authentication required"
msgstr "cal autenticació" msgstr "cal autenticació"
@ -2164,38 +2194,34 @@ msgstr "S'ha produït un error d'autorització a Thunderbolt"
msgid "Could not authorize the Thunderbolt device: %s" msgid "Could not authorize the Thunderbolt device: %s"
msgstr "No s'ha pogut autoritzar el dispositiu Thunderbolt: %s" msgstr "No s'ha pogut autoritzar el dispositiu Thunderbolt: %s"
#: js/ui/status/volume.js:154 #: js/ui/status/volume.js:155
msgid "Volume changed" msgid "Volume changed"
msgstr "S'ha canviat el volum" msgstr "S'ha canviat el volum"
#: js/ui/status/volume.js:225 #: js/ui/status/volume.js:217
msgid "Volume" msgid "Volume"
msgstr "Volum" msgstr "Volum"
#. Translators: this is for display mirroring i.e. cloning. #. Translators: this is for display mirroring i.e. cloning.
#. * Try to keep it under around 15 characters. #. * Try to keep it under around 15 characters.
#.
#: js/ui/switchMonitor.js:17 #: js/ui/switchMonitor.js:17
msgid "Mirror" msgid "Mirror"
msgstr "Mirall" msgstr "Mirall"
#. Translators: this is for the desktop spanning displays. #. Translators: this is for the desktop spanning displays.
#. * Try to keep it under around 15 characters. #. * Try to keep it under around 15 characters.
#.
#: js/ui/switchMonitor.js:22 #: js/ui/switchMonitor.js:22
msgid "Join Displays" msgid "Join Displays"
msgstr "Uneix pantalles" msgstr "Uneix pantalles"
#. Translators: this is for using only an external display. #. Translators: this is for using only an external display.
#. * Try to keep it under around 15 characters. #. * Try to keep it under around 15 characters.
#.
#: js/ui/switchMonitor.js:27 #: js/ui/switchMonitor.js:27
msgid "External Only" msgid "External Only"
msgstr "Només extern" msgstr "Només extern"
#. Translators: this is for using only the laptop display. #. Translators: this is for using only the laptop display.
#. * Try to keep it under around 15 characters. #. * Try to keep it under around 15 characters.
#.
#: js/ui/switchMonitor.js:32 #: js/ui/switchMonitor.js:32
msgid "Built-in Only" msgid "Built-in Only"
msgstr "Només l'integrat" msgstr "Només l'integrat"
@ -2214,11 +2240,11 @@ msgstr "Llisqueu amunt per a desbloquejar"
msgid "Click or press a key to unlock" msgid "Click or press a key to unlock"
msgstr "Feu clic o premeu una tecla per a desbloquejar" msgstr "Feu clic o premeu una tecla per a desbloquejar"
#: js/ui/unlockDialog.js:550 #: js/ui/unlockDialog.js:555
msgid "Unlock Window" msgid "Unlock Window"
msgstr "Desbloqueja la finestra" msgstr "Desbloqueja la finestra"
#: js/ui/unlockDialog.js:559 #: js/ui/unlockDialog.js:564
msgid "Log in as another user" msgid "Log in as another user"
msgstr "Entra amb un altre usuari" msgstr "Entra amb un altre usuari"
@ -2242,7 +2268,6 @@ msgstr "Mantenir aquesta configuració de la pantalla?"
#. Translators: this and the following message should be limited in length, #. Translators: this and the following message should be limited in length,
#. to avoid ellipsizing the labels. #. to avoid ellipsizing the labels.
#.
#: js/ui/windowManager.js:64 #: js/ui/windowManager.js:64
msgid "Revert Settings" msgid "Revert Settings"
msgstr "Descarta els canvis" msgstr "Descarta els canvis"
@ -2353,12 +2378,12 @@ msgstr "Utilitza un mode específic, p. ex. «gdm» per la pantalla d'entrada"
msgid "List possible modes" msgid "List possible modes"
msgstr "Llista els modes possibles" msgstr "Llista els modes possibles"
#: src/shell-app.c:286 #: src/shell-app.c:268
msgctxt "program" msgctxt "program"
msgid "Unknown" msgid "Unknown"
msgstr "Desconegut" msgstr "Desconegut"
#: src/shell-app.c:537 #: src/shell-app.c:519
#, c-format #, c-format
msgid "Failed to launch “%s”" msgid "Failed to launch “%s”"
msgstr "No s'ha pogut iniciar «%s»" msgstr "No s'ha pogut iniciar «%s»"
@ -2414,8 +2439,8 @@ msgid ""
"If you remove the extension, you need to return to download it if you want " "If you remove the extension, you need to return to download it if you want "
"to enable it again" "to enable it again"
msgstr "" msgstr ""
"Si suprimiu una extensió, us cal tornar-la a baixar si voleu habilitar-la de " "Si suprimiu una extensió, us cal tornar-la a baixar si voleu habilitar-la de"
"nou" " nou"
#: subprojects/extensions-app/js/main.js:150 #: subprojects/extensions-app/js/main.js:150
msgid "Remove" msgid "Remove"
@ -2477,11 +2502,11 @@ msgstr "Quant a les extensions"
#: subprojects/extensions-app/data/ui/extensions-window.ui:27 #: subprojects/extensions-app/data/ui/extensions-window.ui:27
msgid "" msgid ""
"To find and add extensions, visit <a href=\"https://extensions.gnome.org" "To find and add extensions, visit <a "
"\">extensions.gnome.org</a>." "href=\"https://extensions.gnome.org\">extensions.gnome.org</a>."
msgstr "" msgstr ""
"Per a visitar i afegir extensions, visiteu <a href=\"https://extensions." "Per a visitar i afegir extensions, visiteu <a "
"gnome.org\">extensions.gnome.org</a>." "href=\"https://extensions.gnome.org\">extensions.gnome.org</a>."
#: subprojects/extensions-app/data/ui/extensions-window.ui:35 #: subprojects/extensions-app/data/ui/extensions-window.ui:35
msgid "Warning" msgid "Warning"
@ -2514,8 +2539,8 @@ msgid ""
"Were very sorry, but it was not possible to get the list of installed " "Were very sorry, but it was not possible to get the list of installed "
"extensions. Make sure you are logged into GNOME and try again." "extensions. Make sure you are logged into GNOME and try again."
msgstr "" msgstr ""
"No s'ha pogut obtenir la llista d'extensions instal·lades. Assegureu-vos que " "No s'ha pogut obtenir la llista d'extensions instal·lades. Assegureu-vos que"
"heu entrat al GNOME i torneu a provar-ho." " heu entrat al GNOME i torneu a provar-ho."
#: subprojects/extensions-app/data/ui/extensions-window.ui:273 #: subprojects/extensions-app/data/ui/extensions-window.ui:273
msgid "Extension Updates Ready" msgid "Extension Updates Ready"
@ -2557,8 +2582,7 @@ msgstr ""
#: subprojects/extensions-tool/src/command-create.c:339 #: subprojects/extensions-tool/src/command-create.c:339
msgid "" msgid ""
"UUID is a globally-unique identifier for your extension.\n" "UUID is a globally-unique identifier for your extension.\n"
"This should be in the format of an email address (clicktofocus@janedoe." "This should be in the format of an email address (clicktofocus@janedoe.example.com)\n"
"example.com)\n"
msgstr "" msgstr ""
"L'UUID és un identificador únic global per l'extensió\n" "L'UUID és un identificador únic global per l'extensió\n"
"Ha de tenir el format d'una adreça de correu (exemple@softcatala.org)\n" "Ha de tenir el format d'una adreça de correu (exemple@softcatala.org)\n"
@ -2933,4 +2957,3 @@ msgstr[1] "%u entrades"
#: subprojects/gvc/gvc-mixer-control.c:2766 #: subprojects/gvc/gvc-mixer-control.c:2766
msgid "System Sounds" msgid "System Sounds"
msgstr "Sons del sistema" msgstr "Sons del sistema"

742
po/de.po

File diff suppressed because it is too large Load Diff

1118
po/el.po

File diff suppressed because it is too large Load Diff

161
po/es.po
View File

@ -9,8 +9,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell.master\n" "Project-Id-Version: gnome-shell.master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2020-06-05 23:11+0000\n" "POT-Creation-Date: 2020-07-27 06:59+0000\n"
"PO-Revision-Date: 2020-06-08 16:06+0200\n" "PO-Revision-Date: 2020-07-29 09:47+0200\n"
"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n" "Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
"Language-Team: Spanish - Spain <gnome-es-list@gnome.org>\n" "Language-Team: Spanish - Spain <gnome-es-list@gnome.org>\n"
"Language: es_ES\n" "Language: es_ES\n"
@ -221,95 +221,112 @@ msgstr ""
"Activa una API de D-Bus que permite la introspección del estado de la " "Activa una API de D-Bus que permite la introspección del estado de la "
"aplicación de la shell." "aplicación de la shell."
#: data/org.gnome.shell.gschema.xml.in:119 #: data/org.gnome.shell.gschema.xml.in:114
msgid "Layout of the app picker"
msgstr "Distribución del selector de aplicaciones"
#: data/org.gnome.shell.gschema.xml.in:115
msgid ""
"Layout of the app picker. Each entry in the array is a page. Pages are "
"stored in the order they appear in GNOME Shell. Each page contains an "
"“application id” → 'data' pair. Currently, the following values are stored "
"as 'data': • “position”: the position of the application icon in the page"
msgstr ""
"Distribución del selector de aplicaciones Cada entrada en el vector es una "
"página. Las páginas se guardan en el orden en que aparecen en GNOME Shell. "
"Cada página contiene una pareja “application id” → 'data'. Actualmente se "
"guardan los siguientes valores como 'data': • “position”:la posición del "
"icono de la aplicación en la página"
#: data/org.gnome.shell.gschema.xml.in:130
msgid "Keybinding to open the application menu" msgid "Keybinding to open the application menu"
msgstr "Asociación de teclas para abrir el menú de la aplicación" msgstr "Asociación de teclas para abrir el menú de la aplicación"
#: data/org.gnome.shell.gschema.xml.in:120 #: data/org.gnome.shell.gschema.xml.in:131
msgid "Keybinding to open the application menu." msgid "Keybinding to open the application menu."
msgstr "Asociación de teclas para abrir el menú de la aplicación." msgstr "Asociación de teclas para abrir el menú de la aplicación."
#: data/org.gnome.shell.gschema.xml.in:126 #: data/org.gnome.shell.gschema.xml.in:137
msgid "Keybinding to open the “Show Applications” view" msgid "Keybinding to open the “Show Applications” view"
msgstr "Asociación de teclas para la vista «Mostrar aplicaciones»" msgstr "Asociación de teclas para la vista «Mostrar aplicaciones»"
#: data/org.gnome.shell.gschema.xml.in:127 #: data/org.gnome.shell.gschema.xml.in:138
msgid "" msgid ""
"Keybinding to open the “Show Applications” view of the Activities Overview." "Keybinding to open the “Show Applications” view of the Activities Overview."
msgstr "" msgstr ""
"Asociación de teclas para abrir la vista «Mostrar aplicaciones» de la vista " "Asociación de teclas para abrir la vista «Mostrar aplicaciones» de la vista "
"de actividades." "de actividades."
#: data/org.gnome.shell.gschema.xml.in:134 #: data/org.gnome.shell.gschema.xml.in:145
msgid "Keybinding to open the overview" msgid "Keybinding to open the overview"
msgstr "Asociación de teclas para la vista general" msgstr "Asociación de teclas para la vista general"
#: data/org.gnome.shell.gschema.xml.in:135 #: data/org.gnome.shell.gschema.xml.in:146
msgid "Keybinding to open the Activities Overview." msgid "Keybinding to open the Activities Overview."
msgstr "Asociación de teclas para abrir la Vista de actividades." msgstr "Asociación de teclas para abrir la Vista de actividades."
#: data/org.gnome.shell.gschema.xml.in:141 #: data/org.gnome.shell.gschema.xml.in:152
msgid "Keybinding to toggle the visibility of the notification list" msgid "Keybinding to toggle the visibility of the notification list"
msgstr "" msgstr ""
"Asociación de teclas para cambiar la visibilidad de la lista de " "Asociación de teclas para cambiar la visibilidad de la lista de "
"notificaciones" "notificaciones"
#: data/org.gnome.shell.gschema.xml.in:142 #: data/org.gnome.shell.gschema.xml.in:153
msgid "Keybinding to toggle the visibility of the notification list." msgid "Keybinding to toggle the visibility of the notification list."
msgstr "" msgstr ""
"Asociación de teclas para cambiar la visibilidad de la lista de " "Asociación de teclas para cambiar la visibilidad de la lista de "
"notificaciones." "notificaciones."
#: data/org.gnome.shell.gschema.xml.in:148 #: data/org.gnome.shell.gschema.xml.in:159
msgid "Keybinding to focus the active notification" msgid "Keybinding to focus the active notification"
msgstr "Asociación de teclas para dar el foco a la notificación activa" msgstr "Asociación de teclas para dar el foco a la notificación activa"
#: data/org.gnome.shell.gschema.xml.in:149 #: data/org.gnome.shell.gschema.xml.in:160
msgid "Keybinding to focus the active notification." msgid "Keybinding to focus the active notification."
msgstr "Asociación de teclas para dar el foco a la notificación activa." msgstr "Asociación de teclas para dar el foco a la notificación activa."
#: data/org.gnome.shell.gschema.xml.in:155 #: data/org.gnome.shell.gschema.xml.in:166
msgid "Switch to application 1" msgid "Switch to application 1"
msgstr "Cambiar a la aplicación 1" msgstr "Cambiar a la aplicación 1"
#: data/org.gnome.shell.gschema.xml.in:159 #: data/org.gnome.shell.gschema.xml.in:170
msgid "Switch to application 2" msgid "Switch to application 2"
msgstr "Cambiar a la aplicación 2" msgstr "Cambiar a la aplicación 2"
#: data/org.gnome.shell.gschema.xml.in:163 #: data/org.gnome.shell.gschema.xml.in:174
msgid "Switch to application 3" msgid "Switch to application 3"
msgstr "Cambiar a la aplicación 3" msgstr "Cambiar a la aplicación 3"
#: data/org.gnome.shell.gschema.xml.in:167 #: data/org.gnome.shell.gschema.xml.in:178
msgid "Switch to application 4" msgid "Switch to application 4"
msgstr "Cambiar a la aplicación 4" msgstr "Cambiar a la aplicación 4"
#: data/org.gnome.shell.gschema.xml.in:171 #: data/org.gnome.shell.gschema.xml.in:182
msgid "Switch to application 5" msgid "Switch to application 5"
msgstr "Cambiar a la aplicación 5" msgstr "Cambiar a la aplicación 5"
#: data/org.gnome.shell.gschema.xml.in:175 #: data/org.gnome.shell.gschema.xml.in:186
msgid "Switch to application 6" msgid "Switch to application 6"
msgstr "Cambiar a la aplicación 6" msgstr "Cambiar a la aplicación 6"
#: data/org.gnome.shell.gschema.xml.in:179 #: data/org.gnome.shell.gschema.xml.in:190
msgid "Switch to application 7" msgid "Switch to application 7"
msgstr "Cambiar a la aplicación 7" msgstr "Cambiar a la aplicación 7"
#: data/org.gnome.shell.gschema.xml.in:183 #: data/org.gnome.shell.gschema.xml.in:194
msgid "Switch to application 8" msgid "Switch to application 8"
msgstr "Cambiar a la aplicación 8" msgstr "Cambiar a la aplicación 8"
#: data/org.gnome.shell.gschema.xml.in:187 #: data/org.gnome.shell.gschema.xml.in:198
msgid "Switch to application 9" msgid "Switch to application 9"
msgstr "Cambiar a la aplicación 9" msgstr "Cambiar a la aplicación 9"
#: data/org.gnome.shell.gschema.xml.in:196 #: data/org.gnome.shell.gschema.xml.in:207
#: data/org.gnome.shell.gschema.xml.in:223 #: data/org.gnome.shell.gschema.xml.in:234
msgid "Limit switcher to current workspace." msgid "Limit switcher to current workspace."
msgstr "Limitar el intercambiador al área de trabajo actual." msgstr "Limitar el intercambiador al área de trabajo actual."
#: data/org.gnome.shell.gschema.xml.in:197 #: data/org.gnome.shell.gschema.xml.in:208
msgid "" msgid ""
"If true, only applications that have windows on the current workspace are " "If true, only applications that have windows on the current workspace are "
"shown in the switcher. Otherwise, all applications are included." "shown in the switcher. Otherwise, all applications are included."
@ -318,11 +335,11 @@ msgstr ""
"trabajo actual se muestran en el selector. Si no, se incluyen todas las " "trabajo actual se muestran en el selector. Si no, se incluyen todas las "
"aplicaciones." "aplicaciones."
#: data/org.gnome.shell.gschema.xml.in:214 #: data/org.gnome.shell.gschema.xml.in:225
msgid "The application icon mode." msgid "The application icon mode."
msgstr "El modo de icono de la aplicación." msgstr "El modo de icono de la aplicación."
#: data/org.gnome.shell.gschema.xml.in:215 #: data/org.gnome.shell.gschema.xml.in:226
msgid "" msgid ""
"Configures how the windows are shown in the switcher. Valid possibilities " "Configures how the windows are shown in the switcher. Valid possibilities "
"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" "are “thumbnail-only” (shows a thumbnail of the window), “app-icon-"
@ -332,7 +349,7 @@ msgstr ""
"son «thumbnail-only» (muestra una miniatura de la ventana), «app-icon-" "son «thumbnail-only» (muestra una miniatura de la ventana), «app-icon-"
"only» (sólo muestra el icono de la aplicación) «both»." "only» (sólo muestra el icono de la aplicación) «both»."
#: data/org.gnome.shell.gschema.xml.in:224 #: data/org.gnome.shell.gschema.xml.in:235
msgid "" msgid ""
"If true, only windows from the current workspace are shown in the switcher. " "If true, only windows from the current workspace are shown in the switcher. "
"Otherwise, all windows are included." "Otherwise, all windows are included."
@ -340,59 +357,59 @@ msgstr ""
"Si es cierto, sólo se muestran en el selector las ventanas del área de " "Si es cierto, sólo se muestran en el selector las ventanas del área de "
"trabajo actual. Si no, se incluyen todas las ventanas." "trabajo actual. Si no, se incluyen todas las ventanas."
#: data/org.gnome.shell.gschema.xml.in:234 #: data/org.gnome.shell.gschema.xml.in:245
msgid "Locations" msgid "Locations"
msgstr "Ubicaciones" msgstr "Ubicaciones"
#: data/org.gnome.shell.gschema.xml.in:235 #: data/org.gnome.shell.gschema.xml.in:246
msgid "The locations to show in world clocks" msgid "The locations to show in world clocks"
msgstr "Las ubicaciones que mostrar en los relojes del mundo" msgstr "Las ubicaciones que mostrar en los relojes del mundo"
#: data/org.gnome.shell.gschema.xml.in:245 #: data/org.gnome.shell.gschema.xml.in:256
msgid "Automatic location" msgid "Automatic location"
msgstr "Ubicación automática" msgstr "Ubicación automática"
#: data/org.gnome.shell.gschema.xml.in:246 #: data/org.gnome.shell.gschema.xml.in:257
msgid "Whether to fetch the current location or not" msgid "Whether to fetch the current location or not"
msgstr "Indica si se debe o no obtener la ubicación actual" msgstr "Indica si se debe o no obtener la ubicación actual"
#: data/org.gnome.shell.gschema.xml.in:253 #: data/org.gnome.shell.gschema.xml.in:264
msgid "Location" msgid "Location"
msgstr "Ubicación" msgstr "Ubicación"
#: data/org.gnome.shell.gschema.xml.in:254 #: data/org.gnome.shell.gschema.xml.in:265
msgid "The location for which to show a forecast" msgid "The location for which to show a forecast"
msgstr "La ubicación para la que mostrar la predicción" msgstr "La ubicación para la que mostrar la predicción"
#: data/org.gnome.shell.gschema.xml.in:266 #: data/org.gnome.shell.gschema.xml.in:277
msgid "Attach modal dialog to the parent window" msgid "Attach modal dialog to the parent window"
msgstr "Acoplar un diálogo modal a la ventana padre" msgstr "Acoplar un diálogo modal a la ventana padre"
#: data/org.gnome.shell.gschema.xml.in:267 #: data/org.gnome.shell.gschema.xml.in:278
#: data/org.gnome.shell.gschema.xml.in:276 #: data/org.gnome.shell.gschema.xml.in:287
#: data/org.gnome.shell.gschema.xml.in:284 #: data/org.gnome.shell.gschema.xml.in:295
#: data/org.gnome.shell.gschema.xml.in:292 #: data/org.gnome.shell.gschema.xml.in:303
#: data/org.gnome.shell.gschema.xml.in:300 #: data/org.gnome.shell.gschema.xml.in:311
msgid "" msgid ""
"This key overrides the key in org.gnome.mutter when running GNOME Shell." "This key overrides the key in org.gnome.mutter when running GNOME Shell."
msgstr "" msgstr ""
"Esta clave sobrescribe la clave en org.gnome.mutter al ejecutar GNOME Shell." "Esta clave sobrescribe la clave en org.gnome.mutter al ejecutar GNOME Shell."
#: data/org.gnome.shell.gschema.xml.in:275 #: data/org.gnome.shell.gschema.xml.in:286
msgid "Enable edge tiling when dropping windows on screen edges" msgid "Enable edge tiling when dropping windows on screen edges"
msgstr "" msgstr ""
"Activar el mosaico en los bordes al arrastrar ventanas a los bordes de la " "Activar el mosaico en los bordes al arrastrar ventanas a los bordes de la "
"ventana" "ventana"
#: data/org.gnome.shell.gschema.xml.in:283 #: data/org.gnome.shell.gschema.xml.in:294
msgid "Workspaces are managed dynamically" msgid "Workspaces are managed dynamically"
msgstr "Las áreas de trabajo se gestionan dinámicamente" msgstr "Las áreas de trabajo se gestionan dinámicamente"
#: data/org.gnome.shell.gschema.xml.in:291 #: data/org.gnome.shell.gschema.xml.in:302
msgid "Workspaces only on primary monitor" msgid "Workspaces only on primary monitor"
msgstr "Áreas de trabajo solo en la pantalla principal" msgstr "Áreas de trabajo solo en la pantalla principal"
#: data/org.gnome.shell.gschema.xml.in:299 #: data/org.gnome.shell.gschema.xml.in:310
msgid "Delay focus changes in mouse mode until the pointer stops moving" msgid "Delay focus changes in mouse mode until the pointer stops moving"
msgstr "" msgstr ""
"Retardo al cambiar el foco del ratón hasta que el puntero deja de moverse" "Retardo al cambiar el foco del ratón hasta que el puntero deja de moverse"
@ -429,7 +446,7 @@ msgstr "Visitar la página web de la extensión"
#: js/gdm/authPrompt.js:135 js/ui/audioDeviceSelection.js:57 #: js/gdm/authPrompt.js:135 js/ui/audioDeviceSelection.js:57
#: js/ui/components/networkAgent.js:110 js/ui/components/polkitAgent.js:139 #: js/ui/components/networkAgent.js:110 js/ui/components/polkitAgent.js:139
#: js/ui/endSessionDialog.js:369 js/ui/extensionDownloader.js:181 #: js/ui/endSessionDialog.js:369 js/ui/extensionDownloader.js:183
#: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386 #: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386
#: js/ui/status/network.js:916 subprojects/extensions-app/js/main.js:149 #: js/ui/status/network.js:916 subprojects/extensions-app/js/main.js:149
msgid "Cancel" msgid "Cancel"
@ -471,7 +488,7 @@ msgstr "Nombre de usuario"
msgid "Login Window" msgid "Login Window"
msgstr "Ventana de inicio de sesión" msgstr "Ventana de inicio de sesión"
#: js/gdm/util.js:345 #: js/gdm/util.js:355
msgid "Authentication error" msgid "Authentication error"
msgstr "Error de autenticación" msgstr "Error de autenticación"
@ -480,7 +497,7 @@ msgstr "Error de autenticación"
#. as a cue to display our own message. #. as a cue to display our own message.
#. Translators: this message is shown below the password entry field #. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead #. to indicate the user can swipe their finger instead
#: js/gdm/util.js:471 #: js/gdm/util.js:481
msgid "(or swipe finger)" msgid "(or swipe finger)"
msgstr "(o pase el dedo)" msgstr "(o pase el dedo)"
@ -714,36 +731,36 @@ msgstr "Denegar acceso"
msgid "Grant Access" msgid "Grant Access"
msgstr "Conceder acceso" msgstr "Conceder acceso"
#: js/ui/appDisplay.js:956 #: js/ui/appDisplay.js:1297
msgid "Unnamed Folder" msgid "Unnamed Folder"
msgstr "Carpeta sin nombre" msgstr "Carpeta sin nombre"
#. Translators: This is the heading of a list of open windows #. Translators: This is the heading of a list of open windows
#: js/ui/appDisplay.js:2215 js/ui/panel.js:75 #: js/ui/appDisplay.js:2767 js/ui/panel.js:75
msgid "Open Windows" msgid "Open Windows"
msgstr "Ventanas abiertas" msgstr "Ventanas abiertas"
#: js/ui/appDisplay.js:2234 js/ui/panel.js:82 #: js/ui/appDisplay.js:2786 js/ui/panel.js:82
msgid "New Window" msgid "New Window"
msgstr "Ventana nueva" msgstr "Ventana nueva"
#: js/ui/appDisplay.js:2250 #: js/ui/appDisplay.js:2802
msgid "Launch using Integrated Graphics Card" msgid "Launch using Integrated Graphics Card"
msgstr "Lanzar usando la tarjeta gráfica integrada" msgstr "Lanzar usando la tarjeta gráfica integrada"
#: js/ui/appDisplay.js:2251 #: js/ui/appDisplay.js:2803
msgid "Launch using Discrete Graphics Card" msgid "Launch using Discrete Graphics Card"
msgstr "Lanzar usando la tarjeta gráfica discreta" msgstr "Lanzar usando la tarjeta gráfica discreta"
#: js/ui/appDisplay.js:2279 js/ui/dash.js:239 #: js/ui/appDisplay.js:2831 js/ui/dash.js:239
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Quitar de los favoritos" msgstr "Quitar de los favoritos"
#: js/ui/appDisplay.js:2285 #: js/ui/appDisplay.js:2837
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Añadir a los favoritos" msgstr "Añadir a los favoritos"
#: js/ui/appDisplay.js:2295 js/ui/panel.js:93 #: js/ui/appDisplay.js:2847 js/ui/panel.js:93
msgid "Show Details" msgid "Show Details"
msgstr "Mostrar detalles" msgstr "Mostrar detalles"
@ -773,7 +790,7 @@ msgstr "Auriculares"
msgid "Headset" msgid "Headset"
msgstr "Manos libres" msgstr "Manos libres"
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:273 #: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:272
msgid "Microphone" msgid "Microphone"
msgstr "Micrófono" msgstr "Micrófono"
@ -1077,14 +1094,12 @@ msgstr "%A %e de %B de %Y"
#. Translators: Shown on calendar heading when selected day occurs on current year #. Translators: Shown on calendar heading when selected day occurs on current year
#: js/ui/dateMenu.js:151 #: js/ui/dateMenu.js:151
#| msgid "%B %-d %Y"
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%B %-d" msgid "%B %-d"
msgstr "%B %-d" msgstr "%B %-d"
#. Translators: Shown on calendar heading when selected day occurs on different year #. Translators: Shown on calendar heading when selected day occurs on different year
#: js/ui/dateMenu.js:154 #: js/ui/dateMenu.js:154
#| msgid "%B %-d %Y"
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%B %-d %Y" msgid "%B %-d %Y"
msgstr "%B %-d %Y" msgstr "%B %-d %Y"
@ -1286,15 +1301,15 @@ msgstr "%s (remoto)"
msgid "%s (console)" msgid "%s (console)"
msgstr "%s (consola)" msgstr "%s (consola)"
#: js/ui/extensionDownloader.js:185 #: js/ui/extensionDownloader.js:187
msgid "Install" msgid "Install"
msgstr "Instalar" msgstr "Instalar"
#: js/ui/extensionDownloader.js:191 #: js/ui/extensionDownloader.js:193
msgid "Install Extension" msgid "Install Extension"
msgstr "Instalar extensión" msgstr "Instalar extensión"
#: js/ui/extensionDownloader.js:192 #: js/ui/extensionDownloader.js:194
#, javascript-format #, javascript-format
msgid "Download and install “%s” from extensions.gnome.org?" msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "¿Descargar e instalar «%s» desde extensions.gnome.org?" msgstr "¿Descargar e instalar «%s» desde extensions.gnome.org?"
@ -1327,11 +1342,11 @@ msgstr "Una aplicación quiere inhibir los atajos"
msgid "You can restore shortcuts by pressing %s." msgid "You can restore shortcuts by pressing %s."
msgstr "Puede restaurar los atajos pulsando %s." msgstr "Puede restaurar los atajos pulsando %s."
#: js/ui/inhibitShortcutsDialog.js:98 #: js/ui/inhibitShortcutsDialog.js:100
msgid "Deny" msgid "Deny"
msgstr "Denegar" msgstr "Denegar"
#: js/ui/inhibitShortcutsDialog.js:105 #: js/ui/inhibitShortcutsDialog.js:107
msgid "Allow" msgid "Allow"
msgstr "Permitir" msgstr "Permitir"
@ -1400,7 +1415,7 @@ msgstr "Apagar"
msgid "Leave Off" msgid "Leave Off"
msgstr "Dejar apagado" msgstr "Dejar apagado"
#: js/ui/keyboard.js:207 #: js/ui/keyboard.js:225
msgid "Region & Language Settings" msgid "Region & Language Settings"
msgstr "Configuración de región e idioma" msgstr "Configuración de región e idioma"
@ -1473,7 +1488,7 @@ msgstr "Pantalla de bloqueo desactivada"
msgid "Screen Locking requires the GNOME display manager." msgid "Screen Locking requires the GNOME display manager."
msgstr "La pantalla de bloqueo necesita el gestor de pantallas de GNOME." msgstr "La pantalla de bloqueo necesita el gestor de pantallas de GNOME."
#: js/ui/messageTray.js:1547 #: js/ui/messageTray.js:1476
msgid "System Information" msgid "System Information"
msgstr "Información del sistema" msgstr "Información del sistema"
@ -1485,13 +1500,13 @@ msgstr "Artista desconocido"
msgid "Unknown title" msgid "Unknown title"
msgstr "Título desconocido" msgstr "Título desconocido"
#: js/ui/overview.js:73 #: js/ui/overview.js:74
msgid "Undo" msgid "Undo"
msgstr "Deshacer" msgstr "Deshacer"
#. Translators: This is the main view to select #. Translators: This is the main view to select
#. activities. See also note for "Activities" string. #. activities. See also note for "Activities" string.
#: js/ui/overview.js:86 #: js/ui/overview.js:87
msgid "Overview" msgid "Overview"
msgstr "Vista general" msgstr "Vista general"
@ -1499,7 +1514,7 @@ msgstr "Vista general"
#. in the search entry when no search is #. in the search entry when no search is
#. active; it should not exceed ~30 #. active; it should not exceed ~30
#. characters. #. characters.
#: js/ui/overview.js:107 #: js/ui/overview.js:108
msgid "Type to search" msgid "Type to search"
msgstr "Escribir para buscar" msgstr "Escribir para buscar"
@ -2153,11 +2168,11 @@ msgstr "Error de autorización de Thunderbolt"
msgid "Could not authorize the Thunderbolt device: %s" msgid "Could not authorize the Thunderbolt device: %s"
msgstr "No se pudo autorizar el dispositivo Thunderbolt: %s" msgstr "No se pudo autorizar el dispositivo Thunderbolt: %s"
#: js/ui/status/volume.js:154 #: js/ui/status/volume.js:155
msgid "Volume changed" msgid "Volume changed"
msgstr "Volumen modificado" msgstr "Volumen modificado"
#: js/ui/status/volume.js:225 #: js/ui/status/volume.js:217
msgid "Volume" msgid "Volume"
msgstr "Volumen" msgstr "Volumen"
@ -2203,11 +2218,11 @@ msgstr "Deslizar para desbloquear"
msgid "Click or press a key to unlock" msgid "Click or press a key to unlock"
msgstr "Pulse con el ratón o una tecla para desbloquear" msgstr "Pulse con el ratón o una tecla para desbloquear"
#: js/ui/unlockDialog.js:550 #: js/ui/unlockDialog.js:555
msgid "Unlock Window" msgid "Unlock Window"
msgstr "Desbloquear ventana" msgstr "Desbloquear ventana"
#: js/ui/unlockDialog.js:559 #: js/ui/unlockDialog.js:564
msgid "Log in as another user" msgid "Log in as another user"
msgstr "Iniciar sesión como otro usuario" msgstr "Iniciar sesión como otro usuario"
@ -2344,12 +2359,12 @@ msgstr ""
msgid "List possible modes" msgid "List possible modes"
msgstr "Listar los modos posibles" msgstr "Listar los modos posibles"
#: src/shell-app.c:286 #: src/shell-app.c:268
msgctxt "program" msgctxt "program"
msgid "Unknown" msgid "Unknown"
msgstr "Desconocido" msgstr "Desconocido"
#: src/shell-app.c:537 #: src/shell-app.c:519
#, c-format #, c-format
msgid "Failed to launch “%s”" msgid "Failed to launch “%s”"
msgstr "Falló al lanzar «%s»" msgstr "Falló al lanzar «%s»"

483
po/fur.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

159
po/ro.po
View File

@ -10,8 +10,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell master\n" "Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2020-06-09 19:41+0000\n" "POT-Creation-Date: 2020-07-21 05:44+0000\n"
"PO-Revision-Date: 2020-06-17 18:47+0300\n" "PO-Revision-Date: 2020-07-21 09:07+0200\n"
"Last-Translator: Florentina Mușat <florentina [dot] musat [dot] 28 [at] " "Last-Translator: Florentina Mușat <florentina [dot] musat [dot] 28 [at] "
"gmail [dot] com>\n" "gmail [dot] com>\n"
"Language-Team: Gnome Romanian Translation Team <gnomero-list@lists." "Language-Team: Gnome Romanian Translation Team <gnomero-list@lists."
@ -224,95 +224,112 @@ msgid ""
msgstr "" msgstr ""
"Activează un API D-Bus care permite introspecția stării aplicației shell." "Activează un API D-Bus care permite introspecția stării aplicației shell."
#: data/org.gnome.shell.gschema.xml.in:119 #: data/org.gnome.shell.gschema.xml.in:114
msgid "Layout of the app picker"
msgstr "Aspectul selectorului de aplicații"
#: data/org.gnome.shell.gschema.xml.in:115
msgid ""
"Layout of the app picker. Each entry in the array is a page. Pages are "
"stored in the order they appear in GNOME Shell. Each page contains an "
"“application id” → 'data' pair. Currently, the following values are stored "
"as 'data': • “position”: the position of the application icon in the page"
msgstr ""
"Aspectul selectorului de aplicații. Fiecare intrare din matrice este o "
"pagină. Paginile sunt stocate în ordinea în care apar în GNOME Shell. "
"Fiecare pagină conține o pereche de „id aplicație” → „date”. Momentan, "
"următoarele valori sunt stocate ca „data”: • „poziție”: poziția iconiței "
"aplicației în pagină."
#: data/org.gnome.shell.gschema.xml.in:130
msgid "Keybinding to open the application menu" msgid "Keybinding to open the application menu"
msgstr "Combinație de taste pentru deschiderea meniului aplicației" msgstr "Combinație de taste pentru deschiderea meniului aplicației"
#: data/org.gnome.shell.gschema.xml.in:120 #: data/org.gnome.shell.gschema.xml.in:131
msgid "Keybinding to open the application menu." msgid "Keybinding to open the application menu."
msgstr "Combinație de taste pentru deschiderea meniului aplicației." msgstr "Combinație de taste pentru deschiderea meniului aplicației."
#: data/org.gnome.shell.gschema.xml.in:126 #: data/org.gnome.shell.gschema.xml.in:137
msgid "Keybinding to open the “Show Applications” view" msgid "Keybinding to open the “Show Applications” view"
msgstr "" msgstr ""
"Combinație de taste pentru deschiderea modului de afișare „Arată aplicațiile”" "Combinație de taste pentru deschiderea modului de afișare „Arată aplicațiile”"
#: data/org.gnome.shell.gschema.xml.in:127 #: data/org.gnome.shell.gschema.xml.in:138
msgid "" msgid ""
"Keybinding to open the “Show Applications” view of the Activities Overview." "Keybinding to open the “Show Applications” view of the Activities Overview."
msgstr "" msgstr ""
"Combinație de taste pentru deschiderea modului de afișare „Arată " "Combinație de taste pentru deschiderea modului de afișare „Arată "
"aplicațiile” a prezentării generale a activităților." "aplicațiile” a prezentării generale a activităților."
#: data/org.gnome.shell.gschema.xml.in:134 #: data/org.gnome.shell.gschema.xml.in:145
msgid "Keybinding to open the overview" msgid "Keybinding to open the overview"
msgstr "Combinație de taste pentru deschiderea prezentării generale" msgstr "Combinație de taste pentru deschiderea prezentării generale"
#: data/org.gnome.shell.gschema.xml.in:135 #: data/org.gnome.shell.gschema.xml.in:146
msgid "Keybinding to open the Activities Overview." msgid "Keybinding to open the Activities Overview."
msgstr "" msgstr ""
"Combinație de taste pentru deschiderea prezentării generale a activităților." "Combinație de taste pentru deschiderea prezentării generale a activităților."
#: data/org.gnome.shell.gschema.xml.in:141 #: data/org.gnome.shell.gschema.xml.in:152
msgid "Keybinding to toggle the visibility of the notification list" msgid "Keybinding to toggle the visibility of the notification list"
msgstr "" msgstr ""
"Combinație de taste pentru comutarea vizibilității listei de notificare" "Combinație de taste pentru comutarea vizibilității listei de notificare"
#: data/org.gnome.shell.gschema.xml.in:142 #: data/org.gnome.shell.gschema.xml.in:153
msgid "Keybinding to toggle the visibility of the notification list." msgid "Keybinding to toggle the visibility of the notification list."
msgstr "" msgstr ""
"Combinație de taste pentru comutarea vizibilității listei de notificare." "Combinație de taste pentru comutarea vizibilității listei de notificare."
#: data/org.gnome.shell.gschema.xml.in:148 #: data/org.gnome.shell.gschema.xml.in:159
msgid "Keybinding to focus the active notification" msgid "Keybinding to focus the active notification"
msgstr "Combinație de taste pentru focalizarea notificării active" msgstr "Combinație de taste pentru focalizarea notificării active"
#: data/org.gnome.shell.gschema.xml.in:149 #: data/org.gnome.shell.gschema.xml.in:160
msgid "Keybinding to focus the active notification." msgid "Keybinding to focus the active notification."
msgstr "Combinație de taste pentru focalizarea notificării active." msgstr "Combinație de taste pentru focalizarea notificării active."
#: data/org.gnome.shell.gschema.xml.in:155 #: data/org.gnome.shell.gschema.xml.in:166
msgid "Switch to application 1" msgid "Switch to application 1"
msgstr "Comută la aplicația 1" msgstr "Comută la aplicația 1"
#: data/org.gnome.shell.gschema.xml.in:159 #: data/org.gnome.shell.gschema.xml.in:170
msgid "Switch to application 2" msgid "Switch to application 2"
msgstr "Comută la aplicația 2" msgstr "Comută la aplicația 2"
#: data/org.gnome.shell.gschema.xml.in:163 #: data/org.gnome.shell.gschema.xml.in:174
msgid "Switch to application 3" msgid "Switch to application 3"
msgstr "Comută la aplicația 3" msgstr "Comută la aplicația 3"
#: data/org.gnome.shell.gschema.xml.in:167 #: data/org.gnome.shell.gschema.xml.in:178
msgid "Switch to application 4" msgid "Switch to application 4"
msgstr "Comută la aplicația 4" msgstr "Comută la aplicația 4"
#: data/org.gnome.shell.gschema.xml.in:171 #: data/org.gnome.shell.gschema.xml.in:182
msgid "Switch to application 5" msgid "Switch to application 5"
msgstr "Comută la aplicația 5" msgstr "Comută la aplicația 5"
#: data/org.gnome.shell.gschema.xml.in:175 #: data/org.gnome.shell.gschema.xml.in:186
msgid "Switch to application 6" msgid "Switch to application 6"
msgstr "Comută la aplicația 6" msgstr "Comută la aplicația 6"
#: data/org.gnome.shell.gschema.xml.in:179 #: data/org.gnome.shell.gschema.xml.in:190
msgid "Switch to application 7" msgid "Switch to application 7"
msgstr "Comută la aplicația 7" msgstr "Comută la aplicația 7"
#: data/org.gnome.shell.gschema.xml.in:183 #: data/org.gnome.shell.gschema.xml.in:194
msgid "Switch to application 8" msgid "Switch to application 8"
msgstr "Comută la aplicația 8" msgstr "Comută la aplicația 8"
#: data/org.gnome.shell.gschema.xml.in:187 #: data/org.gnome.shell.gschema.xml.in:198
msgid "Switch to application 9" msgid "Switch to application 9"
msgstr "Comută la aplicația 9" msgstr "Comută la aplicația 9"
#: data/org.gnome.shell.gschema.xml.in:196 #: data/org.gnome.shell.gschema.xml.in:207
#: data/org.gnome.shell.gschema.xml.in:223 #: data/org.gnome.shell.gschema.xml.in:234
msgid "Limit switcher to current workspace." msgid "Limit switcher to current workspace."
msgstr "Limitează comutatorul la spațiul de lucru curent." msgstr "Limitează comutatorul la spațiul de lucru curent."
#: data/org.gnome.shell.gschema.xml.in:197 #: data/org.gnome.shell.gschema.xml.in:208
msgid "" msgid ""
"If true, only applications that have windows on the current workspace are " "If true, only applications that have windows on the current workspace are "
"shown in the switcher. Otherwise, all applications are included." "shown in the switcher. Otherwise, all applications are included."
@ -320,11 +337,11 @@ msgstr ""
"Dacă este activat, doar aplicațiile care au ferestre în spațiul de lucru " "Dacă este activat, doar aplicațiile care au ferestre în spațiul de lucru "
"curent sunt arătate în comutator. Altfel, toate aplicațiile sunt incluse." "curent sunt arătate în comutator. Altfel, toate aplicațiile sunt incluse."
#: data/org.gnome.shell.gschema.xml.in:214 #: data/org.gnome.shell.gschema.xml.in:225
msgid "The application icon mode." msgid "The application icon mode."
msgstr "Miniatură și pictograma aplicației." msgstr "Miniatură și pictograma aplicației."
#: data/org.gnome.shell.gschema.xml.in:215 #: data/org.gnome.shell.gschema.xml.in:226
msgid "" msgid ""
"Configures how the windows are shown in the switcher. Valid possibilities " "Configures how the windows are shown in the switcher. Valid possibilities "
"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" "are “thumbnail-only” (shows a thumbnail of the window), “app-icon-"
@ -334,7 +351,7 @@ msgstr ""
"Posibilități valide sunt „mod miniatură” (arată o miniatură a ferestrei) " "Posibilități valide sunt „mod miniatură” (arată o miniatură a ferestrei) "
"„mod iconiță” (arată doar iconița aplicației) sau „ambele”." "„mod iconiță” (arată doar iconița aplicației) sau „ambele”."
#: data/org.gnome.shell.gschema.xml.in:224 #: data/org.gnome.shell.gschema.xml.in:235
msgid "" msgid ""
"If true, only windows from the current workspace are shown in the switcher. " "If true, only windows from the current workspace are shown in the switcher. "
"Otherwise, all windows are included." "Otherwise, all windows are included."
@ -342,59 +359,59 @@ msgstr ""
"Dacă este activat, doar ferestrele din spațiul de lucru curent sunt arătate " "Dacă este activat, doar ferestrele din spațiul de lucru curent sunt arătate "
"în comutator. Altfel, toate ferestrele sunt incluse." "în comutator. Altfel, toate ferestrele sunt incluse."
#: data/org.gnome.shell.gschema.xml.in:234 #: data/org.gnome.shell.gschema.xml.in:245
msgid "Locations" msgid "Locations"
msgstr "Locații" msgstr "Locații"
#: data/org.gnome.shell.gschema.xml.in:235 #: data/org.gnome.shell.gschema.xml.in:246
msgid "The locations to show in world clocks" msgid "The locations to show in world clocks"
msgstr "Locațiile de arătat în ceasuri globale" msgstr "Locațiile de arătat în ceasuri globale"
#: data/org.gnome.shell.gschema.xml.in:245 #: data/org.gnome.shell.gschema.xml.in:256
msgid "Automatic location" msgid "Automatic location"
msgstr "Locație automată" msgstr "Locație automată"
#: data/org.gnome.shell.gschema.xml.in:246 #: data/org.gnome.shell.gschema.xml.in:257
msgid "Whether to fetch the current location or not" msgid "Whether to fetch the current location or not"
msgstr "Dacă să se obțină locația curentă" msgstr "Dacă să se obțină locația curentă"
#: data/org.gnome.shell.gschema.xml.in:253 #: data/org.gnome.shell.gschema.xml.in:264
msgid "Location" msgid "Location"
msgstr "Locație" msgstr "Locație"
#: data/org.gnome.shell.gschema.xml.in:254 #: data/org.gnome.shell.gschema.xml.in:265
msgid "The location for which to show a forecast" msgid "The location for which to show a forecast"
msgstr "Locația pentru care să se arate o prognoză" msgstr "Locația pentru care să se arate o prognoză"
#: data/org.gnome.shell.gschema.xml.in:266 #: data/org.gnome.shell.gschema.xml.in:277
msgid "Attach modal dialog to the parent window" msgid "Attach modal dialog to the parent window"
msgstr "Atașează dialogul modal la fereastra părinte" msgstr "Atașează dialogul modal la fereastra părinte"
#: data/org.gnome.shell.gschema.xml.in:267 #: data/org.gnome.shell.gschema.xml.in:278
#: data/org.gnome.shell.gschema.xml.in:276 #: data/org.gnome.shell.gschema.xml.in:287
#: data/org.gnome.shell.gschema.xml.in:284 #: data/org.gnome.shell.gschema.xml.in:295
#: data/org.gnome.shell.gschema.xml.in:292 #: data/org.gnome.shell.gschema.xml.in:303
#: data/org.gnome.shell.gschema.xml.in:300 #: data/org.gnome.shell.gschema.xml.in:311
msgid "" msgid ""
"This key overrides the key in org.gnome.mutter when running GNOME Shell." "This key overrides the key in org.gnome.mutter when running GNOME Shell."
msgstr "" msgstr ""
"Această cheie suprascrie cheia corespondentă din org.gnome.mutter când " "Această cheie suprascrie cheia corespondentă din org.gnome.mutter când "
"Vizualizatorul activităților GNOME rulează." "Vizualizatorul activităților GNOME rulează."
#: data/org.gnome.shell.gschema.xml.in:275 #: data/org.gnome.shell.gschema.xml.in:286
msgid "Enable edge tiling when dropping windows on screen edges" msgid "Enable edge tiling when dropping windows on screen edges"
msgstr "" msgstr ""
"Activează mozaic lateral la plasarea ferestrelor pe marginile ecranului" "Activează mozaic lateral la plasarea ferestrelor pe marginile ecranului"
#: data/org.gnome.shell.gschema.xml.in:283 #: data/org.gnome.shell.gschema.xml.in:294
msgid "Workspaces are managed dynamically" msgid "Workspaces are managed dynamically"
msgstr "Spațiile de lucru sunt gestionate în mod dinamic" msgstr "Spațiile de lucru sunt gestionate în mod dinamic"
#: data/org.gnome.shell.gschema.xml.in:291 #: data/org.gnome.shell.gschema.xml.in:302
msgid "Workspaces only on primary monitor" msgid "Workspaces only on primary monitor"
msgstr "Spații de lucru doar pe monitorul principal" msgstr "Spații de lucru doar pe monitorul principal"
#: data/org.gnome.shell.gschema.xml.in:299 #: data/org.gnome.shell.gschema.xml.in:310
msgid "Delay focus changes in mouse mode until the pointer stops moving" msgid "Delay focus changes in mouse mode until the pointer stops moving"
msgstr "" msgstr ""
"Întârzie schimbările de focalizare în maus până când cursorul încetează să " "Întârzie schimbările de focalizare în maus până când cursorul încetează să "
@ -433,7 +450,7 @@ msgstr "Vizitează pagina principală a extensiei"
#: js/gdm/authPrompt.js:135 js/ui/audioDeviceSelection.js:57 #: js/gdm/authPrompt.js:135 js/ui/audioDeviceSelection.js:57
#: js/ui/components/networkAgent.js:110 js/ui/components/polkitAgent.js:139 #: js/ui/components/networkAgent.js:110 js/ui/components/polkitAgent.js:139
#: js/ui/endSessionDialog.js:369 js/ui/extensionDownloader.js:181 #: js/ui/endSessionDialog.js:369 js/ui/extensionDownloader.js:183
#: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386 #: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386
#: js/ui/status/network.js:916 subprojects/extensions-app/js/main.js:149 #: js/ui/status/network.js:916 subprojects/extensions-app/js/main.js:149
msgid "Cancel" msgid "Cancel"
@ -475,7 +492,7 @@ msgstr "Nume de utilizator"
msgid "Login Window" msgid "Login Window"
msgstr "Fereastră de autentificare" msgstr "Fereastră de autentificare"
#: js/gdm/util.js:345 #: js/gdm/util.js:355
msgid "Authentication error" msgid "Authentication error"
msgstr "Eroare de autentificare" msgstr "Eroare de autentificare"
@ -484,7 +501,7 @@ msgstr "Eroare de autentificare"
#. as a cue to display our own message. #. as a cue to display our own message.
#. Translators: this message is shown below the password entry field #. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead #. to indicate the user can swipe their finger instead
#: js/gdm/util.js:471 #: js/gdm/util.js:481
msgid "(or swipe finger)" msgid "(or swipe finger)"
msgstr "(sau treceți degetul peste)" msgstr "(sau treceți degetul peste)"
@ -727,36 +744,36 @@ msgstr "Refuză accesul"
msgid "Grant Access" msgid "Grant Access"
msgstr "Permite accesul" msgstr "Permite accesul"
#: js/ui/appDisplay.js:902 #: js/ui/appDisplay.js:1297
msgid "Unnamed Folder" msgid "Unnamed Folder"
msgstr "Dosar nedenumit" msgstr "Dosar nedenumit"
#. Translators: This is the heading of a list of open windows #. Translators: This is the heading of a list of open windows
#: js/ui/appDisplay.js:2241 js/ui/panel.js:75 #: js/ui/appDisplay.js:2767 js/ui/panel.js:75
msgid "Open Windows" msgid "Open Windows"
msgstr "Ferestre deschise" msgstr "Ferestre deschise"
#: js/ui/appDisplay.js:2260 js/ui/panel.js:82 #: js/ui/appDisplay.js:2786 js/ui/panel.js:82
msgid "New Window" msgid "New Window"
msgstr "Fereastră nouă" msgstr "Fereastră nouă"
#: js/ui/appDisplay.js:2276 #: js/ui/appDisplay.js:2802
msgid "Launch using Integrated Graphics Card" msgid "Launch using Integrated Graphics Card"
msgstr "Lansează folosind placa grafică integrată" msgstr "Lansează folosind placa grafică integrată"
#: js/ui/appDisplay.js:2277 #: js/ui/appDisplay.js:2803
msgid "Launch using Discrete Graphics Card" msgid "Launch using Discrete Graphics Card"
msgstr "Lansează folosind placa grafică discretă" msgstr "Lansează folosind placa grafică discretă"
#: js/ui/appDisplay.js:2305 js/ui/dash.js:239 #: js/ui/appDisplay.js:2831 js/ui/dash.js:239
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Elimină din favorite" msgstr "Elimină din favorite"
#: js/ui/appDisplay.js:2311 #: js/ui/appDisplay.js:2837
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Adaugă la Favorite" msgstr "Adaugă la Favorite"
#: js/ui/appDisplay.js:2321 js/ui/panel.js:93 #: js/ui/appDisplay.js:2847 js/ui/panel.js:93
msgid "Show Details" msgid "Show Details"
msgstr "Arată detaliile" msgstr "Arată detaliile"
@ -786,7 +803,7 @@ msgstr "Căști auriculare"
msgid "Headset" msgid "Headset"
msgstr "Căști cu microfon" msgstr "Căști cu microfon"
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:273 #: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:272
msgid "Microphone" msgid "Microphone"
msgstr "Microfon" msgstr "Microfon"
@ -1300,15 +1317,15 @@ msgstr "%s (la distanță)"
msgid "%s (console)" msgid "%s (console)"
msgstr "%s (consolă)" msgstr "%s (consolă)"
#: js/ui/extensionDownloader.js:185 #: js/ui/extensionDownloader.js:187
msgid "Install" msgid "Install"
msgstr "Instalează" msgstr "Instalează"
#: js/ui/extensionDownloader.js:191 #: js/ui/extensionDownloader.js:193
msgid "Install Extension" msgid "Install Extension"
msgstr "Instalează extensia" msgstr "Instalează extensia"
#: js/ui/extensionDownloader.js:192 #: js/ui/extensionDownloader.js:194
#, javascript-format #, javascript-format
msgid "Download and install “%s” from extensions.gnome.org?" msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "Descărcați și instalați „%s” de la extensions.gnome.org?" msgstr "Descărcați și instalați „%s” de la extensions.gnome.org?"
@ -1341,11 +1358,11 @@ msgstr "O aplicație vrea să inhibe scurtăturile"
msgid "You can restore shortcuts by pressing %s." msgid "You can restore shortcuts by pressing %s."
msgstr "Puteți restaura scurtăturile apăsând %s." msgstr "Puteți restaura scurtăturile apăsând %s."
#: js/ui/inhibitShortcutsDialog.js:98 #: js/ui/inhibitShortcutsDialog.js:100
msgid "Deny" msgid "Deny"
msgstr "Refuză" msgstr "Refuză"
#: js/ui/inhibitShortcutsDialog.js:105 #: js/ui/inhibitShortcutsDialog.js:107
msgid "Allow" msgid "Allow"
msgstr "Permite" msgstr "Permite"
@ -1414,7 +1431,7 @@ msgstr "Oprește"
msgid "Leave Off" msgid "Leave Off"
msgstr "Lasă oprit" msgstr "Lasă oprit"
#: js/ui/keyboard.js:207 #: js/ui/keyboard.js:225
msgid "Region & Language Settings" msgid "Region & Language Settings"
msgstr "Configurări de regiune și limbă" msgstr "Configurări de regiune și limbă"
@ -1488,7 +1505,7 @@ msgstr "Blocarea ecranului este dezactivată"
msgid "Screen Locking requires the GNOME display manager." msgid "Screen Locking requires the GNOME display manager."
msgstr "Blocarea ecranului necesită administratorul de afișaj GNOME." msgstr "Blocarea ecranului necesită administratorul de afișaj GNOME."
#: js/ui/messageTray.js:1547 #: js/ui/messageTray.js:1476
msgid "System Information" msgid "System Information"
msgstr "Informații despre sistem" msgstr "Informații despre sistem"
@ -1500,13 +1517,13 @@ msgstr "Artist necunoscut"
msgid "Unknown title" msgid "Unknown title"
msgstr "Titlu necunoscut" msgstr "Titlu necunoscut"
#: js/ui/overview.js:73 #: js/ui/overview.js:74
msgid "Undo" msgid "Undo"
msgstr "Anulează" msgstr "Anulează"
#. Translators: This is the main view to select #. Translators: This is the main view to select
#. activities. See also note for "Activities" string. #. activities. See also note for "Activities" string.
#: js/ui/overview.js:86 #: js/ui/overview.js:87
msgid "Overview" msgid "Overview"
msgstr "Prezentare generală" msgstr "Prezentare generală"
@ -1514,7 +1531,7 @@ msgstr "Prezentare generală"
#. in the search entry when no search is #. in the search entry when no search is
#. active; it should not exceed ~30 #. active; it should not exceed ~30
#. characters. #. characters.
#: js/ui/overview.js:107 #: js/ui/overview.js:108
msgid "Type to search" msgid "Type to search"
msgstr "Tastați pentru a căuta" msgstr "Tastați pentru a căuta"
@ -2172,11 +2189,11 @@ msgstr "Eroare de autorizare Thunderbolt"
msgid "Could not authorize the Thunderbolt device: %s" msgid "Could not authorize the Thunderbolt device: %s"
msgstr "Nu s-a putut autoriza dispozitivul Thunderbolt: %s" msgstr "Nu s-a putut autoriza dispozitivul Thunderbolt: %s"
#: js/ui/status/volume.js:154 #: js/ui/status/volume.js:155
msgid "Volume changed" msgid "Volume changed"
msgstr "Volumul a fost schimbat" msgstr "Volumul a fost schimbat"
#: js/ui/status/volume.js:225 #: js/ui/status/volume.js:217
msgid "Volume" msgid "Volume"
msgstr "Volum" msgstr "Volum"
@ -2222,11 +2239,11 @@ msgstr "Glisați în sus pentru a debloca"
msgid "Click or press a key to unlock" msgid "Click or press a key to unlock"
msgstr "Apăsați clic sau o tastă pentru a debloca" msgstr "Apăsați clic sau o tastă pentru a debloca"
#: js/ui/unlockDialog.js:550 #: js/ui/unlockDialog.js:555
msgid "Unlock Window" msgid "Unlock Window"
msgstr "Deblochează fereastră" msgstr "Deblochează fereastră"
#: js/ui/unlockDialog.js:559 #: js/ui/unlockDialog.js:564
msgid "Log in as another user" msgid "Log in as another user"
msgstr "Intră în sesiune ca utilizator diferit" msgstr "Intră în sesiune ca utilizator diferit"
@ -2362,12 +2379,12 @@ msgstr "Utilizează un mod specific, de exemplu „gdm” pentru ecranul de loga
msgid "List possible modes" msgid "List possible modes"
msgstr "Enumeră câmpurile care pot fi afișate" msgstr "Enumeră câmpurile care pot fi afișate"
#: src/shell-app.c:286 #: src/shell-app.c:268
msgctxt "program" msgctxt "program"
msgid "Unknown" msgid "Unknown"
msgstr "Necunoscut" msgstr "Necunoscut"
#: src/shell-app.c:537 #: src/shell-app.c:519
#, c-format #, c-format
msgid "Failed to launch “%s”" msgid "Failed to launch “%s”"
msgstr "Nu s-a putut lansa „%s”" msgstr "Nu s-a putut lansa „%s”"

160
po/tr.po
View File

@ -17,8 +17,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell\n" "Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2020-06-11 10:28+0000\n" "POT-Creation-Date: 2020-07-29 07:55+0000\n"
"PO-Revision-Date: 2020-05-16 12:12+0300\n" "PO-Revision-Date: 2020-07-30 00:49+0300\n"
"Last-Translator: Emin Tufan Çetin <etcetin@gmail.com>\n" "Last-Translator: Emin Tufan Çetin <etcetin@gmail.com>\n"
"Language-Team: Türkçe <gnome-turk@gnome.org>\n" "Language-Team: Türkçe <gnome-turk@gnome.org>\n"
"Language: tr\n" "Language: tr\n"
@ -225,91 +225,107 @@ msgstr ""
"Kabuğun uygulama durumunu gözden geçirmeyi sağlayan D-Bus APIʼsını " "Kabuğun uygulama durumunu gözden geçirmeyi sağlayan D-Bus APIʼsını "
"etkinleştirir." "etkinleştirir."
#: data/org.gnome.shell.gschema.xml.in:119 #: data/org.gnome.shell.gschema.xml.in:114
msgid "Layout of the app picker"
msgstr "Uygulama seçicinin düzeni"
#: data/org.gnome.shell.gschema.xml.in:115
msgid ""
"Layout of the app picker. Each entry in the array is a page. Pages are "
"stored in the order they appear in GNOME Shell. Each page contains an "
"“application id” → 'data' pair. Currently, the following values are stored "
"as 'data': • “position”: the position of the application icon in the page"
msgstr ""
"Uygulama seçicinin düzeni. Dizideki her girdi bir sayfadır. Sayfalar "
"GNOME Kabuğunda göründüğü sırayla depolanır. Her sayfa bir “application id” "
"→ 'data' çifti içerir. Şimdilik şu değerler 'data' olarak depolanır: "
"• “position”: sayfadaki uygulama simgesinin konumu"
#: data/org.gnome.shell.gschema.xml.in:130
msgid "Keybinding to open the application menu" msgid "Keybinding to open the application menu"
msgstr "Uygulama menüsünü açmak için klavye kısayolu" msgstr "Uygulama menüsünü açmak için klavye kısayolu"
#: data/org.gnome.shell.gschema.xml.in:120 #: data/org.gnome.shell.gschema.xml.in:131
msgid "Keybinding to open the application menu." msgid "Keybinding to open the application menu."
msgstr "Uygulama menüsünü açmak için klavye kısayolu." msgstr "Uygulama menüsünü açmak için klavye kısayolu."
#: data/org.gnome.shell.gschema.xml.in:126 #: data/org.gnome.shell.gschema.xml.in:137
msgid "Keybinding to open the “Show Applications” view" msgid "Keybinding to open the “Show Applications” view"
msgstr "“Uygulamaları Göster” görünümünü açmak için klavye kısayolu" msgstr "“Uygulamaları Göster” görünümünü açmak için klavye kısayolu"
#: data/org.gnome.shell.gschema.xml.in:127 #: data/org.gnome.shell.gschema.xml.in:138
msgid "" msgid ""
"Keybinding to open the “Show Applications” view of the Activities Overview." "Keybinding to open the “Show Applications” view of the Activities Overview."
msgstr "" msgstr ""
"Etkinlikler Genel Görünümünün “Uygulamaları Göster” görünümünü açmak için " "Etkinlikler Genel Görünümünün “Uygulamaları Göster” görünümünü açmak için "
"klavye kısayolu." "klavye kısayolu."
#: data/org.gnome.shell.gschema.xml.in:134 #: data/org.gnome.shell.gschema.xml.in:145
msgid "Keybinding to open the overview" msgid "Keybinding to open the overview"
msgstr "Genel görünümü açmak için klavye kısayolu" msgstr "Genel görünümü açmak için klavye kısayolu"
#: data/org.gnome.shell.gschema.xml.in:135 #: data/org.gnome.shell.gschema.xml.in:146
msgid "Keybinding to open the Activities Overview." msgid "Keybinding to open the Activities Overview."
msgstr "Etkinlikler Genel Görünümünü açmak için klavye kısayolu." msgstr "Etkinlikler Genel Görünümünü açmak için klavye kısayolu."
#: data/org.gnome.shell.gschema.xml.in:141 #: data/org.gnome.shell.gschema.xml.in:152
msgid "Keybinding to toggle the visibility of the notification list" msgid "Keybinding to toggle the visibility of the notification list"
msgstr "Bildirim listesinin görünürlüğünü değiştirmek için klavye kısayolu" msgstr "Bildirim listesinin görünürlüğünü değiştirmek için klavye kısayolu"
#: data/org.gnome.shell.gschema.xml.in:142 #: data/org.gnome.shell.gschema.xml.in:153
msgid "Keybinding to toggle the visibility of the notification list." msgid "Keybinding to toggle the visibility of the notification list."
msgstr "Bildirim listesinin görünürlüğünü değiştirmek için klavye kısayolu." msgstr "Bildirim listesinin görünürlüğünü değiştirmek için klavye kısayolu."
#: data/org.gnome.shell.gschema.xml.in:148 #: data/org.gnome.shell.gschema.xml.in:159
msgid "Keybinding to focus the active notification" msgid "Keybinding to focus the active notification"
msgstr "Etkin bildirime odaklanmak için klavye kısayolu" msgstr "Etkin bildirime odaklanmak için klavye kısayolu"
#: data/org.gnome.shell.gschema.xml.in:149 #: data/org.gnome.shell.gschema.xml.in:160
msgid "Keybinding to focus the active notification." msgid "Keybinding to focus the active notification."
msgstr "Etkin bildirime odaklanmak için klavye kısayolu." msgstr "Etkin bildirime odaklanmak için klavye kısayolu."
#: data/org.gnome.shell.gschema.xml.in:155 #: data/org.gnome.shell.gschema.xml.in:166
msgid "Switch to application 1" msgid "Switch to application 1"
msgstr "Uygulama 1ʼe geç" msgstr "Uygulama 1ʼe geç"
#: data/org.gnome.shell.gschema.xml.in:159 #: data/org.gnome.shell.gschema.xml.in:170
msgid "Switch to application 2" msgid "Switch to application 2"
msgstr "Uygulama 2ʼye geç" msgstr "Uygulama 2ʼye geç"
#: data/org.gnome.shell.gschema.xml.in:163 #: data/org.gnome.shell.gschema.xml.in:174
msgid "Switch to application 3" msgid "Switch to application 3"
msgstr "Uygulama 3ʼe geç" msgstr "Uygulama 3ʼe geç"
#: data/org.gnome.shell.gschema.xml.in:167 #: data/org.gnome.shell.gschema.xml.in:178
msgid "Switch to application 4" msgid "Switch to application 4"
msgstr "Uygulama 4ʼe geç" msgstr "Uygulama 4ʼe geç"
#: data/org.gnome.shell.gschema.xml.in:171 #: data/org.gnome.shell.gschema.xml.in:182
msgid "Switch to application 5" msgid "Switch to application 5"
msgstr "Uygulama 5ʼe geç" msgstr "Uygulama 5ʼe geç"
#: data/org.gnome.shell.gschema.xml.in:175 #: data/org.gnome.shell.gschema.xml.in:186
msgid "Switch to application 6" msgid "Switch to application 6"
msgstr "Uygulama 6ʼya geç" msgstr "Uygulama 6ʼya geç"
#: data/org.gnome.shell.gschema.xml.in:179 #: data/org.gnome.shell.gschema.xml.in:190
msgid "Switch to application 7" msgid "Switch to application 7"
msgstr "Uygulama 7ʼye geç" msgstr "Uygulama 7ʼye geç"
#: data/org.gnome.shell.gschema.xml.in:183 #: data/org.gnome.shell.gschema.xml.in:194
msgid "Switch to application 8" msgid "Switch to application 8"
msgstr "Uygulama 8ʼe geç" msgstr "Uygulama 8ʼe geç"
#: data/org.gnome.shell.gschema.xml.in:187 #: data/org.gnome.shell.gschema.xml.in:198
msgid "Switch to application 9" msgid "Switch to application 9"
msgstr "Uygulama 9ʼa geç" msgstr "Uygulama 9ʼa geç"
#: data/org.gnome.shell.gschema.xml.in:196 #: data/org.gnome.shell.gschema.xml.in:207
#: data/org.gnome.shell.gschema.xml.in:223 #: data/org.gnome.shell.gschema.xml.in:234
msgid "Limit switcher to current workspace." msgid "Limit switcher to current workspace."
msgstr "Geçiş menüsünü geçerli çalışma alanıyla sınırla." msgstr "Geçiş menüsünü geçerli çalışma alanıyla sınırla."
#: data/org.gnome.shell.gschema.xml.in:197 #: data/org.gnome.shell.gschema.xml.in:208
msgid "" msgid ""
"If true, only applications that have windows on the current workspace are " "If true, only applications that have windows on the current workspace are "
"shown in the switcher. Otherwise, all applications are included." "shown in the switcher. Otherwise, all applications are included."
@ -318,11 +334,11 @@ msgstr ""
"uygulamalar geçiş menüsünde gösterilir. Aksi halde, tüm uygulamalar " "uygulamalar geçiş menüsünde gösterilir. Aksi halde, tüm uygulamalar "
"görünecektir." "görünecektir."
#: data/org.gnome.shell.gschema.xml.in:214 #: data/org.gnome.shell.gschema.xml.in:225
msgid "The application icon mode." msgid "The application icon mode."
msgstr "Uygulama simge kipi." msgstr "Uygulama simge kipi."
#: data/org.gnome.shell.gschema.xml.in:215 #: data/org.gnome.shell.gschema.xml.in:226
msgid "" msgid ""
"Configures how the windows are shown in the switcher. Valid possibilities " "Configures how the windows are shown in the switcher. Valid possibilities "
"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" "are “thumbnail-only” (shows a thumbnail of the window), “app-icon-"
@ -333,7 +349,7 @@ msgstr ""
"only” (yalnızca uygulama simgesini gösterir) ya da “both” (her ikisi) " "only” (yalnızca uygulama simgesini gösterir) ya da “both” (her ikisi) "
"değerleridir." "değerleridir."
#: data/org.gnome.shell.gschema.xml.in:224 #: data/org.gnome.shell.gschema.xml.in:235
msgid "" msgid ""
"If true, only windows from the current workspace are shown in the switcher. " "If true, only windows from the current workspace are shown in the switcher. "
"Otherwise, all windows are included." "Otherwise, all windows are included."
@ -341,59 +357,59 @@ msgstr ""
"Eğer bu seçenek etkinse, yalnızca geçerli çalışma alanındaki pencereler " "Eğer bu seçenek etkinse, yalnızca geçerli çalışma alanındaki pencereler "
"geçiş menüsünde gösterilir. Aksi halde, tüm pencereler görünecektir." "geçiş menüsünde gösterilir. Aksi halde, tüm pencereler görünecektir."
#: data/org.gnome.shell.gschema.xml.in:234 #: data/org.gnome.shell.gschema.xml.in:245
msgid "Locations" msgid "Locations"
msgstr "Konumlar" msgstr "Konumlar"
#: data/org.gnome.shell.gschema.xml.in:235 #: data/org.gnome.shell.gschema.xml.in:246
msgid "The locations to show in world clocks" msgid "The locations to show in world clocks"
msgstr "Dünya saatlerinde gösterilecek konumlar" msgstr "Dünya saatlerinde gösterilecek konumlar"
#: data/org.gnome.shell.gschema.xml.in:245 #: data/org.gnome.shell.gschema.xml.in:256
msgid "Automatic location" msgid "Automatic location"
msgstr "Kendiliğinden konumlama" msgstr "Kendiliğinden konumlama"
#: data/org.gnome.shell.gschema.xml.in:246 #: data/org.gnome.shell.gschema.xml.in:257
msgid "Whether to fetch the current location or not" msgid "Whether to fetch the current location or not"
msgstr "Geçerli konumun getirilip getirilmeyeceğini belirler" msgstr "Geçerli konumun getirilip getirilmeyeceğini belirler"
#: data/org.gnome.shell.gschema.xml.in:253 #: data/org.gnome.shell.gschema.xml.in:264
msgid "Location" msgid "Location"
msgstr "Konum" msgstr "Konum"
#: data/org.gnome.shell.gschema.xml.in:254 #: data/org.gnome.shell.gschema.xml.in:265
msgid "The location for which to show a forecast" msgid "The location for which to show a forecast"
msgstr "Hava durumunun gösterileceği konum" msgstr "Hava durumunun gösterileceği konum"
#: data/org.gnome.shell.gschema.xml.in:266 #: data/org.gnome.shell.gschema.xml.in:277
msgid "Attach modal dialog to the parent window" msgid "Attach modal dialog to the parent window"
msgstr "Yardımcı iletişim penceresini üst pencereye iliştir" msgstr "Yardımcı iletişim penceresini üst pencereye iliştir"
#: data/org.gnome.shell.gschema.xml.in:267 #: data/org.gnome.shell.gschema.xml.in:278
#: data/org.gnome.shell.gschema.xml.in:276 #: data/org.gnome.shell.gschema.xml.in:287
#: data/org.gnome.shell.gschema.xml.in:284 #: data/org.gnome.shell.gschema.xml.in:295
#: data/org.gnome.shell.gschema.xml.in:292 #: data/org.gnome.shell.gschema.xml.in:303
#: data/org.gnome.shell.gschema.xml.in:300 #: data/org.gnome.shell.gschema.xml.in:311
msgid "" msgid ""
"This key overrides the key in org.gnome.mutter when running GNOME Shell." "This key overrides the key in org.gnome.mutter when running GNOME Shell."
msgstr "" msgstr ""
"Bu anahtar, GNOME Shell çalışırken org.gnome.mutter içindeki anahtarı " "Bu anahtar, GNOME Shell çalışırken org.gnome.mutter içindeki anahtarı "
"geçersiz kılar." "geçersiz kılar."
#: data/org.gnome.shell.gschema.xml.in:275 #: data/org.gnome.shell.gschema.xml.in:286
msgid "Enable edge tiling when dropping windows on screen edges" msgid "Enable edge tiling when dropping windows on screen edges"
msgstr "" msgstr ""
"Pencereler ekran kenarlarında bırakıldığında kenar döşemeyi etkinleştir" "Pencereler ekran kenarlarında bırakıldığında kenar döşemeyi etkinleştir"
#: data/org.gnome.shell.gschema.xml.in:283 #: data/org.gnome.shell.gschema.xml.in:294
msgid "Workspaces are managed dynamically" msgid "Workspaces are managed dynamically"
msgstr "Çalışma alanları dinamik olarak yönetilir" msgstr "Çalışma alanları dinamik olarak yönetilir"
#: data/org.gnome.shell.gschema.xml.in:291 #: data/org.gnome.shell.gschema.xml.in:302
msgid "Workspaces only on primary monitor" msgid "Workspaces only on primary monitor"
msgstr "Çalışma alanları yalnızca birincil ekranda" msgstr "Çalışma alanları yalnızca birincil ekranda"
#: data/org.gnome.shell.gschema.xml.in:299 #: data/org.gnome.shell.gschema.xml.in:310
msgid "Delay focus changes in mouse mode until the pointer stops moving" msgid "Delay focus changes in mouse mode until the pointer stops moving"
msgstr "" msgstr ""
"Fare kipinde odak değişikliklerini işaretçi hareketi durana kadar beklet" "Fare kipinde odak değişikliklerini işaretçi hareketi durana kadar beklet"
@ -430,7 +446,7 @@ msgstr "Uzantı ana sayfasını ziyaret et"
#: js/gdm/authPrompt.js:135 js/ui/audioDeviceSelection.js:57 #: js/gdm/authPrompt.js:135 js/ui/audioDeviceSelection.js:57
#: js/ui/components/networkAgent.js:110 js/ui/components/polkitAgent.js:139 #: js/ui/components/networkAgent.js:110 js/ui/components/polkitAgent.js:139
#: js/ui/endSessionDialog.js:369 js/ui/extensionDownloader.js:181 #: js/ui/endSessionDialog.js:369 js/ui/extensionDownloader.js:183
#: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386 #: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386
#: js/ui/status/network.js:916 subprojects/extensions-app/js/main.js:149 #: js/ui/status/network.js:916 subprojects/extensions-app/js/main.js:149
msgid "Cancel" msgid "Cancel"
@ -468,11 +484,11 @@ msgstr "(örneğin, kullanıcı veya %s)"
msgid "Username" msgid "Username"
msgstr "Kullanıcı Adı" msgstr "Kullanıcı Adı"
#: js/gdm/loginDialog.js:1254 #: js/gdm/loginDialog.js:1253
msgid "Login Window" msgid "Login Window"
msgstr "Oturum Açma Penceresi" msgstr "Oturum Açma Penceresi"
#: js/gdm/util.js:345 #: js/gdm/util.js:355
msgid "Authentication error" msgid "Authentication error"
msgstr "Kimlik doğrulama hatası" msgstr "Kimlik doğrulama hatası"
@ -481,7 +497,7 @@ msgstr "Kimlik doğrulama hatası"
#. as a cue to display our own message. #. as a cue to display our own message.
#. Translators: this message is shown below the password entry field #. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead #. to indicate the user can swipe their finger instead
#: js/gdm/util.js:471 #: js/gdm/util.js:481
msgid "(or swipe finger)" msgid "(or swipe finger)"
msgstr "(ya da parmak izi okut)" msgstr "(ya da parmak izi okut)"
@ -710,36 +726,36 @@ msgstr "Erişimi Reddet"
msgid "Grant Access" msgid "Grant Access"
msgstr "Erişime İzin Ver" msgstr "Erişime İzin Ver"
#: js/ui/appDisplay.js:902 #: js/ui/appDisplay.js:1297
msgid "Unnamed Folder" msgid "Unnamed Folder"
msgstr "Adsız Klasör" msgstr "Adsız Klasör"
#. Translators: This is the heading of a list of open windows #. Translators: This is the heading of a list of open windows
#: js/ui/appDisplay.js:2241 js/ui/panel.js:75 #: js/ui/appDisplay.js:2767 js/ui/panel.js:75
msgid "Open Windows" msgid "Open Windows"
msgstr "Açık Pencereler" msgstr "Açık Pencereler"
#: js/ui/appDisplay.js:2260 js/ui/panel.js:82 #: js/ui/appDisplay.js:2786 js/ui/panel.js:82
msgid "New Window" msgid "New Window"
msgstr "Yeni Pencere" msgstr "Yeni Pencere"
#: js/ui/appDisplay.js:2276 #: js/ui/appDisplay.js:2802
msgid "Launch using Integrated Graphics Card" msgid "Launch using Integrated Graphics Card"
msgstr "Tümleşik Ekran Kartıyla Başlat" msgstr "Tümleşik Ekran Kartıyla Başlat"
#: js/ui/appDisplay.js:2277 #: js/ui/appDisplay.js:2803
msgid "Launch using Discrete Graphics Card" msgid "Launch using Discrete Graphics Card"
msgstr "Ayrık Ekran Kartıyla Başlat" msgstr "Ayrık Ekran Kartıyla Başlat"
#: js/ui/appDisplay.js:2305 js/ui/dash.js:239 #: js/ui/appDisplay.js:2831 js/ui/dash.js:239
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Sık Kullanılanlardan Çıkar" msgstr "Sık Kullanılanlardan Çıkar"
#: js/ui/appDisplay.js:2311 #: js/ui/appDisplay.js:2837
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Sık Kullanılanlara Ekle" msgstr "Sık Kullanılanlara Ekle"
#: js/ui/appDisplay.js:2321 js/ui/panel.js:93 #: js/ui/appDisplay.js:2847 js/ui/panel.js:93
msgid "Show Details" msgid "Show Details"
msgstr "Ayrıntıları Göster" msgstr "Ayrıntıları Göster"
@ -769,7 +785,7 @@ msgstr "Kulaklıklar"
msgid "Headset" msgid "Headset"
msgstr "Kulaklıklı Mikrofon" msgstr "Kulaklıklı Mikrofon"
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:273 #: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:272
msgid "Microphone" msgid "Microphone"
msgstr "Mikrofon" msgstr "Mikrofon"
@ -1273,15 +1289,15 @@ msgstr "%s (uzak)"
msgid "%s (console)" msgid "%s (console)"
msgstr "%s (uçbirim)" msgstr "%s (uçbirim)"
#: js/ui/extensionDownloader.js:185 #: js/ui/extensionDownloader.js:187
msgid "Install" msgid "Install"
msgstr "Kur" msgstr "Kur"
#: js/ui/extensionDownloader.js:191 #: js/ui/extensionDownloader.js:193
msgid "Install Extension" msgid "Install Extension"
msgstr "Uzantı Yükle" msgstr "Uzantı Yükle"
#: js/ui/extensionDownloader.js:192 #: js/ui/extensionDownloader.js:194
#, javascript-format #, javascript-format
msgid "Download and install “%s” from extensions.gnome.org?" msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "extensions.gnome.org üstünden “%s” uzantısı indirilip kurulsun mu?" msgstr "extensions.gnome.org üstünden “%s” uzantısı indirilip kurulsun mu?"
@ -1314,11 +1330,11 @@ msgstr "Bir uygulama, kısayolları baskılamak istiyor"
msgid "You can restore shortcuts by pressing %s." msgid "You can restore shortcuts by pressing %s."
msgstr "%s kısayoluyla, kısayolları geri yükleyebilirsiniz." msgstr "%s kısayoluyla, kısayolları geri yükleyebilirsiniz."
#: js/ui/inhibitShortcutsDialog.js:98 #: js/ui/inhibitShortcutsDialog.js:100
msgid "Deny" msgid "Deny"
msgstr "Reddet" msgstr "Reddet"
#: js/ui/inhibitShortcutsDialog.js:105 #: js/ui/inhibitShortcutsDialog.js:107
msgid "Allow" msgid "Allow"
msgstr "İzin ver" msgstr "İzin ver"
@ -1384,7 +1400,7 @@ msgstr "Kapat"
msgid "Leave Off" msgid "Leave Off"
msgstr "Kapalı Bırak" msgstr "Kapalı Bırak"
#: js/ui/keyboard.js:207 #: js/ui/keyboard.js:225
msgid "Region & Language Settings" msgid "Region & Language Settings"
msgstr "Bölge ve Dil Ayarları" msgstr "Bölge ve Dil Ayarları"
@ -1457,7 +1473,7 @@ msgstr "Ekran Kilidi devre dışı"
msgid "Screen Locking requires the GNOME display manager." msgid "Screen Locking requires the GNOME display manager."
msgstr "Ekran Kilitleme, GNOME ekran yöneticisi gerektirir." msgstr "Ekran Kilitleme, GNOME ekran yöneticisi gerektirir."
#: js/ui/messageTray.js:1547 #: js/ui/messageTray.js:1476
msgid "System Information" msgid "System Information"
msgstr "Sistem Bilgisi" msgstr "Sistem Bilgisi"
@ -1469,13 +1485,13 @@ msgstr "Bilinmeyen sanatçı"
msgid "Unknown title" msgid "Unknown title"
msgstr "Bilinmeyen başlık" msgstr "Bilinmeyen başlık"
#: js/ui/overview.js:73 #: js/ui/overview.js:74
msgid "Undo" msgid "Undo"
msgstr "Geri Al" msgstr "Geri Al"
#. Translators: This is the main view to select #. Translators: This is the main view to select
#. activities. See also note for "Activities" string. #. activities. See also note for "Activities" string.
#: js/ui/overview.js:86 #: js/ui/overview.js:87
msgid "Overview" msgid "Overview"
msgstr "Genel Görünüm" msgstr "Genel Görünüm"
@ -1483,7 +1499,7 @@ msgstr "Genel Görünüm"
#. in the search entry when no search is #. in the search entry when no search is
#. active; it should not exceed ~30 #. active; it should not exceed ~30
#. characters. #. characters.
#: js/ui/overview.js:107 #: js/ui/overview.js:108
msgid "Type to search" msgid "Type to search"
msgstr "Aramak için yaz" msgstr "Aramak için yaz"
@ -2131,11 +2147,11 @@ msgstr "Thunderbolt yetkilendirme hatası"
msgid "Could not authorize the Thunderbolt device: %s" msgid "Could not authorize the Thunderbolt device: %s"
msgstr "Thunderbolt aygıtı yetkilendirilemedi: %s" msgstr "Thunderbolt aygıtı yetkilendirilemedi: %s"
#: js/ui/status/volume.js:154 #: js/ui/status/volume.js:155
msgid "Volume changed" msgid "Volume changed"
msgstr "Bölüm değişti" msgstr "Bölüm değişti"
#: js/ui/status/volume.js:225 #: js/ui/status/volume.js:217
msgid "Volume" msgid "Volume"
msgstr "Bölüm" msgstr "Bölüm"
@ -2181,11 +2197,11 @@ msgstr "Kilidi açmak için yukarı kaydır"
msgid "Click or press a key to unlock" msgid "Click or press a key to unlock"
msgstr "Kilidi açmak için tıklayın veya tuşa basın" msgstr "Kilidi açmak için tıklayın veya tuşa basın"
#: js/ui/unlockDialog.js:550 #: js/ui/unlockDialog.js:555
msgid "Unlock Window" msgid "Unlock Window"
msgstr "Kilit Açma Penceresi" msgstr "Kilit Açma Penceresi"
#: js/ui/unlockDialog.js:559 #: js/ui/unlockDialog.js:564
msgid "Log in as another user" msgid "Log in as another user"
msgstr "Başka kullanıcı olarak oturum aç" msgstr "Başka kullanıcı olarak oturum aç"
@ -2319,12 +2335,12 @@ msgstr "Oturum açma ekranı için -“gdm” gibi- özel kip kullan"
msgid "List possible modes" msgid "List possible modes"
msgstr "Olası kipleri listele" msgstr "Olası kipleri listele"
#: src/shell-app.c:286 #: src/shell-app.c:268
msgctxt "program" msgctxt "program"
msgid "Unknown" msgid "Unknown"
msgstr "Bilinmeyen" msgstr "Bilinmeyen"
#: src/shell-app.c:537 #: src/shell-app.c:519
#, c-format #, c-format
msgid "Failed to launch “%s”" msgid "Failed to launch “%s”"
msgstr "“%s” başlatılamadı" msgstr "“%s” başlatılamadı"

194
po/uk.po
View File

@ -10,8 +10,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell master\n" "Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2020-06-05 23:11+0000\n" "POT-Creation-Date: 2020-07-20 16:18+0000\n"
"PO-Revision-Date: 2020-06-06 15:53+0300\n" "PO-Revision-Date: 2020-07-21 08:42+0300\n"
"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n" "Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
"Language-Team: Ukrainian <kde-i18n-uk@kde.org>\n" "Language-Team: Ukrainian <kde-i18n-uk@kde.org>\n"
"Language: uk\n" "Language: uk\n"
@ -216,89 +216,106 @@ msgid ""
"shell." "shell."
msgstr "Вмикає D-Bus API для самоаналізу стану оболонки." msgstr "Вмикає D-Bus API для самоаналізу стану оболонки."
#: data/org.gnome.shell.gschema.xml.in:119 #: data/org.gnome.shell.gschema.xml.in:114
msgid "Layout of the app picker"
msgstr "Компонування засобу вибору програм"
#: data/org.gnome.shell.gschema.xml.in:115
msgid ""
"Layout of the app picker. Each entry in the array is a page. Pages are "
"stored in the order they appear in GNOME Shell. Each page contains an "
"“application id” → 'data' pair. Currently, the following values are stored "
"as 'data': • “position”: the position of the application icon in the page"
msgstr ""
"Компонування засобу вибору програм. Кожен запис у цьому масиві є сторінкою."
" Сторінки зберігаються у порядку, у якому їх буде показано у GNOME Shell."
" Кожна сторінка містить пану записів “ідентифікатор програми” → 'дані'. У"
" поточній версії як 'дані' може бути збережено такі значення: • “позиція”:"
" позиція піктограми програми на сторінці"
#: data/org.gnome.shell.gschema.xml.in:130
msgid "Keybinding to open the application menu" msgid "Keybinding to open the application menu"
msgstr "Комбінація клавіш, щоб відкрити меню програм" msgstr "Комбінація клавіш, щоб відкрити меню програм"
#: data/org.gnome.shell.gschema.xml.in:120 #: data/org.gnome.shell.gschema.xml.in:131
msgid "Keybinding to open the application menu." msgid "Keybinding to open the application menu."
msgstr "Комбінація клавіш, щоб відкрити меню програм." msgstr "Комбінація клавіш, щоб відкрити меню програм."
#: data/org.gnome.shell.gschema.xml.in:126 #: data/org.gnome.shell.gschema.xml.in:137
msgid "Keybinding to open the “Show Applications” view" msgid "Keybinding to open the “Show Applications” view"
msgstr "Комбінація клавіш, щоб «Показати програми»" msgstr "Комбінація клавіш, щоб «Показати програми»"
#: data/org.gnome.shell.gschema.xml.in:127 #: data/org.gnome.shell.gschema.xml.in:138
msgid "" msgid ""
"Keybinding to open the “Show Applications” view of the Activities Overview." "Keybinding to open the “Show Applications” view of the Activities Overview."
msgstr "Комбінація клавіш, щоб «Показати програми» в огляді діяльності." msgstr "Комбінація клавіш, щоб «Показати програми» в огляді діяльності."
#: data/org.gnome.shell.gschema.xml.in:134 #: data/org.gnome.shell.gschema.xml.in:145
msgid "Keybinding to open the overview" msgid "Keybinding to open the overview"
msgstr "Комбінація клавіш, щоб відкрити огляд" msgstr "Комбінація клавіш, щоб відкрити огляд"
#: data/org.gnome.shell.gschema.xml.in:135 #: data/org.gnome.shell.gschema.xml.in:146
msgid "Keybinding to open the Activities Overview." msgid "Keybinding to open the Activities Overview."
msgstr "Комбінація клавіш, щоб відкрити огляд діяльності." msgstr "Комбінація клавіш, щоб відкрити огляд діяльності."
#: data/org.gnome.shell.gschema.xml.in:141 #: data/org.gnome.shell.gschema.xml.in:152
msgid "Keybinding to toggle the visibility of the notification list" msgid "Keybinding to toggle the visibility of the notification list"
msgstr "Комбінація клавіш, щоб змінювати видимість переліку сповіщень" msgstr "Комбінація клавіш, щоб змінювати видимість переліку сповіщень"
#: data/org.gnome.shell.gschema.xml.in:142 #: data/org.gnome.shell.gschema.xml.in:153
msgid "Keybinding to toggle the visibility of the notification list." msgid "Keybinding to toggle the visibility of the notification list."
msgstr "Комбінація клавіш, щоб змінювати видимість переліку сповіщень." msgstr "Комбінація клавіш, щоб змінювати видимість переліку сповіщень."
#: data/org.gnome.shell.gschema.xml.in:148 #: data/org.gnome.shell.gschema.xml.in:159
msgid "Keybinding to focus the active notification" msgid "Keybinding to focus the active notification"
msgstr "Комбінація клавіш, щоб перейти до активних сповіщень" msgstr "Комбінація клавіш, щоб перейти до активних сповіщень"
#: data/org.gnome.shell.gschema.xml.in:149 #: data/org.gnome.shell.gschema.xml.in:160
msgid "Keybinding to focus the active notification." msgid "Keybinding to focus the active notification."
msgstr "Комбінація клавіш, щоб перейти до активних сповіщень." msgstr "Комбінація клавіш, щоб перейти до активних сповіщень."
#: data/org.gnome.shell.gschema.xml.in:155 #: data/org.gnome.shell.gschema.xml.in:166
msgid "Switch to application 1" msgid "Switch to application 1"
msgstr "Перемкнутися на програму 1" msgstr "Перемкнутися на програму 1"
#: data/org.gnome.shell.gschema.xml.in:159 #: data/org.gnome.shell.gschema.xml.in:170
msgid "Switch to application 2" msgid "Switch to application 2"
msgstr "Перемкнутися на програму 2" msgstr "Перемкнутися на програму 2"
#: data/org.gnome.shell.gschema.xml.in:163 #: data/org.gnome.shell.gschema.xml.in:174
msgid "Switch to application 3" msgid "Switch to application 3"
msgstr "Перемкнутися на програму 3" msgstr "Перемкнутися на програму 3"
#: data/org.gnome.shell.gschema.xml.in:167 #: data/org.gnome.shell.gschema.xml.in:178
msgid "Switch to application 4" msgid "Switch to application 4"
msgstr "Перемкнутися на програму 4" msgstr "Перемкнутися на програму 4"
#: data/org.gnome.shell.gschema.xml.in:171 #: data/org.gnome.shell.gschema.xml.in:182
msgid "Switch to application 5" msgid "Switch to application 5"
msgstr "Перемкнутися на програму 5" msgstr "Перемкнутися на програму 5"
#: data/org.gnome.shell.gschema.xml.in:175 #: data/org.gnome.shell.gschema.xml.in:186
msgid "Switch to application 6" msgid "Switch to application 6"
msgstr "Перемкнутися на програму 6" msgstr "Перемкнутися на програму 6"
#: data/org.gnome.shell.gschema.xml.in:179 #: data/org.gnome.shell.gschema.xml.in:190
msgid "Switch to application 7" msgid "Switch to application 7"
msgstr "Перемкнутися на програму 7" msgstr "Перемкнутися на програму 7"
#: data/org.gnome.shell.gschema.xml.in:183 #: data/org.gnome.shell.gschema.xml.in:194
msgid "Switch to application 8" msgid "Switch to application 8"
msgstr "Перемкнутися на програму 8" msgstr "Перемкнутися на програму 8"
#: data/org.gnome.shell.gschema.xml.in:187 #: data/org.gnome.shell.gschema.xml.in:198
msgid "Switch to application 9" msgid "Switch to application 9"
msgstr "Перемкнутися на програму 9" msgstr "Перемкнутися на програму 9"
#: data/org.gnome.shell.gschema.xml.in:196 #: data/org.gnome.shell.gschema.xml.in:207
#: data/org.gnome.shell.gschema.xml.in:223 #: data/org.gnome.shell.gschema.xml.in:234
msgid "Limit switcher to current workspace." msgid "Limit switcher to current workspace."
msgstr "Обмежити перемикач на поточний робочий простір." msgstr "Обмежити перемикач на поточний робочий простір."
#: data/org.gnome.shell.gschema.xml.in:197 #: data/org.gnome.shell.gschema.xml.in:208
msgid "" msgid ""
"If true, only applications that have windows on the current workspace are " "If true, only applications that have windows on the current workspace are "
"shown in the switcher. Otherwise, all applications are included." "shown in the switcher. Otherwise, all applications are included."
@ -306,11 +323,11 @@ msgstr ""
"Якщо це вказано, то тільки програми з поточного робочого простору будуть " "Якщо це вказано, то тільки програми з поточного робочого простору будуть "
"показані в перемикачі. Інакше — програми з усіх просторів." "показані в перемикачі. Інакше — програми з усіх просторів."
#: data/org.gnome.shell.gschema.xml.in:214 #: data/org.gnome.shell.gschema.xml.in:225
msgid "The application icon mode." msgid "The application icon mode."
msgstr "Режим піктограм для програм." msgstr "Режим піктограм для програм."
#: data/org.gnome.shell.gschema.xml.in:215 #: data/org.gnome.shell.gschema.xml.in:226
msgid "" msgid ""
"Configures how the windows are shown in the switcher. Valid possibilities " "Configures how the windows are shown in the switcher. Valid possibilities "
"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-" "are “thumbnail-only” (shows a thumbnail of the window), “app-icon-"
@ -320,7 +337,7 @@ msgstr ""
"«thumbnail-only» (показує мініатюру вікна), «app-icon-only» (показує тільки " "«thumbnail-only» (показує мініатюру вікна), «app-icon-only» (показує тільки "
"піктограми програм) або «both» (обидва)." "піктограми програм) або «both» (обидва)."
#: data/org.gnome.shell.gschema.xml.in:224 #: data/org.gnome.shell.gschema.xml.in:235
msgid "" msgid ""
"If true, only windows from the current workspace are shown in the switcher. " "If true, only windows from the current workspace are shown in the switcher. "
"Otherwise, all windows are included." "Otherwise, all windows are included."
@ -328,57 +345,57 @@ msgstr ""
"Якщо це вказано, то тільки вікна з поточного робочого простору будуть " "Якщо це вказано, то тільки вікна з поточного робочого простору будуть "
"показані в перемикачі. Інакше — вікна з усіх просторів." "показані в перемикачі. Інакше — вікна з усіх просторів."
#: data/org.gnome.shell.gschema.xml.in:234 #: data/org.gnome.shell.gschema.xml.in:245
msgid "Locations" msgid "Locations"
msgstr "Місцевості" msgstr "Місцевості"
#: data/org.gnome.shell.gschema.xml.in:235 #: data/org.gnome.shell.gschema.xml.in:246
msgid "The locations to show in world clocks" msgid "The locations to show in world clocks"
msgstr "Місцевість для світового годинника" msgstr "Місцевість для світового годинника"
#: data/org.gnome.shell.gschema.xml.in:245 #: data/org.gnome.shell.gschema.xml.in:256
msgid "Automatic location" msgid "Automatic location"
msgstr "Автоматичне визначення місцевості" msgstr "Автоматичне визначення місцевості"
#: data/org.gnome.shell.gschema.xml.in:246 #: data/org.gnome.shell.gschema.xml.in:257
msgid "Whether to fetch the current location or not" msgid "Whether to fetch the current location or not"
msgstr "Чи одержувати поточну локацію" msgstr "Чи одержувати поточну локацію"
#: data/org.gnome.shell.gschema.xml.in:253 #: data/org.gnome.shell.gschema.xml.in:264
msgid "Location" msgid "Location"
msgstr "Місцевість" msgstr "Місцевість"
#: data/org.gnome.shell.gschema.xml.in:254 #: data/org.gnome.shell.gschema.xml.in:265
msgid "The location for which to show a forecast" msgid "The location for which to show a forecast"
msgstr "Місцевість для прогнозу погоди" msgstr "Місцевість для прогнозу погоди"
#: data/org.gnome.shell.gschema.xml.in:266 #: data/org.gnome.shell.gschema.xml.in:277
msgid "Attach modal dialog to the parent window" msgid "Attach modal dialog to the parent window"
msgstr "Приєднати модальне вікно до батьківського вікна" msgstr "Приєднати модальне вікно до батьківського вікна"
#: data/org.gnome.shell.gschema.xml.in:267 #: data/org.gnome.shell.gschema.xml.in:278
#: data/org.gnome.shell.gschema.xml.in:276 #: data/org.gnome.shell.gschema.xml.in:287
#: data/org.gnome.shell.gschema.xml.in:284 #: data/org.gnome.shell.gschema.xml.in:295
#: data/org.gnome.shell.gschema.xml.in:292 #: data/org.gnome.shell.gschema.xml.in:303
#: data/org.gnome.shell.gschema.xml.in:300 #: data/org.gnome.shell.gschema.xml.in:311
msgid "" msgid ""
"This key overrides the key in org.gnome.mutter when running GNOME Shell." "This key overrides the key in org.gnome.mutter when running GNOME Shell."
msgstr "" msgstr ""
"Цей ключ перевизначає ключ у org.gnome.mutter, коли запущено GNOME Shell." "Цей ключ перевизначає ключ у org.gnome.mutter, коли запущено GNOME Shell."
#: data/org.gnome.shell.gschema.xml.in:275 #: data/org.gnome.shell.gschema.xml.in:286
msgid "Enable edge tiling when dropping windows on screen edges" msgid "Enable edge tiling when dropping windows on screen edges"
msgstr "Увімкнути розбиття країв, коли кладуться вікна на краї екрана" msgstr "Увімкнути розбиття країв, коли кладуться вікна на краї екрана"
#: data/org.gnome.shell.gschema.xml.in:283 #: data/org.gnome.shell.gschema.xml.in:294
msgid "Workspaces are managed dynamically" msgid "Workspaces are managed dynamically"
msgstr "Робочі простори організовуються динамічно" msgstr "Робочі простори організовуються динамічно"
#: data/org.gnome.shell.gschema.xml.in:291 #: data/org.gnome.shell.gschema.xml.in:302
msgid "Workspaces only on primary monitor" msgid "Workspaces only on primary monitor"
msgstr "Робочий простір лише на основному моніторі" msgstr "Робочий простір лише на основному моніторі"
#: data/org.gnome.shell.gschema.xml.in:299 #: data/org.gnome.shell.gschema.xml.in:310
msgid "Delay focus changes in mouse mode until the pointer stops moving" msgid "Delay focus changes in mouse mode until the pointer stops moving"
msgstr "Затримувати зміни фокусу миші, поки вказівник не перестане рухатись" msgstr "Затримувати зміни фокусу миші, поки вказівник не перестане рухатись"
@ -414,7 +431,7 @@ msgstr "Відвідати сторінку розширення"
#: js/gdm/authPrompt.js:135 js/ui/audioDeviceSelection.js:57 #: js/gdm/authPrompt.js:135 js/ui/audioDeviceSelection.js:57
#: js/ui/components/networkAgent.js:110 js/ui/components/polkitAgent.js:139 #: js/ui/components/networkAgent.js:110 js/ui/components/polkitAgent.js:139
#: js/ui/endSessionDialog.js:369 js/ui/extensionDownloader.js:181 #: js/ui/endSessionDialog.js:369 js/ui/extensionDownloader.js:183
#: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386 #: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386
#: js/ui/status/network.js:916 subprojects/extensions-app/js/main.js:149 #: js/ui/status/network.js:916 subprojects/extensions-app/js/main.js:149
msgid "Cancel" msgid "Cancel"
@ -456,7 +473,7 @@ msgstr "Користувач"
msgid "Login Window" msgid "Login Window"
msgstr "Вікно входу" msgstr "Вікно входу"
#: js/gdm/util.js:345 #: js/gdm/util.js:355
msgid "Authentication error" msgid "Authentication error"
msgstr "Помилка розпізнавання" msgstr "Помилка розпізнавання"
@ -465,7 +482,7 @@ msgstr "Помилка розпізнавання"
#. as a cue to display our own message. #. as a cue to display our own message.
#. Translators: this message is shown below the password entry field #. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead #. to indicate the user can swipe their finger instead
#: js/gdm/util.js:471 #: js/gdm/util.js:481
msgid "(or swipe finger)" msgid "(or swipe finger)"
msgstr "(або проведіть пальцем)" msgstr "(або проведіть пальцем)"
@ -713,36 +730,36 @@ msgstr "Заборонити доступ"
msgid "Grant Access" msgid "Grant Access"
msgstr "Надати доступ" msgstr "Надати доступ"
#: js/ui/appDisplay.js:956 #: js/ui/appDisplay.js:1297
msgid "Unnamed Folder" msgid "Unnamed Folder"
msgstr "Неназвана тека" msgstr "Неназвана тека"
#. Translators: This is the heading of a list of open windows #. Translators: This is the heading of a list of open windows
#: js/ui/appDisplay.js:2215 js/ui/panel.js:75 #: js/ui/appDisplay.js:2767 js/ui/panel.js:75
msgid "Open Windows" msgid "Open Windows"
msgstr "Відкрити вікна" msgstr "Відкрити вікна"
#: js/ui/appDisplay.js:2234 js/ui/panel.js:82 #: js/ui/appDisplay.js:2786 js/ui/panel.js:82
msgid "New Window" msgid "New Window"
msgstr "Нове вікно" msgstr "Нове вікно"
#: js/ui/appDisplay.js:2250 #: js/ui/appDisplay.js:2802
msgid "Launch using Integrated Graphics Card" msgid "Launch using Integrated Graphics Card"
msgstr "Запустити через інтегровану графічну плату" msgstr "Запустити через інтегровану графічну плату"
#: js/ui/appDisplay.js:2251 #: js/ui/appDisplay.js:2803
msgid "Launch using Discrete Graphics Card" msgid "Launch using Discrete Graphics Card"
msgstr "Запустити через дискретну графічну плату" msgstr "Запустити через дискретну графічну плату"
#: js/ui/appDisplay.js:2279 js/ui/dash.js:239 #: js/ui/appDisplay.js:2831 js/ui/dash.js:239
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Вилучити з улюбленого" msgstr "Вилучити з улюбленого"
#: js/ui/appDisplay.js:2285 #: js/ui/appDisplay.js:2837
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Додати до улюбленого" msgstr "Додати до улюбленого"
#: js/ui/appDisplay.js:2295 js/ui/panel.js:93 #: js/ui/appDisplay.js:2847 js/ui/panel.js:93
msgid "Show Details" msgid "Show Details"
msgstr "Показати подробиці" msgstr "Показати подробиці"
@ -772,7 +789,7 @@ msgstr "Навушники"
msgid "Headset" msgid "Headset"
msgstr "Гарнітура" msgstr "Гарнітура"
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:273 #: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:272
msgid "Microphone" msgid "Microphone"
msgstr "Мікрофон" msgstr "Мікрофон"
@ -1073,14 +1090,12 @@ msgstr "%A %-d %B %Y"
#. Translators: Shown on calendar heading when selected day occurs on current year #. Translators: Shown on calendar heading when selected day occurs on current year
#: js/ui/dateMenu.js:151 #: js/ui/dateMenu.js:151
#| msgid "%B %-d %Y"
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%B %-d" msgid "%B %-d"
msgstr "%-d %B" msgstr "%-d %B"
#. Translators: Shown on calendar heading when selected day occurs on different year #. Translators: Shown on calendar heading when selected day occurs on different year
#: js/ui/dateMenu.js:154 #: js/ui/dateMenu.js:154
#| msgid "%B %-d %Y"
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%B %-d %Y" msgid "%B %-d %Y"
msgstr "%-d %B %Y" msgstr "%-d %B %Y"
@ -1293,15 +1308,15 @@ msgstr "%s (віддалено)"
msgid "%s (console)" msgid "%s (console)"
msgstr "%s (консоль)" msgstr "%s (консоль)"
#: js/ui/extensionDownloader.js:185 #: js/ui/extensionDownloader.js:187
msgid "Install" msgid "Install"
msgstr "Встановити" msgstr "Встановити"
#: js/ui/extensionDownloader.js:191 #: js/ui/extensionDownloader.js:193
msgid "Install Extension" msgid "Install Extension"
msgstr "Встановити розширення" msgstr "Встановити розширення"
#: js/ui/extensionDownloader.js:192 #: js/ui/extensionDownloader.js:194
#, javascript-format #, javascript-format
msgid "Download and install “%s” from extensions.gnome.org?" msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "Звантажити і встановити «%s» з extensions.gnome.org?" msgstr "Звантажити і встановити «%s» з extensions.gnome.org?"
@ -1334,11 +1349,11 @@ msgstr "Програма бажає успадкувати скорочення"
msgid "You can restore shortcuts by pressing %s." msgid "You can restore shortcuts by pressing %s."
msgstr "Можна відновити скорочення, натиснувши %s." msgstr "Можна відновити скорочення, натиснувши %s."
#: js/ui/inhibitShortcutsDialog.js:98 #: js/ui/inhibitShortcutsDialog.js:100
msgid "Deny" msgid "Deny"
msgstr "Заборонити" msgstr "Заборонити"
#: js/ui/inhibitShortcutsDialog.js:105 #: js/ui/inhibitShortcutsDialog.js:107
msgid "Allow" msgid "Allow"
msgstr "Дозволити" msgstr "Дозволити"
@ -1404,7 +1419,7 @@ msgstr "Вимкнути"
msgid "Leave Off" msgid "Leave Off"
msgstr "Покинути" msgstr "Покинути"
#: js/ui/keyboard.js:207 #: js/ui/keyboard.js:225
msgid "Region & Language Settings" msgid "Region & Language Settings"
msgstr "Параметри регіону та мови" msgstr "Параметри регіону та мови"
@ -1477,7 +1492,7 @@ msgstr "Блокування екрана вимкнено"
msgid "Screen Locking requires the GNOME display manager." msgid "Screen Locking requires the GNOME display manager."
msgstr "Блокування екрана потребує керування входом GNOME." msgstr "Блокування екрана потребує керування входом GNOME."
#: js/ui/messageTray.js:1547 #: js/ui/messageTray.js:1476
msgid "System Information" msgid "System Information"
msgstr "Інформація про систему" msgstr "Інформація про систему"
@ -1489,13 +1504,13 @@ msgstr "Невідомий виконавець"
msgid "Unknown title" msgid "Unknown title"
msgstr "Невідома назва" msgstr "Невідома назва"
#: js/ui/overview.js:73 #: js/ui/overview.js:74
msgid "Undo" msgid "Undo"
msgstr "Повернути" msgstr "Повернути"
#. Translators: This is the main view to select #. Translators: This is the main view to select
#. activities. See also note for "Activities" string. #. activities. See also note for "Activities" string.
#: js/ui/overview.js:86 #: js/ui/overview.js:87
msgid "Overview" msgid "Overview"
msgstr "Огляд" msgstr "Огляд"
@ -1503,7 +1518,7 @@ msgstr "Огляд"
#. in the search entry when no search is #. in the search entry when no search is
#. active; it should not exceed ~30 #. active; it should not exceed ~30
#. characters. #. characters.
#: js/ui/overview.js:107 #: js/ui/overview.js:108
msgid "Type to search" msgid "Type to search"
msgstr "Введіть текст для пошуку" msgstr "Введіть текст для пошуку"
@ -2162,11 +2177,11 @@ msgstr "Помилка завірення Thunderbolt"
msgid "Could not authorize the Thunderbolt device: %s" msgid "Could not authorize the Thunderbolt device: %s"
msgstr "Неможливо завірити пристрій Thunderbolt: %s" msgstr "Неможливо завірити пристрій Thunderbolt: %s"
#: js/ui/status/volume.js:154 #: js/ui/status/volume.js:155
msgid "Volume changed" msgid "Volume changed"
msgstr "Гучність змінено" msgstr "Гучність змінено"
#: js/ui/status/volume.js:225 #: js/ui/status/volume.js:217
msgid "Volume" msgid "Volume"
msgstr "Гучність" msgstr "Гучність"
@ -2212,11 +2227,11 @@ msgstr "Проведіть вгору для розблокування"
msgid "Click or press a key to unlock" msgid "Click or press a key to unlock"
msgstr "Клацніть або натисніть клавішу для розблокування" msgstr "Клацніть або натисніть клавішу для розблокування"
#: js/ui/unlockDialog.js:550 #: js/ui/unlockDialog.js:555
msgid "Unlock Window" msgid "Unlock Window"
msgstr "Розблокувати вікно" msgstr "Розблокувати вікно"
#: js/ui/unlockDialog.js:559 #: js/ui/unlockDialog.js:564
msgid "Log in as another user" msgid "Log in as another user"
msgstr "Увійти як інший користувач" msgstr "Увійти як інший користувач"
@ -2353,12 +2368,12 @@ msgstr "Використовувати вказаний режим, прикла
msgid "List possible modes" msgid "List possible modes"
msgstr "Перелік можливих режимів" msgstr "Перелік можливих режимів"
#: src/shell-app.c:286 #: src/shell-app.c:268
msgctxt "program" msgctxt "program"
msgid "Unknown" msgid "Unknown"
msgstr "Невідомо" msgstr "Невідомо"
#: src/shell-app.c:537 #: src/shell-app.c:519
#, c-format #, c-format
msgid "Failed to launch “%s”" msgid "Failed to launch “%s”"
msgstr "Не вдалося запустити «%s»" msgstr "Не вдалося запустити «%s»"
@ -2938,36 +2953,3 @@ msgstr[3] "%u вхід"
#: subprojects/gvc/gvc-mixer-control.c:2766 #: subprojects/gvc/gvc-mixer-control.c:2766
msgid "System Sounds" msgid "System Sounds"
msgstr "Системні звуки" msgstr "Системні звуки"
#~ msgid "Frequently used applications will appear here"
#~ msgstr "Часто використовувані програми будуть з'являтись тут"
#~ msgid "Frequent"
#~ msgstr "Частовживане"
#~ msgid "All"
#~ msgstr "Усе"
#~ msgctxt "calendar heading"
#~ msgid "%A, %B %-d"
#~ msgstr "%A, %-d %B"
#~ msgctxt "calendar heading"
#~ msgid "%A, %B %-d, %Y"
#~ msgstr "%A, %-d %B, %Y"
#~ msgid "Copy Error"
#~ msgstr "Скопіювати помилку"
#~ msgid "%d Connected"
#~ msgid_plural "%d Connected"
#~ msgstr[0] "%d під'єднано"
#~ msgstr[1] "%d під'єднано"
#~ msgstr[2] "%d під'єднано"
#~ msgstr[3] "%d під'єднано"
#~ msgid "Off"
#~ msgstr "Вимкнено"
#~ msgid "On"
#~ msgstr "Увімкнено"

View File

@ -23,8 +23,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell master\n" "Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2020-05-28 11:29+0000\n" "POT-Creation-Date: 2020-07-12 02:14+0000\n"
"PO-Revision-Date: 2020-05-29 09:03-0400\n" "PO-Revision-Date: 2020-07-11 22:32-0400\n"
"Last-Translator: Boyuan Yang <073plan@gmail.com>\n" "Last-Translator: Boyuan Yang <073plan@gmail.com>\n"
"Language-Team: Chinese (China) <i18n-zh@googlegroups.com>\n" "Language-Team: Chinese (China) <i18n-zh@googlegroups.com>\n"
"Language: zh_CN\n" "Language: zh_CN\n"
@ -444,7 +444,7 @@ msgstr "用户名"
msgid "Login Window" msgid "Login Window"
msgstr "登录窗口" msgstr "登录窗口"
#: js/gdm/util.js:345 #: js/gdm/util.js:355
msgid "Authentication error" msgid "Authentication error"
msgstr "认证出错" msgstr "认证出错"
@ -453,7 +453,7 @@ msgstr "认证出错"
#. as a cue to display our own message. #. as a cue to display our own message.
#. Translators: this message is shown below the password entry field #. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead #. to indicate the user can swipe their finger instead
#: js/gdm/util.js:471 #: js/gdm/util.js:481
msgid "(or swipe finger)" msgid "(or swipe finger)"
msgstr "(或滑动手指)" msgstr "(或滑动手指)"
@ -559,7 +559,7 @@ msgid "%d hour ago"
msgid_plural "%d hours ago" msgid_plural "%d hours ago"
msgstr[0] "%d 小时前" msgstr[0] "%d 小时前"
#: js/misc/util.js:191 #: js/misc/util.js:191 js/ui/dateMenu.js:162
msgid "Yesterday" msgid "Yesterday"
msgstr "昨天" msgstr "昨天"
@ -672,44 +672,44 @@ msgstr "您到热点登录的连接不安全。您在此页面输入的密码或
#. No support for non-modal system dialogs, so ignore the option #. No support for non-modal system dialogs, so ignore the option
#. let modal = options['modal'] || true; #. let modal = options['modal'] || true;
#: js/ui/accessDialog.js:39 js/ui/status/location.js:374 #: js/ui/accessDialog.js:39 js/ui/status/location.js:369
msgid "Deny Access" msgid "Deny Access"
msgstr "拒绝访问" msgstr "拒绝访问"
#: js/ui/accessDialog.js:40 js/ui/status/location.js:377 #: js/ui/accessDialog.js:40 js/ui/status/location.js:372
msgid "Grant Access" msgid "Grant Access"
msgstr "允许访问" msgstr "允许访问"
#: js/ui/appDisplay.js:960 #: js/ui/appDisplay.js:903
msgid "Unnamed Folder" msgid "Unnamed Folder"
msgstr "未命名文件夹" msgstr "未命名文件夹"
#. Translators: This is the heading of a list of open windows #. Translators: This is the heading of a list of open windows
#: js/ui/appDisplay.js:2219 js/ui/panel.js:75 #: js/ui/appDisplay.js:2225 js/ui/panel.js:75
msgid "Open Windows" msgid "Open Windows"
msgstr "打开窗口" msgstr "打开窗口"
#: js/ui/appDisplay.js:2238 js/ui/panel.js:82 #: js/ui/appDisplay.js:2244 js/ui/panel.js:82
msgid "New Window" msgid "New Window"
msgstr "新窗口" msgstr "新窗口"
#: js/ui/appDisplay.js:2254 #: js/ui/appDisplay.js:2260
msgid "Launch using Integrated Graphics Card" msgid "Launch using Integrated Graphics Card"
msgstr "使用集成显卡启动" msgstr "使用集成显卡启动"
#: js/ui/appDisplay.js:2255 #: js/ui/appDisplay.js:2261
msgid "Launch using Discrete Graphics Card" msgid "Launch using Discrete Graphics Card"
msgstr "使用独立显卡启动" msgstr "使用独立显卡启动"
#: js/ui/appDisplay.js:2283 js/ui/dash.js:239 #: js/ui/appDisplay.js:2289 js/ui/dash.js:239
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "从收藏夹中移除" msgstr "从收藏夹中移除"
#: js/ui/appDisplay.js:2289 #: js/ui/appDisplay.js:2295
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "添加到收藏夹" msgstr "添加到收藏夹"
#: js/ui/appDisplay.js:2299 js/ui/panel.js:93 #: js/ui/appDisplay.js:2305 js/ui/panel.js:93
msgid "Show Details" msgid "Show Details"
msgstr "显示细节" msgstr "显示细节"
@ -739,7 +739,7 @@ msgstr "耳机"
msgid "Headset" msgid "Headset"
msgstr "耳麦" msgstr "耳麦"
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:273 #: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:272
msgid "Microphone" msgid "Microphone"
msgstr "麦克风" msgstr "麦克风"
@ -756,7 +756,7 @@ msgid "Settings"
msgstr "设置" msgstr "设置"
#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). #. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday).
#: js/ui/calendar.js:41 #: js/ui/calendar.js:36
msgctxt "calendar-no-work" msgctxt "calendar-no-work"
msgid "06" msgid "06"
msgstr "06" msgstr "06"
@ -766,43 +766,43 @@ msgstr "06"
#. * NOTE: These grid abbreviations are always shown together #. * NOTE: These grid abbreviations are always shown together
#. * and in order, e.g. "S M T W T F S". #. * and in order, e.g. "S M T W T F S".
#. #.
#: js/ui/calendar.js:70 #: js/ui/calendar.js:65
msgctxt "grid sunday" msgctxt "grid sunday"
msgid "S" msgid "S"
msgstr "日" msgstr "日"
#. Translators: Calendar grid abbreviation for Monday #. Translators: Calendar grid abbreviation for Monday
#: js/ui/calendar.js:72 #: js/ui/calendar.js:67
msgctxt "grid monday" msgctxt "grid monday"
msgid "M" msgid "M"
msgstr "一" msgstr "一"
#. Translators: Calendar grid abbreviation for Tuesday #. Translators: Calendar grid abbreviation for Tuesday
#: js/ui/calendar.js:74 #: js/ui/calendar.js:69
msgctxt "grid tuesday" msgctxt "grid tuesday"
msgid "T" msgid "T"
msgstr "二" msgstr "二"
#. Translators: Calendar grid abbreviation for Wednesday #. Translators: Calendar grid abbreviation for Wednesday
#: js/ui/calendar.js:76 #: js/ui/calendar.js:71
msgctxt "grid wednesday" msgctxt "grid wednesday"
msgid "W" msgid "W"
msgstr "三" msgstr "三"
#. Translators: Calendar grid abbreviation for Thursday #. Translators: Calendar grid abbreviation for Thursday
#: js/ui/calendar.js:78 #: js/ui/calendar.js:73
msgctxt "grid thursday" msgctxt "grid thursday"
msgid "T" msgid "T"
msgstr "四" msgstr "四"
#. Translators: Calendar grid abbreviation for Friday #. Translators: Calendar grid abbreviation for Friday
#: js/ui/calendar.js:80 #: js/ui/calendar.js:75
msgctxt "grid friday" msgctxt "grid friday"
msgid "F" msgid "F"
msgstr "五" msgstr "五"
#. Translators: Calendar grid abbreviation for Saturday #. Translators: Calendar grid abbreviation for Saturday
#: js/ui/calendar.js:82 #: js/ui/calendar.js:77
msgctxt "grid saturday" msgctxt "grid saturday"
msgid "S" msgid "S"
msgstr "六" msgstr "六"
@ -813,7 +813,7 @@ msgstr "六"
#. * "%OB" is the new format specifier introduced in glibc 2.27, #. * "%OB" is the new format specifier introduced in glibc 2.27,
#. * in most cases you should not change it. #. * in most cases you should not change it.
#. #.
#: js/ui/calendar.js:397 #: js/ui/calendar.js:392
msgid "%OB" msgid "%OB"
msgstr "%OB" msgstr "%OB"
@ -826,61 +826,37 @@ msgstr "%OB"
#. * in most cases you should not use the old "%B" here unless you #. * in most cases you should not use the old "%B" here unless you
#. * absolutely know what you are doing. #. * absolutely know what you are doing.
#. #.
#: js/ui/calendar.js:407 #: js/ui/calendar.js:402
msgid "%OB %Y" msgid "%OB %Y"
msgstr "%Y %OB" msgstr "%Y %OB"
#: js/ui/calendar.js:466 #: js/ui/calendar.js:461
msgid "Previous month" msgid "Previous month"
msgstr "上个月" msgstr "上个月"
#: js/ui/calendar.js:481 #: js/ui/calendar.js:476
msgid "Next month" msgid "Next month"
msgstr "下个月" msgstr "下个月"
#: js/ui/calendar.js:631 #: js/ui/calendar.js:626
#, no-javascript-format #, no-javascript-format
msgctxt "date day number format" msgctxt "date day number format"
msgid "%d" msgid "%d"
msgstr "%d" msgstr "%d"
#: js/ui/calendar.js:687 #: js/ui/calendar.js:682
msgid "Week %V" msgid "Week %V"
msgstr "第 %V 个星期" msgstr "第 %V 个星期"
#. Translators: Shown in calendar event list for all day events #: js/ui/calendar.js:895
#. * Keep it short, best if you can use less then 10 characters
#.
#: js/ui/calendar.js:762
msgctxt "event list time"
msgid "All Day"
msgstr "全天"
#. Translators: Shown on calendar heading when selected day occurs on current year
#: js/ui/calendar.js:900
msgctxt "calendar heading"
msgid "%A, %B %-d"
msgstr "%-m月%-d日 %A"
#. Translators: Shown on calendar heading when selected day occurs on different year
#: js/ui/calendar.js:903
msgctxt "calendar heading"
msgid "%A, %B %-d, %Y"
msgstr "%Y年%-m月%-d日 %A"
#: js/ui/calendar.js:1133
msgid "No Notifications" msgid "No Notifications"
msgstr "无通知" msgstr "无通知"
#: js/ui/calendar.js:1136 #: js/ui/calendar.js:949
msgid "No Events"
msgstr "无事件"
#: js/ui/calendar.js:1190
msgid "Do Not Disturb" msgid "Do Not Disturb"
msgstr "请勿打扰" msgstr "请勿打扰"
#: js/ui/calendar.js:1209 #: js/ui/calendar.js:968
msgid "Clear" msgid "Clear"
msgstr "清除" msgstr "清除"
@ -1030,7 +1006,7 @@ msgstr "抱歉,认证失败。请重试。"
msgid "%s is now known as %s" msgid "%s is now known as %s"
msgstr "%s 现在叫做 %s" msgstr "%s 现在叫做 %s"
#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:177 #: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:178
msgid "Windows" msgid "Windows"
msgstr "窗口" msgstr "窗口"
@ -1049,7 +1025,7 @@ msgstr "Dash"
#. * "Tue 9:29 AM"). The string itself should become a full date, e.g., #. * "Tue 9:29 AM"). The string itself should become a full date, e.g.,
#. * "February 17 2015". #. * "February 17 2015".
#. #.
#: js/ui/dateMenu.js:75 #: js/ui/dateMenu.js:79
msgid "%B %-d %Y" msgid "%B %-d %Y"
msgstr "%Y年%-m月%-d日" msgstr "%Y年%-m月%-d日"
@ -1057,35 +1033,67 @@ msgstr "%Y年%-m月%-d日"
#. * below the time in the shell; it should combine the weekday and the #. * below the time in the shell; it should combine the weekday and the
#. * date, e.g. "Tuesday February 17 2015". #. * date, e.g. "Tuesday February 17 2015".
#. #.
#: js/ui/dateMenu.js:82 #: js/ui/dateMenu.js:86
msgid "%A %B %e %Y" msgid "%A %B %e %Y"
msgstr "%Y年%-m月%-d日 %A" msgstr "%Y年%-m月%-d日 %A"
#: js/ui/dateMenu.js:162 #. Translators: Shown on calendar heading when selected day occurs on current year
#: js/ui/dateMenu.js:151
msgctxt "calendar heading"
msgid "%B %-d"
msgstr "%-m月%-d日"
#. Translators: Shown on calendar heading when selected day occurs on different year
#: js/ui/dateMenu.js:154
msgctxt "calendar heading"
msgid "%B %-d %Y"
msgstr "%Y年%-m月%-d日"
#: js/ui/dateMenu.js:160
msgid "Today"
msgstr "今天"
#: js/ui/dateMenu.js:164
msgid "Tomorrow"
msgstr "明天"
#. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters
#.
#: js/ui/dateMenu.js:180
msgctxt "event list time"
msgid "All Day"
msgstr "全天"
#: js/ui/dateMenu.js:231
msgid "No Events"
msgstr "无事件"
#: js/ui/dateMenu.js:348
msgid "Add world clocks…" msgid "Add world clocks…"
msgstr "添加世界时钟…" msgstr "添加世界时钟…"
#: js/ui/dateMenu.js:163 #: js/ui/dateMenu.js:349
msgid "World Clocks" msgid "World Clocks"
msgstr "世界时钟" msgstr "世界时钟"
#: js/ui/dateMenu.js:443 #: js/ui/dateMenu.js:629
msgid "Loading…" msgid "Loading…"
msgstr "正在载入……" msgstr "正在载入……"
#: js/ui/dateMenu.js:453 #: js/ui/dateMenu.js:639
msgid "Go online for weather information" msgid "Go online for weather information"
msgstr "通过互联网查看天气信息" msgstr "通过互联网查看天气信息"
#: js/ui/dateMenu.js:455 #: js/ui/dateMenu.js:641
msgid "Weather information is currently unavailable" msgid "Weather information is currently unavailable"
msgstr "天气信息目前不可用" msgstr "天气信息目前不可用"
#: js/ui/dateMenu.js:465 #: js/ui/dateMenu.js:651
msgid "Weather" msgid "Weather"
msgstr "天气" msgstr "天气"
#: js/ui/dateMenu.js:467 #: js/ui/dateMenu.js:653
msgid "Select weather location…" msgid "Select weather location…"
msgstr "选择天气地点…" msgstr "选择天气地点…"
@ -1268,11 +1276,11 @@ msgstr "某应用程序希望禁用快捷键"
msgid "You can restore shortcuts by pressing %s." msgid "You can restore shortcuts by pressing %s."
msgstr "按 %s 以恢复快捷键。" msgstr "按 %s 以恢复快捷键。"
#: js/ui/inhibitShortcutsDialog.js:98 #: js/ui/inhibitShortcutsDialog.js:100
msgid "Deny" msgid "Deny"
msgstr "拒绝" msgstr "拒绝"
#: js/ui/inhibitShortcutsDialog.js:105 #: js/ui/inhibitShortcutsDialog.js:107
msgid "Allow" msgid "Allow"
msgstr "允许" msgstr "允许"
@ -1337,7 +1345,7 @@ msgstr "关闭"
msgid "Leave Off" msgid "Leave Off"
msgstr "保持关闭" msgstr "保持关闭"
#: js/ui/keyboard.js:207 #: js/ui/keyboard.js:225
msgid "Region & Language Settings" msgid "Region & Language Settings"
msgstr "区域与语言设置" msgstr "区域与语言设置"
@ -1410,25 +1418,25 @@ msgstr "屏幕锁定已禁用"
msgid "Screen Locking requires the GNOME display manager." msgid "Screen Locking requires the GNOME display manager."
msgstr "屏幕锁定需要 GNOME 显示管理器。" msgstr "屏幕锁定需要 GNOME 显示管理器。"
#: js/ui/messageTray.js:1547 #: js/ui/messageTray.js:1476
msgid "System Information" msgid "System Information"
msgstr "系统信息" msgstr "系统信息"
#: js/ui/mpris.js:204 #: js/ui/mpris.js:203
msgid "Unknown artist" msgid "Unknown artist"
msgstr "未知艺人" msgstr "未知艺人"
#: js/ui/mpris.js:214 #: js/ui/mpris.js:213
msgid "Unknown title" msgid "Unknown title"
msgstr "未知标题" msgstr "未知标题"
#: js/ui/overview.js:73 #: js/ui/overview.js:74
msgid "Undo" msgid "Undo"
msgstr "撤消" msgstr "撤消"
#. Translators: This is the main view to select #. Translators: This is the main view to select
#. activities. See also note for "Activities" string. #. activities. See also note for "Activities" string.
#: js/ui/overview.js:86 #: js/ui/overview.js:87
msgid "Overview" msgid "Overview"
msgstr "概览" msgstr "概览"
@ -1436,7 +1444,7 @@ msgstr "概览"
#. in the search entry when no search is #. in the search entry when no search is
#. active; it should not exceed ~30 #. active; it should not exceed ~30
#. characters. #. characters.
#: js/ui/overview.js:107 #: js/ui/overview.js:108
msgid "Type to search" msgid "Type to search"
msgstr "输入以搜索" msgstr "输入以搜索"
@ -1464,23 +1472,23 @@ msgstr "分配按键"
msgid "Done" msgid "Done"
msgstr "完成" msgstr "完成"
#: js/ui/padOsd.js:745 #: js/ui/padOsd.js:732
msgid "Edit…" msgid "Edit…"
msgstr "编辑…" msgstr "编辑…"
#: js/ui/padOsd.js:787 js/ui/padOsd.js:910 #: js/ui/padOsd.js:774 js/ui/padOsd.js:891
msgid "None" msgid "None"
msgstr "无" msgstr "无"
#: js/ui/padOsd.js:863 #: js/ui/padOsd.js:845
msgid "Press a button to configure" msgid "Press a button to configure"
msgstr "按下按键以配置" msgstr "按下按键以配置"
#: js/ui/padOsd.js:864 #: js/ui/padOsd.js:846
msgid "Press Esc to exit" msgid "Press Esc to exit"
msgstr "按 Esc 以退出" msgstr "按 Esc 以退出"
#: js/ui/padOsd.js:867 #: js/ui/padOsd.js:849
msgid "Press any key to exit" msgid "Press any key to exit"
msgstr "按任意键退出" msgstr "按任意键退出"
@ -1570,7 +1578,7 @@ msgstr "隐藏文本"
#: js/ui/shellEntry.js:162 #: js/ui/shellEntry.js:162
msgid "Caps lock is on." msgid "Caps lock is on."
msgstr "大写锁定已开启。" msgstr "大写锁定已开启。"
#: js/ui/shellMountOperation.js:285 #: js/ui/shellMountOperation.js:285
msgid "Hidden Volume" msgid "Hidden Volume"
@ -1742,17 +1750,17 @@ msgstr "定位服务已禁用"
msgid "Enable" msgid "Enable"
msgstr "启用" msgstr "启用"
#: js/ui/status/location.js:355 #: js/ui/status/location.js:350
msgid "Allow location access" msgid "Allow location access"
msgstr "允许获取位置信息" msgstr "允许获取位置信息"
#. Translators: %s is an application name #. Translators: %s is an application name
#: js/ui/status/location.js:357 #: js/ui/status/location.js:352
#, javascript-format #, javascript-format
msgid "The app %s wants to access your location" msgid "The app %s wants to access your location"
msgstr "应用 %s 想要获取您的位置信息" msgstr "应用 %s 想要获取您的位置信息"
#: js/ui/status/location.js:367 #: js/ui/status/location.js:362
msgid "Location access can be changed at any time from the privacy settings." msgid "Location access can be changed at any time from the privacy settings."
msgstr "位置访问权限可以随时在隐私设置里更改。" msgstr "位置访问权限可以随时在隐私设置里更改。"
@ -2081,11 +2089,11 @@ msgstr "Thunderbolt 授权错误"
msgid "Could not authorize the Thunderbolt device: %s" msgid "Could not authorize the Thunderbolt device: %s"
msgstr "无法授权 Thunderbolt 设备:%s" msgstr "无法授权 Thunderbolt 设备:%s"
#: js/ui/status/volume.js:154 #: js/ui/status/volume.js:155
msgid "Volume changed" msgid "Volume changed"
msgstr "音量已变更" msgstr "音量已变更"
#: js/ui/status/volume.js:225 #: js/ui/status/volume.js:217
msgid "Volume" msgid "Volume"
msgstr "音量" msgstr "音量"
@ -2131,19 +2139,19 @@ msgstr "向上滑动解锁"
msgid "Click or press a key to unlock" msgid "Click or press a key to unlock"
msgstr "单击或按键解锁" msgstr "单击或按键解锁"
#: js/ui/unlockDialog.js:550 #: js/ui/unlockDialog.js:555
msgid "Unlock Window" msgid "Unlock Window"
msgstr "解锁窗口" msgstr "解锁窗口"
#: js/ui/unlockDialog.js:559 #: js/ui/unlockDialog.js:564
msgid "Log in as another user" msgid "Log in as another user"
msgstr "以另一个用户身份登录" msgstr "以另一个用户身份登录"
#: js/ui/viewSelector.js:181 #: js/ui/viewSelector.js:182
msgid "Applications" msgid "Applications"
msgstr "应用程序" msgstr "应用程序"
#: js/ui/viewSelector.js:185 #: js/ui/viewSelector.js:186
msgid "Search" msgid "Search"
msgstr "搜索" msgstr "搜索"
@ -2269,12 +2277,12 @@ msgstr "使用指定模式如“gdm”用于登录屏幕"
msgid "List possible modes" msgid "List possible modes"
msgstr "列出可用的模式" msgstr "列出可用的模式"
#: src/shell-app.c:286 #: src/shell-app.c:268
msgctxt "program" msgctxt "program"
msgid "Unknown" msgid "Unknown"
msgstr "未知" msgstr "未知"
#: src/shell-app.c:537 #: src/shell-app.c:519
#, c-format #, c-format
msgid "Failed to launch “%s”" msgid "Failed to launch “%s”"
msgstr "启动“%s”失败" msgstr "启动“%s”失败"
@ -2504,7 +2512,7 @@ msgstr "描述"
#: subprojects/extensions-tool/src/command-create.c:443 #: subprojects/extensions-tool/src/command-create.c:443
msgid "A short description of what the extension does" msgid "A short description of what the extension does"
msgstr "简短描述下扩展所做的事情" msgstr "扩展功能的简短描述"
#: subprojects/extensions-tool/src/command-create.c:446 #: subprojects/extensions-tool/src/command-create.c:446
msgid "TEMPLATE" msgid "TEMPLATE"
@ -2847,6 +2855,14 @@ msgstr[0] "%u 个输入"
msgid "System Sounds" msgid "System Sounds"
msgstr "系统声音" msgstr "系统声音"
#~ msgctxt "calendar heading"
#~ msgid "%A, %B %-d"
#~ msgstr "%-m月%-d日 %A"
#~ msgctxt "calendar heading"
#~ msgid "%A, %B %-d, %Y"
#~ msgstr "%Y年%-m月%-d日 %A"
#~ msgid "Frequently used applications will appear here" #~ msgid "Frequently used applications will appear here"
#~ msgstr "常用的应用程序会出现在这里" #~ msgstr "常用的应用程序会出现在这里"

View File

@ -346,8 +346,6 @@ struct _App
GSList *notify_appointments; /* CalendarAppointment *, for EventsAdded */ GSList *notify_appointments; /* CalendarAppointment *, for EventsAdded */
GSList *notify_ids; /* gchar *, for EventsRemoved */ GSList *notify_ids; /* gchar *, for EventsRemoved */
guint events_added_timeout_id;
guint events_removed_timeout_id;
GSList *live_views; GSList *live_views;
}; };
@ -370,24 +368,19 @@ app_update_timezone (App *app)
} }
} }
static gboolean static void
on_app_schedule_events_added_cb (gpointer user_data) app_notify_events_added (App *app)
{ {
App *app = user_data;
GVariantBuilder builder, extras_builder; GVariantBuilder builder, extras_builder;
GSList *events, *link; GSList *events, *link;
if (g_source_is_destroyed (g_main_current_source ()))
return FALSE;
events = g_slist_reverse (app->notify_appointments); events = g_slist_reverse (app->notify_appointments);
app->notify_appointments = NULL; app->notify_appointments = NULL;
app->events_added_timeout_id = 0;
print_debug ("Emitting EventsAddedOrUpdated with %d events", g_slist_length (events)); print_debug ("Emitting EventsAddedOrUpdated with %d events", g_slist_length (events));
if (!events) if (!events)
return FALSE; return;
/* The a{sv} is used as an escape hatch in case we want to provide more /* The a{sv} is used as an escape hatch in case we want to provide more
* information in the future without breaking ABI * information in the future without breaking ABI
@ -428,41 +421,21 @@ on_app_schedule_events_added_cb (gpointer user_data)
g_variant_builder_clear (&builder); g_variant_builder_clear (&builder);
g_slist_free_full (events, calendar_appointment_free); g_slist_free_full (events, calendar_appointment_free);
return FALSE;
} }
static void static void
app_schedule_events_added (App *app) app_notify_events_removed (App *app)
{ {
print_debug ("Scheduling EventsAddedOrUpdated");
if (app->events_added_timeout_id == 0)
{
app->events_added_timeout_id = g_timeout_add_seconds (2,
on_app_schedule_events_added_cb,
app);
g_source_set_name_by_id (app->events_added_timeout_id, "[gnome-shell] on_app_schedule_events_added_cb");
}
}
static gboolean
on_app_schedule_events_removed_cb (gpointer user_data)
{
App *app = user_data;
GVariantBuilder builder; GVariantBuilder builder;
GSList *ids, *link; GSList *ids, *link;
if (g_source_is_destroyed (g_main_current_source ()))
return FALSE;
ids = app->notify_ids; ids = app->notify_ids;
app->notify_ids = NULL; app->notify_ids = NULL;
app->events_removed_timeout_id = 0;
print_debug ("Emitting EventsRemoved with %d ids", g_slist_length (ids)); print_debug ("Emitting EventsRemoved with %d ids", g_slist_length (ids));
if (!ids) if (!ids)
return FALSE; return;
g_variant_builder_init (&builder, G_VARIANT_TYPE ("as")); g_variant_builder_init (&builder, G_VARIANT_TYPE ("as"));
for (link = ids; link; link = g_slist_next (link)) for (link = ids; link; link = g_slist_next (link))
@ -483,20 +456,7 @@ on_app_schedule_events_removed_cb (gpointer user_data)
g_slist_free_full (ids, g_free); g_slist_free_full (ids, g_free);
return FALSE; return;
}
static void
app_schedule_events_removed (App *app)
{
print_debug ("Scheduling EventsRemoved");
if (app->events_removed_timeout_id == 0)
{
app->events_removed_timeout_id = g_timeout_add_seconds (2,
on_app_schedule_events_removed_cb,
app);
g_source_set_name_by_id (app->events_removed_timeout_id, "[gnome-shell] on_app_schedule_events_removed_cb");
}
} }
static void static void
@ -546,7 +506,7 @@ app_process_added_modified_objects (App *app,
g_clear_object (&cal_client); g_clear_object (&cal_client);
if (app->notify_appointments) if (app->notify_appointments)
app_schedule_events_added (app); app_notify_events_added (app);
} }
static void static void
@ -610,7 +570,7 @@ on_objects_removed (ECalClientView *view,
g_clear_object (&client); g_clear_object (&client);
if (app->notify_ids) if (app->notify_ids)
app_schedule_events_removed (app); app_notify_events_removed (app);
} }
static gboolean static gboolean
@ -874,9 +834,6 @@ app_free (App *app)
{ {
GSList *ll; GSList *ll;
g_clear_handle_id (&app->events_added_timeout_id, g_source_remove);
g_clear_handle_id (&app->events_removed_timeout_id, g_source_remove);
for (ll = app->live_views; ll != NULL; ll = g_slist_next (ll)) for (ll = app->live_views; ll != NULL; ll = g_slist_next (ll))
{ {
ECalClientView *view = E_CAL_CLIENT_VIEW (ll->data); ECalClientView *view = E_CAL_CLIENT_VIEW (ll->data);

View File

@ -163,15 +163,6 @@ libshell_private_sources = [
'shell-app-cache.c', 'shell-app-cache.c',
] ]
if enable_recorder
libshell_sources += ['shell-recorder.c']
libshell_public_headers += ['shell-recorder.h']
libshell_private_sources += ['shell-recorder-src.c']
libshell_private_headers += ['shell-recorder-src.h']
endif
libshell_enums = gnome.mkenums_simple('shell-enum-types', libshell_enums = gnome.mkenums_simple('shell-enum-types',
sources: libshell_public_headers sources: libshell_public_headers
) )

View File

@ -1,425 +0,0 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
#include "config.h"
#define GST_USE_UNSTABLE_API
#include <gst/base/gstpushsrc.h>
#include "shell-recorder-src.h"
struct _ShellRecorderSrc
{
GstPushSrc parent;
GMutex mutex;
GstCaps *caps;
GMutex queue_lock;
GCond queue_cond;
GQueue *queue;
gboolean eos;
gboolean flushing;
guint memory_used;
guint memory_used_update_idle;
};
struct _ShellRecorderSrcClass
{
GstPushSrcClass parent_class;
};
enum {
PROP_0,
PROP_CAPS,
PROP_MEMORY_USED
};
#define shell_recorder_src_parent_class parent_class
G_DEFINE_TYPE(ShellRecorderSrc, shell_recorder_src, GST_TYPE_PUSH_SRC);
static void
shell_recorder_src_init (ShellRecorderSrc *src)
{
gst_base_src_set_format (GST_BASE_SRC (src), GST_FORMAT_TIME);
gst_base_src_set_live (GST_BASE_SRC (src), TRUE);
src->queue = g_queue_new ();
g_mutex_init (&src->mutex);
g_mutex_init (&src->queue_lock);
g_cond_init (&src->queue_cond);
}
static gboolean
shell_recorder_src_memory_used_update_idle (gpointer data)
{
ShellRecorderSrc *src = data;
g_mutex_lock (&src->mutex);
src->memory_used_update_idle = 0;
g_mutex_unlock (&src->mutex);
g_object_notify (G_OBJECT (src), "memory-used");
return FALSE;
}
/* The memory_used property is used to monitor buffer usage,
* so we marshal notification back to the main loop thread.
*/
static void
shell_recorder_src_update_memory_used (ShellRecorderSrc *src,
int delta)
{
g_mutex_lock (&src->mutex);
src->memory_used += delta;
if (src->memory_used_update_idle == 0)
{
src->memory_used_update_idle = g_idle_add (shell_recorder_src_memory_used_update_idle, src);
g_source_set_name_by_id (src->memory_used_update_idle, "[gnome-shell] shell_recorder_src_memory_used_update_idle");
}
g_mutex_unlock (&src->mutex);
}
/* _negotiate() is called when we have to decide on a format. We
* use the configured format */
static gboolean
shell_recorder_src_negotiate (GstBaseSrc * base_src)
{
ShellRecorderSrc *src = SHELL_RECORDER_SRC (base_src);
gboolean result;
result = gst_base_src_set_caps (base_src, src->caps);
return result;
}
static gboolean
shell_recorder_src_unlock (GstBaseSrc * base_src)
{
ShellRecorderSrc *src = SHELL_RECORDER_SRC (base_src);
g_mutex_lock (&src->queue_lock);
src->flushing = TRUE;
g_cond_signal (&src->queue_cond);
g_mutex_unlock (&src->queue_lock);
return TRUE;
}
static gboolean
shell_recorder_src_unlock_stop (GstBaseSrc * base_src)
{
ShellRecorderSrc *src = SHELL_RECORDER_SRC (base_src);
g_mutex_lock (&src->queue_lock);
src->flushing = FALSE;
g_cond_signal (&src->queue_cond);
g_mutex_unlock (&src->queue_lock);
return TRUE;
}
static gboolean
shell_recorder_src_start (GstBaseSrc * base_src)
{
ShellRecorderSrc *src = SHELL_RECORDER_SRC (base_src);
g_mutex_lock (&src->queue_lock);
src->flushing = FALSE;
src->eos = FALSE;
g_cond_signal (&src->queue_cond);
g_mutex_unlock (&src->queue_lock);
return TRUE;
}
static gboolean
shell_recorder_src_stop (GstBaseSrc * base_src)
{
ShellRecorderSrc *src = SHELL_RECORDER_SRC (base_src);
g_mutex_lock (&src->queue_lock);
src->flushing = TRUE;
src->eos = FALSE;
g_queue_foreach (src->queue, (GFunc) gst_buffer_unref, NULL);
g_queue_clear (src->queue);
g_cond_signal (&src->queue_cond);
g_mutex_unlock (&src->queue_lock);
return TRUE;
}
static gboolean
shell_recorder_src_send_event (GstElement * element, GstEvent * event)
{
ShellRecorderSrc *src = SHELL_RECORDER_SRC (element);
gboolean res;
if (GST_EVENT_TYPE (event) == GST_EVENT_EOS)
{
shell_recorder_src_close (src);
gst_event_unref (event);
res = TRUE;
}
else
{
res = GST_CALL_PARENT_WITH_DEFAULT (GST_ELEMENT_CLASS, send_event, (element,
event), FALSE);
}
return res;
}
/* The create() virtual function is responsible for returning the next buffer.
* We just pop buffers off of the queue and block if necessary.
*/
static GstFlowReturn
shell_recorder_src_create (GstPushSrc *push_src,
GstBuffer **buffer_out)
{
ShellRecorderSrc *src = SHELL_RECORDER_SRC (push_src);
GstBuffer *buffer;
g_mutex_lock (&src->queue_lock);
while (TRUE) {
/* int the flushing state we just return FLUSHING */
if (src->flushing) {
g_mutex_unlock (&src->queue_lock);
return GST_FLOW_FLUSHING;
}
buffer = g_queue_pop_head (src->queue);
/* we have a buffer, exit the loop to handle it */
if (buffer != NULL)
break;
/* no buffer, check EOS */
if (src->eos) {
g_mutex_unlock (&src->queue_lock);
return GST_FLOW_EOS;
}
/* wait for something to happen and try again */
g_cond_wait (&src->queue_cond, &src->queue_lock);
}
g_mutex_unlock (&src->queue_lock);
shell_recorder_src_update_memory_used (src,
- (int)(gst_buffer_get_size(buffer) / 1024));
*buffer_out = buffer;
return GST_FLOW_OK;
}
static void
shell_recorder_src_set_caps (ShellRecorderSrc *src,
const GstCaps *caps)
{
if (caps == src->caps)
return;
if (src->caps != NULL)
{
gst_caps_unref (src->caps);
src->caps = NULL;
}
if (caps)
{
/* The capabilities will be negotated with the downstream element
* and set on the pad when the first buffer is pushed.
*/
src->caps = gst_caps_copy (caps);
}
else
src->caps = NULL;
}
static void
shell_recorder_src_finalize (GObject *object)
{
ShellRecorderSrc *src = SHELL_RECORDER_SRC (object);
g_clear_handle_id (&src->memory_used_update_idle, g_source_remove);
shell_recorder_src_set_caps (src, NULL);
g_queue_free_full (src->queue, (GDestroyNotify) gst_buffer_unref);
g_mutex_clear (&src->mutex);
g_mutex_clear (&src->queue_lock);
g_cond_clear (&src->queue_cond);
G_OBJECT_CLASS (shell_recorder_src_parent_class)->finalize (object);
}
static void
shell_recorder_src_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
ShellRecorderSrc *src = SHELL_RECORDER_SRC (object);
switch (prop_id)
{
case PROP_CAPS:
shell_recorder_src_set_caps (src, gst_value_get_caps (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
shell_recorder_src_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
ShellRecorderSrc *src = SHELL_RECORDER_SRC (object);
switch (prop_id)
{
case PROP_CAPS:
gst_value_set_caps (value, src->caps);
break;
case PROP_MEMORY_USED:
g_mutex_lock (&src->mutex);
g_value_set_uint (value, src->memory_used);
g_mutex_unlock (&src->mutex);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
shell_recorder_src_class_init (ShellRecorderSrcClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
GstBaseSrcClass *base_src_class = GST_BASE_SRC_CLASS (klass);
GstPushSrcClass *push_src_class = GST_PUSH_SRC_CLASS (klass);
static GstStaticPadTemplate src_template =
GST_STATIC_PAD_TEMPLATE ("src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
GST_STATIC_CAPS_ANY);
object_class->finalize = shell_recorder_src_finalize;
object_class->set_property = shell_recorder_src_set_property;
object_class->get_property = shell_recorder_src_get_property;
g_object_class_install_property (object_class,
PROP_CAPS,
g_param_spec_boxed ("caps",
"Caps",
"Fixed GstCaps for the source",
GST_TYPE_CAPS,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property (object_class,
PROP_MEMORY_USED,
g_param_spec_uint ("memory-used",
"Memory Used",
"Memory currently used by the queue (in kB)",
0, G_MAXUINT, 0,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
gst_element_class_add_pad_template (element_class,
gst_static_pad_template_get (&src_template));
gst_element_class_set_details_simple (element_class,
"ShellRecorderSrc",
"Generic/Src",
"Feed screen capture data to a pipeline",
"Owen Taylor <otaylor@redhat.com>");
element_class->send_event = shell_recorder_src_send_event;
base_src_class->negotiate = shell_recorder_src_negotiate;
base_src_class->unlock = shell_recorder_src_unlock;
base_src_class->unlock_stop = shell_recorder_src_unlock_stop;
base_src_class->start = shell_recorder_src_start;
base_src_class->stop = shell_recorder_src_stop;
push_src_class->create = shell_recorder_src_create;
}
/**
* shell_recorder_src_add_buffer:
*
* Adds a buffer to the internal queue to be pushed out at the next opportunity.
* There is no flow control, so arbitrary amounts of memory may be used by
* the buffers on the queue. The buffer contents must match the #GstCaps
* set in the :caps property.
*/
void
shell_recorder_src_add_buffer (ShellRecorderSrc *src,
GstBuffer *buffer)
{
g_return_if_fail (SHELL_IS_RECORDER_SRC (src));
g_return_if_fail (src->caps != NULL);
shell_recorder_src_update_memory_used (src,
(int)(gst_buffer_get_size(buffer) / 1024));
g_mutex_lock (&src->queue_lock);
g_queue_push_tail (src->queue, gst_buffer_ref (buffer));
g_cond_signal (&src->queue_cond);
g_mutex_unlock (&src->queue_lock);
}
/**
* shell_recorder_src_close:
*
* Indicates the end of the input stream. Once all previously added buffers have
* been pushed out an end-of-stream message will be sent.
*/
void
shell_recorder_src_close (ShellRecorderSrc *src)
{
/* We can't send a message to the source immediately or buffers that haven't
* been pushed yet will be discarded. Instead mark ourselves EOS, which will
* make us send an event once everything has been pushed.
*/
g_mutex_lock (&src->queue_lock);
src->eos = TRUE;
g_cond_signal (&src->queue_cond);
g_mutex_unlock (&src->queue_lock);
}
static gboolean
plugin_init (GstPlugin *plugin)
{
gst_element_register(plugin, "shellrecordersrc", GST_RANK_NONE,
SHELL_TYPE_RECORDER_SRC);
return TRUE;
}
/**
* shell_recorder_src_register:
*
* Registers a plugin holding our single element to use privately in
* this application. Can safely be called multiple times.
*/
void
shell_recorder_src_register (void)
{
static gboolean registered = FALSE;
if (registered)
return;
gst_plugin_register_static (GST_VERSION_MAJOR, GST_VERSION_MINOR,
"shellrecorder",
"Plugin for ShellRecorder",
plugin_init,
"0.1",
"LGPL",
"gnome-shell", "gnome-shell", "http://live.gnome.org/GnomeShell");
registered = TRUE;
}

View File

@ -1,40 +0,0 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
#ifndef __SHELL_RECORDER_SRC_H__
#define __SHELL_RECORDER_SRC_H__
#include <gst/gst.h>
G_BEGIN_DECLS
/**
* ShellRecorderSrc:
*
* shellrecordersrc a custom source element is pretty much like a very
* simple version of the stander GStreamer 'appsrc' element, without
* any of the provisions for seeking, generating data on demand,
* etc. In both cases, the application supplies the buffers and the
* element pushes them into the pipeline. The main reason for not using
* appsrc is that it wasn't a supported element until gstreamer 0.10.22,
* and as of 2009-03, many systems still have 0.10.21.
*/
typedef struct _ShellRecorderSrc ShellRecorderSrc;
typedef struct _ShellRecorderSrcClass ShellRecorderSrcClass;
#define SHELL_TYPE_RECORDER_SRC (shell_recorder_src_get_type ())
#define SHELL_RECORDER_SRC(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), SHELL_TYPE_RECORDER_SRC, ShellRecorderSrc))
#define SHELL_RECORDER_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SHELL_TYPE_RECORDER_SRC, ShellRecorderSrcClass))
#define SHELL_IS_RECORDER_SRC(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), SHELL_TYPE_RECORDER_SRC))
#define SHELL_IS_RECORDER_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SHELL_TYPE_RECORDER_SRC))
#define SHELL_RECORDER_SRC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SHELL_TYPE_RECORDER_SRC, ShellRecorderSrcClass))
GType shell_recorder_src_get_type (void) G_GNUC_CONST;
void shell_recorder_src_register (void);
void shell_recorder_src_add_buffer (ShellRecorderSrc *src,
GstBuffer *buffer);
void shell_recorder_src_close (ShellRecorderSrc *src);
G_END_DECLS
#endif /* __SHELL_RECORDER_SRC_H__ */

File diff suppressed because it is too large Load Diff

View File

@ -1,45 +0,0 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
#ifndef __SHELL_RECORDER_H__
#define __SHELL_RECORDER_H__
#include <clutter/clutter.h>
G_BEGIN_DECLS
/**
* SECTION:shell-recorder
* @short_description: Record from a #ClutterStage
*
* The #ShellRecorder object is used to make recordings ("screencasts")
* of a #ClutterStage. Recording is done via #GStreamer. The default is
* to encode as a Theora movie and write it to a file in the current
* directory named after the date, but the encoding and output can
* be configured.
*/
#define SHELL_TYPE_RECORDER (shell_recorder_get_type ())
G_DECLARE_FINAL_TYPE (ShellRecorder, shell_recorder, SHELL, RECORDER, GObject)
ShellRecorder *shell_recorder_new (ClutterStage *stage);
void shell_recorder_set_framerate (ShellRecorder *recorder,
int framerate);
void shell_recorder_set_file_template (ShellRecorder *recorder,
const char *file_template);
void shell_recorder_set_pipeline (ShellRecorder *recorder,
const char *pipeline);
void shell_recorder_set_draw_cursor (ShellRecorder *recorder,
gboolean draw_cursor);
void shell_recorder_set_area (ShellRecorder *recorder,
int x,
int y,
int width,
int height);
gboolean shell_recorder_record (ShellRecorder *recorder,
char **filename_used);
void shell_recorder_close (ShellRecorder *recorder);
void shell_recorder_pause (ShellRecorder *recorder);
gboolean shell_recorder_is_recording (ShellRecorder *recorder);
G_END_DECLS
#endif /* __SHELL_RECORDER_H__ */

View File

@ -77,61 +77,6 @@ shell_util_set_hidden_from_pick (ClutterActor *actor,
} }
} }
/**
* shell_util_get_transformed_allocation:
* @actor: a #ClutterActor
* @box: (out): location to store returned box in stage coordinates
*
* This function is similar to a combination of clutter_actor_get_transformed_position(),
* and clutter_actor_get_transformed_size(), but unlike
* clutter_actor_get_transformed_size(), it always returns a transform
* of the current allocation, while clutter_actor_get_transformed_size() returns
* bad values (the transform of the requested size) if a relayout has been
* queued.
*
* This function is more convenient to use than
* clutter_actor_get_abs_allocation_vertices() if no transformation is in effect
* and also works around limitations in the GJS binding of arrays.
*/
void
shell_util_get_transformed_allocation (ClutterActor *actor,
ClutterActorBox *box)
{
/* Code adapted from clutter-actor.c:
* Copyright 2006, 2007, 2008 OpenedHand Ltd
*/
graphene_point3d_t v[4];
gfloat x_min, x_max, y_min, y_max;
guint i;
g_return_if_fail (CLUTTER_IS_ACTOR (actor));
clutter_actor_get_abs_allocation_vertices (actor, v);
x_min = x_max = v[0].x;
y_min = y_max = v[0].y;
for (i = 1; i < G_N_ELEMENTS (v); ++i)
{
if (v[i].x < x_min)
x_min = v[i].x;
if (v[i].x > x_max)
x_max = v[i].x;
if (v[i].y < y_min)
y_min = v[i].y;
if (v[i].y > y_max)
y_max = v[i].y;
}
box->x1 = x_min;
box->y1 = y_min;
box->x2 = x_max;
box->y2 = y_max;
}
/** /**
* shell_util_get_week_start: * shell_util_get_week_start:
* *
@ -409,34 +354,6 @@ shell_util_create_pixbuf_from_data (const guchar *data,
typedef const gchar *(*ShellGLGetString) (GLenum); typedef const gchar *(*ShellGLGetString) (GLenum);
static const gchar *
get_gl_vendor (void)
{
static const gchar *vendor = NULL;
if (!vendor)
{
ShellGLGetString gl_get_string;
gl_get_string = (ShellGLGetString) cogl_get_proc_address ("glGetString");
if (gl_get_string)
vendor = gl_get_string (GL_VENDOR);
}
return vendor;
}
gboolean
shell_util_need_background_refresh (void)
{
if (!clutter_check_windowing_backend (CLUTTER_WINDOWING_X11))
return FALSE;
if (g_strcmp0 (get_gl_vendor (), "NVIDIA Corporation") == 0)
return TRUE;
return FALSE;
}
static gboolean static gboolean
canvas_draw_cb (ClutterContent *content, canvas_draw_cb (ClutterContent *content,
cairo_t *cr, cairo_t *cr,
@ -653,6 +570,57 @@ shell_util_get_uid (void)
return getuid (); return getuid ();
} }
typedef struct {
GDBusConnection *connection;
gchar *command;
GCancellable *cancellable;
gulong cancel_id;
guint job_watch;
gchar *job;
} SystemdCall;
static void
shell_util_systemd_call_data_free (SystemdCall *data)
{
if (data->job_watch)
{
g_dbus_connection_signal_unsubscribe (data->connection, data->job_watch);
data->job_watch = 0;
}
if (data->cancellable)
{
g_cancellable_disconnect (data->cancellable, data->cancel_id);
g_clear_object (&data->cancellable);
data->cancel_id = 0;
}
g_clear_object (&data->connection);
g_clear_pointer (&data->job, g_free);
g_clear_pointer (&data->command, g_free);
g_free (data);
}
static void
shell_util_systemd_call_cancelled_cb (GCancellable *cancellable,
GTask *task)
{
SystemdCall *data = g_task_get_task_data (task);
/* Task has returned, but data is not yet free'ed, ignore signal. */
if (g_task_get_completed (task))
return;
/* We are still in the DBus call; it will return the error. */
if (data->job == NULL)
return;
g_task_return_error_if_cancelled (task);
g_object_unref (task);
}
static void static void
on_systemd_call_cb (GObject *source, on_systemd_call_cb (GObject *source,
GAsyncResult *res, GAsyncResult *res,
@ -660,46 +628,143 @@ on_systemd_call_cb (GObject *source,
{ {
g_autoptr (GVariant) reply = NULL; g_autoptr (GVariant) reply = NULL;
g_autoptr (GError) error = NULL; g_autoptr (GError) error = NULL;
const gchar *command = user_data; GTask *task = G_TASK (user_data);
SystemdCall *data;
reply = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source), reply = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source),
res, &error); res, &error);
if (error)
g_warning ("Could not issue '%s' systemd call", command); data = g_task_get_task_data (task);
if (error) {
g_warning ("Could not issue '%s' systemd call", data->command);
g_task_return_error (task, g_steal_pointer (&error));
g_object_unref (task);
return;
}
g_assert (data->job == NULL);
g_variant_get (reply, "(o)", &data->job);
/* And we wait for the JobRemoved notification. */
} }
static gboolean static void
shell_util_systemd_call (const char *command, on_systemd_job_removed_cb (GDBusConnection *connection,
const char *unit, const gchar *sender_name,
const char *mode, const gchar *object_path,
GError **error) const gchar *interface_name,
const gchar *signal_name,
GVariant *parameters,
gpointer user_data)
{ {
GTask *task = G_TASK (user_data);
SystemdCall *data;
guint32 id;
const char *path, *unit, *result;
/* Task has returned, but data is not yet free'ed, ignore signal. */
if (g_task_get_completed (task))
return;
data = g_task_get_task_data (task);
/* No job information yet, ignore. */
if (data->job == NULL)
return;
g_variant_get (parameters, "(u&o&s&s)", &id, &path, &unit, &result);
/* Is it the job we are waiting for? */
if (g_strcmp0 (path, data->job) != 0)
return;
/* Task has completed; return the result of the job */
if (g_strcmp0 (result, "done") == 0)
g_task_return_boolean (task, TRUE);
else
g_task_return_new_error (task,
G_IO_ERROR,
G_IO_ERROR_FAILED,
"Systemd job completed with status \"%s\"",
result);
g_object_unref (task);
}
static void
shell_util_systemd_call (const char *command,
const char *unit,
const char *mode,
GCancellable *cancellable,
GAsyncReadyCallback callback,
gpointer user_data)
{
g_autoptr (GTask) task = g_task_new (NULL, cancellable, callback, user_data);
#ifdef HAVE_SYSTEMD #ifdef HAVE_SYSTEMD
g_autoptr (GDBusConnection) connection = NULL; g_autoptr (GDBusConnection) connection = NULL;
GError *error = NULL;
SystemdCall *data;
g_autofree char *self_unit = NULL; g_autofree char *self_unit = NULL;
int res; int res;
connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error);
if (connection == NULL) {
g_task_return_error (task, error);
return;
}
/* We look up the systemd unit that our own process is running in here.
* This way we determine whether the session is managed using systemd.
*/
res = sd_pid_get_user_unit (getpid (), &self_unit); res = sd_pid_get_user_unit (getpid (), &self_unit);
if (res == -ENODATA) if (res == -ENODATA)
{ {
g_debug ("Not systemd-managed, not doing '%s' on '%s'", mode, unit); g_task_return_new_error (task,
return FALSE; G_IO_ERROR,
G_IO_ERROR_NOT_SUPPORTED,
"Not systemd managed");
return;
} }
else if (res < 0) else if (res < 0)
{ {
g_set_error (error, g_task_return_new_error (task,
G_IO_ERROR, G_IO_ERROR,
g_io_error_from_errno (-res), g_io_error_from_errno (-res),
"Error trying to start systemd unit '%s': %s", "Error fetching own systemd unit: %s",
unit, g_strerror (-res)); g_strerror (-res));
return FALSE; return;
} }
connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, error); data = g_new0 (SystemdCall, 1);
data->command = g_strdup (command);
data->connection = g_object_ref (connection);
data->job_watch = g_dbus_connection_signal_subscribe (connection,
"org.freedesktop.systemd1",
"org.freedesktop.systemd1.Manager",
"JobRemoved",
"/org/freedesktop/systemd1",
NULL,
G_DBUS_SIGNAL_FLAGS_NONE,
on_systemd_job_removed_cb,
task,
NULL);
g_task_set_task_data (task,
data,
(GDestroyNotify) shell_util_systemd_call_data_free);
if (connection == NULL) if (cancellable)
return FALSE; {
data->cancellable = g_object_ref (cancellable);
data->cancel_id = g_cancellable_connect (cancellable,
G_CALLBACK (shell_util_systemd_call_cancelled_cb),
task,
NULL);
}
g_dbus_connection_call (connection, g_dbus_connection_call (connection,
"org.freedesktop.systemd1", "org.freedesktop.systemd1",
@ -708,31 +773,53 @@ shell_util_systemd_call (const char *command,
command, command,
g_variant_new ("(ss)", g_variant_new ("(ss)",
unit, mode), unit, mode),
NULL, G_VARIANT_TYPE ("(o)"),
G_DBUS_CALL_FLAGS_NONE, G_DBUS_CALL_FLAGS_NONE,
-1, NULL, -1, cancellable,
on_systemd_call_cb, on_systemd_call_cb,
(gpointer) command); g_steal_pointer (&task));
return TRUE; #else /* HAVE_SYSTEMD */
#endif /* HAVE_SYSTEMD */ g_task_return_new_error (task,
G_IO_ERROR,
G_IO_ERROR_NOT_SUPPORTED,
"systemd not supported by gnome-shell");
#endif /* !HAVE_SYSTEMD */
}
return FALSE; void
shell_util_start_systemd_unit (const char *unit,
const char *mode,
GCancellable *cancellable,
GAsyncReadyCallback callback,
gpointer user_data)
{
shell_util_systemd_call ("StartUnit", unit, mode,
cancellable, callback, user_data);
} }
gboolean gboolean
shell_util_start_systemd_unit (const char *unit, shell_util_start_systemd_unit_finish (GAsyncResult *res,
const char *mode, GError **error)
GError **error)
{ {
return shell_util_systemd_call ("StartUnit", unit, mode, error); return g_task_propagate_boolean (G_TASK (res), error);
}
void
shell_util_stop_systemd_unit (const char *unit,
const char *mode,
GCancellable *cancellable,
GAsyncReadyCallback callback,
gpointer user_data)
{
shell_util_systemd_call ("StopUnit", unit, mode,
cancellable, callback, user_data);
} }
gboolean gboolean
shell_util_stop_systemd_unit (const char *unit, shell_util_stop_systemd_unit_finish (GAsyncResult *res,
const char *mode, GError **error)
GError **error)
{ {
return shell_util_systemd_call ("StopUnit", unit, mode, error); return g_task_propagate_boolean (G_TASK (res), error);
} }
void void

View File

@ -14,9 +14,6 @@ G_BEGIN_DECLS
void shell_util_set_hidden_from_pick (ClutterActor *actor, void shell_util_set_hidden_from_pick (ClutterActor *actor,
gboolean hidden); gboolean hidden);
void shell_util_get_transformed_allocation (ClutterActor *actor,
ClutterActorBox *box);
int shell_util_get_week_start (void); int shell_util_get_week_start (void);
const char *shell_util_translate_time_string (const char *str); const char *shell_util_translate_time_string (const char *str);
@ -49,8 +46,6 @@ GdkPixbuf *shell_util_create_pixbuf_from_data (const guchar *data,
int height, int height,
int rowstride); int rowstride);
gboolean shell_util_need_background_refresh (void);
ClutterContent * shell_util_get_content_for_window_actor (MetaWindowActor *window_actor, ClutterContent * shell_util_get_content_for_window_actor (MetaWindowActor *window_actor,
MetaRectangle *window_rect); MetaRectangle *window_rect);
@ -64,12 +59,21 @@ cairo_surface_t * shell_util_composite_capture_images (ClutterCapture *captures
void shell_util_check_cloexec_fds (void); void shell_util_check_cloexec_fds (void);
gboolean shell_util_start_systemd_unit (const char *unit, void shell_util_start_systemd_unit (const char *unit,
const char *mode, const char *mode,
GError **error); GCancellable *cancellable,
gboolean shell_util_stop_systemd_unit (const char *unit, GAsyncReadyCallback callback,
const char *mode, gpointer user_data);
GError **error); gboolean shell_util_start_systemd_unit_finish (GAsyncResult *res,
GError **error);
void shell_util_stop_systemd_unit (const char *unit,
const char *mode,
GCancellable *cancellable,
GAsyncReadyCallback callback,
gpointer user_data);
gboolean shell_util_stop_systemd_unit_finish (GAsyncResult *res,
GError **error);
void shell_util_sd_notify (void); void shell_util_sd_notify (void);

View File

@ -146,9 +146,13 @@ get_app_from_window_wmclass (MetaWindow *window)
const char *wm_class; const char *wm_class;
const char *wm_instance; const char *wm_instance;
const char *sandbox_id; const char *sandbox_id;
g_autofree char *app_prefix = NULL;
appsys = shell_app_system_get_default (); appsys = shell_app_system_get_default ();
sandbox_id = meta_window_get_sandboxed_app_id (window); sandbox_id = meta_window_get_sandboxed_app_id (window);
if (sandbox_id)
app_prefix = g_strdup_printf ("%s.", sandbox_id);
/* Notes on the heuristics used here: /* Notes on the heuristics used here:
much of the complexity here comes from the desire to support much of the complexity here comes from the desire to support
@ -188,23 +192,23 @@ get_app_from_window_wmclass (MetaWindow *window)
/* first try a match from WM_CLASS (instance part) to StartupWMClass */ /* first try a match from WM_CLASS (instance part) to StartupWMClass */
wm_instance = meta_window_get_wm_class_instance (window); wm_instance = meta_window_get_wm_class_instance (window);
app = shell_app_system_lookup_startup_wmclass (appsys, wm_instance); app = shell_app_system_lookup_startup_wmclass (appsys, wm_instance);
if (app != NULL && check_app_id_prefix (app, sandbox_id)) if (app != NULL && check_app_id_prefix (app, app_prefix))
return g_object_ref (app); return g_object_ref (app);
/* then try a match from WM_CLASS to StartupWMClass */ /* then try a match from WM_CLASS to StartupWMClass */
wm_class = meta_window_get_wm_class (window); wm_class = meta_window_get_wm_class (window);
app = shell_app_system_lookup_startup_wmclass (appsys, wm_class); app = shell_app_system_lookup_startup_wmclass (appsys, wm_class);
if (app != NULL && check_app_id_prefix (app, sandbox_id)) if (app != NULL && check_app_id_prefix (app, app_prefix))
return g_object_ref (app); return g_object_ref (app);
/* then try a match from WM_CLASS (instance part) to .desktop */ /* then try a match from WM_CLASS (instance part) to .desktop */
app = shell_app_system_lookup_desktop_wmclass (appsys, wm_instance); app = shell_app_system_lookup_desktop_wmclass (appsys, wm_instance);
if (app != NULL && check_app_id_prefix (app, sandbox_id)) if (app != NULL && check_app_id_prefix (app, app_prefix))
return g_object_ref (app); return g_object_ref (app);
/* finally, try a match from WM_CLASS to .desktop */ /* finally, try a match from WM_CLASS to .desktop */
app = shell_app_system_lookup_desktop_wmclass (appsys, wm_class); app = shell_app_system_lookup_desktop_wmclass (appsys, wm_class);
if (app != NULL && check_app_id_prefix (app, sandbox_id)) if (app != NULL && check_app_id_prefix (app, app_prefix))
return g_object_ref (app); return g_object_ref (app);
return NULL; return NULL;

View File

@ -1,23 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.0 -->
<interface> <interface>
<requires lib="gtk+" version="3.20"/> <requires lib="gtk+" version="3.20"/>
<template class="ExtensionRow" parent="GtkListBoxRow"> <template class="ExtensionRow" parent="GtkListBoxRow">
<property name="visible">True</property>
<property name="activatable">False</property> <property name="activatable">False</property>
<child> <child>
<object class="GtkGrid"> <object class="GtkGrid">
<property name="visible">True</property> <property name="margin-start">12</property>
<property name="margin">12</property> <property name="margin-end">12</property>
<property name="margin-top">12</property>
<property name="margin-bottom">12</property>
<property name="column_spacing">12</property> <property name="column_spacing">12</property>
<child> <child>
<object class="GtkLabel" id="nameLabel"> <object class="GtkLabel" id="nameLabel"/>
<property name="visible">True</property>
</object>
</child> </child>
<child> <child>
<object class="GtkImage" id="errorIcon"> <object class="GtkImage" id="errorIcon">
<property name="no_show_all">True</property> <property name="visible">False</property>
<property name="icon_name">dialog-error-symbolic</property> <property name="icon_name">dialog-error-symbolic</property>
<style> <style>
<class name="error"/>> <class name="error"/>>
@ -26,86 +24,61 @@
</child> </child>
<child> <child>
<object class="GtkImage" id="updatesIcon"> <object class="GtkImage" id="updatesIcon">
<property name="no_show_all">True</property> <property name="visible">False</property>
<property name="icon_name">software-update-available-symbolic</property> <property name="icon_name">software-update-available-symbolic</property>
<style> <style>
<class name="warning"/>> <class name="warning"/>
</style> </style>
</object> </object>
</child> </child>
<child> <child>
<object class="GtkLabel"> <object class="GtkLabel">
<property name="visible">True</property>
<property name="hexpand">True</property> <property name="hexpand">True</property>
</object> </object>
</child> </child>
<child> <child>
<object class="GtkButton" id="prefsButton"> <object class="GtkButton" id="prefsButton">
<property name="no_show_all">True</property> <property name="visible" bind-source="prefsButton"
<property name="visible"
bind-source="prefsButton"
bind-property="sensitive" bind-property="sensitive"
bind-flags="sync-create"/> bind-flags="sync-create"/>
<property name="can_focus">True</property> <property name="icon_name">emblem-system-symbolic</property>
<property name="receives_default">True</property> <property name="receives_default">True</property>
<property name="valign">center</property> <property name="valign">center</property>
<property name="action-name">row.show-prefs</property> <property name="action-name">row.show-prefs</property>
<style> <style>
<class name="circular"/>> <class name="circular"/>
<class name="image-button"/>>
</style> </style>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="icon_name">emblem-system-symbolic</property>
</object>
</child>
</object> </object>
</child> </child>
<child> <child>
<object class="GtkSwitch" id="switch"> <object class="GtkSwitch" id="switch">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="valign">center</property> <property name="valign">center</property>
<property name="action-name">row.enabled</property> <property name="action-name">row.enabled</property>
</object> </object>
</child> </child>
<child> <child>
<object class="GtkSeparator"> <object class="GtkSeparator"/>
<property name="visible">True</property>
</object>
</child> </child>
<child> <child>
<object class="GtkButton" id="revealButton"> <object class="GtkButton" id="revealButton">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property> <property name="receives_default">True</property>
<property name="valign">center</property> <property name="valign">center</property>
<property name="has-frame">False</property>
<property name="icon_name">pan-end-symbolic</property>
<style> <style>
<class name="details-button"/> <class name="details-button"/>
<class name="image-button"/>
<class name="flat"/>
</style> </style>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="icon_name">pan-end-symbolic</property>
</object>
</child>
</object> </object>
</child> </child>
<child> <child>
<object class="GtkRevealer" id="revealer"> <object class="GtkRevealer" id="revealer">
<property name="visible">True</property>
<child> <child>
<object class="GtkGrid"> <object class="GtkGrid">
<property name="visible">True</property>
<property name="margin_top">12</property> <property name="margin_top">12</property>
<property name="row_spacing">6</property> <property name="row_spacing">6</property>
<property name="column_spacing">12</property> <property name="column_spacing">12</property>
<child> <child>
<object class="GtkLabel"> <object class="GtkLabel">
<property name="visible">True</property>
<property name="label" translatable="yes">Description</property> <property name="label" translatable="yes">Description</property>
<property name="xalign">0</property> <property name="xalign">0</property>
<style> <style>
@ -115,7 +88,6 @@
</child> </child>
<child> <child>
<object class="GtkLabel" id="descriptionLabel"> <object class="GtkLabel" id="descriptionLabel">
<property name="visible">True</property>
<property name="ellipsize">end</property> <property name="ellipsize">end</property>
<property name="max_width_chars">60</property> <property name="max_width_chars">60</property>
<property name="xalign">0</property> <property name="xalign">0</property>
@ -128,27 +100,26 @@
bind-source="versionLabel" bind-source="versionLabel"
bind-property="visible" bind-property="visible"
bind-flags="sync-create"/> bind-flags="sync-create"/>
<property name="no_show_all">True</property>
<property name="label" translatable="yes">Version</property> <property name="label" translatable="yes">Version</property>
<property name="xalign">0</property> <property name="xalign">0</property>
<style> <style>
<class name="dim-label"/> <class name="dim-label"/>
</style> </style>
<layout>
<property name="left_attach">0</property>
<property name="top_attach">1</property>
</layout>
</object> </object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">1</property>
</packing>
</child> </child>
<child> <child>
<object class="GtkLabel" id="versionLabel"> <object class="GtkLabel" id="versionLabel">
<property name="no_show_all">True</property> <property name="visible">False</property>
<property name="xalign">0</property> <property name="xalign">0</property>
<layout>
<property name="left_attach">1</property>
<property name="top_attach">1</property>
</layout>
</object> </object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">1</property>
</packing>
</child> </child>
<child> <child>
<object class="GtkLabel"> <object class="GtkLabel">
@ -156,27 +127,26 @@
bind-source="authorLabel" bind-source="authorLabel"
bind-property="visible" bind-property="visible"
bind-flags="sync-create"/> bind-flags="sync-create"/>
<property name="no_show_all">True</property>
<property name="label" translatable="yes">Author</property> <property name="label" translatable="yes">Author</property>
<property name="xalign">0</property> <property name="xalign">0</property>
<style> <style>
<class name="dim-label"/> <class name="dim-label"/>
</style> </style>
<layout>
<property name="left_attach">0</property>
<property name="top_attach">2</property>
</layout>
</object> </object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">2</property>
</packing>
</child> </child>
<child> <child>
<object class="GtkLabel" id="authorLabel"> <object class="GtkLabel" id="authorLabel">
<property name="no_show_all">True</property> <property name="visible">False</property>
<property name="xalign">0</property> <property name="xalign">0</property>
<layout>
<property name="left_attach">1</property>
<property name="top_attach">2</property>
</layout>
</object> </object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">2</property>
</packing>
</child> </child>
<child> <child>
<object class="GtkLabel"> <object class="GtkLabel">
@ -184,44 +154,42 @@
bind-source="errorLabel" bind-source="errorLabel"
bind-property="visible" bind-property="visible"
bind-flags="sync-create"/> bind-flags="sync-create"/>
<property name="no_show_all">True</property>
<property name="label" translatable="yes">Error</property> <property name="label" translatable="yes">Error</property>
<property name="xalign">0</property> <property name="xalign">0</property>
<property name="yalign">0</property> <property name="yalign">0</property>
<style> <style>
<class name="dim-label"/> <class name="dim-label"/>
</style> </style>
<layout>
<property name="left_attach">0</property>
<property name="top_attach">3</property>
</layout>
</object> </object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">3</property>
</packing>
</child> </child>
<child> <child>
<object class="GtkLabel" id="errorLabel"> <object class="GtkLabel" id="errorLabel">
<property name="no_show_all">True</property> <property name="visible">False</property>
<property name="selectable">True</property> <property name="selectable">True</property>
<property name="wrap">True</property> <property name="wrap">True</property>
<property name="max_width_chars">60</property> <property name="max_width_chars">60</property>
<property name="xalign">0</property> <property name="xalign">0</property>
<layout>
<property name="left_attach">1</property>
<property name="top_attach">3</property>
</layout>
</object> </object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">3</property>
</packing>
</child> </child>
<child> <child>
<object class="GtkButton"> <object class="GtkButton">
<property name="visible">True</property>
<property name="label" translatable="yes">Website</property> <property name="label" translatable="yes">Website</property>
<property name="action_name">row.show-url</property> <property name="action_name">row.show-url</property>
<property name="valign">end</property> <property name="valign">end</property>
<property name="margin-top">12</property> <property name="margin-top">12</property>
<layout>
<property name="left_attach">0</property>
<property name="top_attach">4</property>
</layout>
</object> </object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">4</property>
</packing>
</child> </child>
<child> <child>
<object class="GtkButton" id="removeButton"> <object class="GtkButton" id="removeButton">
@ -229,7 +197,6 @@
bind-source="removeButton" bind-source="removeButton"
bind-property="sensitive" bind-property="sensitive"
bind-flags="sync-create"/> bind-flags="sync-create"/>
<property name="no_show_all">True</property>
<property name="label" translatable="yes">Remove…</property> <property name="label" translatable="yes">Remove…</property>
<property name="action_name">row.uninstall</property> <property name="action_name">row.uninstall</property>
<property name="hexpand">True</property> <property name="hexpand">True</property>
@ -238,20 +205,20 @@
<style> <style>
<class name="destructive-action"/> <class name="destructive-action"/>
</style> </style>
<layout>
<property name="left_attach">1</property>
<property name="top_attach">4</property>
</layout>
</object> </object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">4</property>
</packing>
</child> </child>
</object> </object>
</child> </child>
<layout>
<property name="left_attach">0</property>
<property name="top_attach">1</property>
<property name="column-span">8</property>
</layout>
</object> </object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">1</property>
<property name="width">8</property>
</packing>
</child> </child>
</object> </object>
</child> </child>

View File

@ -1,5 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.0 -->
<interface> <interface>
<requires lib="gtk+" version="3.20"/> <requires lib="gtk+" version="3.20"/>
<menu id="primary-menu"> <menu id="primary-menu">
@ -17,13 +16,14 @@
<object class="GtkPopover" id="infoPopover"> <object class="GtkPopover" id="infoPopover">
<child> <child>
<object class="GtkBox"> <object class="GtkBox">
<property name="visible">True</property>
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<property name="margin">12</property> <property name="margin-start">12</property>
<property name="margin-end">12</property>
<property name="margin-top">12</property>
<property name="margin-bottom">12</property>
<property name="spacing">6</property> <property name="spacing">6</property>
<child> <child>
<object class="GtkLabel"> <object class="GtkLabel">
<property name="visible">True</property>
<property name="label" translatable="yes">To find and add extensions, visit &lt;a href="https://extensions.gnome.org"&gt;extensions.gnome.org&lt;/a&gt;.</property> <property name="label" translatable="yes">To find and add extensions, visit &lt;a href="https://extensions.gnome.org"&gt;extensions.gnome.org&lt;/a&gt;.</property>
<property name="use_markup">True</property> <property name="use_markup">True</property>
<property name="xalign">0</property> <property name="xalign">0</property>
@ -31,7 +31,6 @@
</child> </child>
<child> <child>
<object class="GtkLabel"> <object class="GtkLabel">
<property name="visible">True</property>
<property name="label" translatable="yes">Warning</property> <property name="label" translatable="yes">Warning</property>
<property name="xalign">0</property> <property name="xalign">0</property>
<property name="margin_top">6</property> <property name="margin_top">6</property>
@ -42,7 +41,6 @@
</child> </child>
<child> <child>
<object class="GtkLabel"> <object class="GtkLabel">
<property name="visible">True</property>
<property name="label" translatable="yes">Extensions can cause system issues, including performance problems. If you encounter problems with your system, it is recommended to disable all extensions.</property> <property name="label" translatable="yes">Extensions can cause system issues, including performance problems. If you encounter problems with your system, it is recommended to disable all extensions.</property>
<property name="wrap">True</property> <property name="wrap">True</property>
<property name="max_width_chars">40</property> <property name="max_width_chars">40</property>
@ -55,207 +53,190 @@
<template class="ExtensionsWindow" parent="GtkApplicationWindow"> <template class="ExtensionsWindow" parent="GtkApplicationWindow">
<property name="default_width">800</property> <property name="default_width">800</property>
<property name="default_height">500</property> <property name="default_height">500</property>
<property name="title" translatable="yes">Extensions</property>
<child type="titlebar"> <child type="titlebar">
<object class="GtkHeaderBar"> <object class="GtkHeaderBar">
<property name="visible">True</property> <property name="show-title-buttons">True</property>
<property name="title" translatable="yes">Extensions</property>
<property name="show_close_button">True</property>
<child> <child>
<object class="GtkMenuButton"> <object class="GtkMenuButton">
<property name="visible">True</property>
<property name="popover">infoPopover</property> <property name="popover">infoPopover</property>
<child> <property name="icon_name">dialog-information-symbolic</property>
<object class="GtkImage">
<property name="visible">True</property>
<property name="icon_name">dialog-information-symbolic</property>
</object>
</child>
</object> </object>
</child> </child>
<child> <child type="end">
<object class="GtkMenuButton" id="menuButton"> <object class="GtkMenuButton" id="menuButton">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property> <property name="receives_default">True</property>
<property name="menu_model">primary-menu</property> <property name="menu_model">primary-menu</property>
<child> <property name="icon_name">open-menu-symbolic</property>
<object class="GtkImage">
<property name="visible">True</property>
<property name="icon_name">open-menu-symbolic</property>
</object>
</child>
</object> </object>
<packing>
<property name="pack_type">end</property>
</packing>
</child> </child>
<child> <child type="end">
<object class="GtkSwitch"> <object class="GtkSwitch">
<property name="visible">True</property>
<property name="action-name">win.user-extensions-enabled</property> <property name="action-name">win.user-extensions-enabled</property>
<property name="valign">center</property> <property name="valign">center</property>
</object> </object>
<packing>
<property name="pack_type">end</property>
</packing>
</child> </child>
</object> </object>
</child> </child>
<child> <child>
<object class="GtkBox"> <object class="GtkBox">
<property name="visible">True</property>
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<child> <child>
<object class="GtkStack" id="mainStack"> <object class="GtkStack" id="mainStack">
<property name="visible">True</property>
<property name="transition_type">crossfade</property> <property name="transition_type">crossfade</property>
<property name="vexpand">True</property> <property name="vexpand">True</property>
<child> <child>
<object class="GtkScrolledWindow" id="scrolledWindow"> <object class="GtkStackPage">
<property name="visible">True</property> <property name="name">main</property>
<property name="hscrollbar_policy">never</property> <property name="child">
<child> <object class="GtkScrolledWindow" id="scrolledWindow">
<object class="GtkViewport"> <property name="hscrollbar_policy">never</property>
<property name="visible">True</property>
<child> <child>
<object class="GtkBox" id="mainBox"> <object class="GtkViewport">
<property name="visible">True</property> <property name="scroll-to-focus">True</property>
<property name="orientation">vertical</property>
<property name="halign">center</property>
<property name="margin">36</property>
<property name="spacing">12</property>
<child> <child>
<object class="GtkLabel"> <object class="GtkBox">
<property name="visible" <property name="orientation">vertical</property>
bind-source="userList" <property name="halign">center</property>
bind-property="visible" <property name="margin-start">36</property>
bind-flags="sync-create"/> <property name="margin-end">36</property>
<property name="halign">start</property> <property name="margin-top">36</property>
<property name="hexpand">True</property> <property name="margin-bottom">36</property>
<property name="label" translatable="yes">Manually Installed</property> <property name="spacing">12</property>
<attributes> <child>
<attribute name="weight" value="bold"/> <object class="GtkLabel">
</attributes> <property name="visible"
</object> bind-source="userList"
</child> bind-property="visible"
<child> bind-flags="sync-create"/>
<object class="GtkListBox" id="userList"> <property name="halign">start</property>
<property name="visible">True</property> <property name="hexpand">True</property>
<property name="selection_mode">none</property> <property name="label" translatable="yes">Manually Installed</property>
<property name="margin_bottom">24</property> <attributes>
<style> <attribute name="weight" value="bold"/>
<class name="frame"/> </attributes>
</style> </object>
</object> </child>
</child> <child>
<child> <object class="GtkListBox" id="userList">
<object class="GtkLabel"> <property name="selection_mode">none</property>
<property name="visible" <property name="show_separators">True</property>
bind-source="systemList" <property name="margin_bottom">24</property>
bind-property="visible" <style>
bind-flags="sync-create"/> <class name="frame"/>
<property name="halign">start</property> </style>
<property name="hexpand">True</property> </object>
<property name="label" translatable="yes">Built-In</property> </child>
<attributes> <child>
<attribute name="weight" value="bold"/> <object class="GtkLabel">
</attributes> <property name="visible"
</object> bind-source="systemList"
</child> bind-property="visible"
<child> bind-flags="sync-create"/>
<object class="GtkListBox" id="systemList"> <property name="halign">start</property>
<property name="visible">True</property> <property name="hexpand">True</property>
<property name="selection_mode">none</property> <property name="label" translatable="yes">Built-In</property>
<style> <attributes>
<class name="frame"/> <attribute name="weight" value="bold"/>
</style> </attributes>
</object>
</child>
<child>
<object class="GtkListBox" id="systemList">
<property name="selection_mode">none</property>
<property name="show_separators">True</property>
<style>
<class name="frame"/>
</style>
</object>
</child>
</object> </object>
</child> </child>
</object> </object>
</child> </child>
</object> </object>
</child> </property>
</object> </object>
<packing>
<property name="name">main</property>
</packing>
</child> </child>
<child> <child>
<object class="GtkBox"> <object class="GtkStackPage">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="margin">32</property>
<property name="spacing">6</property>
<property name="valign">center</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="pixel_size">96</property>
<property name="icon_name">org.gnome.Extensions-symbolic</property>
</object>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="label" translatable="yes">No Installed Extensions</property>
<attributes>
<attribute name="weight" value="bold"/>
<attribute name="scale" value="1.44"/>
</attributes>
</object>
</child>
</object>
<packing>
<property name="name">placeholder</property> <property name="name">placeholder</property>
</packing> <property name="child">
<object class="GtkBox">
<property name="orientation">vertical</property>
<property name="margin-start">32</property>
<property name="margin-end">32</property>
<property name="margin-top">32</property>
<property name="margin-bottom">32</property>
<property name="spacing">6</property>
<property name="valign">center</property>
<child>
<object class="GtkImage">
<property name="pixel_size">96</property>
<property name="icon_name">org.gnome.Extensions-symbolic</property>
</object>
</child>
<child>
<object class="GtkLabel">
<property name="label" translatable="yes">No Installed Extensions</property>
<attributes>
<attribute name="weight" value="bold"/>
<attribute name="scale" value="1.44"/>
</attributes>
</object>
</child>
</object>
</property>
</object>
</child> </child>
<child> <child>
<object class="GtkBox"> <object class="GtkStackPage">
<property name="visible">True</property>
<property name="margin_left">100</property>
<property name="margin_right">100</property>
<property name="margin_top">100</property>
<property name="margin_bottom">60</property>
<property name="orientation">vertical</property>
<property name="spacing">12</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="label" translatable="yes">Somethings gone wrong</property>
<attributes>
<attribute name="scale" value="1.44"/>
</attributes>
<style>
<class name="dim-label"/>
</style>
</object>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="label" translatable="yes">Were very sorry, but it was not possible to get the list of installed extensions. Make sure you are logged into GNOME and try again.</property>
<property name="justify">center</property>
<property name="wrap">True</property>
<style>
<class name="dim-label"/>
</style>
</object>
</child>
</object>
<packing>
<property name="name">noshell</property> <property name="name">noshell</property>
</packing> <property name="child">
<object class="GtkBox">
<property name="margin-start">100</property>
<property name="margin-end">100</property>
<property name="margin_top">100</property>
<property name="margin_bottom">60</property>
<property name="orientation">vertical</property>
<property name="spacing">12</property>
<child>
<object class="GtkLabel">
<property name="label" translatable="yes">Somethings gone wrong</property>
<attributes>
<attribute name="scale" value="1.44"/>
</attributes>
<style>
<class name="dim-label"/>
</style>
</object>
</child>
<child>
<object class="GtkLabel">
<property name="label" translatable="yes">Were very sorry, but it was not possible to get the list of installed extensions. Make sure you are logged into GNOME and try again.</property>
<property name="justify">center</property>
<property name="wrap">True</property>
<style>
<class name="dim-label"/>
</style>
</object>
</child>
</object>
</property>
</object>
</child> </child>
</object> </object>
</child> </child>
<child> <child>
<object class="GtkActionBar" id="updatesBar"> <object class="GtkActionBar" id="updatesBar">
<property name="no_show_all">True</property> <property name="revealed">False</property>
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<property name="visible">True</property>
<property name="pixel-size">24</property> <property name="pixel-size">24</property>
<property name="margin">6</property> <property name="margin-start">6</property>
<property name="margin-end">6</property>
<property name="margin-top">6</property>
<property name="margin-bottom">6</property>
<property name="icon_name">software-update-available-symbolic</property> <property name="icon_name">software-update-available-symbolic</property>
<style> <style>
<class name="warning"/> <class name="warning"/>
@ -264,11 +245,9 @@
</child> </child>
<child> <child>
<object class="GtkBox"> <object class="GtkBox">
<property name="visible">True</property>
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<child> <child>
<object class="GtkLabel"> <object class="GtkLabel">
<property name="visible">True</property>
<property name="halign">start</property> <property name="halign">start</property>
<property name="label" translatable="yes">Extension Updates Ready</property> <property name="label" translatable="yes">Extension Updates Ready</property>
<attributes> <attributes>
@ -278,16 +257,14 @@
</child> </child>
<child> <child>
<object class="GtkLabel" id="updatesLabel"> <object class="GtkLabel" id="updatesLabel">
<property name="visible">True</property>
<property name="halign">start</property> <property name="halign">start</property>
</object> </object>
</child> </child>
</object> </object>
</child> </child>
<child> <child type="end">
<object class="GtkButton"> <object class="GtkButton">
<property name="label" translatable="yes">Log Out…</property> <property name="label" translatable="yes">Log Out…</property>
<property name="visible">True</property>
<property name="valign">center</property> <property name="valign">center</property>
<property name="action-name">win.logout</property> <property name="action-name">win.logout</property>
<property name="receives_default">True</property> <property name="receives_default">True</property>
@ -295,9 +272,6 @@
<class name="suggested-action"/> <class name="suggested-action"/>
</style> </style>
</object> </object>
<packing>
<property name="pack_type">end</property>
</packing>
</child> </child>
</object> </object>
</child> </child>

View File

@ -1,6 +1,6 @@
/* exported main */ /* exported main */
imports.gi.versions.Gdk = '3.0'; imports.gi.versions.Gdk = '4.0';
imports.gi.versions.Gtk = '3.0'; imports.gi.versions.Gtk = '4.0';
const Gettext = imports.gettext; const Gettext = imports.gettext;
const Package = imports.package; const Package = imports.package;
@ -63,7 +63,7 @@ class Application extends Gtk.Application {
} catch (e) { } catch (e) {
logError(e, 'Failed to add application style'); logError(e, 'Failed to add application style');
} }
Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(), Gtk.StyleContext.add_provider_for_display(Gdk.Display.get_default(),
provider, provider,
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION); Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION);
@ -80,7 +80,6 @@ var ExtensionsWindow = GObject.registerClass({
InternalChildren: [ InternalChildren: [
'userList', 'userList',
'systemList', 'systemList',
'mainBox',
'mainStack', 'mainStack',
'scrolledWindow', 'scrolledWindow',
'updatesBar', 'updatesBar',
@ -95,8 +94,6 @@ var ExtensionsWindow = GObject.registerClass({
this._exporter = new Shew.WindowExporter({ window: this }); this._exporter = new Shew.WindowExporter({ window: this });
this._exportedHandle = ''; this._exportedHandle = '';
this._mainBox.set_focus_vadjustment(this._scrolledWindow.vadjustment);
let action; let action;
action = new Gio.SimpleAction({ name: 'show-about' }); action = new Gio.SimpleAction({ name: 'show-about' });
action.connect('activate', this._showAbout.bind(this)); action.connect('activate', this._showAbout.bind(this));
@ -117,10 +114,7 @@ var ExtensionsWindow = GObject.registerClass({
this.add_action(action); this.add_action(action);
this._userList.set_sort_func(this._sortList.bind(this)); this._userList.set_sort_func(this._sortList.bind(this));
this._userList.set_header_func(this._updateHeader.bind(this));
this._systemList.set_sort_func(this._sortList.bind(this)); this._systemList.set_sort_func(this._sortList.bind(this));
this._systemList.set_header_func(this._updateHeader.bind(this));
this._shellProxy.connectSignal('ExtensionStateChanged', this._shellProxy.connectSignal('ExtensionStateChanged',
this._onExtensionStateChanged.bind(this)); this._onExtensionStateChanged.bind(this));
@ -209,18 +203,10 @@ var ExtensionsWindow = GObject.registerClass({
return row1.name.localeCompare(row2.name); return row1.name.localeCompare(row2.name);
} }
_updateHeader(row, before) {
if (!before || row.get_header())
return;
let sep = new Gtk.Separator({ orientation: Gtk.Orientation.HORIZONTAL });
row.set_header(sep);
}
_findExtensionRow(uuid) { _findExtensionRow(uuid) {
return [ return [
...this._userList.get_children(), ...this._userList,
...this._systemList.get_children(), ...this._systemList,
].find(c => c.uuid === uuid); ].find(c => c.uuid === uuid);
} }
@ -240,13 +226,13 @@ var ExtensionsWindow = GObject.registerClass({
// and reset the variable to null so that we create a new row // and reset the variable to null so that we create a new row
// below and add it to the appropriate list // below and add it to the appropriate list
if (row && row.type !== extension.type) { if (row && row.type !== extension.type) {
row.destroy(); row.get_parent().remove(row);
row = null; row = null;
} }
if (row) { if (row) {
if (extension.state === ExtensionState.UNINSTALLED) if (extension.state === ExtensionState.UNINSTALLED)
row.destroy(); row.get_parent().remove(row);
} else { } else {
this._addExtensionRow(extension); this._addExtensionRow(extension);
} }
@ -276,12 +262,11 @@ var ExtensionsWindow = GObject.registerClass({
_addExtensionRow(extension) { _addExtensionRow(extension) {
let row = new ExtensionRow(extension); let row = new ExtensionRow(extension);
row.show_all();
if (row.type === ExtensionType.PER_USER) if (row.type === ExtensionType.PER_USER)
this._userList.add(row); this._userList.insert(row, -1);
else else
this._systemList.add(row); this._systemList.insert(row, -1);
} }
_queueUpdatesCheck() { _queueUpdatesCheck() {
@ -298,8 +283,8 @@ var ExtensionsWindow = GObject.registerClass({
} }
_syncListVisibility() { _syncListVisibility() {
this._userList.visible = this._userList.get_children().length > 0; this._userList.visible = this._userList.get_first_child() !== null;
this._systemList.visible = this._systemList.get_children().length > 0; this._systemList.visible = this._systemList.get_first_child() !== null;
if (this._userList.visible || this._systemList.visible) if (this._userList.visible || this._systemList.visible)
this._mainStack.visible_child_name = 'main'; this._mainStack.visible_child_name = 'main';
@ -308,13 +293,13 @@ var ExtensionsWindow = GObject.registerClass({
} }
_checkUpdates() { _checkUpdates() {
let nUpdates = this._userList.get_children().filter(c => c.hasUpdate).length; let nUpdates = [...this._userList].filter(c => c.hasUpdate).length;
this._updatesLabel.label = Gettext.ngettext( this._updatesLabel.label = Gettext.ngettext(
'%d extension will be updated on next login.', '%d extension will be updated on next login.',
'%d extensions will be updated on next login.', '%d extensions will be updated on next login.',
nUpdates).format(nUpdates); nUpdates).format(nUpdates);
this._updatesBar.visible = nUpdates > 0; this._updatesBar.revealed = nUpdates > 0;
} }
_extensionsLoaded() { _extensionsLoaded() {
@ -354,7 +339,7 @@ var ExtensionRow = GObject.registerClass({
name: 'show-prefs', name: 'show-prefs',
enabled: this.hasPrefs, enabled: this.hasPrefs,
}); });
action.connect('activate', () => this.get_toplevel().openPrefs(this.uuid)); action.connect('activate', () => this.get_root().openPrefs(this.uuid));
this._actionGroup.add_action(action); this._actionGroup.add_action(action);
action = new Gio.SimpleAction({ action = new Gio.SimpleAction({
@ -371,7 +356,7 @@ var ExtensionRow = GObject.registerClass({
name: 'uninstall', name: 'uninstall',
enabled: this.type === ExtensionType.PER_USER, enabled: this.type === ExtensionType.PER_USER,
}); });
action.connect('activate', () => this.get_toplevel().uninstall(this.uuid)); action.connect('activate', () => this.get_root().uninstall(this.uuid));
this._actionGroup.add_action(action); this._actionGroup.add_action(action);
action = new Gio.SimpleAction({ action = new Gio.SimpleAction({

View File

@ -22,6 +22,7 @@ pkglibdir = join_paths(get_option('libdir'), package_name)
girdir = join_paths(pkgdatadir, 'gir-1.0') girdir = join_paths(pkgdatadir, 'gir-1.0')
typelibdir = join_paths(pkglibdir, 'girepository-1.0') typelibdir = join_paths(pkglibdir, 'girepository-1.0')
gtk_dep = dependency('gtk+-3.0') gtk_dep = dependency('gtk4')
x11_dep = dependency('x11', required: false)
subdir('src') subdir('src')

View File

@ -12,7 +12,7 @@ shew_sources = [
libshew = library(full_name, libshew = library(full_name,
sources: shew_sources, sources: shew_sources,
dependencies: [gtk_dep], dependencies: [gtk_dep, x11_dep],
install_dir: pkglibdir, install_dir: pkglibdir,
install: true, install: true,
) )
@ -21,7 +21,7 @@ libshew_gir = gnome.generate_gir(libshew,
sources: shew_sources + shew_public_headers, sources: shew_sources + shew_public_headers,
nsversion: api_version, nsversion: api_version,
namespace: 'Shew', namespace: 'Shew',
includes: ['Gdk-3.0', 'Gtk-3.0'], includes: ['Gdk-4.0', 'Gtk-4.0'],
extra_args: ['--quiet'], extra_args: ['--quiet'],
install_dir_gir: girdir, install_dir_gir: girdir,
install_dir_typelib: typelibdir, install_dir_typelib: typelibdir,

View File

@ -21,7 +21,7 @@
#include <gdk/gdk.h> #include <gdk/gdk.h>
#ifdef GDK_WINDOWING_WAYLAND #ifdef GDK_WINDOWING_WAYLAND
#include <gdk/gdkwayland.h> #include <gdk/wayland/gdkwayland.h>
#endif #endif
#include "shew-external-window-wayland.h" #include "shew-external-window-wayland.h"
@ -77,14 +77,14 @@ shew_external_window_wayland_new (const char *handle_str)
static void static void
shew_external_window_wayland_set_parent_of (ShewExternalWindow *external_window, shew_external_window_wayland_set_parent_of (ShewExternalWindow *external_window,
GdkWindow *child_window) GdkSurface *child_surface)
{ {
ShewExternalWindowWayland *external_window_wayland = ShewExternalWindowWayland *external_window_wayland =
SHEW_EXTERNAL_WINDOW_WAYLAND (external_window); SHEW_EXTERNAL_WINDOW_WAYLAND (external_window);
char *handle_str = external_window_wayland->handle_str; char *handle_str = external_window_wayland->handle_str;
#ifdef GDK_WINDOWING_WAYLAND #ifdef GDK_WINDOWING_WAYLAND
if (!gdk_wayland_window_set_transient_for_exported (child_window, handle_str)) if (!gdk_wayland_surface_set_transient_for_exported (GDK_WAYLAND_SURFACE (child_surface), handle_str))
g_warning ("Failed to set portal window transient for external parent"); g_warning ("Failed to set portal window transient for external parent");
#endif #endif
} }

View File

@ -21,7 +21,8 @@
#include <errno.h> #include <errno.h>
#include <gdk/gdk.h> #include <gdk/gdk.h>
#ifdef GDK_WINDOWING_X11 #ifdef GDK_WINDOWING_X11
#include <gdk/gdkx.h> #include <gdk/x11/gdkx.h>
#include <X11/Xlib.h>
#endif #endif
#include <stdlib.h> #include <stdlib.h>
@ -33,7 +34,7 @@ struct _ShewExternalWindowX11
{ {
ShewExternalWindow parent; ShewExternalWindow parent;
GdkWindow *foreign_gdk_window; int foreign_xid;
}; };
G_DEFINE_TYPE (ShewExternalWindowX11, shew_external_window_x11, G_DEFINE_TYPE (ShewExternalWindowX11, shew_external_window_x11,
@ -54,13 +55,29 @@ get_x11_display (void)
return x11_display; return x11_display;
} }
static gboolean
check_foreign_xid (GdkDisplay *display,
int xid)
{
gboolean result = FALSE;
#ifdef GDK_WINDOWING_X11
XWindowAttributes attrs;
gdk_x11_display_error_trap_push (display);
result = XGetWindowAttributes (GDK_DISPLAY_XDISPLAY (display), xid, &attrs);
if (gdk_x11_display_error_trap_pop (display) || !result)
return FALSE;
#endif
return result;
}
ShewExternalWindowX11 * ShewExternalWindowX11 *
shew_external_window_x11_new (const char *handle_str) shew_external_window_x11_new (const char *handle_str)
{ {
ShewExternalWindowX11 *external_window_x11; ShewExternalWindowX11 *external_window_x11;
GdkDisplay *display; GdkDisplay *display;
int xid; int xid;
GdkWindow *foreign_gdk_window = NULL;
display = get_x11_display (); display = get_x11_display ();
if (!display) if (!display)
@ -77,43 +94,32 @@ shew_external_window_x11_new (const char *handle_str)
return NULL; return NULL;
} }
#ifdef GDK_WINDOWING_X11 if (!check_foreign_xid (display, xid))
foreign_gdk_window = gdk_x11_window_foreign_new_for_display (display, xid);
#endif
if (!foreign_gdk_window)
{ {
g_warning ("Failed to create foreign window for XID %d", xid); g_warning ("Failed to find foreign window for XID %d", xid);
return NULL; return NULL;
} }
external_window_x11 = g_object_new (SHEW_TYPE_EXTERNAL_WINDOW_X11, external_window_x11 = g_object_new (SHEW_TYPE_EXTERNAL_WINDOW_X11,
"display", display, "display", display,
NULL); NULL);
external_window_x11->foreign_gdk_window = foreign_gdk_window; external_window_x11->foreign_xid = xid;
return external_window_x11; return external_window_x11;
} }
static void static void
shew_external_window_x11_set_parent_of (ShewExternalWindow *external_window, shew_external_window_x11_set_parent_of (ShewExternalWindow *external_window,
GdkWindow *child_window) GdkSurface *child_surface)
{ {
ShewExternalWindowX11 *external_window_x11 = ShewExternalWindowX11 *external_window_x11 =
SHEW_EXTERNAL_WINDOW_X11 (external_window); SHEW_EXTERNAL_WINDOW_X11 (external_window);
gdk_window_set_transient_for (child_window, #ifdef GDK_WINDOWING_X11
external_window_x11->foreign_gdk_window); XSetTransientForHint (GDK_SURFACE_XDISPLAY (child_surface),
} GDK_SURFACE_XID (child_surface),
external_window_x11->foreign_xid);
static void #endif
shew_external_window_x11_dispose (GObject *object)
{
ShewExternalWindowX11 *external_window_x11 = SHEW_EXTERNAL_WINDOW_X11 (object);
g_clear_object (&external_window_x11->foreign_gdk_window);
G_OBJECT_CLASS (shew_external_window_x11_parent_class)->dispose (object);
} }
static void static void
@ -124,10 +130,7 @@ shew_external_window_x11_init (ShewExternalWindowX11 *external_window_x11)
static void static void
shew_external_window_x11_class_init (ShewExternalWindowX11Class *klass) shew_external_window_x11_class_init (ShewExternalWindowX11Class *klass)
{ {
GObjectClass *object_class = G_OBJECT_CLASS (klass);
ShewExternalWindowClass *external_window_class = SHEW_EXTERNAL_WINDOW_CLASS (klass); ShewExternalWindowClass *external_window_class = SHEW_EXTERNAL_WINDOW_CLASS (klass);
object_class->dispose = shew_external_window_x11_dispose;
external_window_class->set_parent_of = shew_external_window_x11_set_parent_of; external_window_class->set_parent_of = shew_external_window_x11_set_parent_of;
} }

View File

@ -75,10 +75,10 @@ shew_external_window_new_from_handle (const char *handle_str)
void void
shew_external_window_set_parent_of (ShewExternalWindow *external_window, shew_external_window_set_parent_of (ShewExternalWindow *external_window,
GdkWindow *child_window) GdkSurface *child_surface)
{ {
SHEW_EXTERNAL_WINDOW_GET_CLASS (external_window)->set_parent_of (external_window, SHEW_EXTERNAL_WINDOW_GET_CLASS (external_window)->set_parent_of (external_window,
child_window); child_surface);
} }
/** /**

View File

@ -32,12 +32,12 @@ struct _ShewExternalWindowClass
GObjectClass parent_class; GObjectClass parent_class;
void (*set_parent_of) (ShewExternalWindow *external_window, void (*set_parent_of) (ShewExternalWindow *external_window,
GdkWindow *child_window); GdkSurface *child_surface);
}; };
ShewExternalWindow *shew_external_window_new_from_handle (const char *handle_str); ShewExternalWindow *shew_external_window_new_from_handle (const char *handle_str);
void shew_external_window_set_parent_of (ShewExternalWindow *external_window, void shew_external_window_set_parent_of (ShewExternalWindow *external_window,
GdkWindow *child_window); GdkSurface *child_surface);
GdkDisplay *shew_external_window_get_display (ShewExternalWindow *external_window); GdkDisplay *shew_external_window_get_display (ShewExternalWindow *external_window);

View File

@ -21,10 +21,10 @@
#include "shew-window-exporter.h" #include "shew-window-exporter.h"
#ifdef GDK_WINDOWING_X11 #ifdef GDK_WINDOWING_X11
#include <gdk/gdkx.h> #include <gdk/x11/gdkx.h>
#endif #endif
#ifdef GDK_WINDOWING_WAYLAND #ifdef GDK_WINDOWING_WAYLAND
#include <gdk/gdkwayland.h> #include <gdk/wayland/gdkwayland.h>
#endif #endif
struct _ShewWindowExporter struct _ShewWindowExporter
@ -53,7 +53,7 @@ shew_window_exporter_new (GtkWindow *window)
#ifdef GDK_WINDOWING_WAYLAND #ifdef GDK_WINDOWING_WAYLAND
static void static void
wayland_window_exported (GdkWindow *window, wayland_window_exported (GdkSurface *surface,
const char *handle, const char *handle,
gpointer user_data) gpointer user_data)
{ {
@ -90,8 +90,8 @@ shew_window_exporter_export (ShewWindowExporter *exporter,
#ifdef GDK_WINDOWING_X11 #ifdef GDK_WINDOWING_X11
if (GDK_IS_X11_DISPLAY (gtk_widget_get_display (widget))) if (GDK_IS_X11_DISPLAY (gtk_widget_get_display (widget)))
{ {
GdkWindow *w = gtk_widget_get_window (widget); GdkSurface *s = gtk_native_get_surface (GTK_NATIVE (widget));
guint32 xid = (guint32) gdk_x11_window_get_xid (w); guint32 xid = (guint32) gdk_x11_surface_get_xid (s);
g_task_return_pointer (task, g_strdup_printf ("x11:%x", xid), g_free); g_task_return_pointer (task, g_strdup_printf ("x11:%x", xid), g_free);
} }
@ -100,9 +100,9 @@ shew_window_exporter_export (ShewWindowExporter *exporter,
#ifdef GDK_WINDOWING_WAYLAND #ifdef GDK_WINDOWING_WAYLAND
if (GDK_IS_WAYLAND_DISPLAY (gtk_widget_get_display (widget))) if (GDK_IS_WAYLAND_DISPLAY (gtk_widget_get_display (widget)))
{ {
GdkWindow *w = gtk_widget_get_window (widget); GdkSurface *s = gtk_native_get_surface (GTK_NATIVE (widget));
gdk_wayland_window_export_handle (w, wayland_window_exported, gdk_wayland_surface_export_handle (s, wayland_window_exported,
g_steal_pointer (&task), NULL); g_steal_pointer (&task), NULL);
} }
#endif #endif
@ -136,8 +136,8 @@ shew_window_exporter_unexport (ShewWindowExporter *exporter)
#ifdef GDK_WINDOWING_WAYLAND #ifdef GDK_WINDOWING_WAYLAND
if (GDK_IS_WAYLAND_DISPLAY (gtk_widget_get_display (widget))) if (GDK_IS_WAYLAND_DISPLAY (gtk_widget_get_display (widget)))
{ {
GdkWindow *w = gtk_widget_get_window (widget); GdkSurface *s = gtk_native_get_surface (GTK_NATIVE (widget));
gdk_wayland_window_unexport_handle (w); gdk_wayland_surface_unexport_handle (s);
} }
#endif #endif
} }