Compare commits
74 Commits
3.37.3
...
benzea/use
Author | SHA1 | Date | |
---|---|---|---|
869f8f480c | |||
4e54cbcc60 | |||
b689b35b7d | |||
01a927f388 | |||
41d5b1455f | |||
b710c6e275 | |||
4c9f42eea9 | |||
2b0731ab81 | |||
a9b803f075 | |||
73436b5276 | |||
20dcc8aa87 | |||
fdac0602db | |||
e5272c84d7 | |||
1812db7aa8 | |||
260405a49e | |||
71d37bffdf | |||
95436a08b5 | |||
13137aad9d | |||
71f55643b2 | |||
5c550daecb | |||
4e0492c517 | |||
f386103bc1 | |||
26e66aa4fd | |||
4420f52080 | |||
b4082063de | |||
bde974087a | |||
d93b51e135 | |||
730a68dffc | |||
f06c257952 | |||
7afab2c28c | |||
16a18f2ae7 | |||
704e08dc08 | |||
60311aa4d1 | |||
cceb74706a | |||
578ae29ed2 | |||
701d110493 | |||
d1cbf6c7a9 | |||
b64ce217e4 | |||
783dbe2aa9 | |||
f4ce1cf462 | |||
d04d6e069d | |||
40de201056 | |||
18234ea91a | |||
e3f3297cba | |||
e1ea1d2954 | |||
8e23ff8111 | |||
8a50a8e64c | |||
fae207811a | |||
1d86424942 | |||
2bc8175219 | |||
1e31caf0b8 | |||
8e24ac6b26 | |||
427b9ac75f | |||
f50205e9b4 | |||
168cfdd86b | |||
d339c94c18 | |||
97509bf1d2 | |||
4a9c2ee805 | |||
51e1e6d15c | |||
f0d2509dc3 | |||
95bb194356 | |||
de8b43a45d | |||
82be010fd8 | |||
2a0c116757 | |||
6cdaec4001 | |||
ed4baec40f | |||
9e8883c922 | |||
9bb64da895 | |||
049f348e25 | |||
be190cc4d9 | |||
0893789b34 | |||
7b5c6b657a | |||
9363fd3524 | |||
0ad242a81e |
191
data/dbus-interfaces/org.gnome.Mutter.ScreenCast.xml
Normal file
191
data/dbus-interfaces/org.gnome.Mutter.ScreenCast.xml
Normal 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>
|
@ -70,6 +70,14 @@
|
||||
-->
|
||||
<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"/>
|
||||
</interface>
|
||||
</node>
|
||||
|
@ -28,6 +28,7 @@
|
||||
<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.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.SessionManager.EndSessionDialog.xml</file>
|
||||
<file preprocess="xml-stripblanks">org.gnome.SessionManager.Inhibitor.xml</file>
|
||||
|
@ -6,25 +6,25 @@
|
||||
<file>checkbox-off-focused.svg</file>
|
||||
<file>checkbox-off.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>gnome-shell.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-notifications.svg</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/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/pointer-drag-symbolic.svg">pointer-drag-symbolic.svg</file>
|
||||
<file alias="icons/pointer-primary-click-symbolic.svg">pointer-primary-click-symbolic.svg</file>
|
||||
<file alias="icons/pointer-secondary-click-symbolic.svg">pointer-secondary-click-symbolic.svg</file>
|
||||
<file alias="icons/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/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/keyboard-shift-filled-symbolic.svg">keyboard-shift-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/scalable/status/eye-not-looking-symbolic.svg">eye-not-looking-symbolic.svg</file>
|
||||
<file alias="icons/scalable/actions/pointer-double-click-symbolic.svg">pointer-double-click-symbolic.svg</file>
|
||||
<file alias="icons/scalable/actions/pointer-drag-symbolic.svg">pointer-drag-symbolic.svg</file>
|
||||
<file alias="icons/scalable/actions/pointer-primary-click-symbolic.svg">pointer-primary-click-symbolic.svg</file>
|
||||
<file alias="icons/scalable/actions/pointer-secondary-click-symbolic.svg">pointer-secondary-click-symbolic.svg</file>
|
||||
<file alias="icons/scalable/status/keyboard-caps-lock-filled-symbolic.svg">keyboard-caps-lock-filled-symbolic.svg</file>
|
||||
<file alias="icons/scalable/status/keyboard-enter-symbolic.svg">keyboard-enter-symbolic.svg</file>
|
||||
<file alias="icons/scalable/status/keyboard-hide-symbolic.svg">keyboard-hide-symbolic.svg</file>
|
||||
<file alias="icons/scalable/status/keyboard-layout-filled-symbolic.svg">keyboard-layout-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>toggle-off.svg</file>
|
||||
<file>toggle-off-dark.svg</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
|
@ -101,22 +101,21 @@ if have_systemd
|
||||
unitconf.set('bindir', bindir)
|
||||
|
||||
configure_file(
|
||||
input: 'gnome-shell-x11.service.in',
|
||||
output: 'gnome-shell-x11.service',
|
||||
input: 'org.gnome.Shell@x11.service.in',
|
||||
output: 'org.gnome.Shell@x11.service',
|
||||
configuration: unitconf,
|
||||
install_dir: systemduserunitdir
|
||||
)
|
||||
|
||||
configure_file(
|
||||
input: 'gnome-shell-wayland.service.in',
|
||||
output: 'gnome-shell-wayland.service',
|
||||
input: 'org.gnome.Shell@wayland.service.in',
|
||||
output: 'org.gnome.Shell@wayland.service',
|
||||
configuration: unitconf,
|
||||
install_dir: systemduserunitdir
|
||||
)
|
||||
|
||||
units = files('gnome-shell-x11.target',
|
||||
'gnome-shell-wayland.target',
|
||||
'gnome-shell-disable-extensions.service')
|
||||
units = files('org.gnome.Shell.target',
|
||||
'org.gnome.Shell-disable-extensions.service')
|
||||
|
||||
install_data(units, install_dir: systemduserunitdir)
|
||||
endif
|
||||
|
@ -6,5 +6,5 @@ Requisite=gnome-session-initialized.target
|
||||
PartOf=gnome-session-initialized.target
|
||||
Before=gnome-session-initialized.target
|
||||
|
||||
Requires=gnome-shell-wayland.service
|
||||
After=gnome-shell-wayland.service
|
||||
Wants=org.gnome.Shell@wayland.service
|
||||
Wants=org.gnome.Shell@x11.service
|
@ -1,7 +1,7 @@
|
||||
[Unit]
|
||||
Description=GNOME Shell on Wayland
|
||||
# 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
|
||||
CollectMode=inactive-or-failed
|
||||
RefuseManualStart=on
|
||||
@ -13,18 +13,21 @@ Requisite=gnome-session-initialized.target
|
||||
PartOf=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]
|
||||
Slice=session.slice
|
||||
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
|
||||
# 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
|
||||
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
|
||||
Restart=no
|
||||
# Kill any stubborn child processes after this long
|
@ -1,7 +1,7 @@
|
||||
[Unit]
|
||||
Description=GNOME Shell on X11
|
||||
# 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
|
||||
CollectMode=inactive-or-failed
|
||||
RefuseManualStart=on
|
||||
@ -13,18 +13,24 @@ Requisite=gnome-session-initialized.target
|
||||
PartOf=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
|
||||
StartLimitIntervalSec=15s
|
||||
StartLimitBurst=3
|
||||
|
||||
[Service]
|
||||
Slice=session.slice
|
||||
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
|
||||
# Exit code 1 means we are probably *not* dealing with an extension failure
|
||||
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.
|
||||
Restart=always
|
||||
# Do not wait before restarting the shell
|
@ -109,6 +109,17 @@
|
||||
the shell.
|
||||
</description>
|
||||
</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"/>
|
||||
</schema>
|
||||
|
||||
|
@ -3,13 +3,8 @@ private_headers = [
|
||||
'gactionobservable.h',
|
||||
'gactionobserver.h',
|
||||
'shell-network-agent.h',
|
||||
'shell-recorder-src.h'
|
||||
]
|
||||
|
||||
if not enable_recorder
|
||||
private_headers += 'shell-recorder.h'
|
||||
endif
|
||||
|
||||
exclude_directories = [
|
||||
'calendar-server',
|
||||
'hotplug-sniffer',
|
||||
|
@ -25,6 +25,8 @@ var ServiceImplementation = class {
|
||||
|
||||
// subclasses may override this to disable automatic shutdown
|
||||
this._autoShutdown = true;
|
||||
|
||||
this._queueShutdownCheck();
|
||||
}
|
||||
|
||||
// subclasses may override this to own additional names
|
||||
|
@ -8,6 +8,12 @@ dbus_services = {
|
||||
'org.gnome.Shell.Notifications': 'notifications',
|
||||
}
|
||||
|
||||
if enable_recorder
|
||||
dbus_services += {
|
||||
'org.gnome.Shell.Screencast': 'screencast',
|
||||
}
|
||||
endif
|
||||
|
||||
config_dir = '@0@/..'.format(meson.current_build_dir())
|
||||
|
||||
foreach service, dir : dbus_services
|
||||
|
11
js/dbusServices/org.gnome.Shell.Screencast.src.gresource.xml
Normal file
11
js/dbusServices/org.gnome.Shell.Screencast.src.gresource.xml
Normal 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>
|
11
js/dbusServices/screencast/main.js
Normal file
11
js/dbusServices/screencast/main.js
Normal 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();
|
||||
}
|
458
js/dbusServices/screencast/screencastService.js
Normal file
458
js/dbusServices/screencast/screencastService.js
Normal 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]));
|
||||
});
|
||||
}
|
||||
};
|
@ -953,16 +953,15 @@ var LoginDialog = GObject.registerClass({
|
||||
if (this.opacity == 255 && this._authPrompt.verificationStatus == AuthPrompt.AuthPromptStatus.NOT_VERIFYING)
|
||||
return;
|
||||
|
||||
if (this._authPrompt.verificationStatus !== AuthPrompt.AuthPromptStatus.NOT_VERIFYING)
|
||||
this._authPrompt.reset();
|
||||
|
||||
this._bindOpacity();
|
||||
this.ease({
|
||||
opacity: 255,
|
||||
duration: _FADE_ANIMATION_TIME,
|
||||
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
|
||||
onComplete: () => {
|
||||
if (this._authPrompt.verificationStatus != AuthPrompt.AuthPromptStatus.NOT_VERIFYING)
|
||||
this._authPrompt.reset();
|
||||
this._unbindOpacity();
|
||||
},
|
||||
onComplete: () => this._unbindOpacity(),
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -92,7 +92,6 @@
|
||||
<file>ui/ripples.js</file>
|
||||
<file>ui/runDialog.js</file>
|
||||
<file>ui/screenShield.js</file>
|
||||
<file>ui/screencast.js</file>
|
||||
<file>ui/screenshot.js</file>
|
||||
<file>ui/scripting.js</file>
|
||||
<file>ui/search.js</file>
|
||||
@ -137,7 +136,6 @@
|
||||
<file>ui/status/volume.js</file>
|
||||
<file>ui/status/bluetooth.js</file>
|
||||
<file>ui/status/remoteAccess.js</file>
|
||||
<file>ui/status/screencast.js</file>
|
||||
<file>ui/status/system.js</file>
|
||||
<file>ui/status/thunderbolt.js</file>
|
||||
</gresource>
|
||||
|
@ -1,6 +1,6 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
/* exported collectFromDatadirs, recursivelyDeleteDir,
|
||||
recursivelyMoveDir, loadInterfaceXML */
|
||||
recursivelyMoveDir, loadInterfaceXML, loadSubInterfaceXML */
|
||||
|
||||
const { Gio, GLib } = imports.gi;
|
||||
const Config = imports.misc.config;
|
||||
@ -67,14 +67,19 @@ function recursivelyMoveDir(srcDir, destDir) {
|
||||
}
|
||||
|
||||
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) {
|
||||
if (!_ifaceResource) {
|
||||
// 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();
|
||||
}
|
||||
ensureIfaceResource();
|
||||
|
||||
let uri = `resource:///org/gnome/shell/dbus-interfaces/${iface}.xml`;
|
||||
let f = Gio.File.new_for_uri(uri);
|
||||
@ -88,3 +93,25 @@ function loadInterfaceXML(iface) {
|
||||
|
||||
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);
|
||||
}
|
||||
|
@ -5,7 +5,7 @@ const INTROSPECT_SCHEMA = 'org.gnome.shell';
|
||||
const INTROSPECT_KEY = 'introspect';
|
||||
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;
|
||||
|
||||
@ -59,6 +59,11 @@ var IntrospectService = class {
|
||||
this._settings.connect('notify::enable-animations',
|
||||
this._syncAnimationsEnabled.bind(this));
|
||||
this._syncAnimationsEnabled();
|
||||
|
||||
const monitorManager = Meta.MonitorManager.get();
|
||||
monitorManager.connect('monitors-changed',
|
||||
this._syncScreenSize.bind(this));
|
||||
this._syncScreenSize();
|
||||
}
|
||||
|
||||
_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() {
|
||||
return this._animationsEnabled;
|
||||
}
|
||||
|
||||
get ScreenSize() {
|
||||
return [this._screenWidth, this._screenHeight];
|
||||
}
|
||||
|
||||
get version() {
|
||||
return INTROSPECT_DBUS_API_VERSION;
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
/* exported findUrls, spawn, spawnCommandLine, spawnApp, trySpawnCommandLine,
|
||||
formatTime, formatTimeSpan, createTimeLabel, insertSorted,
|
||||
ensureActorVisibleInScrollView, wiggle */
|
||||
/* exported findUrls, spawn, spawnCommandLine, spawnApp, trySpawnAppCommandline,
|
||||
trySpawnCommandLine, formatTime, formatTimeSpan, createTimeLabel,
|
||||
insertSorted, ensureActorVisibleInScrollView, wiggle */
|
||||
|
||||
const { Clutter, Gio, GLib, Shell, St, GnomeDesktop } = imports.gi;
|
||||
const Gettext = imports.gettext;
|
||||
@ -86,18 +86,49 @@ function spawnCommandLine(commandLine) {
|
||||
}
|
||||
}
|
||||
|
||||
// trySpawnAppCommandline:
|
||||
// @command: The command to spawn
|
||||
//
|
||||
// Runs @command as if it was an application, handling startup notification
|
||||
// and placing it into a separate systemd scope.
|
||||
function trySpawnAppCommandline(command) {
|
||||
const quoted = command.replace(/%/g, '%%');
|
||||
|
||||
// This cannot fail currently
|
||||
const app = Gio.AppInfo.create_from_commandline(quoted, null,
|
||||
Gio.AppInfoCreateFlags.SUPPORTS_STARTUP_NOTIFICATION);
|
||||
|
||||
// Launching applications does not check whether the executable exists,
|
||||
// it'll just log an error later on. So do an explicit check here.
|
||||
const exec = app.get_executable();
|
||||
if (!GLib.find_program_in_path(exec)) {
|
||||
throw new GLib.SpawnError({
|
||||
code: GLib.SpawnError.NOENT,
|
||||
message: _('Command not found'),
|
||||
});
|
||||
}
|
||||
|
||||
try {
|
||||
let context = global.create_app_launch_context(0, -1);
|
||||
|
||||
app.launch([], context);
|
||||
} catch (err) {
|
||||
// Replace "Error invoking global.create_app_launch_context: " with
|
||||
// something nicer
|
||||
err.message = err.message.replace(/[^:]*: /, '%s\n'.format(_('Could not parse command:')));
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
|
||||
// spawnApp:
|
||||
// @argv: an argv array
|
||||
//
|
||||
// Runs @argv as if it was an application, handling startup notification
|
||||
// and placing it into a separate systemd scope.
|
||||
function spawnApp(argv) {
|
||||
try {
|
||||
let app = Gio.AppInfo.create_from_commandline(argv.join(' '), null,
|
||||
Gio.AppInfoCreateFlags.SUPPORTS_STARTUP_NOTIFICATION);
|
||||
|
||||
let context = global.create_app_launch_context(0, -1);
|
||||
app.launch([], context);
|
||||
} catch (err) {
|
||||
trySpawnAppCommandline(argv.join(' '));
|
||||
} catch (err) {
|
||||
_handleSpawnError(argv[0], err);
|
||||
}
|
||||
}
|
||||
|
1207
js/ui/appDisplay.js
1207
js/ui/appDisplay.js
File diff suppressed because it is too large
Load Diff
@ -347,6 +347,8 @@ var Background = GObject.registerClass({
|
||||
this.set_color(color);
|
||||
else
|
||||
this.set_gradient(shadingType, color, secondColor);
|
||||
|
||||
this._setLoaded();
|
||||
}
|
||||
|
||||
_watchFile(file) {
|
||||
@ -765,10 +767,27 @@ var BackgroundManager = class BackgroundManager {
|
||||
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', () => {
|
||||
if (changeSignalId)
|
||||
background.disconnect(changeSignalId);
|
||||
|
||||
if (loadedSignalId)
|
||||
background.disconnect(loadedSignalId);
|
||||
|
||||
if (backgroundActor.loadedSignalId)
|
||||
background.disconnect(backgroundActor.loadedSignalId);
|
||||
});
|
||||
|
@ -1,7 +1,7 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
/* exported BoxPointer */
|
||||
|
||||
const { Clutter, GObject, Shell, St } = imports.gi;
|
||||
const { Clutter, GObject, St } = imports.gi;
|
||||
|
||||
const Main = imports.ui.main;
|
||||
|
||||
@ -453,15 +453,16 @@ var BoxPointer = GObject.registerClass({
|
||||
let alignment = this._arrowAlignment;
|
||||
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);
|
||||
|
||||
// Position correctly relative to the sourceActor
|
||||
let sourceNode = sourceActor.get_theme_node();
|
||||
let sourceContentBox = sourceNode.get_content_box(sourceActor.get_allocation_box());
|
||||
let sourceAllocation = this._sourceAllocation;
|
||||
let sourceCenterX = sourceAllocation.x1 + sourceContentBox.x1 + (sourceContentBox.x2 - sourceContentBox.x1) * this._sourceAlignment;
|
||||
let sourceCenterY = sourceAllocation.y1 + sourceContentBox.y1 + (sourceContentBox.y2 - sourceContentBox.y1) * this._sourceAlignment;
|
||||
let sourceTopLeft = this._sourceExtents.get_top_left();
|
||||
let sourceBottomRight = this._sourceExtents.get_bottom_right();
|
||||
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();
|
||||
|
||||
// We also want to keep it onscreen, and separated from the
|
||||
@ -481,16 +482,16 @@ var BoxPointer = GObject.registerClass({
|
||||
|
||||
switch (this._arrowSide) {
|
||||
case St.Side.TOP:
|
||||
resY = sourceAllocation.y2 + gap;
|
||||
resY = sourceBottomRight.y + gap;
|
||||
break;
|
||||
case St.Side.BOTTOM:
|
||||
resY = sourceAllocation.y1 - natHeight - gap;
|
||||
resY = sourceTopLeft.y - natHeight - gap;
|
||||
break;
|
||||
case St.Side.LEFT:
|
||||
resX = sourceAllocation.x2 + gap;
|
||||
resX = sourceBottomRight.x + gap;
|
||||
break;
|
||||
case St.Side.RIGHT:
|
||||
resX = sourceAllocation.x1 - natWidth - gap;
|
||||
resX = sourceTopLeft.x - natWidth - gap;
|
||||
break;
|
||||
}
|
||||
|
||||
@ -586,29 +587,30 @@ var BoxPointer = GObject.registerClass({
|
||||
}
|
||||
|
||||
_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 workarea = this._workArea;
|
||||
|
||||
switch (arrowSide) {
|
||||
case St.Side.TOP:
|
||||
if (sourceAllocation.y2 + boxHeight > workarea.y + workarea.height &&
|
||||
boxHeight < sourceAllocation.y1 - workarea.y)
|
||||
if (sourceBottomRight.y + boxHeight > workarea.y + workarea.height &&
|
||||
boxHeight < sourceTopLeft.y - workarea.y)
|
||||
return St.Side.BOTTOM;
|
||||
break;
|
||||
case St.Side.BOTTOM:
|
||||
if (sourceAllocation.y1 - boxHeight < workarea.y &&
|
||||
boxHeight < workarea.y + workarea.height - sourceAllocation.y2)
|
||||
if (sourceTopLeft.y - boxHeight < workarea.y &&
|
||||
boxHeight < workarea.y + workarea.height - sourceBottomRight.y)
|
||||
return St.Side.TOP;
|
||||
break;
|
||||
case St.Side.LEFT:
|
||||
if (sourceAllocation.x2 + boxWidth > workarea.x + workarea.width &&
|
||||
boxWidth < sourceAllocation.x1 - workarea.x)
|
||||
if (sourceBottomRight.x + boxWidth > workarea.x + workarea.width &&
|
||||
boxWidth < sourceTopLeft.x - workarea.x)
|
||||
return St.Side.RIGHT;
|
||||
break;
|
||||
case St.Side.RIGHT:
|
||||
if (sourceAllocation.x1 - boxWidth < workarea.x &&
|
||||
boxWidth < workarea.x + workarea.width - sourceAllocation.x2)
|
||||
if (sourceTopLeft.x - boxWidth < workarea.x &&
|
||||
boxWidth < workarea.x + workarea.width - sourceBottomRight.x)
|
||||
return St.Side.LEFT;
|
||||
break;
|
||||
}
|
||||
|
11
js/ui/dnd.js
11
js/ui/dnd.js
@ -388,17 +388,16 @@ var _Draggable = class _Draggable {
|
||||
const [, newAllocatedWidth] = this._dragActor.get_preferred_width(-1);
|
||||
const [, newAllocatedHeight] = this._dragActor.get_preferred_height(-1);
|
||||
|
||||
const transformedAllocation =
|
||||
Shell.util_get_transformed_allocation(this._dragActor);
|
||||
const transformedExtents = this._dragActor.get_transformed_extents();
|
||||
|
||||
// Set the actor's scale such that it will keep the same
|
||||
// transformed size when it's reparented to the uiGroup
|
||||
this._dragActor.set_scale(
|
||||
transformedAllocation.get_width() / newAllocatedWidth,
|
||||
transformedAllocation.get_height() / newAllocatedHeight);
|
||||
transformedExtents.get_width() / newAllocatedWidth,
|
||||
transformedExtents.get_height() / newAllocatedHeight);
|
||||
|
||||
this._dragOffsetX = transformedAllocation.x1 - this._dragStartX;
|
||||
this._dragOffsetY = transformedAllocation.y1 - this._dragStartY;
|
||||
this._dragOffsetX = transformedExtents.origin.x - this._dragStartX;
|
||||
this._dragOffsetY = transformedExtents.origin.y - this._dragStartY;
|
||||
|
||||
this._dragOrigParent.remove_actor(this._dragActor);
|
||||
Main.uiGroup.add_child(this._dragActor);
|
||||
|
@ -139,7 +139,9 @@ function checkForUpdates() {
|
||||
return;
|
||||
if (extension.hasUpdate)
|
||||
return;
|
||||
metadatas[uuid] = extension.metadata;
|
||||
metadatas[uuid] = {
|
||||
version: extension.metadata.version,
|
||||
};
|
||||
});
|
||||
|
||||
if (Object.keys(metadatas).length === 0)
|
||||
|
@ -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(
|
||||
class BaseIcon extends St.Bin {
|
||||
_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
|
||||
get allow_incomplete_pages() {
|
||||
return this._allowIncompletePages;
|
||||
@ -1559,6 +1663,11 @@ var IconGrid = GObject.registerClass({
|
||||
this.queue_relayout();
|
||||
}
|
||||
|
||||
getDropTarget(x, y) {
|
||||
const layoutManager = this.layout_manager;
|
||||
return layoutManager.getDropTarget(x, y, this._currentPage);
|
||||
}
|
||||
|
||||
get itemsPerPage() {
|
||||
const layoutManager = this.layout_manager;
|
||||
return layoutManager.rows_per_page * layoutManager.columns_per_page;
|
||||
|
@ -42,7 +42,7 @@ const defaultKeysPost = [
|
||||
[[{ width: 1.5, keyval: Clutter.KEY_BackSpace, icon: 'edit-clear-symbolic' }],
|
||||
[{ width: 2, keyval: Clutter.KEY_Return, extraClassName: 'enter-key', icon: 'keyboard-enter-symbolic' }],
|
||||
[{ 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: 2, keyval: Clutter.KEY_Return, extraClassName: 'enter-key', icon: 'keyboard-enter-symbolic' }],
|
||||
[{ label: '?123', width: 3, level: 2, right: true }],
|
||||
|
@ -6,7 +6,6 @@ const Signals = imports.signals;
|
||||
|
||||
const Background = imports.ui.background;
|
||||
const BackgroundMenu = imports.ui.backgroundMenu;
|
||||
const LoginManager = imports.misc.loginManager;
|
||||
|
||||
const DND = imports.ui.dnd;
|
||||
const Main = imports.ui.main;
|
||||
@ -295,18 +294,6 @@ var LayoutManager = GObject.registerClass({
|
||||
monitorManager.connect('monitors-changed',
|
||||
this._monitorsChanged.bind(this));
|
||||
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
|
||||
@ -470,6 +457,15 @@ var LayoutManager = GObject.registerClass({
|
||||
}
|
||||
}
|
||||
|
||||
_waitLoaded(bgManager) {
|
||||
return new Promise(resolve => {
|
||||
const id = bgManager.connect('loaded', () => {
|
||||
bgManager.disconnect(id);
|
||||
resolve();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
_updateBackgrounds() {
|
||||
for (let i = 0; i < this._bgManagers.length; i++)
|
||||
this._bgManagers[i].destroy();
|
||||
@ -477,7 +473,7 @@ var LayoutManager = GObject.registerClass({
|
||||
this._bgManagers = [];
|
||||
|
||||
if (Main.sessionMode.isGreeter)
|
||||
return;
|
||||
return Promise.resolve();
|
||||
|
||||
for (let i = 0; i < this.monitors.length; i++) {
|
||||
let bgManager = this._createBackgroundManager(i);
|
||||
@ -486,6 +482,8 @@ var LayoutManager = GObject.registerClass({
|
||||
if (i != this.primaryIndex && this._startingUp)
|
||||
bgManager.backgroundActor.hide();
|
||||
}
|
||||
|
||||
return Promise.all(this._bgManagers.map(this._waitLoaded));
|
||||
}
|
||||
|
||||
_updateKeyboardBox() {
|
||||
@ -644,7 +642,7 @@ var LayoutManager = GObject.registerClass({
|
||||
// When starting a normal user session, we want to grow it out of the middle
|
||||
// of the screen.
|
||||
|
||||
_prepareStartupAnimation() {
|
||||
async _prepareStartupAnimation() {
|
||||
// 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.
|
||||
this._coverPane = new Clutter.Actor({ opacity: 0,
|
||||
@ -661,8 +659,6 @@ var LayoutManager = GObject.registerClass({
|
||||
} else if (Main.sessionMode.isGreeter) {
|
||||
this.panelBox.translation_y = -this.panelBox.height;
|
||||
} else {
|
||||
this._updateBackgrounds();
|
||||
|
||||
// We need to force an update of the regions now before we scale
|
||||
// the UI group to get the correct allocation for the struts.
|
||||
this._updateRegions();
|
||||
@ -678,6 +674,8 @@ var LayoutManager = GObject.registerClass({
|
||||
this.uiGroup.scale_x = this.uiGroup.scale_y = 0.75;
|
||||
this.uiGroup.opacity = 0;
|
||||
global.window_group.set_clip(monitor.x, monitor.y, monitor.width, monitor.height);
|
||||
|
||||
await this._updateBackgrounds();
|
||||
}
|
||||
|
||||
this.emit('startup-prepared');
|
||||
@ -1230,8 +1228,9 @@ class HotCorner extends Clutter.Actor {
|
||||
return;
|
||||
|
||||
if (Main.overview.shouldToggleByCornerOrButton()) {
|
||||
this._ripples.playAnimation(this._x, this._y);
|
||||
Main.overview.toggle();
|
||||
if (Main.overview.animationInProgress)
|
||||
this._ripples.playAnimation(this._x, this._y);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3,10 +3,10 @@
|
||||
ctrlAltTabManager, padOsdService, osdWindowManager,
|
||||
osdMonitorLabeler, shellMountOpDBusService, shellDBusService,
|
||||
shellAccessDialogDBusService, shellAudioSelectionDBusService,
|
||||
screenSaverDBus, screencastService, uiGroup, magnifier,
|
||||
xdndHandler, keyboard, kbdA11yDialog, introspectService,
|
||||
start, pushModal, popModal, activateWindow, createLookingGlass,
|
||||
initializeDeferredWork, getThemeStylesheet, setThemeStylesheet */
|
||||
screenSaverDBus, uiGroup, magnifier, xdndHandler, keyboard,
|
||||
kbdA11yDialog, introspectService, start, pushModal, popModal,
|
||||
activateWindow, createLookingGlass, initializeDeferredWork,
|
||||
getThemeStylesheet, setThemeStylesheet */
|
||||
|
||||
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 NotificationDaemon = imports.ui.notificationDaemon;
|
||||
const WindowAttentionHandler = imports.ui.windowAttentionHandler;
|
||||
const Screencast = imports.ui.screencast;
|
||||
const ScreenShield = imports.ui.screenShield;
|
||||
const Scripting = imports.ui.scripting;
|
||||
const SessionMode = imports.ui.sessionMode;
|
||||
@ -74,7 +73,6 @@ var shellAudioSelectionDBusService = null;
|
||||
var shellDBusService = null;
|
||||
var shellMountOpDBusService = null;
|
||||
var screenSaverDBus = null;
|
||||
var screencastService = null;
|
||||
var modalCount = 0;
|
||||
var actionMode = Shell.ActionMode.NONE;
|
||||
var modalActorFocusStack = [];
|
||||
@ -200,7 +198,6 @@ function _initializeUI() {
|
||||
uiGroup = layoutManager.uiGroup;
|
||||
|
||||
padOsdService = new PadOsd.PadOsdService();
|
||||
screencastService = new Screencast.ScreencastService();
|
||||
xdndHandler = new XdndHandler.XdndHandler();
|
||||
ctrlAltTabManager = new CtrlAltTab.CtrlAltTabManager();
|
||||
osdWindowManager = new OsdWindow.OsdWindowManager();
|
||||
|
@ -736,13 +736,11 @@ class AggregateMenu extends PanelMenu.Button {
|
||||
this._volume = new imports.ui.status.volume.Indicator();
|
||||
this._brightness = new imports.ui.status.brightness.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._nightLight = new imports.ui.status.nightLight.Indicator();
|
||||
this._thunderbolt = new imports.ui.status.thunderbolt.Indicator();
|
||||
|
||||
this._indicators.add_child(this._thunderbolt);
|
||||
this._indicators.add_child(this._screencast);
|
||||
this._indicators.add_child(this._location);
|
||||
this._indicators.add_child(this._nightLight);
|
||||
if (this._network)
|
||||
|
@ -183,10 +183,9 @@ var Button = GObject.registerClass({
|
||||
}
|
||||
|
||||
_onDestroy() {
|
||||
super._onDestroy();
|
||||
|
||||
if (this.menu)
|
||||
this.menu.destroy();
|
||||
super._onDestroy();
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -881,9 +881,10 @@ var PopupMenu = class extends PopupMenuBase {
|
||||
|
||||
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
|
||||
state &= ~Clutter.ModifierType.LOCK_MASK;
|
||||
state &= ~Clutter.ModifierType.MOD2_MASK;
|
||||
state &= Clutter.ModifierType.MODIFIER_MASK;
|
||||
|
||||
if (state)
|
||||
@ -1324,7 +1325,7 @@ var PopupMenuManager = class {
|
||||
|
||||
removeMenu(menu) {
|
||||
if (menu == this.activeMenu)
|
||||
this._closeMenu(false, menu);
|
||||
this._grabHelper.ungrab({ actor: menu.actor });
|
||||
|
||||
let position = this._findMenu(menu);
|
||||
if (position == -1) // not a menu we manage
|
||||
|
@ -196,7 +196,7 @@ class RunDialog extends ModalDialog.ModalDialog {
|
||||
let execArg = this._terminalSettings.get_string(EXEC_ARG_KEY);
|
||||
command = '%s %s %s'.format(exec, execArg, input);
|
||||
}
|
||||
Util.trySpawnCommandLine(command);
|
||||
Util.trySpawnAppCommandline(command);
|
||||
} catch (e) {
|
||||
// Mmmh, that failed - see if @input matches an existing file
|
||||
let path = null;
|
||||
|
@ -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);
|
@ -24,7 +24,8 @@ class RemoteAccessApplet extends PanelMenu.SystemIndicator {
|
||||
return;
|
||||
|
||||
this._handles = new Set();
|
||||
this._indicator = null;
|
||||
this._sharedIndicator = null;
|
||||
this._recordingIndicator = null;
|
||||
this._menuSection = null;
|
||||
|
||||
controller.connect('new-handle', (o, handle) => {
|
||||
@ -33,32 +34,49 @@ class RemoteAccessApplet extends PanelMenu.SystemIndicator {
|
||||
}
|
||||
|
||||
_ensureControls() {
|
||||
if (this._indicator)
|
||||
if (this._sharedIndicator && this._recordingIndicator)
|
||||
return;
|
||||
|
||||
this._indicator = this._addIndicator();
|
||||
this._indicator.icon_name = 'screen-shared-symbolic';
|
||||
this._indicator.add_style_class_name('remote-access-indicator');
|
||||
this._item =
|
||||
this._sharedIndicator = this._addIndicator();
|
||||
this._sharedIndicator.icon_name = 'screen-shared-symbolic';
|
||||
this._sharedIndicator.add_style_class_name('remote-access-indicator');
|
||||
|
||||
this._sharedItem =
|
||||
new PopupMenu.PopupSubMenuMenuItem(_("Screen is Being Shared"),
|
||||
true);
|
||||
this._item.menu.addAction(_("Turn off"),
|
||||
() => {
|
||||
for (let handle of this._handles)
|
||||
handle.stop();
|
||||
});
|
||||
this._item.icon.icon_name = 'screen-shared-symbolic';
|
||||
this.menu.addMenuItem(this._item);
|
||||
this._sharedItem.menu.addAction(_("Turn off"),
|
||||
() => {
|
||||
for (let handle of this._handles) {
|
||||
if (!handle.is_recording)
|
||||
handle.stop();
|
||||
}
|
||||
});
|
||||
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() {
|
||||
if (this._handles.size == 0) {
|
||||
this._indicator.visible = false;
|
||||
this._item.visible = false;
|
||||
if (this._isScreenShared()) {
|
||||
this._sharedIndicator.visible = true;
|
||||
this._sharedItem.visible = true;
|
||||
} else {
|
||||
this._indicator.visible = true;
|
||||
this._item.visible = true;
|
||||
this._sharedIndicator.visible = false;
|
||||
this._sharedItem.visible = false;
|
||||
}
|
||||
|
||||
this._recordingIndicator.visible = this._isRecording();
|
||||
}
|
||||
|
||||
_onStopped(handle) {
|
||||
@ -70,9 +88,7 @@ class RemoteAccessApplet extends PanelMenu.SystemIndicator {
|
||||
this._handles.add(handle);
|
||||
handle.connect('stopped', this._onStopped.bind(this));
|
||||
|
||||
if (this._handles.size == 1) {
|
||||
this._ensureControls();
|
||||
this._sync();
|
||||
}
|
||||
this._ensureControls();
|
||||
this._sync();
|
||||
}
|
||||
});
|
||||
|
@ -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;
|
||||
}
|
||||
});
|
@ -42,6 +42,11 @@ const GsdWacomProxy = Gio.DBusProxy.makeProxyWrapper(GsdWacomIface);
|
||||
|
||||
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(
|
||||
class DisplayChangeDialog extends ModalDialog.ModalDialog {
|
||||
_init(wm) {
|
||||
@ -901,46 +906,23 @@ var WindowManager = class {
|
||||
global.display.connect('init-xserver', (display, task) => {
|
||||
IBusManager.getIBusManager().restartDaemon(['--xim']);
|
||||
|
||||
try {
|
||||
if (!Shell.util_start_systemd_unit('gsd-xsettings.target', 'fail'))
|
||||
log('Not starting gsd-xsettings; waiting for gnome-session to do so');
|
||||
/* Timeout waiting for start job completion after 5 seconds */
|
||||
let cancellable = new Gio.Cancellable();
|
||||
GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, 5, () => {
|
||||
cancellable.cancel();
|
||||
return GLib.SOURCE_REMOVE;
|
||||
});
|
||||
|
||||
/* Leave this watchdog timeout so don't block indefinitely here */
|
||||
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);
|
||||
}
|
||||
this._startX11Services(task, cancellable);
|
||||
|
||||
return true;
|
||||
});
|
||||
global.display.connect('x11-display-closing', () => {
|
||||
if (!Meta.is_wayland_compositor())
|
||||
return;
|
||||
try {
|
||||
Shell.util_stop_systemd_unit('gsd-xsettings.target', 'fail');
|
||||
} catch (e) {
|
||||
log('Error stopping gsd-xsettings: %s'.format(e.message));
|
||||
}
|
||||
|
||||
this._stopX11Services(null);
|
||||
|
||||
IBusManager.getIBusManager().restartDaemon();
|
||||
});
|
||||
|
||||
@ -1008,6 +990,36 @@ var WindowManager = class {
|
||||
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) {
|
||||
this._currentPadOsd = new PadOsd.PadOsd(device, settings, imagePath, editionMode, monitorIndex);
|
||||
this._currentPadOsd.connect('closed', () => (this._currentPadOsd = null));
|
||||
|
@ -1027,6 +1027,8 @@ class Workspace extends St.Widget {
|
||||
if (this.metaWorkspace !== null && !this.metaWorkspace.active)
|
||||
return;
|
||||
|
||||
this.layout_manager.stateAdjustment.value = 0;
|
||||
|
||||
// Special case maximized windows, since it doesn't make sense
|
||||
// to animate windows below in the stack
|
||||
let topMaximizedWindow;
|
||||
@ -1079,6 +1081,8 @@ class Workspace extends St.Widget {
|
||||
if (this.metaWorkspace !== null && !this.metaWorkspace.active)
|
||||
return;
|
||||
|
||||
this.layout_manager.stateAdjustment.value = 0;
|
||||
|
||||
// Special case maximized windows, since it doesn't make sense
|
||||
// to animate windows below in the stack
|
||||
let topMaximizedWindow;
|
||||
@ -1190,10 +1194,14 @@ class Workspace extends St.Widget {
|
||||
|
||||
_doneLeavingOverview() {
|
||||
this.layout_manager.layout_frozen = false;
|
||||
this.layout_manager.stateAdjustment.value = 0;
|
||||
this._windows.forEach(w => (w.opacity = 255));
|
||||
}
|
||||
|
||||
_doneShowingOverview() {
|
||||
this.layout_manager.layout_frozen = false;
|
||||
this.layout_manager.stateAdjustment.value = 1;
|
||||
this._windows.forEach(w => (w.opacity = 255));
|
||||
}
|
||||
|
||||
_isMyWindow(window) {
|
||||
|
@ -11,7 +11,10 @@ var DISPLAY_TIMEOUT = 600;
|
||||
var WorkspaceSwitcherPopupList = GObject.registerClass(
|
||||
class WorkspaceSwitcherPopupList extends St.Widget {
|
||||
_init() {
|
||||
super._init({ style_class: 'workspace-switcher' });
|
||||
super._init({
|
||||
style_class: 'workspace-switcher',
|
||||
offscreen_redirect: Clutter.OffscreenRedirect.ALWAYS,
|
||||
});
|
||||
|
||||
this._itemSpacing = 0;
|
||||
this._childHeight = 0;
|
||||
|
@ -241,6 +241,8 @@ class WorkspacesView extends WorkspacesViewBase {
|
||||
|
||||
startTouchGesture() {
|
||||
this._gestureActive = true;
|
||||
|
||||
this._updateVisibility();
|
||||
}
|
||||
|
||||
endTouchGesture() {
|
||||
@ -381,8 +383,10 @@ class WorkspacesDisplay extends St.Widget {
|
||||
this._windowDragEndId =
|
||||
Main.overview.connect('window-drag-begin',
|
||||
this._windowDragEnd.bind(this));
|
||||
this._overviewShownId = Main.overview.connect('shown',
|
||||
this._syncWorkspacesActualGeometry.bind(this));
|
||||
this._overviewShownId = Main.overview.connect('shown', () => {
|
||||
this._inWindowFade = false;
|
||||
this._syncWorkspacesActualGeometry();
|
||||
});
|
||||
|
||||
this._primaryIndex = Main.layoutManager.primaryIndex;
|
||||
this._workspacesViews = [];
|
||||
@ -401,6 +405,7 @@ class WorkspacesDisplay extends St.Widget {
|
||||
|
||||
this._actualGeometry = null;
|
||||
this._inWindowDrag = false;
|
||||
this._inWindowFade = false;
|
||||
|
||||
this._gestureActive = false; // touch(pad) gestures
|
||||
this._canScroll = true; // limiting scrolling speed
|
||||
@ -549,20 +554,20 @@ class WorkspacesDisplay extends St.Widget {
|
||||
this.show();
|
||||
this._updateWorkspacesViews();
|
||||
|
||||
if (this._actualGeometry) {
|
||||
for (let i = 0; i < this._workspacesViews.length; i++) {
|
||||
let animationType;
|
||||
if (fadeOnPrimary && i == this._primaryIndex)
|
||||
animationType = AnimationType.FADE;
|
||||
else
|
||||
animationType = AnimationType.ZOOM;
|
||||
this._workspacesViews[i].animateToOverview(animationType);
|
||||
}
|
||||
|
||||
if (!fadeOnPrimary)
|
||||
this._syncWorkspacesActualGeometry();
|
||||
for (let i = 0; i < this._workspacesViews.length; i++) {
|
||||
let animationType;
|
||||
if (fadeOnPrimary && i == this._primaryIndex)
|
||||
animationType = AnimationType.FADE;
|
||||
else
|
||||
animationType = AnimationType.ZOOM;
|
||||
this._workspacesViews[i].animateToOverview(animationType);
|
||||
}
|
||||
|
||||
this._inWindowFade = fadeOnPrimary;
|
||||
|
||||
if (this._actualGeometry && !fadeOnPrimary)
|
||||
this._syncWorkspacesActualGeometry();
|
||||
|
||||
this._restackedNotifyId =
|
||||
Main.overview.connect('windows-restacked',
|
||||
this._onRestacked.bind(this));
|
||||
@ -583,6 +588,8 @@ class WorkspacesDisplay extends St.Widget {
|
||||
this._workspacesViews[i].animateFromOverview(animationType);
|
||||
}
|
||||
|
||||
this._inWindowFade = fadeOnPrimary;
|
||||
|
||||
const { primaryIndex } = Main.layoutManager;
|
||||
const { x, y, width, height } =
|
||||
Main.layoutManager.getWorkAreaForMonitor(primaryIndex);
|
||||
@ -707,7 +714,7 @@ class WorkspacesDisplay extends St.Widget {
|
||||
|
||||
_syncWorkspacesActualGeometry() {
|
||||
const primaryView = this._getPrimaryView();
|
||||
if (!primaryView)
|
||||
if (!primaryView || this._inWindowFade)
|
||||
return;
|
||||
|
||||
primaryView.ease({
|
||||
|
@ -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)
|
||||
gst_dep = dependency('gstreamer-1.0', version: gst_req, required: false)
|
||||
gst_base_dep = dependency('gstreamer-base-1.0', required: false)
|
||||
pipewire_dep = dependency('libpipewire-0.3', required: false)
|
||||
|
||||
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
|
||||
recorder_deps += [gst_dep, gst_base_dep, gtk_dep, x11_dep]
|
||||
endif
|
||||
|
315
po/ca.po
315
po/ca.po
@ -10,7 +10,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: HEAD\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"
|
||||
"Last-Translator: Robert Antoni Buj Gelonch <rbuj@fedoraproject.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 "
|
||||
"dialog."
|
||||
msgstr ""
|
||||
"Permet l'accés a les eines de depuració i de seguiment internes a través del "
|
||||
"diàleg de l'Alt+F2."
|
||||
"Permet l'accés a les eines de depuració i de seguiment internes a través del"
|
||||
" diàleg de l'Alt+F2."
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:16
|
||||
msgid "UUIDs of extensions to enable"
|
||||
@ -74,9 +74,9 @@ msgstr ""
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:17
|
||||
msgid ""
|
||||
"GNOME Shell extensions have a UUID property; this key lists extensions which "
|
||||
"should be loaded. Any extension that wants to be loaded needs to be in this "
|
||||
"list. You can also manipulate this list with the EnableExtension and "
|
||||
"GNOME Shell extensions have a UUID property; this key lists extensions which"
|
||||
" should be loaded. Any extension that wants to be loaded needs to be in this"
|
||||
" list. You can also manipulate this list with the EnableExtension and "
|
||||
"DisableExtension D-Bus methods on org.gnome.Shell."
|
||||
msgstr ""
|
||||
"Les extensions del GNOME Shell tenen un identificador universal. Aquesta "
|
||||
@ -92,18 +92,19 @@ msgstr ""
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:27
|
||||
msgid ""
|
||||
"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 "
|
||||
"manipulate this list with the EnableExtension and DisableExtension D-Bus "
|
||||
"methods on org.gnome.Shell. This key takes precedence over the “enabled-"
|
||||
"extensions” setting."
|
||||
"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 manipulate this list with the EnableExtension and DisableExtension "
|
||||
"D-Bus methods on org.gnome.Shell. This key takes precedence over the "
|
||||
"“enabled-extensions” setting."
|
||||
msgstr ""
|
||||
"Les extensions del GNOME Shell tenen un identificador universal. Aquesta "
|
||||
"clau conté una llista de les extensions que s'han de carregar. Qualsevol "
|
||||
"extensió que s'hagi de carregar ha de ser a la llista. Podeu modificar "
|
||||
"aquesta llista amb els mètodes de D-Bus «EnableExtension» (activa una "
|
||||
"extensió) i «DisableExtension» (desactiva una extensió) a org.gnome.Shell."
|
||||
"Aquesta clau té preferència sobre el paràmetre «enabled-extensions»."
|
||||
"extensió) i «DisableExtension» (desactiva una extensió) a "
|
||||
"org.gnome.Shell.Aquesta clau té preferència sobre el paràmetre «enabled-"
|
||||
"extensions»."
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:37
|
||||
msgid "Disable user extensions"
|
||||
@ -127,20 +128,21 @@ msgid ""
|
||||
"running version. Enabling this option will disable this check and try to "
|
||||
"load all extensions regardless of the versions they claim to support."
|
||||
msgstr ""
|
||||
"El GNOME Shell només carregarà extensions que afirmin ser compatibles amb la "
|
||||
"versió en execució. Si s'activa aquesta opció, es desactivarà la comprovació "
|
||||
"i es provarà de carregar totes les extensions sense tenir en compte les "
|
||||
"versions amb què afirmin ser compatibles."
|
||||
"El GNOME Shell només carregarà extensions que afirmin ser compatibles amb la"
|
||||
" versió en execució. Si s'activa aquesta opció, es desactivarà la "
|
||||
"comprovació i es provarà de carregar totes les extensions sense tenir en "
|
||||
"compte les versions amb què afirmin ser compatibles."
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:54
|
||||
msgid "List of desktop file IDs for favorite applications"
|
||||
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
|
||||
msgid ""
|
||||
"The applications corresponding to these identifiers will be displayed in the "
|
||||
"favorites area."
|
||||
"The applications corresponding to these identifiers will be displayed in the"
|
||||
" favorites area."
|
||||
msgstr ""
|
||||
"Es mostraran, a l'àrea de preferits, les aplicacions que corresponguin a "
|
||||
"aquests identificadors."
|
||||
@ -158,7 +160,8 @@ msgstr ""
|
||||
msgid "History for command (Alt-F2) dialog"
|
||||
msgstr "Historial de les ordres utilitzades en el diàleg de l'Alt+F2"
|
||||
|
||||
#. Translators: looking glass is a debugger and inspector tool, see https://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
|
||||
msgid "History for the looking glass dialog"
|
||||
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
|
||||
msgid ""
|
||||
"This key overrides the automatic hiding of the “Log out” menu item in single-"
|
||||
"user, single-session situations."
|
||||
"This key overrides the automatic hiding of the “Log out” menu item in "
|
||||
"single-user, single-session situations."
|
||||
msgstr ""
|
||||
"Aquesta clau sobreescriu l'ocultació automàtica de l'element de menú «Surt» "
|
||||
"quan només hi ha un usuari i un sol tipus de sessió."
|
||||
@ -179,7 +182,7 @@ msgstr ""
|
||||
msgid ""
|
||||
"Whether to remember password for mounting encrypted or remote filesystems"
|
||||
msgstr ""
|
||||
"Si s'han de recordar les contrasenyes dels punts de muntatge encriptats o "
|
||||
"Si s'han de recordar les contrasenyes dels punts de muntatge xifrat o "
|
||||
"els sistemes de fitxers remots"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:87
|
||||
@ -190,7 +193,7 @@ msgid ""
|
||||
"state of the checkbox."
|
||||
msgstr ""
|
||||
"El GNOME Shell us demanarà la contrasenya quan es munti un dispositiu "
|
||||
"encriptat o un sistema de fitxers remot. Si es pot desar la contrasenya per "
|
||||
"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 "
|
||||
"contrasenya». Aquesta clau estableix el valor per defecte d'aquesta casella "
|
||||
"de selecció."
|
||||
@ -226,93 +229,110 @@ msgstr ""
|
||||
"Habilita una API D-BUS que permet la introspecció de l'estat de l'aplicació "
|
||||
"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"
|
||||
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."
|
||||
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"
|
||||
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 ""
|
||||
"Keybinding to open the “Show Applications” view of the Activities Overview."
|
||||
msgstr ""
|
||||
"Vinculació de tecles per a obrir la vista «Mostra les aplicacions» de les "
|
||||
"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"
|
||||
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."
|
||||
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"
|
||||
msgstr ""
|
||||
"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."
|
||||
msgstr ""
|
||||
"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"
|
||||
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."
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
msgstr "Commuta a l'aplicació 9"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:196
|
||||
#: data/org.gnome.shell.gschema.xml.in:223
|
||||
#: data/org.gnome.shell.gschema.xml.in:207
|
||||
#: data/org.gnome.shell.gschema.xml.in:234
|
||||
msgid "Limit switcher to current workspace."
|
||||
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 ""
|
||||
"If true, only applications that have windows on the current workspace are "
|
||||
"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 "
|
||||
"totes les aplicacions."
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:214
|
||||
#: data/org.gnome.shell.gschema.xml.in:225
|
||||
msgid "The application icon mode."
|
||||
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 ""
|
||||
"Configures how the windows are shown in the switcher. Valid possibilities "
|
||||
"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-"
|
||||
"only” (shows only the application icon) or “both”."
|
||||
"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-only” "
|
||||
"(shows only the application icon) or “both”."
|
||||
msgstr ""
|
||||
"Configureu com es mostren les finestres en l'intercanviador. Els valors "
|
||||
"possibles són: «thumbnail-only» (mostra una miniatura de la finestra), «app-"
|
||||
"icon-only» (mostra la icona de l'aplicació) o «both» (ambdues coses)."
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:224
|
||||
#: data/org.gnome.shell.gschema.xml.in:235
|
||||
msgid ""
|
||||
"If true, only windows from the current workspace are shown in the switcher. "
|
||||
"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 "
|
||||
"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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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:276
|
||||
#: data/org.gnome.shell.gschema.xml.in:284
|
||||
#: data/org.gnome.shell.gschema.xml.in:292
|
||||
#: data/org.gnome.shell.gschema.xml.in:300
|
||||
#: data/org.gnome.shell.gschema.xml.in:278
|
||||
#: data/org.gnome.shell.gschema.xml.in:287
|
||||
#: data/org.gnome.shell.gschema.xml.in:295
|
||||
#: data/org.gnome.shell.gschema.xml.in:303
|
||||
#: data/org.gnome.shell.gschema.xml.in:311
|
||||
msgid ""
|
||||
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
|
||||
msgstr ""
|
||||
"Si s'executa el GNOME Shell, aquesta clau sobreescriu la clau «org.gnome."
|
||||
"mutter»."
|
||||
"Si s'executa el GNOME Shell, aquesta clau sobreescriu la clau "
|
||||
"«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"
|
||||
msgstr ""
|
||||
"Habilita el mosaic a les vores en deixar anar les finestres a les vores de "
|
||||
"la pantalla"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:283
|
||||
#: data/org.gnome.shell.gschema.xml.in:294
|
||||
msgid "Workspaces are managed dynamically"
|
||||
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"
|
||||
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"
|
||||
msgstr ""
|
||||
"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/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/status/network.js:916 subprojects/extensions-app/js/main.js:149
|
||||
msgid "Cancel"
|
||||
@ -476,7 +496,7 @@ msgstr "Nom d'usuari"
|
||||
msgid "Login Window"
|
||||
msgstr "Finestra d'entrada"
|
||||
|
||||
#: js/gdm/util.js:345
|
||||
#: js/gdm/util.js:355
|
||||
msgid "Authentication error"
|
||||
msgstr "Error d'autenticació"
|
||||
|
||||
@ -485,7 +505,7 @@ msgstr "Error d'autenticació"
|
||||
#. as a cue to display our own message.
|
||||
#. Translators: this message is shown below the password entry field
|
||||
#. to indicate the user can swipe their finger instead
|
||||
#: js/gdm/util.js:471
|
||||
#: js/gdm/util.js:481
|
||||
msgid "(or swipe finger)"
|
||||
msgstr "(o passeu el dit)"
|
||||
|
||||
@ -495,7 +515,8 @@ msgctxt "search-result"
|
||||
msgid "Power Off"
|
||||
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
|
||||
msgid "power off;shutdown;reboot;restart;halt;stop"
|
||||
msgstr "apaga;atura;reinicia"
|
||||
@ -506,7 +527,8 @@ msgctxt "search-result"
|
||||
msgid "Lock Screen"
|
||||
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
|
||||
msgid "lock screen"
|
||||
msgstr "bloca la pantalla"
|
||||
@ -517,7 +539,8 @@ msgctxt "search-result"
|
||||
msgid "Log Out"
|
||||
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
|
||||
msgid "logout;log out;sign off"
|
||||
msgstr "desconnecta;sortida;surt"
|
||||
@ -528,7 +551,8 @@ msgctxt "search-result"
|
||||
msgid "Suspend"
|
||||
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
|
||||
msgid "suspend;sleep"
|
||||
msgstr "atura temporalment;dorm"
|
||||
@ -539,12 +563,14 @@ msgctxt "search-result"
|
||||
msgid "Switch User"
|
||||
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
|
||||
msgid "switch user"
|
||||
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
|
||||
msgid "lock orientation;unlock orientation;screen;rotation"
|
||||
msgstr "bloqueja l'orientació;desbloqueja l'orientació;pantalla;rotació"
|
||||
@ -720,36 +746,36 @@ msgstr "Denega l'accés"
|
||||
msgid "Grant Access"
|
||||
msgstr "Permet l'accés"
|
||||
|
||||
#: js/ui/appDisplay.js:956
|
||||
#: js/ui/appDisplay.js:1297
|
||||
msgid "Unnamed Folder"
|
||||
msgstr "Carpeta sense nom"
|
||||
|
||||
#. 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"
|
||||
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"
|
||||
msgstr "Finestra nova"
|
||||
|
||||
#: js/ui/appDisplay.js:2250
|
||||
#: js/ui/appDisplay.js:2802
|
||||
msgid "Launch using Integrated Graphics Card"
|
||||
msgstr "Inicia usant una targeta gràfica integrada"
|
||||
|
||||
#: js/ui/appDisplay.js:2251
|
||||
#: js/ui/appDisplay.js:2803
|
||||
msgid "Launch using Discrete Graphics Card"
|
||||
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"
|
||||
msgstr "Suprimeix dels preferits"
|
||||
|
||||
#: js/ui/appDisplay.js:2285
|
||||
#: js/ui/appDisplay.js:2837
|
||||
msgid "Add to Favorites"
|
||||
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"
|
||||
msgstr "Mostra els detalls"
|
||||
|
||||
@ -779,7 +805,7 @@ msgstr "Auriculars"
|
||||
msgid "Headset"
|
||||
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"
|
||||
msgstr "Micròfon"
|
||||
|
||||
@ -795,7 +821,8 @@ msgstr "Paràmetres de la pantalla"
|
||||
msgid "Settings"
|
||||
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
|
||||
msgctxt "calendar-no-work"
|
||||
msgid "06"
|
||||
@ -805,7 +832,6 @@ msgstr "06"
|
||||
#. *
|
||||
#. * NOTE: These grid abbreviations are always shown together
|
||||
#. * and in order, e.g. "S M T W T F S".
|
||||
#.
|
||||
#: js/ui/calendar.js:65
|
||||
msgctxt "grid sunday"
|
||||
msgid "S"
|
||||
@ -852,7 +878,6 @@ msgstr "Ds"
|
||||
#. * standalone, when this is a month of the current year.
|
||||
#. * "%OB" is the new format specifier introduced in glibc 2.27,
|
||||
#. * in most cases you should not change it.
|
||||
#.
|
||||
#: js/ui/calendar.js:392
|
||||
msgid "%OB"
|
||||
msgstr "%OB"
|
||||
@ -865,7 +890,6 @@ msgstr "%OB"
|
||||
#. * "%OB" is the new format specifier introduced in glibc 2.27,
|
||||
#. * in most cases you should not use the old "%B" here unless you
|
||||
#. * absolutely know what you are doing.
|
||||
#.
|
||||
#: js/ui/calendar.js:402
|
||||
msgid "%OB %Y"
|
||||
msgstr "%OB de %Y"
|
||||
@ -947,7 +971,8 @@ msgstr "Obre amb %s"
|
||||
#: js/ui/components/networkAgent.js:92
|
||||
msgid ""
|
||||
"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/status/network.js:318 js/ui/status/network.js:919
|
||||
@ -982,7 +1007,7 @@ msgid ""
|
||||
"“%s”."
|
||||
msgstr ""
|
||||
"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
|
||||
msgid "Wired 802.1X authentication"
|
||||
@ -1043,7 +1068,8 @@ msgstr "Autentica"
|
||||
msgid "Sorry, that didn’t work. Please try again."
|
||||
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.
|
||||
#: js/ui/components/telepathyClient.js:822
|
||||
#, javascript-format
|
||||
@ -1068,7 +1094,6 @@ msgstr "Quadre d'aplicacions"
|
||||
#. * 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.,
|
||||
#. * "February 17 2015".
|
||||
#.
|
||||
#: js/ui/dateMenu.js:79
|
||||
msgid "%B %-d %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
|
||||
#. * below the time in the shell; it should combine the weekday and the
|
||||
#. * date, e.g. "Tuesday February 17 2015".
|
||||
#.
|
||||
#: js/ui/dateMenu.js:86
|
||||
msgid "%A %B %e %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
|
||||
msgctxt "calendar heading"
|
||||
msgid "%B %-d"
|
||||
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
|
||||
msgctxt "calendar heading"
|
||||
msgid "%B %-d %Y"
|
||||
@ -1103,7 +1129,6 @@ msgstr "Demà"
|
||||
|
||||
#. 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"
|
||||
@ -1222,7 +1247,8 @@ msgstr "Reinicia i instal·la les actualitzacions"
|
||||
|
||||
#: js/ui/endSessionDialog.js:91
|
||||
#, 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 ""
|
||||
"The system will automatically restart and install updates in %d seconds."
|
||||
msgstr[0] ""
|
||||
@ -1293,15 +1319,15 @@ msgstr "%s (remot)"
|
||||
msgid "%s (console)"
|
||||
msgstr "%s (consola)"
|
||||
|
||||
#: js/ui/extensionDownloader.js:185
|
||||
#: js/ui/extensionDownloader.js:187
|
||||
msgid "Install"
|
||||
msgstr "Instal·la"
|
||||
|
||||
#: js/ui/extensionDownloader.js:191
|
||||
#: js/ui/extensionDownloader.js:193
|
||||
msgid "Install Extension"
|
||||
msgstr "Instal·la l'extensió"
|
||||
|
||||
#: js/ui/extensionDownloader.js:192
|
||||
#: js/ui/extensionDownloader.js:194
|
||||
#, javascript-format
|
||||
msgid "Download and install “%s” from 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."
|
||||
msgstr "Podeu restaurar les dreceres si premeu %s."
|
||||
|
||||
#: js/ui/inhibitShortcutsDialog.js:98
|
||||
#: js/ui/inhibitShortcutsDialog.js:100
|
||||
msgid "Deny"
|
||||
msgstr "Denega"
|
||||
|
||||
#: js/ui/inhibitShortcutsDialog.js:105
|
||||
#: js/ui/inhibitShortcutsDialog.js:107
|
||||
msgid "Allow"
|
||||
msgstr "Permet"
|
||||
|
||||
@ -1354,8 +1380,8 @@ msgstr "Tecles lentes inactives"
|
||||
|
||||
#: js/ui/kbdA11yDialog.js:34
|
||||
msgid ""
|
||||
"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."
|
||||
"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."
|
||||
msgstr ""
|
||||
"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 "
|
||||
@ -1374,8 +1400,8 @@ msgid ""
|
||||
"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."
|
||||
msgstr ""
|
||||
"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è "
|
||||
"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è "
|
||||
"funciona el teclat."
|
||||
|
||||
#: js/ui/kbdA11yDialog.js:46
|
||||
@ -1409,7 +1435,7 @@ msgstr "Desactiva"
|
||||
msgid "Leave Off"
|
||||
msgstr "Deixa-ho desactivat"
|
||||
|
||||
#: js/ui/keyboard.js:207
|
||||
#: js/ui/keyboard.js:225
|
||||
msgid "Region & Language Settings"
|
||||
msgstr "Configuració de regió i idioma"
|
||||
|
||||
@ -1471,8 +1497,8 @@ msgid ""
|
||||
"Running a session as a privileged user should be avoided for security "
|
||||
"reasons. If possible, you should log in as a normal user."
|
||||
msgstr ""
|
||||
"Cal evitar iniciar sessions com a usuari privilegiat per raons de seguretat. "
|
||||
"Si és possible, entreu com a un usuari normal."
|
||||
"Cal evitar iniciar sessions com a usuari privilegiat per raons de seguretat."
|
||||
" Si és possible, entreu com a un usuari normal."
|
||||
|
||||
#: js/ui/main.js:337
|
||||
msgid "Screen Lock disabled"
|
||||
@ -1482,7 +1508,7 @@ msgstr "La pantalla de bloqueig està inhabilitada"
|
||||
msgid "Screen Locking requires the GNOME display manager."
|
||||
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"
|
||||
msgstr "Informació de l'ordinador"
|
||||
|
||||
@ -1494,13 +1520,13 @@ msgstr "Artista desconegut"
|
||||
msgid "Unknown title"
|
||||
msgstr "Títol desconegut"
|
||||
|
||||
#: js/ui/overview.js:73
|
||||
#: js/ui/overview.js:74
|
||||
msgid "Undo"
|
||||
msgstr "Desfés"
|
||||
|
||||
#. Translators: This is the main view to select
|
||||
#. activities. See also note for "Activities" string.
|
||||
#: js/ui/overview.js:86
|
||||
#: js/ui/overview.js:87
|
||||
msgid "Overview"
|
||||
msgstr "Vista general"
|
||||
|
||||
@ -1508,7 +1534,7 @@ msgstr "Vista general"
|
||||
#. in the search entry when no search is
|
||||
#. active; it should not exceed ~30
|
||||
#. characters.
|
||||
#: js/ui/overview.js:107
|
||||
#: js/ui/overview.js:108
|
||||
msgid "Type to search"
|
||||
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
|
||||
#. point, but any application using global grabs is broken
|
||||
#. Just tell him to stop using this app
|
||||
#.
|
||||
#. XXX: another option is to kick the user into the gdm login
|
||||
#. screen, where we're not affected by grabs
|
||||
#: js/ui/screenShield.js:244 js/ui/screenShield.js:602
|
||||
@ -1841,14 +1866,15 @@ msgstr "<desconegut>"
|
||||
msgid "%s Off"
|
||||
msgstr "%s apagat"
|
||||
|
||||
# N.T.: p. ex. Connectat amb fil
|
||||
#. Translators: %s is a network identifier
|
||||
# N.T.: p. ex. Connectat amb fil
|
||||
#: js/ui/status/network.js:427
|
||||
#, javascript-format
|
||||
msgid "%s Connected"
|
||||
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);
|
||||
#. %s is a network identifier
|
||||
#: js/ui/status/network.js:432
|
||||
@ -1868,20 +1894,23 @@ msgstr "%s s'està desconnectant"
|
||||
msgid "%s Connecting"
|
||||
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
|
||||
#, javascript-format
|
||||
msgid "%s Requires Authentication"
|
||||
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
|
||||
#: js/ui/status/network.js:453
|
||||
#, javascript-format
|
||||
msgid "Firmware Missing For %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
|
||||
#: js/ui/status/network.js:457
|
||||
#, javascript-format
|
||||
@ -1984,7 +2013,8 @@ msgstr "%s no està connectat"
|
||||
msgid "connecting…"
|
||||
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
|
||||
msgid "authentication required"
|
||||
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"
|
||||
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"
|
||||
msgstr "S'ha canviat el volum"
|
||||
|
||||
#: js/ui/status/volume.js:225
|
||||
#: js/ui/status/volume.js:217
|
||||
msgid "Volume"
|
||||
msgstr "Volum"
|
||||
|
||||
#. Translators: this is for display mirroring i.e. cloning.
|
||||
#. * Try to keep it under around 15 characters.
|
||||
#.
|
||||
#: js/ui/switchMonitor.js:17
|
||||
msgid "Mirror"
|
||||
msgstr "Mirall"
|
||||
|
||||
#. Translators: this is for the desktop spanning displays.
|
||||
#. * Try to keep it under around 15 characters.
|
||||
#.
|
||||
#: js/ui/switchMonitor.js:22
|
||||
msgid "Join Displays"
|
||||
msgstr "Uneix pantalles"
|
||||
|
||||
#. Translators: this is for using only an external display.
|
||||
#. * Try to keep it under around 15 characters.
|
||||
#.
|
||||
#: js/ui/switchMonitor.js:27
|
||||
msgid "External Only"
|
||||
msgstr "Només extern"
|
||||
|
||||
#. Translators: this is for using only the laptop display.
|
||||
#. * Try to keep it under around 15 characters.
|
||||
#.
|
||||
#: js/ui/switchMonitor.js:32
|
||||
msgid "Built-in Only"
|
||||
msgstr "Només l'integrat"
|
||||
@ -2214,11 +2240,11 @@ msgstr "Llisqueu amunt per a desbloquejar"
|
||||
msgid "Click or press a key to unlock"
|
||||
msgstr "Feu clic o premeu una tecla per a desbloquejar"
|
||||
|
||||
#: js/ui/unlockDialog.js:550
|
||||
#: js/ui/unlockDialog.js:555
|
||||
msgid "Unlock Window"
|
||||
msgstr "Desbloqueja la finestra"
|
||||
|
||||
#: js/ui/unlockDialog.js:559
|
||||
#: js/ui/unlockDialog.js:564
|
||||
msgid "Log in as another user"
|
||||
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,
|
||||
#. to avoid ellipsizing the labels.
|
||||
#.
|
||||
#: js/ui/windowManager.js:64
|
||||
msgid "Revert Settings"
|
||||
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"
|
||||
msgstr "Llista els modes possibles"
|
||||
|
||||
#: src/shell-app.c:286
|
||||
#: src/shell-app.c:268
|
||||
msgctxt "program"
|
||||
msgid "Unknown"
|
||||
msgstr "Desconegut"
|
||||
|
||||
#: src/shell-app.c:537
|
||||
#: src/shell-app.c:519
|
||||
#, c-format
|
||||
msgid "Failed to launch “%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 "
|
||||
"to enable it again"
|
||||
msgstr ""
|
||||
"Si suprimiu una extensió, us cal tornar-la a baixar si voleu habilitar-la de "
|
||||
"nou"
|
||||
"Si suprimiu una extensió, us cal tornar-la a baixar si voleu habilitar-la de"
|
||||
" nou"
|
||||
|
||||
#: subprojects/extensions-app/js/main.js:150
|
||||
msgid "Remove"
|
||||
@ -2477,11 +2502,11 @@ msgstr "Quant a les extensions"
|
||||
|
||||
#: subprojects/extensions-app/data/ui/extensions-window.ui:27
|
||||
msgid ""
|
||||
"To find and add extensions, visit <a href=\"https://extensions.gnome.org"
|
||||
"\">extensions.gnome.org</a>."
|
||||
"To find and add extensions, visit <a "
|
||||
"href=\"https://extensions.gnome.org\">extensions.gnome.org</a>."
|
||||
msgstr ""
|
||||
"Per a visitar i afegir extensions, visiteu <a href=\"https://extensions."
|
||||
"gnome.org\">extensions.gnome.org</a>."
|
||||
"Per a visitar i afegir extensions, visiteu <a "
|
||||
"href=\"https://extensions.gnome.org\">extensions.gnome.org</a>."
|
||||
|
||||
#: subprojects/extensions-app/data/ui/extensions-window.ui:35
|
||||
msgid "Warning"
|
||||
@ -2514,8 +2539,8 @@ msgid ""
|
||||
"We’re very sorry, but it was not possible to get the list of installed "
|
||||
"extensions. Make sure you are logged into GNOME and try again."
|
||||
msgstr ""
|
||||
"No s'ha pogut obtenir la llista d'extensions instal·lades. Assegureu-vos que "
|
||||
"heu entrat al GNOME i torneu a provar-ho."
|
||||
"No s'ha pogut obtenir la llista d'extensions instal·lades. Assegureu-vos que"
|
||||
" heu entrat al GNOME i torneu a provar-ho."
|
||||
|
||||
#: subprojects/extensions-app/data/ui/extensions-window.ui:273
|
||||
msgid "Extension Updates Ready"
|
||||
@ -2557,8 +2582,7 @@ msgstr ""
|
||||
#: subprojects/extensions-tool/src/command-create.c:339
|
||||
msgid ""
|
||||
"UUID is a globally-unique identifier for your extension.\n"
|
||||
"This should be in the format of an email address (clicktofocus@janedoe."
|
||||
"example.com)\n"
|
||||
"This should be in the format of an email address (clicktofocus@janedoe.example.com)\n"
|
||||
msgstr ""
|
||||
"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"
|
||||
@ -2933,4 +2957,3 @@ msgstr[1] "%u entrades"
|
||||
#: subprojects/gvc/gvc-mixer-control.c:2766
|
||||
msgid "System Sounds"
|
||||
msgstr "Sons del sistema"
|
||||
|
||||
|
161
po/es.po
161
po/es.po
@ -9,8 +9,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell.master\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
|
||||
"POT-Creation-Date: 2020-06-05 23:11+0000\n"
|
||||
"PO-Revision-Date: 2020-06-08 16:06+0200\n"
|
||||
"POT-Creation-Date: 2020-07-27 06:59+0000\n"
|
||||
"PO-Revision-Date: 2020-07-29 09:47+0200\n"
|
||||
"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
|
||||
"Language-Team: Spanish - Spain <gnome-es-list@gnome.org>\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 "
|
||||
"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"
|
||||
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."
|
||||
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"
|
||||
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 ""
|
||||
"Keybinding to open the “Show Applications” view of the Activities Overview."
|
||||
msgstr ""
|
||||
"Asociación de teclas para abrir la vista «Mostrar aplicaciones» de la vista "
|
||||
"de actividades."
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:134
|
||||
#: data/org.gnome.shell.gschema.xml.in:145
|
||||
msgid "Keybinding to open the overview"
|
||||
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."
|
||||
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"
|
||||
msgstr ""
|
||||
"Asociación de teclas para cambiar la visibilidad de la lista de "
|
||||
"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."
|
||||
msgstr ""
|
||||
"Asociación de teclas para cambiar la visibilidad de la lista de "
|
||||
"notificaciones."
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:148
|
||||
#: data/org.gnome.shell.gschema.xml.in:159
|
||||
msgid "Keybinding to focus the active notification"
|
||||
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."
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
msgstr "Cambiar a la aplicación 9"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:196
|
||||
#: data/org.gnome.shell.gschema.xml.in:223
|
||||
#: data/org.gnome.shell.gschema.xml.in:207
|
||||
#: data/org.gnome.shell.gschema.xml.in:234
|
||||
msgid "Limit switcher to current workspace."
|
||||
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 ""
|
||||
"If true, only applications that have windows on the current workspace are "
|
||||
"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 "
|
||||
"aplicaciones."
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:214
|
||||
#: data/org.gnome.shell.gschema.xml.in:225
|
||||
msgid "The application icon mode."
|
||||
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 ""
|
||||
"Configures how the windows are shown in the switcher. Valid possibilities "
|
||||
"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-"
|
||||
"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 ""
|
||||
"If true, only windows from the current workspace are shown in the switcher. "
|
||||
"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 "
|
||||
"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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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:276
|
||||
#: data/org.gnome.shell.gschema.xml.in:284
|
||||
#: data/org.gnome.shell.gschema.xml.in:292
|
||||
#: data/org.gnome.shell.gschema.xml.in:300
|
||||
#: data/org.gnome.shell.gschema.xml.in:278
|
||||
#: data/org.gnome.shell.gschema.xml.in:287
|
||||
#: data/org.gnome.shell.gschema.xml.in:295
|
||||
#: data/org.gnome.shell.gschema.xml.in:303
|
||||
#: data/org.gnome.shell.gschema.xml.in:311
|
||||
msgid ""
|
||||
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
|
||||
msgstr ""
|
||||
"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"
|
||||
msgstr ""
|
||||
"Activar el mosaico en los bordes al arrastrar ventanas a los bordes de la "
|
||||
"ventana"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:283
|
||||
#: data/org.gnome.shell.gschema.xml.in:294
|
||||
msgid "Workspaces are managed dynamically"
|
||||
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"
|
||||
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"
|
||||
msgstr ""
|
||||
"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/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/status/network.js:916 subprojects/extensions-app/js/main.js:149
|
||||
msgid "Cancel"
|
||||
@ -471,7 +488,7 @@ msgstr "Nombre de usuario"
|
||||
msgid "Login Window"
|
||||
msgstr "Ventana de inicio de sesión"
|
||||
|
||||
#: js/gdm/util.js:345
|
||||
#: js/gdm/util.js:355
|
||||
msgid "Authentication error"
|
||||
msgstr "Error de autenticación"
|
||||
|
||||
@ -480,7 +497,7 @@ msgstr "Error de autenticación"
|
||||
#. as a cue to display our own message.
|
||||
#. Translators: this message is shown below the password entry field
|
||||
#. to indicate the user can swipe their finger instead
|
||||
#: js/gdm/util.js:471
|
||||
#: js/gdm/util.js:481
|
||||
msgid "(or swipe finger)"
|
||||
msgstr "(o pase el dedo)"
|
||||
|
||||
@ -714,36 +731,36 @@ msgstr "Denegar acceso"
|
||||
msgid "Grant Access"
|
||||
msgstr "Conceder acceso"
|
||||
|
||||
#: js/ui/appDisplay.js:956
|
||||
#: js/ui/appDisplay.js:1297
|
||||
msgid "Unnamed Folder"
|
||||
msgstr "Carpeta sin nombre"
|
||||
|
||||
#. 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"
|
||||
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"
|
||||
msgstr "Ventana nueva"
|
||||
|
||||
#: js/ui/appDisplay.js:2250
|
||||
#: js/ui/appDisplay.js:2802
|
||||
msgid "Launch using Integrated Graphics Card"
|
||||
msgstr "Lanzar usando la tarjeta gráfica integrada"
|
||||
|
||||
#: js/ui/appDisplay.js:2251
|
||||
#: js/ui/appDisplay.js:2803
|
||||
msgid "Launch using Discrete Graphics Card"
|
||||
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"
|
||||
msgstr "Quitar de los favoritos"
|
||||
|
||||
#: js/ui/appDisplay.js:2285
|
||||
#: js/ui/appDisplay.js:2837
|
||||
msgid "Add to Favorites"
|
||||
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"
|
||||
msgstr "Mostrar detalles"
|
||||
|
||||
@ -773,7 +790,7 @@ msgstr "Auriculares"
|
||||
msgid "Headset"
|
||||
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"
|
||||
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
|
||||
#: js/ui/dateMenu.js:151
|
||||
#| msgid "%B %-d %Y"
|
||||
msgctxt "calendar heading"
|
||||
msgid "%B %-d"
|
||||
msgstr "%B %-d"
|
||||
|
||||
#. Translators: Shown on calendar heading when selected day occurs on different year
|
||||
#: js/ui/dateMenu.js:154
|
||||
#| msgid "%B %-d %Y"
|
||||
msgctxt "calendar heading"
|
||||
msgid "%B %-d %Y"
|
||||
msgstr "%B %-d %Y"
|
||||
@ -1286,15 +1301,15 @@ msgstr "%s (remoto)"
|
||||
msgid "%s (console)"
|
||||
msgstr "%s (consola)"
|
||||
|
||||
#: js/ui/extensionDownloader.js:185
|
||||
#: js/ui/extensionDownloader.js:187
|
||||
msgid "Install"
|
||||
msgstr "Instalar"
|
||||
|
||||
#: js/ui/extensionDownloader.js:191
|
||||
#: js/ui/extensionDownloader.js:193
|
||||
msgid "Install Extension"
|
||||
msgstr "Instalar extensión"
|
||||
|
||||
#: js/ui/extensionDownloader.js:192
|
||||
#: js/ui/extensionDownloader.js:194
|
||||
#, javascript-format
|
||||
msgid "Download and install “%s” from 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."
|
||||
msgstr "Puede restaurar los atajos pulsando %s."
|
||||
|
||||
#: js/ui/inhibitShortcutsDialog.js:98
|
||||
#: js/ui/inhibitShortcutsDialog.js:100
|
||||
msgid "Deny"
|
||||
msgstr "Denegar"
|
||||
|
||||
#: js/ui/inhibitShortcutsDialog.js:105
|
||||
#: js/ui/inhibitShortcutsDialog.js:107
|
||||
msgid "Allow"
|
||||
msgstr "Permitir"
|
||||
|
||||
@ -1400,7 +1415,7 @@ msgstr "Apagar"
|
||||
msgid "Leave Off"
|
||||
msgstr "Dejar apagado"
|
||||
|
||||
#: js/ui/keyboard.js:207
|
||||
#: js/ui/keyboard.js:225
|
||||
msgid "Region & Language Settings"
|
||||
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."
|
||||
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"
|
||||
msgstr "Información del sistema"
|
||||
|
||||
@ -1485,13 +1500,13 @@ msgstr "Artista desconocido"
|
||||
msgid "Unknown title"
|
||||
msgstr "Título desconocido"
|
||||
|
||||
#: js/ui/overview.js:73
|
||||
#: js/ui/overview.js:74
|
||||
msgid "Undo"
|
||||
msgstr "Deshacer"
|
||||
|
||||
#. Translators: This is the main view to select
|
||||
#. activities. See also note for "Activities" string.
|
||||
#: js/ui/overview.js:86
|
||||
#: js/ui/overview.js:87
|
||||
msgid "Overview"
|
||||
msgstr "Vista general"
|
||||
|
||||
@ -1499,7 +1514,7 @@ msgstr "Vista general"
|
||||
#. in the search entry when no search is
|
||||
#. active; it should not exceed ~30
|
||||
#. characters.
|
||||
#: js/ui/overview.js:107
|
||||
#: js/ui/overview.js:108
|
||||
msgid "Type to search"
|
||||
msgstr "Escribir para buscar"
|
||||
|
||||
@ -2153,11 +2168,11 @@ msgstr "Error de autorización de Thunderbolt"
|
||||
msgid "Could not authorize the Thunderbolt device: %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"
|
||||
msgstr "Volumen modificado"
|
||||
|
||||
#: js/ui/status/volume.js:225
|
||||
#: js/ui/status/volume.js:217
|
||||
msgid "Volume"
|
||||
msgstr "Volumen"
|
||||
|
||||
@ -2203,11 +2218,11 @@ msgstr "Deslizar para desbloquear"
|
||||
msgid "Click or press a key to unlock"
|
||||
msgstr "Pulse con el ratón o una tecla para desbloquear"
|
||||
|
||||
#: js/ui/unlockDialog.js:550
|
||||
#: js/ui/unlockDialog.js:555
|
||||
msgid "Unlock Window"
|
||||
msgstr "Desbloquear ventana"
|
||||
|
||||
#: js/ui/unlockDialog.js:559
|
||||
#: js/ui/unlockDialog.js:564
|
||||
msgid "Log in as another user"
|
||||
msgstr "Iniciar sesión como otro usuario"
|
||||
|
||||
@ -2344,12 +2359,12 @@ msgstr ""
|
||||
msgid "List possible modes"
|
||||
msgstr "Listar los modos posibles"
|
||||
|
||||
#: src/shell-app.c:286
|
||||
#: src/shell-app.c:268
|
||||
msgctxt "program"
|
||||
msgid "Unknown"
|
||||
msgstr "Desconocido"
|
||||
|
||||
#: src/shell-app.c:537
|
||||
#: src/shell-app.c:519
|
||||
#, c-format
|
||||
msgid "Failed to launch “%s”"
|
||||
msgstr "Falló al lanzar «%s»"
|
||||
|
896
po/pt_BR.po
896
po/pt_BR.po
File diff suppressed because it is too large
Load Diff
159
po/ro.po
159
po/ro.po
@ -10,8 +10,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell master\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
|
||||
"POT-Creation-Date: 2020-06-09 19:41+0000\n"
|
||||
"PO-Revision-Date: 2020-06-17 18:47+0300\n"
|
||||
"POT-Creation-Date: 2020-07-21 05:44+0000\n"
|
||||
"PO-Revision-Date: 2020-07-21 09:07+0200\n"
|
||||
"Last-Translator: Florentina Mușat <florentina [dot] musat [dot] 28 [at] "
|
||||
"gmail [dot] com>\n"
|
||||
"Language-Team: Gnome Romanian Translation Team <gnomero-list@lists."
|
||||
@ -224,95 +224,112 @@ msgid ""
|
||||
msgstr ""
|
||||
"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"
|
||||
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."
|
||||
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"
|
||||
msgstr ""
|
||||
"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 ""
|
||||
"Keybinding to open the “Show Applications” view of the Activities Overview."
|
||||
msgstr ""
|
||||
"Combinație de taste pentru deschiderea modului de afișare „Arată "
|
||||
"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"
|
||||
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."
|
||||
msgstr ""
|
||||
"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"
|
||||
msgstr ""
|
||||
"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."
|
||||
msgstr ""
|
||||
"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"
|
||||
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."
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
msgstr "Comută la aplicația 9"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:196
|
||||
#: data/org.gnome.shell.gschema.xml.in:223
|
||||
#: data/org.gnome.shell.gschema.xml.in:207
|
||||
#: data/org.gnome.shell.gschema.xml.in:234
|
||||
msgid "Limit switcher to current workspace."
|
||||
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 ""
|
||||
"If true, only applications that have windows on the current workspace are "
|
||||
"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 "
|
||||
"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."
|
||||
msgstr "Miniatură și pictograma aplicației."
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:215
|
||||
#: data/org.gnome.shell.gschema.xml.in:226
|
||||
msgid ""
|
||||
"Configures how the windows are shown in the switcher. Valid possibilities "
|
||||
"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) "
|
||||
"„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 ""
|
||||
"If true, only windows from the current workspace are shown in the switcher. "
|
||||
"Otherwise, all windows are included."
|
||||
@ -342,59 +359,59 @@ msgstr ""
|
||||
"Dacă este activat, doar ferestrele din spațiul de lucru curent sunt arătate "
|
||||
"î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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
msgstr "Atașează dialogul modal la fereastra părinte"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:267
|
||||
#: data/org.gnome.shell.gschema.xml.in:276
|
||||
#: data/org.gnome.shell.gschema.xml.in:284
|
||||
#: data/org.gnome.shell.gschema.xml.in:292
|
||||
#: data/org.gnome.shell.gschema.xml.in:300
|
||||
#: data/org.gnome.shell.gschema.xml.in:278
|
||||
#: data/org.gnome.shell.gschema.xml.in:287
|
||||
#: data/org.gnome.shell.gschema.xml.in:295
|
||||
#: data/org.gnome.shell.gschema.xml.in:303
|
||||
#: data/org.gnome.shell.gschema.xml.in:311
|
||||
msgid ""
|
||||
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
|
||||
msgstr ""
|
||||
"Această cheie suprascrie cheia corespondentă din org.gnome.mutter când "
|
||||
"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"
|
||||
msgstr ""
|
||||
"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"
|
||||
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"
|
||||
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"
|
||||
msgstr ""
|
||||
"Î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/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/status/network.js:916 subprojects/extensions-app/js/main.js:149
|
||||
msgid "Cancel"
|
||||
@ -475,7 +492,7 @@ msgstr "Nume de utilizator"
|
||||
msgid "Login Window"
|
||||
msgstr "Fereastră de autentificare"
|
||||
|
||||
#: js/gdm/util.js:345
|
||||
#: js/gdm/util.js:355
|
||||
msgid "Authentication error"
|
||||
msgstr "Eroare de autentificare"
|
||||
|
||||
@ -484,7 +501,7 @@ msgstr "Eroare de autentificare"
|
||||
#. as a cue to display our own message.
|
||||
#. Translators: this message is shown below the password entry field
|
||||
#. to indicate the user can swipe their finger instead
|
||||
#: js/gdm/util.js:471
|
||||
#: js/gdm/util.js:481
|
||||
msgid "(or swipe finger)"
|
||||
msgstr "(sau treceți degetul peste)"
|
||||
|
||||
@ -727,36 +744,36 @@ msgstr "Refuză accesul"
|
||||
msgid "Grant Access"
|
||||
msgstr "Permite accesul"
|
||||
|
||||
#: js/ui/appDisplay.js:902
|
||||
#: js/ui/appDisplay.js:1297
|
||||
msgid "Unnamed Folder"
|
||||
msgstr "Dosar nedenumit"
|
||||
|
||||
#. 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"
|
||||
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"
|
||||
msgstr "Fereastră nouă"
|
||||
|
||||
#: js/ui/appDisplay.js:2276
|
||||
#: js/ui/appDisplay.js:2802
|
||||
msgid "Launch using Integrated Graphics Card"
|
||||
msgstr "Lansează folosind placa grafică integrată"
|
||||
|
||||
#: js/ui/appDisplay.js:2277
|
||||
#: js/ui/appDisplay.js:2803
|
||||
msgid "Launch using Discrete Graphics Card"
|
||||
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"
|
||||
msgstr "Elimină din favorite"
|
||||
|
||||
#: js/ui/appDisplay.js:2311
|
||||
#: js/ui/appDisplay.js:2837
|
||||
msgid "Add to Favorites"
|
||||
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"
|
||||
msgstr "Arată detaliile"
|
||||
|
||||
@ -786,7 +803,7 @@ msgstr "Căști auriculare"
|
||||
msgid "Headset"
|
||||
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"
|
||||
msgstr "Microfon"
|
||||
|
||||
@ -1300,15 +1317,15 @@ msgstr "%s (la distanță)"
|
||||
msgid "%s (console)"
|
||||
msgstr "%s (consolă)"
|
||||
|
||||
#: js/ui/extensionDownloader.js:185
|
||||
#: js/ui/extensionDownloader.js:187
|
||||
msgid "Install"
|
||||
msgstr "Instalează"
|
||||
|
||||
#: js/ui/extensionDownloader.js:191
|
||||
#: js/ui/extensionDownloader.js:193
|
||||
msgid "Install Extension"
|
||||
msgstr "Instalează extensia"
|
||||
|
||||
#: js/ui/extensionDownloader.js:192
|
||||
#: js/ui/extensionDownloader.js:194
|
||||
#, javascript-format
|
||||
msgid "Download and install “%s” from 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."
|
||||
msgstr "Puteți restaura scurtăturile apăsând %s."
|
||||
|
||||
#: js/ui/inhibitShortcutsDialog.js:98
|
||||
#: js/ui/inhibitShortcutsDialog.js:100
|
||||
msgid "Deny"
|
||||
msgstr "Refuză"
|
||||
|
||||
#: js/ui/inhibitShortcutsDialog.js:105
|
||||
#: js/ui/inhibitShortcutsDialog.js:107
|
||||
msgid "Allow"
|
||||
msgstr "Permite"
|
||||
|
||||
@ -1414,7 +1431,7 @@ msgstr "Oprește"
|
||||
msgid "Leave Off"
|
||||
msgstr "Lasă oprit"
|
||||
|
||||
#: js/ui/keyboard.js:207
|
||||
#: js/ui/keyboard.js:225
|
||||
msgid "Region & Language Settings"
|
||||
msgstr "Configurări de regiune și limbă"
|
||||
|
||||
@ -1488,7 +1505,7 @@ msgstr "Blocarea ecranului este dezactivată"
|
||||
msgid "Screen Locking requires the GNOME display manager."
|
||||
msgstr "Blocarea ecranului necesită administratorul de afișaj GNOME."
|
||||
|
||||
#: js/ui/messageTray.js:1547
|
||||
#: js/ui/messageTray.js:1476
|
||||
msgid "System Information"
|
||||
msgstr "Informații despre sistem"
|
||||
|
||||
@ -1500,13 +1517,13 @@ msgstr "Artist necunoscut"
|
||||
msgid "Unknown title"
|
||||
msgstr "Titlu necunoscut"
|
||||
|
||||
#: js/ui/overview.js:73
|
||||
#: js/ui/overview.js:74
|
||||
msgid "Undo"
|
||||
msgstr "Anulează"
|
||||
|
||||
#. Translators: This is the main view to select
|
||||
#. activities. See also note for "Activities" string.
|
||||
#: js/ui/overview.js:86
|
||||
#: js/ui/overview.js:87
|
||||
msgid "Overview"
|
||||
msgstr "Prezentare generală"
|
||||
|
||||
@ -1514,7 +1531,7 @@ msgstr "Prezentare generală"
|
||||
#. in the search entry when no search is
|
||||
#. active; it should not exceed ~30
|
||||
#. characters.
|
||||
#: js/ui/overview.js:107
|
||||
#: js/ui/overview.js:108
|
||||
msgid "Type to search"
|
||||
msgstr "Tastați pentru a căuta"
|
||||
|
||||
@ -2172,11 +2189,11 @@ msgstr "Eroare de autorizare Thunderbolt"
|
||||
msgid "Could not authorize the Thunderbolt device: %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"
|
||||
msgstr "Volumul a fost schimbat"
|
||||
|
||||
#: js/ui/status/volume.js:225
|
||||
#: js/ui/status/volume.js:217
|
||||
msgid "Volume"
|
||||
msgstr "Volum"
|
||||
|
||||
@ -2222,11 +2239,11 @@ msgstr "Glisați în sus pentru a debloca"
|
||||
msgid "Click or press a key to unlock"
|
||||
msgstr "Apăsați clic sau o tastă pentru a debloca"
|
||||
|
||||
#: js/ui/unlockDialog.js:550
|
||||
#: js/ui/unlockDialog.js:555
|
||||
msgid "Unlock Window"
|
||||
msgstr "Deblochează fereastră"
|
||||
|
||||
#: js/ui/unlockDialog.js:559
|
||||
#: js/ui/unlockDialog.js:564
|
||||
msgid "Log in as another user"
|
||||
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"
|
||||
msgstr "Enumeră câmpurile care pot fi afișate"
|
||||
|
||||
#: src/shell-app.c:286
|
||||
#: src/shell-app.c:268
|
||||
msgctxt "program"
|
||||
msgid "Unknown"
|
||||
msgstr "Necunoscut"
|
||||
|
||||
#: src/shell-app.c:537
|
||||
#: src/shell-app.c:519
|
||||
#, c-format
|
||||
msgid "Failed to launch “%s”"
|
||||
msgstr "Nu s-a putut lansa „%s”"
|
||||
|
160
po/tr.po
160
po/tr.po
@ -17,8 +17,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
|
||||
"POT-Creation-Date: 2020-06-11 10:28+0000\n"
|
||||
"PO-Revision-Date: 2020-05-16 12:12+0300\n"
|
||||
"POT-Creation-Date: 2020-07-29 07:55+0000\n"
|
||||
"PO-Revision-Date: 2020-07-30 00:49+0300\n"
|
||||
"Last-Translator: Emin Tufan Çetin <etcetin@gmail.com>\n"
|
||||
"Language-Team: Türkçe <gnome-turk@gnome.org>\n"
|
||||
"Language: tr\n"
|
||||
@ -225,91 +225,107 @@ msgstr ""
|
||||
"Kabuğun uygulama durumunu gözden geçirmeyi sağlayan D-Bus APIʼsını "
|
||||
"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ğu’nda 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"
|
||||
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."
|
||||
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"
|
||||
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 ""
|
||||
"Keybinding to open the “Show Applications” view of the Activities Overview."
|
||||
msgstr ""
|
||||
"Etkinlikler Genel Görünümünün “Uygulamaları Göster” görünümünü açmak için "
|
||||
"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"
|
||||
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."
|
||||
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"
|
||||
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."
|
||||
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"
|
||||
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."
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
msgstr "Uygulama 9ʼa geç"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:196
|
||||
#: data/org.gnome.shell.gschema.xml.in:223
|
||||
#: data/org.gnome.shell.gschema.xml.in:207
|
||||
#: data/org.gnome.shell.gschema.xml.in:234
|
||||
msgid "Limit switcher to current workspace."
|
||||
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 ""
|
||||
"If true, only applications that have windows on the current workspace are "
|
||||
"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 "
|
||||
"görünecektir."
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:214
|
||||
#: data/org.gnome.shell.gschema.xml.in:225
|
||||
msgid "The application icon mode."
|
||||
msgstr "Uygulama simge kipi."
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:215
|
||||
#: data/org.gnome.shell.gschema.xml.in:226
|
||||
msgid ""
|
||||
"Configures how the windows are shown in the switcher. Valid possibilities "
|
||||
"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) "
|
||||
"değerleridir."
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:224
|
||||
#: data/org.gnome.shell.gschema.xml.in:235
|
||||
msgid ""
|
||||
"If true, only windows from the current workspace are shown in the switcher. "
|
||||
"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 "
|
||||
"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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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:276
|
||||
#: data/org.gnome.shell.gschema.xml.in:284
|
||||
#: data/org.gnome.shell.gschema.xml.in:292
|
||||
#: data/org.gnome.shell.gschema.xml.in:300
|
||||
#: data/org.gnome.shell.gschema.xml.in:278
|
||||
#: data/org.gnome.shell.gschema.xml.in:287
|
||||
#: data/org.gnome.shell.gschema.xml.in:295
|
||||
#: data/org.gnome.shell.gschema.xml.in:303
|
||||
#: data/org.gnome.shell.gschema.xml.in:311
|
||||
msgid ""
|
||||
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
|
||||
msgstr ""
|
||||
"Bu anahtar, GNOME Shell çalışırken org.gnome.mutter içindeki anahtarı "
|
||||
"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"
|
||||
msgstr ""
|
||||
"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"
|
||||
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"
|
||||
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"
|
||||
msgstr ""
|
||||
"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/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/status/network.js:916 subprojects/extensions-app/js/main.js:149
|
||||
msgid "Cancel"
|
||||
@ -468,11 +484,11 @@ msgstr "(örneğin, kullanıcı veya %s)"
|
||||
msgid "Username"
|
||||
msgstr "Kullanıcı Adı"
|
||||
|
||||
#: js/gdm/loginDialog.js:1254
|
||||
#: js/gdm/loginDialog.js:1253
|
||||
msgid "Login Window"
|
||||
msgstr "Oturum Açma Penceresi"
|
||||
|
||||
#: js/gdm/util.js:345
|
||||
#: js/gdm/util.js:355
|
||||
msgid "Authentication error"
|
||||
msgstr "Kimlik doğrulama hatası"
|
||||
|
||||
@ -481,7 +497,7 @@ msgstr "Kimlik doğrulama hatası"
|
||||
#. as a cue to display our own message.
|
||||
#. Translators: this message is shown below the password entry field
|
||||
#. to indicate the user can swipe their finger instead
|
||||
#: js/gdm/util.js:471
|
||||
#: js/gdm/util.js:481
|
||||
msgid "(or swipe finger)"
|
||||
msgstr "(ya da parmak izi okut)"
|
||||
|
||||
@ -710,36 +726,36 @@ msgstr "Erişimi Reddet"
|
||||
msgid "Grant Access"
|
||||
msgstr "Erişime İzin Ver"
|
||||
|
||||
#: js/ui/appDisplay.js:902
|
||||
#: js/ui/appDisplay.js:1297
|
||||
msgid "Unnamed Folder"
|
||||
msgstr "Adsız Klasör"
|
||||
|
||||
#. 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"
|
||||
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"
|
||||
msgstr "Yeni Pencere"
|
||||
|
||||
#: js/ui/appDisplay.js:2276
|
||||
#: js/ui/appDisplay.js:2802
|
||||
msgid "Launch using Integrated Graphics Card"
|
||||
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"
|
||||
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"
|
||||
msgstr "Sık Kullanılanlardan Çıkar"
|
||||
|
||||
#: js/ui/appDisplay.js:2311
|
||||
#: js/ui/appDisplay.js:2837
|
||||
msgid "Add to Favorites"
|
||||
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"
|
||||
msgstr "Ayrıntıları Göster"
|
||||
|
||||
@ -769,7 +785,7 @@ msgstr "Kulaklıklar"
|
||||
msgid "Headset"
|
||||
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"
|
||||
msgstr "Mikrofon"
|
||||
|
||||
@ -1273,15 +1289,15 @@ msgstr "%s (uzak)"
|
||||
msgid "%s (console)"
|
||||
msgstr "%s (uçbirim)"
|
||||
|
||||
#: js/ui/extensionDownloader.js:185
|
||||
#: js/ui/extensionDownloader.js:187
|
||||
msgid "Install"
|
||||
msgstr "Kur"
|
||||
|
||||
#: js/ui/extensionDownloader.js:191
|
||||
#: js/ui/extensionDownloader.js:193
|
||||
msgid "Install Extension"
|
||||
msgstr "Uzantı Yükle"
|
||||
|
||||
#: js/ui/extensionDownloader.js:192
|
||||
#: js/ui/extensionDownloader.js:194
|
||||
#, javascript-format
|
||||
msgid "Download and install “%s” from extensions.gnome.org?"
|
||||
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."
|
||||
msgstr "%s kısayoluyla, kısayolları geri yükleyebilirsiniz."
|
||||
|
||||
#: js/ui/inhibitShortcutsDialog.js:98
|
||||
#: js/ui/inhibitShortcutsDialog.js:100
|
||||
msgid "Deny"
|
||||
msgstr "Reddet"
|
||||
|
||||
#: js/ui/inhibitShortcutsDialog.js:105
|
||||
#: js/ui/inhibitShortcutsDialog.js:107
|
||||
msgid "Allow"
|
||||
msgstr "İzin ver"
|
||||
|
||||
@ -1384,7 +1400,7 @@ msgstr "Kapat"
|
||||
msgid "Leave Off"
|
||||
msgstr "Kapalı Bırak"
|
||||
|
||||
#: js/ui/keyboard.js:207
|
||||
#: js/ui/keyboard.js:225
|
||||
msgid "Region & Language Settings"
|
||||
msgstr "Bölge ve Dil Ayarları"
|
||||
|
||||
@ -1457,7 +1473,7 @@ msgstr "Ekran Kilidi devre dışı"
|
||||
msgid "Screen Locking requires the GNOME display manager."
|
||||
msgstr "Ekran Kilitleme, GNOME ekran yöneticisi gerektirir."
|
||||
|
||||
#: js/ui/messageTray.js:1547
|
||||
#: js/ui/messageTray.js:1476
|
||||
msgid "System Information"
|
||||
msgstr "Sistem Bilgisi"
|
||||
|
||||
@ -1469,13 +1485,13 @@ msgstr "Bilinmeyen sanatçı"
|
||||
msgid "Unknown title"
|
||||
msgstr "Bilinmeyen başlık"
|
||||
|
||||
#: js/ui/overview.js:73
|
||||
#: js/ui/overview.js:74
|
||||
msgid "Undo"
|
||||
msgstr "Geri Al"
|
||||
|
||||
#. Translators: This is the main view to select
|
||||
#. activities. See also note for "Activities" string.
|
||||
#: js/ui/overview.js:86
|
||||
#: js/ui/overview.js:87
|
||||
msgid "Overview"
|
||||
msgstr "Genel Görünüm"
|
||||
|
||||
@ -1483,7 +1499,7 @@ msgstr "Genel Görünüm"
|
||||
#. in the search entry when no search is
|
||||
#. active; it should not exceed ~30
|
||||
#. characters.
|
||||
#: js/ui/overview.js:107
|
||||
#: js/ui/overview.js:108
|
||||
msgid "Type to search"
|
||||
msgstr "Aramak için yaz"
|
||||
|
||||
@ -2131,11 +2147,11 @@ msgstr "Thunderbolt yetkilendirme hatası"
|
||||
msgid "Could not authorize the Thunderbolt device: %s"
|
||||
msgstr "Thunderbolt aygıtı yetkilendirilemedi: %s"
|
||||
|
||||
#: js/ui/status/volume.js:154
|
||||
#: js/ui/status/volume.js:155
|
||||
msgid "Volume changed"
|
||||
msgstr "Bölüm değişti"
|
||||
|
||||
#: js/ui/status/volume.js:225
|
||||
#: js/ui/status/volume.js:217
|
||||
msgid "Volume"
|
||||
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"
|
||||
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"
|
||||
msgstr "Kilit Açma Penceresi"
|
||||
|
||||
#: js/ui/unlockDialog.js:559
|
||||
#: js/ui/unlockDialog.js:564
|
||||
msgid "Log in as another user"
|
||||
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"
|
||||
msgstr "Olası kipleri listele"
|
||||
|
||||
#: src/shell-app.c:286
|
||||
#: src/shell-app.c:268
|
||||
msgctxt "program"
|
||||
msgid "Unknown"
|
||||
msgstr "Bilinmeyen"
|
||||
|
||||
#: src/shell-app.c:537
|
||||
#: src/shell-app.c:519
|
||||
#, c-format
|
||||
msgid "Failed to launch “%s”"
|
||||
msgstr "“%s” başlatılamadı"
|
||||
|
194
po/uk.po
194
po/uk.po
@ -10,8 +10,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell master\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
|
||||
"POT-Creation-Date: 2020-06-05 23:11+0000\n"
|
||||
"PO-Revision-Date: 2020-06-06 15:53+0300\n"
|
||||
"POT-Creation-Date: 2020-07-20 16:18+0000\n"
|
||||
"PO-Revision-Date: 2020-07-21 08:42+0300\n"
|
||||
"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
|
||||
"Language-Team: Ukrainian <kde-i18n-uk@kde.org>\n"
|
||||
"Language: uk\n"
|
||||
@ -216,89 +216,106 @@ msgid ""
|
||||
"shell."
|
||||
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"
|
||||
msgstr "Комбінація клавіш, щоб відкрити меню програм"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:120
|
||||
#: data/org.gnome.shell.gschema.xml.in:131
|
||||
msgid "Keybinding to open the application menu."
|
||||
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"
|
||||
msgstr "Комбінація клавіш, щоб «Показати програми»"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:127
|
||||
#: data/org.gnome.shell.gschema.xml.in:138
|
||||
msgid ""
|
||||
"Keybinding to open the “Show Applications” view of the Activities Overview."
|
||||
msgstr "Комбінація клавіш, щоб «Показати програми» в огляді діяльності."
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:134
|
||||
#: data/org.gnome.shell.gschema.xml.in:145
|
||||
msgid "Keybinding to open the overview"
|
||||
msgstr "Комбінація клавіш, щоб відкрити огляд"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:135
|
||||
#: data/org.gnome.shell.gschema.xml.in:146
|
||||
msgid "Keybinding to open the Activities Overview."
|
||||
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"
|
||||
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."
|
||||
msgstr "Комбінація клавіш, щоб змінювати видимість переліку сповіщень."
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:148
|
||||
#: data/org.gnome.shell.gschema.xml.in:159
|
||||
msgid "Keybinding to focus the active notification"
|
||||
msgstr "Комбінація клавіш, щоб перейти до активних сповіщень"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:149
|
||||
#: data/org.gnome.shell.gschema.xml.in:160
|
||||
msgid "Keybinding to focus the active notification."
|
||||
msgstr "Комбінація клавіш, щоб перейти до активних сповіщень."
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:155
|
||||
#: data/org.gnome.shell.gschema.xml.in:166
|
||||
msgid "Switch to application 1"
|
||||
msgstr "Перемкнутися на програму 1"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:159
|
||||
#: data/org.gnome.shell.gschema.xml.in:170
|
||||
msgid "Switch to application 2"
|
||||
msgstr "Перемкнутися на програму 2"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:163
|
||||
#: data/org.gnome.shell.gschema.xml.in:174
|
||||
msgid "Switch to application 3"
|
||||
msgstr "Перемкнутися на програму 3"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:167
|
||||
#: data/org.gnome.shell.gschema.xml.in:178
|
||||
msgid "Switch to application 4"
|
||||
msgstr "Перемкнутися на програму 4"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:171
|
||||
#: data/org.gnome.shell.gschema.xml.in:182
|
||||
msgid "Switch to application 5"
|
||||
msgstr "Перемкнутися на програму 5"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:175
|
||||
#: data/org.gnome.shell.gschema.xml.in:186
|
||||
msgid "Switch to application 6"
|
||||
msgstr "Перемкнутися на програму 6"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:179
|
||||
#: data/org.gnome.shell.gschema.xml.in:190
|
||||
msgid "Switch to application 7"
|
||||
msgstr "Перемкнутися на програму 7"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:183
|
||||
#: data/org.gnome.shell.gschema.xml.in:194
|
||||
msgid "Switch to application 8"
|
||||
msgstr "Перемкнутися на програму 8"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:187
|
||||
#: data/org.gnome.shell.gschema.xml.in:198
|
||||
msgid "Switch to application 9"
|
||||
msgstr "Перемкнутися на програму 9"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:196
|
||||
#: data/org.gnome.shell.gschema.xml.in:223
|
||||
#: data/org.gnome.shell.gschema.xml.in:207
|
||||
#: data/org.gnome.shell.gschema.xml.in:234
|
||||
msgid "Limit switcher to current workspace."
|
||||
msgstr "Обмежити перемикач на поточний робочий простір."
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:197
|
||||
#: data/org.gnome.shell.gschema.xml.in:208
|
||||
msgid ""
|
||||
"If true, only applications that have windows on the current workspace are "
|
||||
"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."
|
||||
msgstr "Режим піктограм для програм."
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:215
|
||||
#: data/org.gnome.shell.gschema.xml.in:226
|
||||
msgid ""
|
||||
"Configures how the windows are shown in the switcher. Valid possibilities "
|
||||
"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-"
|
||||
@ -320,7 +337,7 @@ msgstr ""
|
||||
"«thumbnail-only» (показує мініатюру вікна), «app-icon-only» (показує тільки "
|
||||
"піктограми програм) або «both» (обидва)."
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:224
|
||||
#: data/org.gnome.shell.gschema.xml.in:235
|
||||
msgid ""
|
||||
"If true, only windows from the current workspace are shown in the switcher. "
|
||||
"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"
|
||||
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"
|
||||
msgstr "Місцевість для світового годинника"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:245
|
||||
#: data/org.gnome.shell.gschema.xml.in:256
|
||||
msgid "Automatic location"
|
||||
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"
|
||||
msgstr "Чи одержувати поточну локацію"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:253
|
||||
#: data/org.gnome.shell.gschema.xml.in:264
|
||||
msgid "Location"
|
||||
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"
|
||||
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"
|
||||
msgstr "Приєднати модальне вікно до батьківського вікна"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:267
|
||||
#: data/org.gnome.shell.gschema.xml.in:276
|
||||
#: data/org.gnome.shell.gschema.xml.in:284
|
||||
#: data/org.gnome.shell.gschema.xml.in:292
|
||||
#: data/org.gnome.shell.gschema.xml.in:300
|
||||
#: data/org.gnome.shell.gschema.xml.in:278
|
||||
#: data/org.gnome.shell.gschema.xml.in:287
|
||||
#: data/org.gnome.shell.gschema.xml.in:295
|
||||
#: data/org.gnome.shell.gschema.xml.in:303
|
||||
#: data/org.gnome.shell.gschema.xml.in:311
|
||||
msgid ""
|
||||
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
|
||||
msgstr ""
|
||||
"Цей ключ перевизначає ключ у 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"
|
||||
msgstr "Увімкнути розбиття країв, коли кладуться вікна на краї екрана"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:283
|
||||
#: data/org.gnome.shell.gschema.xml.in:294
|
||||
msgid "Workspaces are managed dynamically"
|
||||
msgstr "Робочі простори організовуються динамічно"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:291
|
||||
#: data/org.gnome.shell.gschema.xml.in:302
|
||||
msgid "Workspaces only on primary monitor"
|
||||
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"
|
||||
msgstr "Затримувати зміни фокусу миші, поки вказівник не перестане рухатись"
|
||||
|
||||
@ -414,7 +431,7 @@ msgstr "Відвідати сторінку розширення"
|
||||
|
||||
#: js/gdm/authPrompt.js:135 js/ui/audioDeviceSelection.js:57
|
||||
#: 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/status/network.js:916 subprojects/extensions-app/js/main.js:149
|
||||
msgid "Cancel"
|
||||
@ -456,7 +473,7 @@ msgstr "Користувач"
|
||||
msgid "Login Window"
|
||||
msgstr "Вікно входу"
|
||||
|
||||
#: js/gdm/util.js:345
|
||||
#: js/gdm/util.js:355
|
||||
msgid "Authentication error"
|
||||
msgstr "Помилка розпізнавання"
|
||||
|
||||
@ -465,7 +482,7 @@ msgstr "Помилка розпізнавання"
|
||||
#. as a cue to display our own message.
|
||||
#. Translators: this message is shown below the password entry field
|
||||
#. to indicate the user can swipe their finger instead
|
||||
#: js/gdm/util.js:471
|
||||
#: js/gdm/util.js:481
|
||||
msgid "(or swipe finger)"
|
||||
msgstr "(або проведіть пальцем)"
|
||||
|
||||
@ -713,36 +730,36 @@ msgstr "Заборонити доступ"
|
||||
msgid "Grant Access"
|
||||
msgstr "Надати доступ"
|
||||
|
||||
#: js/ui/appDisplay.js:956
|
||||
#: js/ui/appDisplay.js:1297
|
||||
msgid "Unnamed Folder"
|
||||
msgstr "Неназвана тека"
|
||||
|
||||
#. 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"
|
||||
msgstr "Відкрити вікна"
|
||||
|
||||
#: js/ui/appDisplay.js:2234 js/ui/panel.js:82
|
||||
#: js/ui/appDisplay.js:2786 js/ui/panel.js:82
|
||||
msgid "New Window"
|
||||
msgstr "Нове вікно"
|
||||
|
||||
#: js/ui/appDisplay.js:2250
|
||||
#: js/ui/appDisplay.js:2802
|
||||
msgid "Launch using Integrated Graphics Card"
|
||||
msgstr "Запустити через інтегровану графічну плату"
|
||||
|
||||
#: js/ui/appDisplay.js:2251
|
||||
#: js/ui/appDisplay.js:2803
|
||||
msgid "Launch using Discrete Graphics Card"
|
||||
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"
|
||||
msgstr "Вилучити з улюбленого"
|
||||
|
||||
#: js/ui/appDisplay.js:2285
|
||||
#: js/ui/appDisplay.js:2837
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Додати до улюбленого"
|
||||
|
||||
#: js/ui/appDisplay.js:2295 js/ui/panel.js:93
|
||||
#: js/ui/appDisplay.js:2847 js/ui/panel.js:93
|
||||
msgid "Show Details"
|
||||
msgstr "Показати подробиці"
|
||||
|
||||
@ -772,7 +789,7 @@ msgstr "Навушники"
|
||||
msgid "Headset"
|
||||
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"
|
||||
msgstr "Мікрофон"
|
||||
|
||||
@ -1073,14 +1090,12 @@ msgstr "%A %-d %B %Y"
|
||||
|
||||
#. Translators: Shown on calendar heading when selected day occurs on current year
|
||||
#: js/ui/dateMenu.js:151
|
||||
#| msgid "%B %-d %Y"
|
||||
msgctxt "calendar heading"
|
||||
msgid "%B %-d"
|
||||
msgstr "%-d %B"
|
||||
|
||||
#. Translators: Shown on calendar heading when selected day occurs on different year
|
||||
#: js/ui/dateMenu.js:154
|
||||
#| msgid "%B %-d %Y"
|
||||
msgctxt "calendar heading"
|
||||
msgid "%B %-d %Y"
|
||||
msgstr "%-d %B %Y"
|
||||
@ -1293,15 +1308,15 @@ msgstr "%s (віддалено)"
|
||||
msgid "%s (console)"
|
||||
msgstr "%s (консоль)"
|
||||
|
||||
#: js/ui/extensionDownloader.js:185
|
||||
#: js/ui/extensionDownloader.js:187
|
||||
msgid "Install"
|
||||
msgstr "Встановити"
|
||||
|
||||
#: js/ui/extensionDownloader.js:191
|
||||
#: js/ui/extensionDownloader.js:193
|
||||
msgid "Install Extension"
|
||||
msgstr "Встановити розширення"
|
||||
|
||||
#: js/ui/extensionDownloader.js:192
|
||||
#: js/ui/extensionDownloader.js:194
|
||||
#, javascript-format
|
||||
msgid "Download and install “%s” from extensions.gnome.org?"
|
||||
msgstr "Звантажити і встановити «%s» з extensions.gnome.org?"
|
||||
@ -1334,11 +1349,11 @@ msgstr "Програма бажає успадкувати скорочення"
|
||||
msgid "You can restore shortcuts by pressing %s."
|
||||
msgstr "Можна відновити скорочення, натиснувши %s."
|
||||
|
||||
#: js/ui/inhibitShortcutsDialog.js:98
|
||||
#: js/ui/inhibitShortcutsDialog.js:100
|
||||
msgid "Deny"
|
||||
msgstr "Заборонити"
|
||||
|
||||
#: js/ui/inhibitShortcutsDialog.js:105
|
||||
#: js/ui/inhibitShortcutsDialog.js:107
|
||||
msgid "Allow"
|
||||
msgstr "Дозволити"
|
||||
|
||||
@ -1404,7 +1419,7 @@ msgstr "Вимкнути"
|
||||
msgid "Leave Off"
|
||||
msgstr "Покинути"
|
||||
|
||||
#: js/ui/keyboard.js:207
|
||||
#: js/ui/keyboard.js:225
|
||||
msgid "Region & Language Settings"
|
||||
msgstr "Параметри регіону та мови"
|
||||
|
||||
@ -1477,7 +1492,7 @@ msgstr "Блокування екрана вимкнено"
|
||||
msgid "Screen Locking requires the GNOME display manager."
|
||||
msgstr "Блокування екрана потребує керування входом GNOME."
|
||||
|
||||
#: js/ui/messageTray.js:1547
|
||||
#: js/ui/messageTray.js:1476
|
||||
msgid "System Information"
|
||||
msgstr "Інформація про систему"
|
||||
|
||||
@ -1489,13 +1504,13 @@ msgstr "Невідомий виконавець"
|
||||
msgid "Unknown title"
|
||||
msgstr "Невідома назва"
|
||||
|
||||
#: js/ui/overview.js:73
|
||||
#: js/ui/overview.js:74
|
||||
msgid "Undo"
|
||||
msgstr "Повернути"
|
||||
|
||||
#. Translators: This is the main view to select
|
||||
#. activities. See also note for "Activities" string.
|
||||
#: js/ui/overview.js:86
|
||||
#: js/ui/overview.js:87
|
||||
msgid "Overview"
|
||||
msgstr "Огляд"
|
||||
|
||||
@ -1503,7 +1518,7 @@ msgstr "Огляд"
|
||||
#. in the search entry when no search is
|
||||
#. active; it should not exceed ~30
|
||||
#. characters.
|
||||
#: js/ui/overview.js:107
|
||||
#: js/ui/overview.js:108
|
||||
msgid "Type to search"
|
||||
msgstr "Введіть текст для пошуку"
|
||||
|
||||
@ -2162,11 +2177,11 @@ msgstr "Помилка завірення Thunderbolt"
|
||||
msgid "Could not authorize the Thunderbolt device: %s"
|
||||
msgstr "Неможливо завірити пристрій Thunderbolt: %s"
|
||||
|
||||
#: js/ui/status/volume.js:154
|
||||
#: js/ui/status/volume.js:155
|
||||
msgid "Volume changed"
|
||||
msgstr "Гучність змінено"
|
||||
|
||||
#: js/ui/status/volume.js:225
|
||||
#: js/ui/status/volume.js:217
|
||||
msgid "Volume"
|
||||
msgstr "Гучність"
|
||||
|
||||
@ -2212,11 +2227,11 @@ msgstr "Проведіть вгору для розблокування"
|
||||
msgid "Click or press a key to unlock"
|
||||
msgstr "Клацніть або натисніть клавішу для розблокування"
|
||||
|
||||
#: js/ui/unlockDialog.js:550
|
||||
#: js/ui/unlockDialog.js:555
|
||||
msgid "Unlock Window"
|
||||
msgstr "Розблокувати вікно"
|
||||
|
||||
#: js/ui/unlockDialog.js:559
|
||||
#: js/ui/unlockDialog.js:564
|
||||
msgid "Log in as another user"
|
||||
msgstr "Увійти як інший користувач"
|
||||
|
||||
@ -2353,12 +2368,12 @@ msgstr "Використовувати вказаний режим, прикла
|
||||
msgid "List possible modes"
|
||||
msgstr "Перелік можливих режимів"
|
||||
|
||||
#: src/shell-app.c:286
|
||||
#: src/shell-app.c:268
|
||||
msgctxt "program"
|
||||
msgid "Unknown"
|
||||
msgstr "Невідомо"
|
||||
|
||||
#: src/shell-app.c:537
|
||||
#: src/shell-app.c:519
|
||||
#, c-format
|
||||
msgid "Failed to launch “%s”"
|
||||
msgstr "Не вдалося запустити «%s»"
|
||||
@ -2938,36 +2953,3 @@ msgstr[3] "%u вхід"
|
||||
#: subprojects/gvc/gvc-mixer-control.c:2766
|
||||
msgid "System Sounds"
|
||||
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 "Увімкнено"
|
||||
|
204
po/zh_CN.po
204
po/zh_CN.po
@ -23,8 +23,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell master\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
|
||||
"POT-Creation-Date: 2020-05-28 11:29+0000\n"
|
||||
"PO-Revision-Date: 2020-05-29 09:03-0400\n"
|
||||
"POT-Creation-Date: 2020-07-12 02:14+0000\n"
|
||||
"PO-Revision-Date: 2020-07-11 22:32-0400\n"
|
||||
"Last-Translator: Boyuan Yang <073plan@gmail.com>\n"
|
||||
"Language-Team: Chinese (China) <i18n-zh@googlegroups.com>\n"
|
||||
"Language: zh_CN\n"
|
||||
@ -444,7 +444,7 @@ msgstr "用户名"
|
||||
msgid "Login Window"
|
||||
msgstr "登录窗口"
|
||||
|
||||
#: js/gdm/util.js:345
|
||||
#: js/gdm/util.js:355
|
||||
msgid "Authentication error"
|
||||
msgstr "认证出错"
|
||||
|
||||
@ -453,7 +453,7 @@ msgstr "认证出错"
|
||||
#. as a cue to display our own message.
|
||||
#. Translators: this message is shown below the password entry field
|
||||
#. to indicate the user can swipe their finger instead
|
||||
#: js/gdm/util.js:471
|
||||
#: js/gdm/util.js:481
|
||||
msgid "(or swipe finger)"
|
||||
msgstr "(或滑动手指)"
|
||||
|
||||
@ -559,7 +559,7 @@ msgid "%d hour ago"
|
||||
msgid_plural "%d hours ago"
|
||||
msgstr[0] "%d 小时前"
|
||||
|
||||
#: js/misc/util.js:191
|
||||
#: js/misc/util.js:191 js/ui/dateMenu.js:162
|
||||
msgid "Yesterday"
|
||||
msgstr "昨天"
|
||||
|
||||
@ -672,44 +672,44 @@ msgstr "您到热点登录的连接不安全。您在此页面输入的密码或
|
||||
|
||||
#. No support for non-modal system dialogs, so ignore the option
|
||||
#. 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"
|
||||
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"
|
||||
msgstr "允许访问"
|
||||
|
||||
#: js/ui/appDisplay.js:960
|
||||
#: js/ui/appDisplay.js:903
|
||||
msgid "Unnamed Folder"
|
||||
msgstr "未命名文件夹"
|
||||
|
||||
#. 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"
|
||||
msgstr "打开窗口"
|
||||
|
||||
#: js/ui/appDisplay.js:2238 js/ui/panel.js:82
|
||||
#: js/ui/appDisplay.js:2244 js/ui/panel.js:82
|
||||
msgid "New Window"
|
||||
msgstr "新窗口"
|
||||
|
||||
#: js/ui/appDisplay.js:2254
|
||||
#: js/ui/appDisplay.js:2260
|
||||
msgid "Launch using Integrated Graphics Card"
|
||||
msgstr "使用集成显卡启动"
|
||||
|
||||
#: js/ui/appDisplay.js:2255
|
||||
#: js/ui/appDisplay.js:2261
|
||||
msgid "Launch using Discrete Graphics Card"
|
||||
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"
|
||||
msgstr "从收藏夹中移除"
|
||||
|
||||
#: js/ui/appDisplay.js:2289
|
||||
#: js/ui/appDisplay.js:2295
|
||||
msgid "Add to Favorites"
|
||||
msgstr "添加到收藏夹"
|
||||
|
||||
#: js/ui/appDisplay.js:2299 js/ui/panel.js:93
|
||||
#: js/ui/appDisplay.js:2305 js/ui/panel.js:93
|
||||
msgid "Show Details"
|
||||
msgstr "显示细节"
|
||||
|
||||
@ -739,7 +739,7 @@ msgstr "耳机"
|
||||
msgid "Headset"
|
||||
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"
|
||||
msgstr "麦克风"
|
||||
|
||||
@ -756,7 +756,7 @@ msgid "Settings"
|
||||
msgstr "设置"
|
||||
|
||||
#. 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"
|
||||
msgid "06"
|
||||
msgstr "06"
|
||||
@ -766,43 +766,43 @@ msgstr "06"
|
||||
#. * NOTE: These grid abbreviations are always shown together
|
||||
#. * 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"
|
||||
msgid "S"
|
||||
msgstr "日"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Monday
|
||||
#: js/ui/calendar.js:72
|
||||
#: js/ui/calendar.js:67
|
||||
msgctxt "grid monday"
|
||||
msgid "M"
|
||||
msgstr "一"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Tuesday
|
||||
#: js/ui/calendar.js:74
|
||||
#: js/ui/calendar.js:69
|
||||
msgctxt "grid tuesday"
|
||||
msgid "T"
|
||||
msgstr "二"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Wednesday
|
||||
#: js/ui/calendar.js:76
|
||||
#: js/ui/calendar.js:71
|
||||
msgctxt "grid wednesday"
|
||||
msgid "W"
|
||||
msgstr "三"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Thursday
|
||||
#: js/ui/calendar.js:78
|
||||
#: js/ui/calendar.js:73
|
||||
msgctxt "grid thursday"
|
||||
msgid "T"
|
||||
msgstr "四"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Friday
|
||||
#: js/ui/calendar.js:80
|
||||
#: js/ui/calendar.js:75
|
||||
msgctxt "grid friday"
|
||||
msgid "F"
|
||||
msgstr "五"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Saturday
|
||||
#: js/ui/calendar.js:82
|
||||
#: js/ui/calendar.js:77
|
||||
msgctxt "grid saturday"
|
||||
msgid "S"
|
||||
msgstr "六"
|
||||
@ -813,7 +813,7 @@ msgstr "六"
|
||||
#. * "%OB" is the new format specifier introduced in glibc 2.27,
|
||||
#. * in most cases you should not change it.
|
||||
#.
|
||||
#: js/ui/calendar.js:397
|
||||
#: js/ui/calendar.js:392
|
||||
msgid "%OB"
|
||||
msgstr "%OB"
|
||||
|
||||
@ -826,61 +826,37 @@ msgstr "%OB"
|
||||
#. * in most cases you should not use the old "%B" here unless you
|
||||
#. * absolutely know what you are doing.
|
||||
#.
|
||||
#: js/ui/calendar.js:407
|
||||
#: js/ui/calendar.js:402
|
||||
msgid "%OB %Y"
|
||||
msgstr "%Y %OB"
|
||||
|
||||
#: js/ui/calendar.js:466
|
||||
#: js/ui/calendar.js:461
|
||||
msgid "Previous month"
|
||||
msgstr "上个月"
|
||||
|
||||
#: js/ui/calendar.js:481
|
||||
#: js/ui/calendar.js:476
|
||||
msgid "Next month"
|
||||
msgstr "下个月"
|
||||
|
||||
#: js/ui/calendar.js:631
|
||||
#: js/ui/calendar.js:626
|
||||
#, no-javascript-format
|
||||
msgctxt "date day number format"
|
||||
msgid "%d"
|
||||
msgstr "%d"
|
||||
|
||||
#: js/ui/calendar.js:687
|
||||
#: js/ui/calendar.js:682
|
||||
msgid "Week %V"
|
||||
msgstr "第 %V 个星期"
|
||||
|
||||
#. Translators: Shown in calendar event list for all day events
|
||||
#. * Keep it short, best if you can use less then 10 characters
|
||||
#.
|
||||
#: js/ui/calendar.js: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
|
||||
#: js/ui/calendar.js:895
|
||||
msgid "No Notifications"
|
||||
msgstr "无通知"
|
||||
|
||||
#: js/ui/calendar.js:1136
|
||||
msgid "No Events"
|
||||
msgstr "无事件"
|
||||
|
||||
#: js/ui/calendar.js:1190
|
||||
#: js/ui/calendar.js:949
|
||||
msgid "Do Not Disturb"
|
||||
msgstr "请勿打扰"
|
||||
|
||||
#: js/ui/calendar.js:1209
|
||||
#: js/ui/calendar.js:968
|
||||
msgid "Clear"
|
||||
msgstr "清除"
|
||||
|
||||
@ -1030,7 +1006,7 @@ msgstr "抱歉,认证失败。请重试。"
|
||||
msgid "%s is now known as %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"
|
||||
msgstr "窗口"
|
||||
|
||||
@ -1049,7 +1025,7 @@ msgstr "Dash"
|
||||
#. * "Tue 9:29 AM"). The string itself should become a full date, e.g.,
|
||||
#. * "February 17 2015".
|
||||
#.
|
||||
#: js/ui/dateMenu.js:75
|
||||
#: js/ui/dateMenu.js:79
|
||||
msgid "%B %-d %Y"
|
||||
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
|
||||
#. * date, e.g. "Tuesday February 17 2015".
|
||||
#.
|
||||
#: js/ui/dateMenu.js:82
|
||||
#: js/ui/dateMenu.js:86
|
||||
msgid "%A %B %e %Y"
|
||||
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…"
|
||||
msgstr "添加世界时钟…"
|
||||
|
||||
#: js/ui/dateMenu.js:163
|
||||
#: js/ui/dateMenu.js:349
|
||||
msgid "World Clocks"
|
||||
msgstr "世界时钟"
|
||||
|
||||
#: js/ui/dateMenu.js:443
|
||||
#: js/ui/dateMenu.js:629
|
||||
msgid "Loading…"
|
||||
msgstr "正在载入……"
|
||||
|
||||
#: js/ui/dateMenu.js:453
|
||||
#: js/ui/dateMenu.js:639
|
||||
msgid "Go online for weather information"
|
||||
msgstr "通过互联网查看天气信息"
|
||||
|
||||
#: js/ui/dateMenu.js:455
|
||||
#: js/ui/dateMenu.js:641
|
||||
msgid "Weather information is currently unavailable"
|
||||
msgstr "天气信息目前不可用"
|
||||
|
||||
#: js/ui/dateMenu.js:465
|
||||
#: js/ui/dateMenu.js:651
|
||||
msgid "Weather"
|
||||
msgstr "天气"
|
||||
|
||||
#: js/ui/dateMenu.js:467
|
||||
#: js/ui/dateMenu.js:653
|
||||
msgid "Select weather location…"
|
||||
msgstr "选择天气地点…"
|
||||
|
||||
@ -1268,11 +1276,11 @@ msgstr "某应用程序希望禁用快捷键"
|
||||
msgid "You can restore shortcuts by pressing %s."
|
||||
msgstr "按 %s 以恢复快捷键。"
|
||||
|
||||
#: js/ui/inhibitShortcutsDialog.js:98
|
||||
#: js/ui/inhibitShortcutsDialog.js:100
|
||||
msgid "Deny"
|
||||
msgstr "拒绝"
|
||||
|
||||
#: js/ui/inhibitShortcutsDialog.js:105
|
||||
#: js/ui/inhibitShortcutsDialog.js:107
|
||||
msgid "Allow"
|
||||
msgstr "允许"
|
||||
|
||||
@ -1337,7 +1345,7 @@ msgstr "关闭"
|
||||
msgid "Leave Off"
|
||||
msgstr "保持关闭"
|
||||
|
||||
#: js/ui/keyboard.js:207
|
||||
#: js/ui/keyboard.js:225
|
||||
msgid "Region & Language Settings"
|
||||
msgstr "区域与语言设置"
|
||||
|
||||
@ -1410,25 +1418,25 @@ msgstr "屏幕锁定已禁用"
|
||||
msgid "Screen Locking requires the GNOME display manager."
|
||||
msgstr "屏幕锁定需要 GNOME 显示管理器。"
|
||||
|
||||
#: js/ui/messageTray.js:1547
|
||||
#: js/ui/messageTray.js:1476
|
||||
msgid "System Information"
|
||||
msgstr "系统信息"
|
||||
|
||||
#: js/ui/mpris.js:204
|
||||
#: js/ui/mpris.js:203
|
||||
msgid "Unknown artist"
|
||||
msgstr "未知艺人"
|
||||
|
||||
#: js/ui/mpris.js:214
|
||||
#: js/ui/mpris.js:213
|
||||
msgid "Unknown title"
|
||||
msgstr "未知标题"
|
||||
|
||||
#: js/ui/overview.js:73
|
||||
#: js/ui/overview.js:74
|
||||
msgid "Undo"
|
||||
msgstr "撤消"
|
||||
|
||||
#. Translators: This is the main view to select
|
||||
#. activities. See also note for "Activities" string.
|
||||
#: js/ui/overview.js:86
|
||||
#: js/ui/overview.js:87
|
||||
msgid "Overview"
|
||||
msgstr "概览"
|
||||
|
||||
@ -1436,7 +1444,7 @@ msgstr "概览"
|
||||
#. in the search entry when no search is
|
||||
#. active; it should not exceed ~30
|
||||
#. characters.
|
||||
#: js/ui/overview.js:107
|
||||
#: js/ui/overview.js:108
|
||||
msgid "Type to search"
|
||||
msgstr "输入以搜索"
|
||||
|
||||
@ -1464,23 +1472,23 @@ msgstr "分配按键"
|
||||
msgid "Done"
|
||||
msgstr "完成"
|
||||
|
||||
#: js/ui/padOsd.js:745
|
||||
#: js/ui/padOsd.js:732
|
||||
msgid "Edit…"
|
||||
msgstr "编辑…"
|
||||
|
||||
#: js/ui/padOsd.js:787 js/ui/padOsd.js:910
|
||||
#: js/ui/padOsd.js:774 js/ui/padOsd.js:891
|
||||
msgid "None"
|
||||
msgstr "无"
|
||||
|
||||
#: js/ui/padOsd.js:863
|
||||
#: js/ui/padOsd.js:845
|
||||
msgid "Press a button to configure"
|
||||
msgstr "按下按键以配置"
|
||||
|
||||
#: js/ui/padOsd.js:864
|
||||
#: js/ui/padOsd.js:846
|
||||
msgid "Press Esc to exit"
|
||||
msgstr "按 Esc 以退出"
|
||||
|
||||
#: js/ui/padOsd.js:867
|
||||
#: js/ui/padOsd.js:849
|
||||
msgid "Press any key to exit"
|
||||
msgstr "按任意键退出"
|
||||
|
||||
@ -1570,7 +1578,7 @@ msgstr "隐藏文本"
|
||||
|
||||
#: js/ui/shellEntry.js:162
|
||||
msgid "Caps lock is on."
|
||||
msgstr "大写锁定键已开启。"
|
||||
msgstr "大写锁定已开启。"
|
||||
|
||||
#: js/ui/shellMountOperation.js:285
|
||||
msgid "Hidden Volume"
|
||||
@ -1742,17 +1750,17 @@ msgstr "定位服务已禁用"
|
||||
msgid "Enable"
|
||||
msgstr "启用"
|
||||
|
||||
#: js/ui/status/location.js:355
|
||||
#: js/ui/status/location.js:350
|
||||
msgid "Allow location access"
|
||||
msgstr "允许获取位置信息"
|
||||
|
||||
#. Translators: %s is an application name
|
||||
#: js/ui/status/location.js:357
|
||||
#: js/ui/status/location.js:352
|
||||
#, javascript-format
|
||||
msgid "The app %s wants to access your location"
|
||||
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."
|
||||
msgstr "位置访问权限可以随时在隐私设置里更改。"
|
||||
|
||||
@ -2081,11 +2089,11 @@ msgstr "Thunderbolt 授权错误"
|
||||
msgid "Could not authorize the Thunderbolt device: %s"
|
||||
msgstr "无法授权 Thunderbolt 设备:%s"
|
||||
|
||||
#: js/ui/status/volume.js:154
|
||||
#: js/ui/status/volume.js:155
|
||||
msgid "Volume changed"
|
||||
msgstr "音量已变更"
|
||||
|
||||
#: js/ui/status/volume.js:225
|
||||
#: js/ui/status/volume.js:217
|
||||
msgid "Volume"
|
||||
msgstr "音量"
|
||||
|
||||
@ -2131,19 +2139,19 @@ msgstr "向上滑动解锁"
|
||||
msgid "Click or press a key to unlock"
|
||||
msgstr "单击或按键解锁"
|
||||
|
||||
#: js/ui/unlockDialog.js:550
|
||||
#: js/ui/unlockDialog.js:555
|
||||
msgid "Unlock Window"
|
||||
msgstr "解锁窗口"
|
||||
|
||||
#: js/ui/unlockDialog.js:559
|
||||
#: js/ui/unlockDialog.js:564
|
||||
msgid "Log in as another user"
|
||||
msgstr "以另一个用户身份登录"
|
||||
|
||||
#: js/ui/viewSelector.js:181
|
||||
#: js/ui/viewSelector.js:182
|
||||
msgid "Applications"
|
||||
msgstr "应用程序"
|
||||
|
||||
#: js/ui/viewSelector.js:185
|
||||
#: js/ui/viewSelector.js:186
|
||||
msgid "Search"
|
||||
msgstr "搜索"
|
||||
|
||||
@ -2269,12 +2277,12 @@ msgstr "使用指定模式,如“gdm”用于登录屏幕"
|
||||
msgid "List possible modes"
|
||||
msgstr "列出可用的模式"
|
||||
|
||||
#: src/shell-app.c:286
|
||||
#: src/shell-app.c:268
|
||||
msgctxt "program"
|
||||
msgid "Unknown"
|
||||
msgstr "未知"
|
||||
|
||||
#: src/shell-app.c:537
|
||||
#: src/shell-app.c:519
|
||||
#, c-format
|
||||
msgid "Failed to launch “%s”"
|
||||
msgstr "启动“%s”失败"
|
||||
@ -2504,7 +2512,7 @@ msgstr "描述"
|
||||
|
||||
#: subprojects/extensions-tool/src/command-create.c:443
|
||||
msgid "A short description of what the extension does"
|
||||
msgstr "简短描述下扩展所做的事情"
|
||||
msgstr "扩展功能的简短描述"
|
||||
|
||||
#: subprojects/extensions-tool/src/command-create.c:446
|
||||
msgid "TEMPLATE"
|
||||
@ -2847,6 +2855,14 @@ msgstr[0] "%u 个输入"
|
||||
msgid "System Sounds"
|
||||
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"
|
||||
#~ msgstr "常用的应用程序会出现在这里"
|
||||
|
||||
|
@ -346,8 +346,6 @@ struct _App
|
||||
|
||||
GSList *notify_appointments; /* CalendarAppointment *, for EventsAdded */
|
||||
GSList *notify_ids; /* gchar *, for EventsRemoved */
|
||||
guint events_added_timeout_id;
|
||||
guint events_removed_timeout_id;
|
||||
|
||||
GSList *live_views;
|
||||
};
|
||||
@ -370,24 +368,19 @@ app_update_timezone (App *app)
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean
|
||||
on_app_schedule_events_added_cb (gpointer user_data)
|
||||
static void
|
||||
app_notify_events_added (App *app)
|
||||
{
|
||||
App *app = user_data;
|
||||
GVariantBuilder builder, extras_builder;
|
||||
GSList *events, *link;
|
||||
|
||||
if (g_source_is_destroyed (g_main_current_source ()))
|
||||
return FALSE;
|
||||
|
||||
events = g_slist_reverse (app->notify_appointments);
|
||||
app->notify_appointments = NULL;
|
||||
app->events_added_timeout_id = 0;
|
||||
|
||||
print_debug ("Emitting EventsAddedOrUpdated with %d events", g_slist_length (events));
|
||||
|
||||
if (!events)
|
||||
return FALSE;
|
||||
return;
|
||||
|
||||
/* The a{sv} is used as an escape hatch in case we want to provide more
|
||||
* 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_slist_free_full (events, calendar_appointment_free);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
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;
|
||||
GSList *ids, *link;
|
||||
|
||||
if (g_source_is_destroyed (g_main_current_source ()))
|
||||
return FALSE;
|
||||
|
||||
ids = app->notify_ids;
|
||||
app->notify_ids = NULL;
|
||||
app->events_removed_timeout_id = 0;
|
||||
|
||||
print_debug ("Emitting EventsRemoved with %d ids", g_slist_length (ids));
|
||||
|
||||
if (!ids)
|
||||
return FALSE;
|
||||
return;
|
||||
|
||||
g_variant_builder_init (&builder, G_VARIANT_TYPE ("as"));
|
||||
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);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
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");
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -546,7 +506,7 @@ app_process_added_modified_objects (App *app,
|
||||
g_clear_object (&cal_client);
|
||||
|
||||
if (app->notify_appointments)
|
||||
app_schedule_events_added (app);
|
||||
app_notify_events_added (app);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -610,7 +570,7 @@ on_objects_removed (ECalClientView *view,
|
||||
g_clear_object (&client);
|
||||
|
||||
if (app->notify_ids)
|
||||
app_schedule_events_removed (app);
|
||||
app_notify_events_removed (app);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
@ -874,9 +834,6 @@ app_free (App *app)
|
||||
{
|
||||
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))
|
||||
{
|
||||
ECalClientView *view = E_CAL_CLIENT_VIEW (ll->data);
|
||||
|
@ -163,15 +163,6 @@ libshell_private_sources = [
|
||||
'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',
|
||||
sources: libshell_public_headers
|
||||
)
|
||||
|
@ -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;
|
||||
}
|
@ -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__ */
|
1625
src/shell-recorder.c
1625
src/shell-recorder.c
File diff suppressed because it is too large
Load Diff
@ -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__ */
|
319
src/shell-util.c
319
src/shell-util.c
@ -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:
|
||||
*
|
||||
@ -409,34 +354,6 @@ shell_util_create_pixbuf_from_data (const guchar *data,
|
||||
|
||||
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
|
||||
canvas_draw_cb (ClutterContent *content,
|
||||
cairo_t *cr,
|
||||
@ -653,6 +570,57 @@ shell_util_get_uid (void)
|
||||
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
|
||||
on_systemd_call_cb (GObject *source,
|
||||
GAsyncResult *res,
|
||||
@ -660,46 +628,143 @@ on_systemd_call_cb (GObject *source,
|
||||
{
|
||||
g_autoptr (GVariant) reply = 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),
|
||||
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
|
||||
shell_util_systemd_call (const char *command,
|
||||
const char *unit,
|
||||
const char *mode,
|
||||
GError **error)
|
||||
static void
|
||||
on_systemd_job_removed_cb (GDBusConnection *connection,
|
||||
const gchar *sender_name,
|
||||
const gchar *object_path,
|
||||
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
|
||||
g_autoptr (GDBusConnection) connection = NULL;
|
||||
GError *error = NULL;
|
||||
SystemdCall *data;
|
||||
g_autofree char *self_unit = NULL;
|
||||
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);
|
||||
|
||||
if (res == -ENODATA)
|
||||
{
|
||||
g_debug ("Not systemd-managed, not doing '%s' on '%s'", mode, unit);
|
||||
return FALSE;
|
||||
g_task_return_new_error (task,
|
||||
G_IO_ERROR,
|
||||
G_IO_ERROR_NOT_SUPPORTED,
|
||||
"Not systemd managed");
|
||||
return;
|
||||
}
|
||||
else if (res < 0)
|
||||
{
|
||||
g_set_error (error,
|
||||
G_IO_ERROR,
|
||||
g_io_error_from_errno (-res),
|
||||
"Error trying to start systemd unit '%s': %s",
|
||||
unit, g_strerror (-res));
|
||||
return FALSE;
|
||||
g_task_return_new_error (task,
|
||||
G_IO_ERROR,
|
||||
g_io_error_from_errno (-res),
|
||||
"Error fetching own systemd unit: %s",
|
||||
g_strerror (-res));
|
||||
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)
|
||||
return FALSE;
|
||||
if (cancellable)
|
||||
{
|
||||
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,
|
||||
"org.freedesktop.systemd1",
|
||||
@ -708,31 +773,53 @@ shell_util_systemd_call (const char *command,
|
||||
command,
|
||||
g_variant_new ("(ss)",
|
||||
unit, mode),
|
||||
NULL,
|
||||
G_VARIANT_TYPE ("(o)"),
|
||||
G_DBUS_CALL_FLAGS_NONE,
|
||||
-1, NULL,
|
||||
-1, cancellable,
|
||||
on_systemd_call_cb,
|
||||
(gpointer) command);
|
||||
return TRUE;
|
||||
#endif /* HAVE_SYSTEMD */
|
||||
g_steal_pointer (&task));
|
||||
#else /* 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
|
||||
shell_util_start_systemd_unit (const char *unit,
|
||||
const char *mode,
|
||||
GError **error)
|
||||
shell_util_start_systemd_unit_finish (GAsyncResult *res,
|
||||
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
|
||||
shell_util_stop_systemd_unit (const char *unit,
|
||||
const char *mode,
|
||||
GError **error)
|
||||
shell_util_stop_systemd_unit_finish (GAsyncResult *res,
|
||||
GError **error)
|
||||
{
|
||||
return shell_util_systemd_call ("StopUnit", unit, mode, error);
|
||||
return g_task_propagate_boolean (G_TASK (res), error);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -14,9 +14,6 @@ G_BEGIN_DECLS
|
||||
void shell_util_set_hidden_from_pick (ClutterActor *actor,
|
||||
gboolean hidden);
|
||||
|
||||
void shell_util_get_transformed_allocation (ClutterActor *actor,
|
||||
ClutterActorBox *box);
|
||||
|
||||
int shell_util_get_week_start (void);
|
||||
|
||||
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 rowstride);
|
||||
|
||||
gboolean shell_util_need_background_refresh (void);
|
||||
|
||||
ClutterContent * shell_util_get_content_for_window_actor (MetaWindowActor *window_actor,
|
||||
MetaRectangle *window_rect);
|
||||
|
||||
@ -64,12 +59,21 @@ cairo_surface_t * shell_util_composite_capture_images (ClutterCapture *captures
|
||||
|
||||
void shell_util_check_cloexec_fds (void);
|
||||
|
||||
gboolean shell_util_start_systemd_unit (const char *unit,
|
||||
const char *mode,
|
||||
GError **error);
|
||||
gboolean shell_util_stop_systemd_unit (const char *unit,
|
||||
const char *mode,
|
||||
GError **error);
|
||||
void shell_util_start_systemd_unit (const char *unit,
|
||||
const char *mode,
|
||||
GCancellable *cancellable,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data);
|
||||
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);
|
||||
|
||||
|
@ -146,9 +146,13 @@ get_app_from_window_wmclass (MetaWindow *window)
|
||||
const char *wm_class;
|
||||
const char *wm_instance;
|
||||
const char *sandbox_id;
|
||||
g_autofree char *app_prefix = NULL;
|
||||
|
||||
appsys = shell_app_system_get_default ();
|
||||
|
||||
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:
|
||||
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 */
|
||||
wm_instance = meta_window_get_wm_class_instance (window);
|
||||
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);
|
||||
|
||||
/* then try a match from WM_CLASS to StartupWMClass */
|
||||
wm_class = meta_window_get_wm_class (window);
|
||||
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);
|
||||
|
||||
/* then try a match from WM_CLASS (instance part) to .desktop */
|
||||
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);
|
||||
|
||||
/* finally, try a match from WM_CLASS to .desktop */
|
||||
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 NULL;
|
||||
|
Reference in New Issue
Block a user