Compare commits
1 Commits
3.37.90
...
wip/ewlsh/
Author | SHA1 | Date | |
---|---|---|---|
![]() |
170fe945a9 |
@@ -9,6 +9,7 @@ stages:
|
||||
variables:
|
||||
BUNDLE: "extensions-git.flatpak"
|
||||
JS_LOG: "js-report.txt"
|
||||
POT_LOG: "pot-update.txt"
|
||||
|
||||
.only_default: &only_default
|
||||
only:
|
||||
@@ -66,7 +67,6 @@ no_template_check:
|
||||
build:
|
||||
image: registry.gitlab.gnome.org/gnome/mutter/master:v4
|
||||
stage: build
|
||||
needs: []
|
||||
before_script:
|
||||
- .gitlab-ci/checkout-mutter.sh
|
||||
- meson mutter mutter/build --prefix=/usr -Dtests=false
|
||||
@@ -85,7 +85,6 @@ build:
|
||||
test:
|
||||
image: registry.gitlab.gnome.org/gnome/mutter/master:v4
|
||||
stage: test
|
||||
needs: ["build"]
|
||||
variables:
|
||||
XDG_RUNTIME_DIR: "$CI_PROJECT_DIR/runtime-dir"
|
||||
NO_AT_BRIDGE: "1"
|
||||
@@ -100,9 +99,24 @@ test:
|
||||
- build/meson-logs/testlog.txt
|
||||
when: on_failure
|
||||
|
||||
test-pot:
|
||||
image: registry.gitlab.gnome.org/gnome/mutter/master:v4
|
||||
stage: test
|
||||
before_script:
|
||||
- ninja -C mutter/build install
|
||||
script:
|
||||
# Check that pot files are generated correctly:
|
||||
# https://savannah.gnu.org/bugs/?50920#comment5
|
||||
- ninja -C build gnome-shell-pot 2>&1 | awk '
|
||||
BEGIN { start=0; }
|
||||
start==1 { print $0; }
|
||||
/gnome-shell-pot/ { start=1; }
|
||||
' | tee $POT_LOG
|
||||
- (! grep -q . $POT_LOG)
|
||||
<<: *only_default
|
||||
|
||||
flatpak:
|
||||
stage: build
|
||||
needs: []
|
||||
variables:
|
||||
SUBPROJECT: "subprojects/extensions-app"
|
||||
# Your manifest path
|
||||
|
67
NEWS
67
NEWS
@@ -1,70 +1,3 @@
|
||||
3.37.90
|
||||
=======
|
||||
* Fix extension updates when many extensions are installed [Jeremias; !1363]
|
||||
* Fix missing icons in on-screen keyboard [Emre; #2631, #3007]
|
||||
* Fix delay when showing calendar events [Sebastian; #2992]
|
||||
* Allow rearranging items in app picker [Georges; !1284]
|
||||
* Fix top bar navigation when NumLock is active [Olivier; #550]
|
||||
* Delay login animation until wallpaper has loaded [Michael; #734996]
|
||||
* Reset auth prompt on login screen on VT switch before fade in [Ray; #2997]
|
||||
* Move screencasting into a separate service [Jonas Å.; !1372]
|
||||
* Replace loaded terms with more descriptive one [Olivier; !1393]
|
||||
* Add "Boot Options" support to restart dialog [Hans; !199]
|
||||
* Move "Restart" into a separate menu item/dialog [Florian; #2202]
|
||||
* Default to not installing updates on low battery [Michael; #2717]
|
||||
* Misc. bug fixes and cleanups [Florian, Daniel V., Georges, Jonas Å.,
|
||||
Daniel G., Carlos, Benjamin, Piotr, Andre, Jonas D., Andy; !1357, !1356,
|
||||
#2969, #2969, !1358, !1371, #3005, !1380, #3022, !1381, !895, !1387, !1386,
|
||||
!1385, #3037, !1389, !1390, !1391, !1383, !1399, #2983, !1403]
|
||||
|
||||
Contributors:
|
||||
Jonas Ådahl, Benjamin Berg, Michael Catanzaro, Piotr Drąg, Jonas Dreßler,
|
||||
Olivier Fourdan, Carlos Garnacho, Hans de Goede, Andy Holmes,
|
||||
Sebastian Keller, Andre Moreira Magalhaes, Daniel García Moreno,
|
||||
Florian Müllner, Georges Basile Stavracas Neto, Jeremias Ortega, Ray Strode,
|
||||
Emre Uyguroglu, Daniel van Vugt
|
||||
|
||||
Translators:
|
||||
Tim Sabsch [de], Boyuan Yang [zh_CN], Fabio Tomat [fur],
|
||||
Efstathios Iosifidis [el], Rafael Fontenelle [pt_BR], Yuri Chornoivan [uk],
|
||||
Daniel Șerbănescu [ro], Jordi Mas [ca], Daniel Mustieles [es],
|
||||
Emin Tufan Çetin [tr], Asier Sarasua Garmendia [eu]
|
||||
|
||||
3.37.3
|
||||
======
|
||||
* Refactor and clean up window picker
|
||||
[Jonas D., Florian; !1297, !1298, !1305, !1345, !1353]
|
||||
* Move calendar events out of notifications list [Florian; !1282]
|
||||
* Refine app folder dialogs [Georges; !1301]
|
||||
* Hide switch-user button on lock screen if unsupported [Chingkai; #2687]
|
||||
* Refactor and clean up app picker pagination [Georges; !1271]
|
||||
* Add API to retrieve specified mimetypes from clipboards [Carlos; !1321]
|
||||
* Support prepending workspace with horizontal layouts [Florian; #2916]
|
||||
* Update microphone icon on input volume changes [fludixx; #2902]
|
||||
* Cache labels on GPU [Daniel; !1329]
|
||||
* Fix regressions in redesigned modal dialogs [Florian, Jonas D.; #2491, !1336]
|
||||
* Use GIcon for all application icons [Florian; !1342]
|
||||
* Support pre-authenticated logins in vmware environments [yun341; #1983]
|
||||
* Better support sandboxed apps with multiple .desktop files [Florian; #219]
|
||||
* Fix on-screen keyboard size in portrait orientation [Florian; #2349]
|
||||
* Plugged leaks [Sebastian, Daniel, Florian; !1306, !1319, !1341]
|
||||
* Misc. bug fixes and cleanups [Jonas D., Georges, Marco, Florian, Sebastian,
|
||||
MOZGIII, Daniel, Mariana, Jonas Å.; !1296, !1295, #2643, !1300, !1309,
|
||||
!1119, #2901, !1313, !1251, !1285, !1307, !1318, !1310, !1320, !1327, !1315,
|
||||
!1289, !1331, !1332, !1333, !1334, !1340, !1287, !1308, !1346, !1299, !1343,
|
||||
!1351, !1352, !1322]
|
||||
|
||||
Contributors:
|
||||
Marco Trevisan (Treviño), Chingkai, Jonas Dreßler, Carlos Garnacho,
|
||||
Sebastian Keller, MOZGIII, Florian Müllner, Georges Basile Stavracas Neto,
|
||||
Mariana Picolo, Daniel van Vugt, fludixx, yun341, Jonas Ådahl
|
||||
|
||||
Translators:
|
||||
Daniel Mustieles [es], Boyuan Yang [zh_CN], Yuri Chornoivan [uk],
|
||||
Jordi Mas [ca], sicklylife [ja], Emin Tufan Çetin [tr],
|
||||
Baurzhan Muftakhidinov [kk], Florentina Mușat [ro], Aurimas Černius [lt],
|
||||
Rūdolfs Mazurs [lv]
|
||||
|
||||
3.37.2
|
||||
======
|
||||
* Add support for "PrefersNonDefaultGPU" desktop key [Bastien; !1226]
|
||||
|
@@ -20,12 +20,6 @@
|
||||
<method name="ListSessions">
|
||||
<arg name="sessions" type="a(susso)" direction="out"/>
|
||||
</method>
|
||||
<method name="CanRebootToBootLoaderMenu">
|
||||
<arg type="s" direction="out"/>
|
||||
</method>
|
||||
<method name="SetRebootToBootLoaderMenu">
|
||||
<arg type="t" direction="in"/>
|
||||
</method>
|
||||
<signal name="PrepareForSleep">
|
||||
<arg type="b" direction="out"/>
|
||||
</signal>
|
||||
|
@@ -1,191 +0,0 @@
|
||||
<!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,14 +70,6 @@
|
||||
-->
|
||||
<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,7 +28,6 @@
|
||||
<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/scalable/actions/color-pick.svg">color-pick.svg</file>
|
||||
<file alias="icons/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/scalable/status/message-indicator-symbolic.svg">message-indicator-symbolic.svg</file>
|
||||
<file alias="icons/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/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 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>process-working.svg</file>
|
||||
<file>toggle-off.svg</file>
|
||||
<file>toggle-off-dark.svg</file>
|
||||
|
@@ -1,7 +1,7 @@
|
||||
[Unit]
|
||||
Description=GNOME Shell on Wayland
|
||||
# On wayland, force a session shutdown
|
||||
OnFailure=org.gnome.Shell-disable-extensions.service gnome-session-shutdown.target
|
||||
OnFailure=gnome-shell-disable-extensions.service gnome-session-shutdown.target
|
||||
OnFailureJobMode=replace-irreversibly
|
||||
CollectMode=inactive-or-failed
|
||||
RefuseManualStart=on
|
||||
@@ -13,21 +13,18 @@ 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
|
@@ -6,5 +6,5 @@ Requisite=gnome-session-initialized.target
|
||||
PartOf=gnome-session-initialized.target
|
||||
Before=gnome-session-initialized.target
|
||||
|
||||
Wants=org.gnome.Shell@wayland.service
|
||||
Wants=org.gnome.Shell@x11.service
|
||||
Requires=gnome-shell-wayland.service
|
||||
After=gnome-shell-wayland.service
|
@@ -1,7 +1,7 @@
|
||||
[Unit]
|
||||
Description=GNOME Shell on X11
|
||||
# On X11, try to show the GNOME Session Failed screen
|
||||
OnFailure=org.gnome.Shell-disable-extensions.service gnome-session-failed.target
|
||||
OnFailure=gnome-shell-disable-extensions.service gnome-session-failed.target
|
||||
OnFailureJobMode=replace
|
||||
CollectMode=inactive-or-failed
|
||||
RefuseManualStart=on
|
||||
@@ -13,24 +13,18 @@ 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
|
10
data/gnome-shell-x11.target
Normal file
10
data/gnome-shell-x11.target
Normal file
@@ -0,0 +1,10 @@
|
||||
[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,21 +101,22 @@ if have_systemd
|
||||
unitconf.set('bindir', bindir)
|
||||
|
||||
configure_file(
|
||||
input: 'org.gnome.Shell@x11.service.in',
|
||||
output: 'org.gnome.Shell@x11.service',
|
||||
input: 'gnome-shell-x11.service.in',
|
||||
output: 'gnome-shell-x11.service',
|
||||
configuration: unitconf,
|
||||
install_dir: systemduserunitdir
|
||||
)
|
||||
|
||||
configure_file(
|
||||
input: 'org.gnome.Shell@wayland.service.in',
|
||||
output: 'org.gnome.Shell@wayland.service',
|
||||
input: 'gnome-shell-wayland.service.in',
|
||||
output: 'gnome-shell-wayland.service',
|
||||
configuration: unitconf,
|
||||
install_dir: systemduserunitdir
|
||||
)
|
||||
|
||||
units = files('org.gnome.Shell.target',
|
||||
'org.gnome.Shell-disable-extensions.service')
|
||||
units = files('gnome-shell-x11.target',
|
||||
'gnome-shell-wayland.target',
|
||||
'gnome-shell-disable-extensions.service')
|
||||
|
||||
install_data(units, install_dir: systemduserunitdir)
|
||||
endif
|
||||
|
@@ -109,17 +109,6 @@
|
||||
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>
|
||||
|
||||
|
@@ -232,9 +232,7 @@
|
||||
color: $fg_color;
|
||||
font-feature-settings: "tnum";
|
||||
@include fontsize($base_font_size);
|
||||
|
||||
&:ltr { text-align: right; }
|
||||
&:rtl { text-align: left; }
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
// timezone offset label
|
||||
|
@@ -138,10 +138,11 @@
|
||||
.user-widget.horizontal .user-widget-label {
|
||||
@include fontsize($base_font_size + 2);
|
||||
font-weight: bold;
|
||||
text-align: left;
|
||||
padding-left: 15px;
|
||||
|
||||
&:ltr { padding-left: 14px; text-align: left; }
|
||||
&:rtl { padding-right: 14px; text-align: right; }
|
||||
&:ltr { padding-left: 14px; }
|
||||
&:rtl { padding-right: 14px; }
|
||||
}
|
||||
|
||||
.user-widget.vertical .user-widget-label {
|
||||
|
@@ -71,11 +71,9 @@
|
||||
> .event-time {
|
||||
color: transparentize($fg_color, 0.5);
|
||||
@include fontsize($base_font_size - 2);
|
||||
text-align: right;
|
||||
/* HACK: the label should be baseline-aligned with a 1em label, fake this with some bottom padding */
|
||||
padding-bottom: 0.13em;
|
||||
|
||||
&:ltr { text-align: right };
|
||||
&:rtl { text-align: left };
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -76,10 +76,8 @@ $popover_arrow_height: 12px;
|
||||
|
||||
// container for radio and check boxes
|
||||
.popup-menu-ornament {
|
||||
text-align: right;
|
||||
width: 1.2em;
|
||||
|
||||
&:ltr { text-align: right };
|
||||
&:rtl { text-align: left };
|
||||
}
|
||||
|
||||
// separator
|
||||
|
@@ -1,7 +1,7 @@
|
||||
/* Window Picker */
|
||||
|
||||
$window_picker_spacing: $base_spacing; // 6px
|
||||
$window_picker_padding: $base_padding * 2; // 12px
|
||||
$window_picker_spacing: $base_spacing * 2; // 16px
|
||||
$window_picker_padding: $base_padding * 2; // 16px
|
||||
|
||||
$window_thumbnail_border_color:transparentize($selected_fg_color, 0.65);
|
||||
|
||||
@@ -13,8 +13,8 @@ $window_clone_border_size: 6px;
|
||||
// Window picker
|
||||
.window-picker {
|
||||
// Space between window thumbnails
|
||||
spacing: $window_picker_spacing;
|
||||
|
||||
-horizontal-spacing: $window_picker_spacing;
|
||||
-vertical-spacing: $window_picker_spacing;
|
||||
// Padding for container around window thumbnails
|
||||
padding: $window_picker_padding;
|
||||
|
||||
|
@@ -3,8 +3,13 @@ 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,8 +25,6 @@ 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,12 +8,6 @@ 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
|
||||
|
@@ -1,11 +0,0 @@
|
||||
<?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>
|
@@ -1,11 +0,0 @@
|
||||
/* exported main */
|
||||
|
||||
const { DBusService } = imports.dbusService;
|
||||
const { ScreencastService } = imports.screencastService;
|
||||
|
||||
function main() {
|
||||
const service = new DBusService(
|
||||
'org.gnome.Shell.Screencast',
|
||||
new ScreencastService());
|
||||
service.run();
|
||||
}
|
@@ -1,458 +0,0 @@
|
||||
// -*- 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]));
|
||||
});
|
||||
}
|
||||
};
|
@@ -71,7 +71,7 @@ var AuthPrompt = GObject.registerClass({
|
||||
this._userVerifier.connect('verification-complete', this._onVerificationComplete.bind(this));
|
||||
this._userVerifier.connect('reset', this._onReset.bind(this));
|
||||
this._userVerifier.connect('smartcard-status-changed', this._onSmartcardStatusChanged.bind(this));
|
||||
this._userVerifier.connect('credential-manager-authenticated', this._onCredentialManagerAuthenticated.bind(this));
|
||||
this._userVerifier.connect('ovirt-user-authenticated', this._onOVirtUserAuthenticated.bind(this));
|
||||
this.smartcardDetected = this._userVerifier.smartcardDetected;
|
||||
|
||||
this.connect('destroy', this._onDestroy.bind(this));
|
||||
@@ -242,7 +242,7 @@ var AuthPrompt = GObject.registerClass({
|
||||
this.emit('prompted');
|
||||
}
|
||||
|
||||
_onCredentialManagerAuthenticated() {
|
||||
_onOVirtUserAuthenticated() {
|
||||
if (this.verificationStatus != AuthPromptStatus.VERIFICATION_SUCCEEDED)
|
||||
this.reset();
|
||||
}
|
||||
|
@@ -1,24 +0,0 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
/* exported CredentialManager */
|
||||
|
||||
class CredentialManager {
|
||||
constructor(service) {
|
||||
this._token = null;
|
||||
this._service = service;
|
||||
this._authenticatedSignalId = null;
|
||||
}
|
||||
|
||||
get token() {
|
||||
return this._token;
|
||||
}
|
||||
|
||||
set token(t) {
|
||||
this._token = t;
|
||||
if (this._token)
|
||||
this.emit('user-authenticated', this._token);
|
||||
}
|
||||
|
||||
get service() {
|
||||
return this._service;
|
||||
}
|
||||
}
|
@@ -810,8 +810,8 @@ var LoginDialog = GObject.registerClass({
|
||||
return;
|
||||
|
||||
this._logoBin.destroy_all_children();
|
||||
const resourceScale = this._logoBin.get_resource_scale();
|
||||
if (this._logoFile) {
|
||||
const [valid, resourceScale] = this._logoBin.get_resource_scale();
|
||||
if (this._logoFile && valid) {
|
||||
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
||||
this._logoBin.add_child(this._textureCache.load_file_async(this._logoFile,
|
||||
-1, -1,
|
||||
@@ -953,15 +953,16 @@ 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: () => this._unbindOpacity(),
|
||||
onComplete: () => {
|
||||
if (this._authPrompt.verificationStatus != AuthPrompt.AuthPromptStatus.NOT_VERIFYING)
|
||||
this._authPrompt.reset();
|
||||
this._unbindOpacity();
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
|
@@ -3,9 +3,6 @@
|
||||
|
||||
const Gio = imports.gi.Gio;
|
||||
const Signals = imports.signals;
|
||||
const Credential = imports.gdm.credentialManager;
|
||||
|
||||
var SERVICE_NAME = 'gdm-ovirtcred';
|
||||
|
||||
const OVirtCredentialsIface = `
|
||||
<node>
|
||||
@@ -31,14 +28,30 @@ function OVirtCredentials() {
|
||||
return self;
|
||||
}
|
||||
|
||||
var OVirtCredentialsManager = class OVirtCredentialsManager extends Credential.CredentialManager {
|
||||
var OVirtCredentialsManager = class {
|
||||
constructor() {
|
||||
super(SERVICE_NAME);
|
||||
this._token = null;
|
||||
|
||||
this._credentials = new OVirtCredentials();
|
||||
this._credentials.connectSignal('UserAuthenticated',
|
||||
(proxy, sender, [token]) => {
|
||||
this.token = token;
|
||||
});
|
||||
this._onUserAuthenticated.bind(this));
|
||||
}
|
||||
|
||||
_onUserAuthenticated(proxy, sender, [token]) {
|
||||
this._token = token;
|
||||
this.emit('user-authenticated', token);
|
||||
}
|
||||
|
||||
hasToken() {
|
||||
return this._token != null;
|
||||
}
|
||||
|
||||
getToken() {
|
||||
return this._token;
|
||||
}
|
||||
|
||||
resetToken() {
|
||||
this._token = null;
|
||||
}
|
||||
};
|
||||
Signals.addSignalMethods(OVirtCredentialsManager.prototype);
|
||||
|
@@ -8,7 +8,6 @@ const Signals = imports.signals;
|
||||
const Batch = imports.gdm.batch;
|
||||
const Fprint = imports.gdm.fingerprint;
|
||||
const OVirt = imports.gdm.oVirt;
|
||||
const Vmware = imports.gdm.vmware;
|
||||
const Main = imports.ui.main;
|
||||
const Params = imports.misc.params;
|
||||
const SmartcardManager = imports.misc.smartcardManager;
|
||||
@@ -25,6 +24,7 @@ Gio._promisify(Gdm.UserVerifierProxy.prototype,
|
||||
var PASSWORD_SERVICE_NAME = 'gdm-password';
|
||||
var FINGERPRINT_SERVICE_NAME = 'gdm-fingerprint';
|
||||
var SMARTCARD_SERVICE_NAME = 'gdm-smartcard';
|
||||
var OVIRT_SERVICE_NAME = 'gdm-ovirtcred';
|
||||
var FADE_ANIMATION_TIME = 160;
|
||||
var CLONE_FADE_ANIMATION_TIME = 250;
|
||||
|
||||
@@ -160,20 +160,13 @@ var ShellUserVerifier = class {
|
||||
|
||||
this._failCounter = 0;
|
||||
|
||||
this._credentialManagers = {};
|
||||
this._credentialManagers[OVirt.SERVICE_NAME] = OVirt.getOVirtCredentialsManager();
|
||||
this._credentialManagers[Vmware.SERVICE_NAME] = Vmware.getVmwareCredentialsManager();
|
||||
this._oVirtCredentialsManager = OVirt.getOVirtCredentialsManager();
|
||||
|
||||
for (let service in this._credentialManagers) {
|
||||
if (this._credentialManagers[service].token) {
|
||||
this._onCredentialManagerAuthenticated(this._credentialManagers[service],
|
||||
this._credentialManagers[service].token);
|
||||
}
|
||||
if (this._oVirtCredentialsManager.hasToken())
|
||||
this._oVirtUserAuthenticated(this._oVirtCredentialsManager.getToken());
|
||||
|
||||
this._credentialManagers[service]._authenticatedSignalId =
|
||||
this._credentialManagers[service].connect('user-authenticated',
|
||||
this._onCredentialManagerAuthenticated.bind(this));
|
||||
}
|
||||
this._oVirtUserAuthenticatedId = this._oVirtCredentialsManager.connect('user-authenticated',
|
||||
this._oVirtUserAuthenticated.bind(this));
|
||||
}
|
||||
|
||||
begin(userName, hold) {
|
||||
@@ -229,11 +222,8 @@ var ShellUserVerifier = class {
|
||||
this._smartcardManager.disconnect(this._smartcardRemovedId);
|
||||
this._smartcardManager = null;
|
||||
|
||||
for (let service in this._credentialManagers) {
|
||||
let credentialManager = this._credentialManagers[service];
|
||||
credentialManager.disconnect(credentialManager._authenticatedSignalId);
|
||||
credentialManager = null;
|
||||
}
|
||||
this._oVirtCredentialsManager.disconnect(this._oVirtUserAuthenticatedId);
|
||||
this._oVirtCredentialsManager = null;
|
||||
}
|
||||
|
||||
answerQuery(serviceName, answer) {
|
||||
@@ -321,9 +311,9 @@ var ShellUserVerifier = class {
|
||||
});
|
||||
}
|
||||
|
||||
_onCredentialManagerAuthenticated(credentialManager, _token) {
|
||||
this._preemptingService = credentialManager.service;
|
||||
this.emit('credential-manager-authenticated');
|
||||
_oVirtUserAuthenticated(_token) {
|
||||
this._preemptingService = OVIRT_SERVICE_NAME;
|
||||
this.emit('ovirt-user-authenticated');
|
||||
}
|
||||
|
||||
_checkForSmartcard() {
|
||||
@@ -500,12 +490,9 @@ var ShellUserVerifier = class {
|
||||
if (!this.serviceIsForeground(serviceName))
|
||||
return;
|
||||
|
||||
let token = null;
|
||||
if (this._credentialManagers[serviceName])
|
||||
token = this._credentialManagers[serviceName].token;
|
||||
|
||||
if (token) {
|
||||
this.answerQuery(serviceName, token);
|
||||
if (serviceName == OVIRT_SERVICE_NAME) {
|
||||
// The only question asked by this service is "Token?"
|
||||
this.answerQuery(serviceName, this._oVirtCredentialsManager.getToken());
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -573,10 +560,8 @@ var ShellUserVerifier = class {
|
||||
// If the login failed with the preauthenticated oVirt credentials
|
||||
// then discard the credentials and revert to default authentication
|
||||
// mechanism.
|
||||
let foregroundService = Object.keys(this._credentialManagers).find(service =>
|
||||
this.serviceIsForeground(service));
|
||||
if (foregroundService) {
|
||||
this._credentialManagers[foregroundService].token = null;
|
||||
if (this.serviceIsForeground(OVIRT_SERVICE_NAME)) {
|
||||
this._oVirtCredentialsManager.resetToken();
|
||||
this._preemptingService = null;
|
||||
this._verificationFailed(false);
|
||||
return;
|
||||
|
@@ -1,54 +0,0 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
/* exported getVmwareCredentialsManager */
|
||||
|
||||
const Gio = imports.gi.Gio;
|
||||
const Signals = imports.signals;
|
||||
const Credential = imports.gdm.credentialManager;
|
||||
|
||||
const dbusPath = '/org/vmware/viewagent/Credentials';
|
||||
const dbusInterface = 'org.vmware.viewagent.Credentials';
|
||||
|
||||
var SERVICE_NAME = 'gdm-vmwcred';
|
||||
|
||||
const VmwareCredentialsIface = '<node> \
|
||||
<interface name="' + dbusInterface + '"> \
|
||||
<signal name="UserAuthenticated"> \
|
||||
<arg type="s" name="token"/> \
|
||||
</signal> \
|
||||
</interface> \
|
||||
</node>';
|
||||
|
||||
|
||||
const VmwareCredentialsInfo = Gio.DBusInterfaceInfo.new_for_xml(VmwareCredentialsIface);
|
||||
|
||||
let _vmwareCredentialsManager = null;
|
||||
|
||||
function VmwareCredentials() {
|
||||
var self = new Gio.DBusProxy({ g_connection: Gio.DBus.session,
|
||||
g_interface_name: VmwareCredentialsInfo.name,
|
||||
g_interface_info: VmwareCredentialsInfo,
|
||||
g_name: dbusInterface,
|
||||
g_object_path: dbusPath,
|
||||
g_flags: Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES });
|
||||
self.init(null);
|
||||
return self;
|
||||
}
|
||||
|
||||
var VmwareCredentialsManager = class VmwareCredentialsManager extends Credential.CredentialManager {
|
||||
constructor() {
|
||||
super(SERVICE_NAME);
|
||||
this._credentials = new VmwareCredentials();
|
||||
this._credentials.connectSignal('UserAuthenticated',
|
||||
(proxy, sender, [token]) => {
|
||||
this.token = token;
|
||||
});
|
||||
}
|
||||
};
|
||||
Signals.addSignalMethods(VmwareCredentialsManager.prototype);
|
||||
|
||||
function getVmwareCredentialsManager() {
|
||||
if (!_vmwareCredentialsManager)
|
||||
_vmwareCredentialsManager = new VmwareCredentialsManager();
|
||||
|
||||
return _vmwareCredentialsManager;
|
||||
}
|
@@ -6,8 +6,6 @@
|
||||
<file>gdm/fingerprint.js</file>
|
||||
<file>gdm/loginDialog.js</file>
|
||||
<file>gdm/oVirt.js</file>
|
||||
<file>gdm/credentialManager.js</file>
|
||||
<file>gdm/vmware.js</file>
|
||||
<file>gdm/realmd.js</file>
|
||||
<file>gdm/util.js</file>
|
||||
|
||||
@@ -92,6 +90,7 @@
|
||||
<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>
|
||||
@@ -136,6 +135,7 @@
|
||||
<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, loadSubInterfaceXML */
|
||||
recursivelyMoveDir, loadInterfaceXML */
|
||||
|
||||
const { Gio, GLib } = imports.gi;
|
||||
const Config = imports.misc.config;
|
||||
@@ -67,19 +67,14 @@ 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) {
|
||||
ensureIfaceResource();
|
||||
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();
|
||||
}
|
||||
|
||||
let uri = `resource:///org/gnome/shell/dbus-interfaces/${iface}.xml`;
|
||||
let f = Gio.File.new_for_uri(uri);
|
||||
@@ -93,25 +88,3 @@ 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);
|
||||
}
|
||||
|
@@ -3,9 +3,9 @@ const { Gio, GLib, Meta, Shell, St } = imports.gi;
|
||||
|
||||
const INTROSPECT_SCHEMA = 'org.gnome.shell';
|
||||
const INTROSPECT_KEY = 'introspect';
|
||||
const APP_ALLOWLIST = ['org.freedesktop.impl.portal.desktop.gtk'];
|
||||
const APP_WHITELIST = ['org.freedesktop.impl.portal.desktop.gtk'];
|
||||
|
||||
const INTROSPECT_DBUS_API_VERSION = 3;
|
||||
const INTROSPECT_DBUS_API_VERSION = 2;
|
||||
|
||||
const { loadInterfaceXML } = imports.misc.fileUtils;
|
||||
|
||||
@@ -46,24 +46,19 @@ var IntrospectService = class {
|
||||
|
||||
this._syncRunningApplications();
|
||||
|
||||
this._allowlistMap = new Map();
|
||||
APP_ALLOWLIST.forEach(appName => {
|
||||
this._whitelistMap = new Map();
|
||||
APP_WHITELIST.forEach(appName => {
|
||||
Gio.DBus.watch_name(Gio.BusType.SESSION,
|
||||
appName,
|
||||
Gio.BusNameWatcherFlags.NONE,
|
||||
(conn, name, owner) => this._allowlistMap.set(name, owner),
|
||||
(conn, name) => this._allowlistMap.delete(name));
|
||||
(conn, name, owner) => this._whitelistMap.set(name, owner),
|
||||
(conn, name) => this._whitelistMap.delete(name));
|
||||
});
|
||||
|
||||
this._settings = St.Settings.get();
|
||||
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) {
|
||||
@@ -74,8 +69,8 @@ var IntrospectService = class {
|
||||
return this._introspectSettings.get_boolean(INTROSPECT_KEY);
|
||||
}
|
||||
|
||||
_isSenderAllowed(sender) {
|
||||
return [...this._allowlistMap.values()].includes(sender);
|
||||
_isSenderWhitelisted(sender) {
|
||||
return [...this._whitelistMap.values()].includes(sender);
|
||||
}
|
||||
|
||||
_getSandboxedAppId(app) {
|
||||
@@ -138,7 +133,7 @@ var IntrospectService = class {
|
||||
if (this._isIntrospectEnabled())
|
||||
return true;
|
||||
|
||||
if (this._isSenderAllowed(invocation.get_sender()))
|
||||
if (this._isSenderWhitelisted(invocation.get_sender()))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
@@ -214,28 +209,10 @@ 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;
|
||||
}
|
||||
|
@@ -158,23 +158,6 @@ var LoginManagerSystemd = class {
|
||||
});
|
||||
}
|
||||
|
||||
canRebootToBootLoaderMenu(asyncCallback) {
|
||||
this._proxy.CanRebootToBootLoaderMenuRemote((result, error) => {
|
||||
if (error) {
|
||||
asyncCallback(false, false);
|
||||
} else {
|
||||
const needsAuth = result[0] === 'challenge';
|
||||
const canRebootToBootLoaderMenu = needsAuth || result[0] === 'yes';
|
||||
asyncCallback(canRebootToBootLoaderMenu, needsAuth);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
setRebootToBootLoaderMenu() {
|
||||
/* Parameter is timeout in usec, show to menu for 60 seconds */
|
||||
this._proxy.SetRebootToBootLoaderMenuRemote(60000000);
|
||||
}
|
||||
|
||||
listSessions(asyncCallback) {
|
||||
this._proxy.ListSessionsRemote((result, error) => {
|
||||
if (error)
|
||||
@@ -220,13 +203,6 @@ var LoginManagerDummy = class {
|
||||
asyncCallback(false, false);
|
||||
}
|
||||
|
||||
canRebootToBootLoaderMenu(asyncCallback) {
|
||||
asyncCallback(false, false);
|
||||
}
|
||||
|
||||
setRebootToBootLoaderMenu() {
|
||||
}
|
||||
|
||||
listSessions(asyncCallback) {
|
||||
asyncCallback([]);
|
||||
}
|
||||
|
@@ -121,10 +121,10 @@ var ParentalControlsManager = GObject.registerClass({
|
||||
// Calculate whether the given app (a Gio.DesktopAppInfo) should be shown
|
||||
// on the desktop, in search results, etc. The app should be shown if:
|
||||
// - The .desktop file doesn’t say it should be hidden.
|
||||
// - The executable from the .desktop file’s Exec line isn’t denied in
|
||||
// - The executable from the .desktop file’s Exec line isn’t blacklisted in
|
||||
// the user’s parental controls.
|
||||
// - None of the flatpak app IDs from the X-Flatpak and the
|
||||
// X-Flatpak-RenamedFrom lines are denied in the user’s parental
|
||||
// X-Flatpak-RenamedFrom lines are blacklisted in the user’s parental
|
||||
// controls.
|
||||
shouldShowApp(appInfo) {
|
||||
// Quick decision?
|
||||
|
@@ -21,7 +21,6 @@ const SENSOR_OBJECT_PATH = '/net/hadess/SensorProxy';
|
||||
const SensorProxyInterface = loadInterfaceXML('net.hadess.SensorProxy');
|
||||
|
||||
const POWER_OFF_ACTION_ID = 'power-off';
|
||||
const RESTART_ACTION_ID = 'restart';
|
||||
const LOCK_SCREEN_ACTION_ID = 'lock-screen';
|
||||
const LOGOUT_ACTION_ID = 'logout';
|
||||
const SUSPEND_ACTION_ID = 'suspend';
|
||||
@@ -41,38 +40,41 @@ function getDefault() {
|
||||
|
||||
const SystemActions = GObject.registerClass({
|
||||
Properties: {
|
||||
'can-power-off': GObject.ParamSpec.boolean(
|
||||
'can-power-off', 'can-power-off', 'can-power-off',
|
||||
GObject.ParamFlags.READABLE,
|
||||
false),
|
||||
'can-restart': GObject.ParamSpec.boolean(
|
||||
'can-restart', 'can-restart', 'can-restart',
|
||||
GObject.ParamFlags.READABLE,
|
||||
false),
|
||||
'can-suspend': GObject.ParamSpec.boolean(
|
||||
'can-suspend', 'can-suspend', 'can-suspend',
|
||||
GObject.ParamFlags.READABLE,
|
||||
false),
|
||||
'can-lock-screen': GObject.ParamSpec.boolean(
|
||||
'can-lock-screen', 'can-lock-screen', 'can-lock-screen',
|
||||
GObject.ParamFlags.READABLE,
|
||||
false),
|
||||
'can-switch-user': GObject.ParamSpec.boolean(
|
||||
'can-switch-user', 'can-switch-user', 'can-switch-user',
|
||||
GObject.ParamFlags.READABLE,
|
||||
false),
|
||||
'can-logout': GObject.ParamSpec.boolean(
|
||||
'can-logout', 'can-logout', 'can-logout',
|
||||
GObject.ParamFlags.READABLE,
|
||||
false),
|
||||
'can-lock-orientation': GObject.ParamSpec.boolean(
|
||||
'can-lock-orientation', 'can-lock-orientation', 'can-lock-orientation',
|
||||
GObject.ParamFlags.READABLE,
|
||||
false),
|
||||
'orientation-lock-icon': GObject.ParamSpec.string(
|
||||
'orientation-lock-icon', 'orientation-lock-icon', 'orientation-lock-icon',
|
||||
GObject.ParamFlags.READWRITE,
|
||||
null),
|
||||
'can-power-off': GObject.ParamSpec.boolean('can-power-off',
|
||||
'can-power-off',
|
||||
'can-power-off',
|
||||
GObject.ParamFlags.READABLE,
|
||||
false),
|
||||
'can-suspend': GObject.ParamSpec.boolean('can-suspend',
|
||||
'can-suspend',
|
||||
'can-suspend',
|
||||
GObject.ParamFlags.READABLE,
|
||||
false),
|
||||
'can-lock-screen': GObject.ParamSpec.boolean('can-lock-screen',
|
||||
'can-lock-screen',
|
||||
'can-lock-screen',
|
||||
GObject.ParamFlags.READABLE,
|
||||
false),
|
||||
'can-switch-user': GObject.ParamSpec.boolean('can-switch-user',
|
||||
'can-switch-user',
|
||||
'can-switch-user',
|
||||
GObject.ParamFlags.READABLE,
|
||||
false),
|
||||
'can-logout': GObject.ParamSpec.boolean('can-logout',
|
||||
'can-logout',
|
||||
'can-logout',
|
||||
GObject.ParamFlags.READABLE,
|
||||
false),
|
||||
'can-lock-orientation': GObject.ParamSpec.boolean('can-lock-orientation',
|
||||
'can-lock-orientation',
|
||||
'can-lock-orientation',
|
||||
GObject.ParamFlags.READABLE,
|
||||
false),
|
||||
'orientation-lock-icon': GObject.ParamSpec.string('orientation-lock-icon',
|
||||
'orientation-lock-icon',
|
||||
'orientation-lock-icon',
|
||||
GObject.ParamFlags.READWRITE,
|
||||
null),
|
||||
},
|
||||
}, class SystemActions extends GObject.Object {
|
||||
_init() {
|
||||
@@ -91,15 +93,7 @@ const SystemActions = GObject.registerClass({
|
||||
name: C_("search-result", "Power Off"),
|
||||
iconName: 'system-shutdown-symbolic',
|
||||
// Translators: A list of keywords that match the power-off action, separated by semicolons
|
||||
keywords: tokenizeKeywords(_('power off;shutdown;halt;stop')),
|
||||
available: false,
|
||||
});
|
||||
this._actions.set(RESTART_ACTION_ID, {
|
||||
// Translators: The name of the restart action in search
|
||||
name: C_('search-result', 'Restart'),
|
||||
iconName: 'system-reboot-symbolic',
|
||||
// Translators: A list of keywords that match the restart action, separated by semicolons
|
||||
keywords: tokenizeKeywords(_('reboot;restart;')),
|
||||
keywords: tokenizeKeywords(_('power off;shutdown;reboot;restart;halt;stop')),
|
||||
available: false,
|
||||
});
|
||||
this._actions.set(LOCK_SCREEN_ACTION_ID, {
|
||||
@@ -209,11 +203,6 @@ const SystemActions = GObject.registerClass({
|
||||
return this._actions.get(POWER_OFF_ACTION_ID).available;
|
||||
}
|
||||
|
||||
// eslint-disable-next-line camelcase
|
||||
get can_restart() {
|
||||
return this._actions.get(RESTART_ACTION_ID).available;
|
||||
}
|
||||
|
||||
// eslint-disable-next-line camelcase
|
||||
get can_suspend() {
|
||||
return this._actions.get(SUSPEND_ACTION_ID).available;
|
||||
@@ -317,9 +306,6 @@ const SystemActions = GObject.registerClass({
|
||||
case POWER_OFF_ACTION_ID:
|
||||
this.activatePowerOff();
|
||||
break;
|
||||
case RESTART_ACTION_ID:
|
||||
this.activateRestart();
|
||||
break;
|
||||
case LOCK_SCREEN_ACTION_ID:
|
||||
this.activateLockScreen();
|
||||
break;
|
||||
@@ -361,9 +347,6 @@ const SystemActions = GObject.registerClass({
|
||||
this._loginScreenSettings.get_boolean(DISABLE_RESTART_KEY));
|
||||
this._actions.get(POWER_OFF_ACTION_ID).available = this._canHavePowerOff && !disabled;
|
||||
this.notify('can-power-off');
|
||||
|
||||
this._actions.get(RESTART_ACTION_ID).available = this._canHavePowerOff && !disabled;
|
||||
this.notify('can-restart');
|
||||
}
|
||||
|
||||
_updateHaveSuspend() {
|
||||
@@ -462,13 +445,6 @@ const SystemActions = GObject.registerClass({
|
||||
this._session.ShutdownRemote(0);
|
||||
}
|
||||
|
||||
activateRestart() {
|
||||
if (!this._actions.get(RESTART_ACTION_ID).available)
|
||||
throw new Error('The restart action is not available!');
|
||||
|
||||
this._session.RebootRemote();
|
||||
}
|
||||
|
||||
activateSuspend() {
|
||||
if (!this._actions.get(SUSPEND_ACTION_ID).available)
|
||||
throw new Error('The suspend action is not available!');
|
||||
|
@@ -852,9 +852,6 @@ class AppSwitcher extends SwitcherPopup.SwitcherList {
|
||||
if (index === -1)
|
||||
return;
|
||||
|
||||
this._arrows[index].destroy();
|
||||
this._arrows.splice(index, 1);
|
||||
|
||||
this.icons.splice(index, 1);
|
||||
this.removeItem(index);
|
||||
}
|
||||
|
@@ -60,7 +60,7 @@ class Animation extends St.Bin {
|
||||
}
|
||||
|
||||
_loadFile(file, width, height) {
|
||||
const resourceScale = this.get_resource_scale();
|
||||
let [validResourceScale, resourceScale] = this.get_resource_scale();
|
||||
let wasPlaying = this._isPlaying;
|
||||
|
||||
if (this._isPlaying)
|
||||
@@ -69,6 +69,12 @@ class Animation extends St.Bin {
|
||||
this._isLoaded = false;
|
||||
this.destroy_all_children();
|
||||
|
||||
if (!validResourceScale) {
|
||||
if (wasPlaying)
|
||||
this.play();
|
||||
return;
|
||||
}
|
||||
|
||||
let textureCache = St.TextureCache.get_default();
|
||||
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
||||
this._animations = textureCache.load_sliced_image(file, width, height,
|
||||
|
1327
js/ui/appDisplay.js
1327
js/ui/appDisplay.js
File diff suppressed because it is too large
Load Diff
@@ -347,8 +347,6 @@ var Background = GObject.registerClass({
|
||||
this.set_color(color);
|
||||
else
|
||||
this.set_gradient(shadingType, color, secondColor);
|
||||
|
||||
this._setLoaded();
|
||||
}
|
||||
|
||||
_watchFile(file) {
|
||||
@@ -714,18 +712,13 @@ var BackgroundManager = class BackgroundManager {
|
||||
}
|
||||
|
||||
let newBackgroundActor = this._createBackgroundActor();
|
||||
|
||||
const oldContent = this.backgroundActor.content;
|
||||
const newContent = newBackgroundActor.content;
|
||||
|
||||
newContent.vignette_sharpness = oldContent.vignette_sharpness;
|
||||
newContent.brightness = oldContent.brightness;
|
||||
|
||||
newBackgroundActor.vignette_sharpness = this.backgroundActor.vignette_sharpness;
|
||||
newBackgroundActor.brightness = this.backgroundActor.brightness;
|
||||
newBackgroundActor.visible = this.backgroundActor.visible;
|
||||
|
||||
this._newBackgroundActor = newBackgroundActor;
|
||||
|
||||
const { background } = newBackgroundActor.content;
|
||||
let background = newBackgroundActor.background;
|
||||
|
||||
if (background.isLoaded) {
|
||||
this._swapBackgroundActor();
|
||||
@@ -767,27 +760,10 @@ 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, St } = imports.gi;
|
||||
const { Clutter, GObject, Shell, St } = imports.gi;
|
||||
|
||||
const Main = imports.ui.main;
|
||||
|
||||
@@ -453,16 +453,15 @@ var BoxPointer = GObject.registerClass({
|
||||
let alignment = this._arrowAlignment;
|
||||
let monitorIndex = Main.layoutManager.findIndexForActor(sourceActor);
|
||||
|
||||
this._sourceExtents = sourceActor.get_transformed_extents();
|
||||
this._sourceAllocation = Shell.util_get_transformed_allocation(sourceActor);
|
||||
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 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 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 [, , natWidth, natHeight] = this.get_preferred_size();
|
||||
|
||||
// We also want to keep it onscreen, and separated from the
|
||||
@@ -482,16 +481,16 @@ var BoxPointer = GObject.registerClass({
|
||||
|
||||
switch (this._arrowSide) {
|
||||
case St.Side.TOP:
|
||||
resY = sourceBottomRight.y + gap;
|
||||
resY = sourceAllocation.y2 + gap;
|
||||
break;
|
||||
case St.Side.BOTTOM:
|
||||
resY = sourceTopLeft.y - natHeight - gap;
|
||||
resY = sourceAllocation.y1 - natHeight - gap;
|
||||
break;
|
||||
case St.Side.LEFT:
|
||||
resX = sourceBottomRight.x + gap;
|
||||
resX = sourceAllocation.x2 + gap;
|
||||
break;
|
||||
case St.Side.RIGHT:
|
||||
resX = sourceTopLeft.x - natWidth - gap;
|
||||
resX = sourceAllocation.x1 - natWidth - gap;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -587,30 +586,29 @@ var BoxPointer = GObject.registerClass({
|
||||
}
|
||||
|
||||
_calculateArrowSide(arrowSide) {
|
||||
let sourceTopLeft = this._sourceExtents.get_top_left();
|
||||
let sourceBottomRight = this._sourceExtents.get_bottom_right();
|
||||
let sourceAllocation = this._sourceAllocation;
|
||||
let [, , boxWidth, boxHeight] = this.get_preferred_size();
|
||||
let workarea = this._workArea;
|
||||
|
||||
switch (arrowSide) {
|
||||
case St.Side.TOP:
|
||||
if (sourceBottomRight.y + boxHeight > workarea.y + workarea.height &&
|
||||
boxHeight < sourceTopLeft.y - workarea.y)
|
||||
if (sourceAllocation.y2 + boxHeight > workarea.y + workarea.height &&
|
||||
boxHeight < sourceAllocation.y1 - workarea.y)
|
||||
return St.Side.BOTTOM;
|
||||
break;
|
||||
case St.Side.BOTTOM:
|
||||
if (sourceTopLeft.y - boxHeight < workarea.y &&
|
||||
boxHeight < workarea.y + workarea.height - sourceBottomRight.y)
|
||||
if (sourceAllocation.y1 - boxHeight < workarea.y &&
|
||||
boxHeight < workarea.y + workarea.height - sourceAllocation.y2)
|
||||
return St.Side.TOP;
|
||||
break;
|
||||
case St.Side.LEFT:
|
||||
if (sourceBottomRight.x + boxWidth > workarea.x + workarea.width &&
|
||||
boxWidth < sourceTopLeft.x - workarea.x)
|
||||
if (sourceAllocation.x2 + boxWidth > workarea.x + workarea.width &&
|
||||
boxWidth < sourceAllocation.x1 - workarea.x)
|
||||
return St.Side.RIGHT;
|
||||
break;
|
||||
case St.Side.RIGHT:
|
||||
if (sourceTopLeft.x - boxWidth < workarea.x &&
|
||||
boxWidth < workarea.x + workarea.width - sourceBottomRight.x)
|
||||
if (sourceAllocation.x1 - boxWidth < workarea.x &&
|
||||
boxWidth < workarea.x + workarea.width - sourceAllocation.x2)
|
||||
return St.Side.LEFT;
|
||||
break;
|
||||
}
|
||||
|
@@ -784,7 +784,6 @@ class DateMenuButton extends PanelMenu.Button {
|
||||
|
||||
this._clockDisplay = new St.Label({ style_class: 'clock' });
|
||||
this._clockDisplay.clutter_text.y_align = Clutter.ActorAlign.CENTER;
|
||||
this._clockDisplay.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
||||
|
||||
this._indicator = new MessagesIndicator();
|
||||
|
||||
|
@@ -1,7 +1,7 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
/* exported Dialog, MessageDialogContent, ListSection, ListSectionItem */
|
||||
|
||||
const { Clutter, GLib, GObject, Meta, Pango, St } = imports.gi;
|
||||
const { Clutter, GObject, Meta, Pango, St } = imports.gi;
|
||||
|
||||
function _setLabel(label, value) {
|
||||
label.set({
|
||||
@@ -221,16 +221,13 @@ var MessageDialogContent = GObject.registerClass({
|
||||
this._updateTitleStyleLater = Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => {
|
||||
this._updateTitleStyleLater = 0;
|
||||
this._title.add_style_class_name('leightweight');
|
||||
return GLib.SOURCE_REMOVE;
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
set title(title) {
|
||||
if (this._title.text === title)
|
||||
return;
|
||||
|
||||
_setLabel(this._title, title);
|
||||
|
||||
this._title.remove_style_class_name('leightweight');
|
||||
@@ -240,9 +237,6 @@ var MessageDialogContent = GObject.registerClass({
|
||||
}
|
||||
|
||||
set description(description) {
|
||||
if (this._description.text === description)
|
||||
return;
|
||||
|
||||
_setLabel(this._description, description);
|
||||
this.notify('description');
|
||||
}
|
||||
|
11
js/ui/dnd.js
11
js/ui/dnd.js
@@ -388,16 +388,17 @@ var _Draggable = class _Draggable {
|
||||
const [, newAllocatedWidth] = this._dragActor.get_preferred_width(-1);
|
||||
const [, newAllocatedHeight] = this._dragActor.get_preferred_height(-1);
|
||||
|
||||
const transformedExtents = this._dragActor.get_transformed_extents();
|
||||
const transformedAllocation =
|
||||
Shell.util_get_transformed_allocation(this._dragActor);
|
||||
|
||||
// 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(
|
||||
transformedExtents.get_width() / newAllocatedWidth,
|
||||
transformedExtents.get_height() / newAllocatedHeight);
|
||||
transformedAllocation.get_width() / newAllocatedWidth,
|
||||
transformedAllocation.get_height() / newAllocatedHeight);
|
||||
|
||||
this._dragOffsetX = transformedExtents.origin.x - this._dragStartX;
|
||||
this._dragOffsetY = transformedExtents.origin.y - this._dragStartY;
|
||||
this._dragOffsetX = transformedAllocation.x1 - this._dragStartX;
|
||||
this._dragOffsetY = transformedAllocation.y1 - this._dragStartY;
|
||||
|
||||
this._dragOrigParent.remove_actor(this._dragActor);
|
||||
Main.uiGroup.add_child(this._dragActor);
|
||||
|
@@ -18,7 +18,7 @@
|
||||
*/
|
||||
|
||||
const { AccountsService, Clutter, Gio,
|
||||
GLib, GObject, Pango, Polkit, Shell, St, UPowerGlib: UPower } = imports.gi;
|
||||
GLib, GObject, Pango, Polkit, Shell, St } = imports.gi;
|
||||
|
||||
const CheckBox = imports.ui.checkBox;
|
||||
const Dialog = imports.ui.dialog;
|
||||
@@ -31,30 +31,24 @@ const { loadInterfaceXML } = imports.misc.fileUtils;
|
||||
|
||||
const _ITEM_ICON_SIZE = 64;
|
||||
|
||||
const LOW_BATTERY_THRESHOLD = 30;
|
||||
|
||||
const EndSessionDialogIface = loadInterfaceXML('org.gnome.SessionManager.EndSessionDialog');
|
||||
|
||||
const logoutDialogContent = {
|
||||
subjectWithUser: C_("title", "Log Out %s"),
|
||||
subject: C_("title", "Log Out"),
|
||||
descriptionWithUser(user, seconds) {
|
||||
return ngettext(
|
||||
'%s will be logged out automatically in %d second.',
|
||||
'%s will be logged out automatically in %d seconds.',
|
||||
seconds).format(user, seconds);
|
||||
return ngettext("%s will be logged out automatically in %d second.",
|
||||
"%s will be logged out automatically in %d seconds.",
|
||||
seconds).format(user, seconds);
|
||||
},
|
||||
description(seconds) {
|
||||
return ngettext(
|
||||
'You will be logged out automatically in %d second.',
|
||||
'You will be logged out automatically in %d seconds.',
|
||||
seconds).format(seconds);
|
||||
return ngettext("You will be logged out automatically in %d second.",
|
||||
"You will be logged out automatically in %d seconds.",
|
||||
seconds).format(seconds);
|
||||
},
|
||||
showBatteryWarning: false,
|
||||
confirmButtons: [{
|
||||
signal: 'ConfirmedLogout',
|
||||
label: C_('button', 'Log Out'),
|
||||
}],
|
||||
confirmButtons: [{ signal: 'ConfirmedLogout',
|
||||
label: C_("button", "Log Out") }],
|
||||
showOtherSessions: false,
|
||||
};
|
||||
|
||||
@@ -62,36 +56,30 @@ const shutdownDialogContent = {
|
||||
subject: C_("title", "Power Off"),
|
||||
subjectWithUpdates: C_("title", "Install Updates & Power Off"),
|
||||
description(seconds) {
|
||||
return ngettext(
|
||||
'The system will power off automatically in %d second.',
|
||||
'The system will power off automatically in %d seconds.',
|
||||
seconds).format(seconds);
|
||||
return ngettext("The system will power off automatically in %d second.",
|
||||
"The system will power off automatically in %d seconds.",
|
||||
seconds).format(seconds);
|
||||
},
|
||||
checkBoxText: C_("checkbox", "Install pending software updates"),
|
||||
showBatteryWarning: true,
|
||||
confirmButtons: [{
|
||||
signal: 'ConfirmedShutdown',
|
||||
label: C_('button', 'Power Off'),
|
||||
}],
|
||||
confirmButtons: [{ signal: 'ConfirmedReboot',
|
||||
label: C_("button", "Restart") },
|
||||
{ signal: 'ConfirmedShutdown',
|
||||
label: C_("button", "Power Off") }],
|
||||
iconName: 'system-shutdown-symbolic',
|
||||
showOtherSessions: true,
|
||||
};
|
||||
|
||||
const restartDialogContent = {
|
||||
subject: C_("title", "Restart"),
|
||||
subjectWithUpdates: C_('title', 'Install Updates & Restart'),
|
||||
description(seconds) {
|
||||
return ngettext(
|
||||
'The system will restart automatically in %d second.',
|
||||
'The system will restart automatically in %d seconds.',
|
||||
seconds).format(seconds);
|
||||
return ngettext("The system will restart automatically in %d second.",
|
||||
"The system will restart automatically in %d seconds.",
|
||||
seconds).format(seconds);
|
||||
},
|
||||
checkBoxText: C_('checkbox', 'Install pending software updates'),
|
||||
showBatteryWarning: true,
|
||||
confirmButtons: [{
|
||||
signal: 'ConfirmedReboot',
|
||||
label: C_('button', 'Restart'),
|
||||
}],
|
||||
showBatteryWarning: false,
|
||||
confirmButtons: [{ signal: 'ConfirmedReboot',
|
||||
label: C_("button", "Restart") }],
|
||||
iconName: 'view-refresh-symbolic',
|
||||
showOtherSessions: true,
|
||||
};
|
||||
@@ -100,16 +88,13 @@ const restartUpdateDialogContent = {
|
||||
|
||||
subject: C_("title", "Restart & Install Updates"),
|
||||
description(seconds) {
|
||||
return ngettext(
|
||||
'The system will automatically restart and install updates in %d second.',
|
||||
'The system will automatically restart and install updates in %d seconds.',
|
||||
seconds).format(seconds);
|
||||
return ngettext("The system will automatically restart and install updates in %d second.",
|
||||
"The system will automatically restart and install updates in %d seconds.",
|
||||
seconds).format(seconds);
|
||||
},
|
||||
showBatteryWarning: true,
|
||||
confirmButtons: [{
|
||||
signal: 'ConfirmedReboot',
|
||||
label: C_('button', 'Restart & Install'),
|
||||
}],
|
||||
confirmButtons: [{ signal: 'ConfirmedReboot',
|
||||
label: C_("button", "Restart & Install") }],
|
||||
unusedFutureButtonForTranslation: C_("button", "Install & Power Off"),
|
||||
unusedFutureCheckBoxForTranslation: C_("checkbox", "Power off after updates are installed"),
|
||||
iconName: 'view-refresh-symbolic',
|
||||
@@ -127,10 +112,8 @@ const restartUpgradeDialogContent = {
|
||||
},
|
||||
disableTimer: true,
|
||||
showBatteryWarning: false,
|
||||
confirmButtons: [{
|
||||
signal: 'ConfirmedReboot',
|
||||
label: C_('button', 'Restart & Install'),
|
||||
}],
|
||||
confirmButtons: [{ signal: 'ConfirmedReboot',
|
||||
label: C_("button", "Restart & Install") }],
|
||||
iconName: 'view-refresh-symbolic',
|
||||
showOtherSessions: true,
|
||||
};
|
||||
@@ -159,7 +142,7 @@ const LogindSession = Gio.DBusProxy.makeProxyWrapper(LogindSessionIface);
|
||||
const PkOfflineIface = loadInterfaceXML('org.freedesktop.PackageKit.Offline');
|
||||
const PkOfflineProxy = Gio.DBusProxy.makeProxyWrapper(PkOfflineIface);
|
||||
|
||||
const UPowerIface = loadInterfaceXML('org.freedesktop.UPower.Device');
|
||||
const UPowerIface = loadInterfaceXML('org.freedesktop.UPower');
|
||||
const UPowerProxy = Gio.DBusProxy.makeProxyWrapper(UPowerIface);
|
||||
|
||||
function findAppFromInhibitor(inhibitor) {
|
||||
@@ -230,11 +213,6 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
|
||||
destroyOnClose: false });
|
||||
|
||||
this._loginManager = LoginManager.getLoginManager();
|
||||
this._loginManager.canRebootToBootLoaderMenu(
|
||||
(canRebootToBootLoaderMenu, unusedNeedsAuth) => {
|
||||
this._canRebootToBootLoaderMenu = canRebootToBootLoaderMenu;
|
||||
});
|
||||
|
||||
this._userManager = AccountsService.UserManager.get_default();
|
||||
this._user = this._userManager.get_user(GLib.get_user_name());
|
||||
this._updatesPermission = null;
|
||||
@@ -246,7 +224,7 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
|
||||
|
||||
this._powerProxy = new UPowerProxy(Gio.DBus.system,
|
||||
'org.freedesktop.UPower',
|
||||
'/org/freedesktop/UPower/devices/DisplayDevice',
|
||||
'/org/freedesktop/UPower',
|
||||
(proxy, error) => {
|
||||
if (error) {
|
||||
log(error.message);
|
||||
@@ -261,9 +239,6 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
|
||||
this._totalSecondsToStayOpen = 0;
|
||||
this._applications = [];
|
||||
this._sessions = [];
|
||||
this._capturedEventId = 0;
|
||||
this._rebootButton = null;
|
||||
this._rebootButtonAlt = null;
|
||||
|
||||
this.connect('destroy',
|
||||
this._onDestroy.bind(this));
|
||||
@@ -281,7 +256,7 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
|
||||
|
||||
this._batteryWarning = new St.Label({
|
||||
style_class: 'end-session-dialog-battery-warning',
|
||||
text: _('Low battery power: please plug in before installing updates.'),
|
||||
text: _('Running on battery power: Please plug in before installing updates.'),
|
||||
});
|
||||
this._batteryWarning.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
||||
this._batteryWarning.clutter_text.line_wrap = true;
|
||||
@@ -331,32 +306,6 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
|
||||
this._user.disconnect(this._userChangedId);
|
||||
}
|
||||
|
||||
_isDischargingBattery() {
|
||||
return this._powerProxy.IsPresent &&
|
||||
this._powerProxy.State !== UPower.DeviceState.CHARGING &&
|
||||
this._powerProxy.State !== UPower.DeviceState.FULLY_CHARGED;
|
||||
}
|
||||
|
||||
_isBatteryLow() {
|
||||
return this._isDischargingBattery() && this._powerProxy.Percentage < LOW_BATTERY_THRESHOLD;
|
||||
}
|
||||
|
||||
_shouldShowLowBatteryWarning(dialogContent) {
|
||||
if (!dialogContent.showBatteryWarning)
|
||||
return false;
|
||||
|
||||
if (!this._isBatteryLow())
|
||||
return false;
|
||||
|
||||
if (this._checkBox.checked)
|
||||
return true;
|
||||
|
||||
// Show the warning if updates have already been triggered, but
|
||||
// the user doesn't have enough permissions to cancel them.
|
||||
let updatesAllowed = this._updatesPermission && this._updatesPermission.allowed;
|
||||
return this._updateInfo.UpdatePrepared && this._updateInfo.UpdateTriggered && !updatesAllowed;
|
||||
}
|
||||
|
||||
_sync() {
|
||||
let open = this.state == ModalDialog.State.OPENING || this.state == ModalDialog.State.OPENED;
|
||||
if (!open)
|
||||
@@ -370,7 +319,10 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
|
||||
if (dialogContent.subjectWithUpdates && this._checkBox.checked)
|
||||
subject = dialogContent.subjectWithUpdates;
|
||||
|
||||
this._batteryWarning.visible = this._shouldShowLowBatteryWarning(dialogContent);
|
||||
if (dialogContent.showBatteryWarning) {
|
||||
this._batteryWarning.visible =
|
||||
this._powerProxy.OnBattery && this._checkBox.checked;
|
||||
}
|
||||
|
||||
let description;
|
||||
let displayTime = _roundSecondsToInterval(this._totalSecondsToStayOpen,
|
||||
@@ -411,38 +363,16 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
|
||||
this._sessionSection.visible = hasSessions;
|
||||
}
|
||||
|
||||
_onCapturedEvent(actor, event) {
|
||||
let altEnabled = false;
|
||||
|
||||
let type = event.type();
|
||||
if (type !== Clutter.EventType.KEY_PRESS && type !== Clutter.EventType.KEY_RELEASE)
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
|
||||
let key = event.get_key_symbol();
|
||||
if (key !== Clutter.KEY_Alt_L && key !== Clutter.KEY_Alt_R)
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
|
||||
if (type === Clutter.EventType.KEY_PRESS)
|
||||
altEnabled = true;
|
||||
|
||||
this._rebootButton.visible = !altEnabled;
|
||||
this._rebootButtonAlt.visible = altEnabled;
|
||||
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
}
|
||||
|
||||
_updateButtons() {
|
||||
this.clearButtons();
|
||||
|
||||
this.addButton({ action: this.cancel.bind(this),
|
||||
label: _("Cancel"),
|
||||
key: Clutter.KEY_Escape });
|
||||
|
||||
let dialogContent = DialogContent[this._type];
|
||||
let buttons = [{ action: this.cancel.bind(this),
|
||||
label: _("Cancel"),
|
||||
key: Clutter.KEY_Escape }];
|
||||
|
||||
for (let i = 0; i < dialogContent.confirmButtons.length; i++) {
|
||||
let signal = dialogContent.confirmButtons[i].signal;
|
||||
let label = dialogContent.confirmButtons[i].label;
|
||||
let button = this.addButton({
|
||||
buttons.push({
|
||||
action: () => {
|
||||
this.close(true);
|
||||
let signalId = this.connect('closed', () => {
|
||||
@@ -452,34 +382,9 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
|
||||
},
|
||||
label,
|
||||
});
|
||||
|
||||
// Add Alt "Boot Options" option to the Reboot button
|
||||
if (this._canRebootToBootLoaderMenu && signal === 'ConfirmedReboot') {
|
||||
this._rebootButton = button;
|
||||
this._rebootButtonAlt = this.addButton({
|
||||
action: () => {
|
||||
this.close(true);
|
||||
let signalId = this.connect('closed', () => {
|
||||
this.disconnect(signalId);
|
||||
this._confirmRebootToBootLoaderMenu();
|
||||
});
|
||||
},
|
||||
label: C_('button', 'Boot Options'),
|
||||
});
|
||||
this._rebootButtonAlt.visible = false;
|
||||
this._capturedEventId = global.stage.connect('captured-event',
|
||||
this._onCapturedEvent.bind(this));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_stopAltCapture() {
|
||||
if (this._capturedEventId > 0) {
|
||||
global.stage.disconnect(this._capturedEventId);
|
||||
this._capturedEventId = 0;
|
||||
}
|
||||
this._rebootButton = null;
|
||||
this._rebootButtonAlt = null;
|
||||
this.setButtons(buttons);
|
||||
}
|
||||
|
||||
close(skipSignal) {
|
||||
@@ -491,21 +396,14 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
|
||||
|
||||
cancel() {
|
||||
this._stopTimer();
|
||||
this._stopAltCapture();
|
||||
this._dbusImpl.emit_signal('Canceled', null);
|
||||
this.close();
|
||||
}
|
||||
|
||||
_confirmRebootToBootLoaderMenu() {
|
||||
this._loginManager.setRebootToBootLoaderMenu();
|
||||
this._confirm('ConfirmedReboot');
|
||||
}
|
||||
|
||||
_confirm(signal) {
|
||||
let callback = () => {
|
||||
this._fadeOutDialog();
|
||||
this._stopTimer();
|
||||
this._stopAltCapture();
|
||||
this._dbusImpl.emit_signal(signal, null);
|
||||
};
|
||||
|
||||
@@ -773,17 +671,19 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
|
||||
if (dialogContent.showOtherSessions)
|
||||
this._loadSessions();
|
||||
|
||||
let updateTriggered = this._updateInfo.UpdateTriggered;
|
||||
let updatePrepared = this._updateInfo.UpdatePrepared;
|
||||
let updatesAllowed = this._updatesPermission && this._updatesPermission.allowed;
|
||||
|
||||
_setCheckBoxLabel(this._checkBox, dialogContent.checkBoxText || '');
|
||||
this._checkBox.visible = dialogContent.checkBoxText && this._updateInfo.UpdatePrepared && updatesAllowed;
|
||||
this._checkBox.visible = dialogContent.checkBoxText && updatePrepared && updatesAllowed;
|
||||
this._checkBox.checked = this._checkBox.visible;
|
||||
|
||||
if (this._type === DialogType.UPGRADE_RESTART)
|
||||
this._checkBox.checked = this._checkBox.visible && this._updateInfo.UpdateTriggered && !this._isDischargingBattery();
|
||||
else
|
||||
this._checkBox.checked = this._checkBox.visible && !this._isBatteryLow();
|
||||
|
||||
this._batteryWarning.visible = this._shouldShowLowBatteryWarning(dialogContent);
|
||||
// We show the warning either together with the checkbox, or when
|
||||
// updates have already been triggered, but the user doesn't have
|
||||
// enough permissions to cancel them.
|
||||
this._batteryWarning.visible = dialogContent.showBatteryWarning &&
|
||||
(this._checkBox.visible || updatePrepared && updateTriggered && !updatesAllowed);
|
||||
|
||||
this._updateButtons();
|
||||
|
||||
|
@@ -139,9 +139,7 @@ function checkForUpdates() {
|
||||
return;
|
||||
if (extension.hasUpdate)
|
||||
return;
|
||||
metadatas[uuid] = {
|
||||
version: extension.metadata.version,
|
||||
};
|
||||
metadatas[uuid] = extension.metadata;
|
||||
});
|
||||
|
||||
if (Object.keys(metadatas).length === 0)
|
||||
|
@@ -31,7 +31,7 @@ var IconSize = {
|
||||
var APPICON_ANIMATION_OUT_SCALE = 3;
|
||||
var APPICON_ANIMATION_OUT_TIME = 250;
|
||||
|
||||
const ICON_POSITION_DELAY = 10;
|
||||
const ICON_POSITION_DELAY = 25;
|
||||
|
||||
const defaultGridModes = [
|
||||
{
|
||||
@@ -52,17 +52,6 @@ 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) {
|
||||
@@ -957,99 +946,6 @@ 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;
|
||||
@@ -1663,11 +1559,6 @@ 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;
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/* exported InhibitShortcutsDialog */
|
||||
const { Clutter, Gio, GLib, GObject, Gtk, Meta, Pango, Shell, St } = imports.gi;
|
||||
const { Clutter, Gio, GLib, GObject, Gtk, Meta, Shell, St } = imports.gi;
|
||||
|
||||
const Dialog = imports.ui.dialog;
|
||||
const ModalDialog = imports.ui.modalDialog;
|
||||
@@ -7,7 +7,7 @@ const PermissionStore = imports.misc.permissionStore;
|
||||
|
||||
const WAYLAND_KEYBINDINGS_SCHEMA = 'org.gnome.mutter.wayland.keybindings';
|
||||
|
||||
const APP_ALLOWLIST = ['gnome-control-center.desktop'];
|
||||
const APP_WHITELIST = ['gnome-control-center.desktop'];
|
||||
const APP_PERMISSIONS_TABLE = 'gnome';
|
||||
const APP_PERMISSIONS_ID = 'shortcuts-inhibitor';
|
||||
const GRANTED = 'GRANTED';
|
||||
@@ -90,8 +90,6 @@ var InhibitShortcutsDialog = GObject.registerClass({
|
||||
text: _('You can restore shortcuts by pressing %s.').format(restoreAccel),
|
||||
style_class: 'message-dialog-description',
|
||||
});
|
||||
restoreLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
||||
restoreLabel.clutter_text.line_wrap = true;
|
||||
content.add_child(restoreLabel);
|
||||
}
|
||||
|
||||
@@ -118,7 +116,7 @@ var InhibitShortcutsDialog = GObject.registerClass({
|
||||
}
|
||||
|
||||
vfunc_show() {
|
||||
if (this._app && APP_ALLOWLIST.includes(this._app.get_id())) {
|
||||
if (this._app && APP_WHITELIST.includes(this._app.get_id())) {
|
||||
this._emitResponse(DialogResponse.ALLOW);
|
||||
return;
|
||||
}
|
||||
|
@@ -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', icon: 'keyboard-layout-filled-symbolic' }, { action: 'hide', extraClassName: 'hide-key', icon: 'go-down-symbolic' }]],
|
||||
[{ action: 'emoji', icon: 'face-smile-symbolic' }, { action: 'languageMenu', extraClassName: 'layout-key' }, { action: 'hide', extraClassName: 'hide-key' }]],
|
||||
[[{ 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 }],
|
||||
@@ -61,24 +61,6 @@ class AspectContainer extends St.Widget {
|
||||
this.queue_relayout();
|
||||
}
|
||||
|
||||
vfunc_get_preferred_width(forHeight) {
|
||||
let [min, nat] = super.vfunc_get_preferred_width(forHeight);
|
||||
|
||||
if (forHeight > 0)
|
||||
nat = forHeight * this._ratio;
|
||||
|
||||
return [min, nat];
|
||||
}
|
||||
|
||||
vfunc_get_preferred_height(forWidth) {
|
||||
let [min, nat] = super.vfunc_get_preferred_height(forWidth);
|
||||
|
||||
if (forWidth > 0)
|
||||
nat = forWidth / this._ratio;
|
||||
|
||||
return [min, nat];
|
||||
}
|
||||
|
||||
vfunc_allocate(box) {
|
||||
if (box.get_width() > 0 && box.get_height() > 0) {
|
||||
let sizeRatio = box.get_width() / box.get_height();
|
||||
@@ -1091,8 +1073,8 @@ var Keypad = GObject.registerClass({
|
||||
{ label: '8', keyval: Clutter.KEY_8, left: 1, top: 2 },
|
||||
{ label: '9', keyval: Clutter.KEY_9, left: 2, top: 2 },
|
||||
{ label: '0', keyval: Clutter.KEY_0, left: 1, top: 3 },
|
||||
{ keyval: Clutter.KEY_BackSpace, icon: 'edit-clear-symbolic', left: 3, top: 0 },
|
||||
{ keyval: Clutter.KEY_Return, extraClassName: 'enter-key', icon: 'keyboard-enter-symbolic', left: 3, top: 1, height: 2 },
|
||||
{ label: '⌫', keyval: Clutter.KEY_BackSpace, left: 3, top: 0 },
|
||||
{ keyval: Clutter.KEY_Return, extraClassName: 'enter-key', left: 3, top: 1, height: 2 },
|
||||
];
|
||||
|
||||
super._init({
|
||||
@@ -1109,7 +1091,7 @@ var Keypad = GObject.registerClass({
|
||||
|
||||
for (let i = 0; i < keys.length; i++) {
|
||||
let cur = keys[i];
|
||||
let key = new Key(cur.label || "", [], cur.icon);
|
||||
let key = new Key(cur.label || "", []);
|
||||
|
||||
if (keys[i].extraClassName)
|
||||
key.keyButton.add_style_class_name(cur.extraClassName);
|
||||
@@ -1626,9 +1608,7 @@ class Keyboard extends St.BoxLayout {
|
||||
* we allow the OSK being smaller than 1/3rd of the monitor height
|
||||
* there.
|
||||
*/
|
||||
const forWidth = this.get_theme_node().adjust_for_width(monitor.width);
|
||||
const [, natHeight] = this.get_preferred_height(forWidth);
|
||||
this.height = Math.min(maxHeight, natHeight);
|
||||
this.height = Math.min(maxHeight, this.get_preferred_height(monitor.width));
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -6,6 +6,7 @@ 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;
|
||||
@@ -294,6 +295,18 @@ 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
|
||||
@@ -457,15 +470,6 @@ 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();
|
||||
@@ -473,7 +477,7 @@ var LayoutManager = GObject.registerClass({
|
||||
this._bgManagers = [];
|
||||
|
||||
if (Main.sessionMode.isGreeter)
|
||||
return Promise.resolve();
|
||||
return;
|
||||
|
||||
for (let i = 0; i < this.monitors.length; i++) {
|
||||
let bgManager = this._createBackgroundManager(i);
|
||||
@@ -482,8 +486,6 @@ var LayoutManager = GObject.registerClass({
|
||||
if (i != this.primaryIndex && this._startingUp)
|
||||
bgManager.backgroundActor.hide();
|
||||
}
|
||||
|
||||
return Promise.all(this._bgManagers.map(this._waitLoaded));
|
||||
}
|
||||
|
||||
_updateKeyboardBox() {
|
||||
@@ -642,7 +644,7 @@ var LayoutManager = GObject.registerClass({
|
||||
// When starting a normal user session, we want to grow it out of the middle
|
||||
// of the screen.
|
||||
|
||||
async _prepareStartupAnimation() {
|
||||
_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,
|
||||
@@ -659,6 +661,8 @@ 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();
|
||||
@@ -674,8 +678,6 @@ 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');
|
||||
@@ -1202,8 +1204,7 @@ class HotCorner extends Clutter.Actor {
|
||||
|
||||
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) {
|
||||
this._corner.set_position(this.width - this._corner.width, 0);
|
||||
this.set_pivot_point(1.0, 0.0);
|
||||
this.translation_x = -this.width;
|
||||
this.set_anchor_point_from_gravity(Clutter.Gravity.NORTH_EAST);
|
||||
} else {
|
||||
this._corner.set_position(0, 0);
|
||||
}
|
||||
@@ -1228,9 +1229,8 @@ 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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -489,10 +489,7 @@ var Magnifier = class Magnifier {
|
||||
_updateMouseSprite() {
|
||||
this._updateSpriteTexture();
|
||||
let [xHot, yHot] = this._cursorTracker.get_hot();
|
||||
this._mouseSprite.set({
|
||||
translation_x: -xHot,
|
||||
translation_y: -yHot,
|
||||
});
|
||||
this._mouseSprite.set_anchor_point(xHot, yHot);
|
||||
}
|
||||
|
||||
_updateSpriteTexture() {
|
||||
|
@@ -3,10 +3,10 @@
|
||||
ctrlAltTabManager, padOsdService, osdWindowManager,
|
||||
osdMonitorLabeler, shellMountOpDBusService, shellDBusService,
|
||||
shellAccessDialogDBusService, shellAudioSelectionDBusService,
|
||||
screenSaverDBus, uiGroup, magnifier, xdndHandler, keyboard,
|
||||
kbdA11yDialog, introspectService, start, pushModal, popModal,
|
||||
activateWindow, createLookingGlass, initializeDeferredWork,
|
||||
getThemeStylesheet, setThemeStylesheet */
|
||||
screenSaverDBus, screencastService, 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,6 +34,7 @@ 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;
|
||||
@@ -73,6 +74,7 @@ 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 = [];
|
||||
@@ -198,6 +200,7 @@ 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();
|
||||
|
@@ -1,6 +1,6 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
/* exported NotificationPolicy, NotificationGenericPolicy,
|
||||
NotificationApplicationPolicy, Source, SourceActor,
|
||||
NotificationApplicationPolicy, Source, SourceActor, SourceActorWithLabel,
|
||||
SystemNotificationSource, MessageTray */
|
||||
|
||||
const { Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi;
|
||||
@@ -655,6 +655,77 @@ class SourceActor extends St.Widget {
|
||||
}
|
||||
});
|
||||
|
||||
var SourceActorWithLabel = GObject.registerClass(
|
||||
class SourceActorWithLabel extends SourceActor {
|
||||
_init(source, size) {
|
||||
super._init(source, size);
|
||||
|
||||
this._counterLabel = new St.Label({ x_align: Clutter.ActorAlign.CENTER,
|
||||
x_expand: true,
|
||||
y_align: Clutter.ActorAlign.CENTER,
|
||||
y_expand: true });
|
||||
|
||||
this._counterBin = new St.Bin({ style_class: 'summary-source-counter',
|
||||
child: this._counterLabel,
|
||||
layout_manager: new Clutter.BinLayout() });
|
||||
this._counterBin.hide();
|
||||
|
||||
this._counterBin.connect('style-changed', () => {
|
||||
let themeNode = this._counterBin.get_theme_node();
|
||||
this._counterBin.translation_x = themeNode.get_length('-shell-counter-overlap-x');
|
||||
this._counterBin.translation_y = themeNode.get_length('-shell-counter-overlap-y');
|
||||
});
|
||||
|
||||
this.add_actor(this._counterBin);
|
||||
|
||||
this._countUpdatedId = this._source.connect('notify::count', this._updateCount.bind(this));
|
||||
this._updateCount();
|
||||
|
||||
this.connect('destroy', () => {
|
||||
this._source.disconnect(this._countUpdatedId);
|
||||
});
|
||||
}
|
||||
|
||||
vfunc_allocate(box) {
|
||||
super.vfunc_allocate(box);
|
||||
|
||||
let childBox = new Clutter.ActorBox();
|
||||
|
||||
let [, , naturalWidth, naturalHeight] = this._counterBin.get_preferred_size();
|
||||
let direction = this.get_text_direction();
|
||||
|
||||
if (direction == Clutter.TextDirection.LTR) {
|
||||
// allocate on the right in LTR
|
||||
childBox.x1 = box.x2 - naturalWidth;
|
||||
childBox.x2 = box.x2;
|
||||
} else {
|
||||
// allocate on the left in RTL
|
||||
childBox.x1 = 0;
|
||||
childBox.x2 = naturalWidth;
|
||||
}
|
||||
|
||||
childBox.y1 = box.y2 - naturalHeight;
|
||||
childBox.y2 = box.y2;
|
||||
|
||||
this._counterBin.allocate(childBox);
|
||||
}
|
||||
|
||||
_updateCount() {
|
||||
if (this._actorDestroyed)
|
||||
return;
|
||||
|
||||
this._counterBin.visible = this._source.countVisible;
|
||||
|
||||
let text;
|
||||
if (this._source.count < 100)
|
||||
text = this._source.count.toString();
|
||||
else
|
||||
text = String.fromCharCode(0x22EF); // midline horizontal ellipsis
|
||||
|
||||
this._counterLabel.set_text(text);
|
||||
}
|
||||
});
|
||||
|
||||
var Source = GObject.registerClass({
|
||||
Properties: {
|
||||
'count': GObject.ParamSpec.int(
|
||||
|
@@ -4,10 +4,6 @@
|
||||
const { Clutter, GLib, GObject, Meta, Shell, St } = imports.gi;
|
||||
const Signals = imports.signals;
|
||||
|
||||
// Time for initial animation going into Overview mode;
|
||||
// this is defined here to make it available in imports.
|
||||
var ANIMATION_TIME = 250;
|
||||
|
||||
const Background = imports.ui.background;
|
||||
const DND = imports.ui.dnd;
|
||||
const LayoutManager = imports.ui.layout;
|
||||
@@ -18,6 +14,9 @@ const OverviewControls = imports.ui.overviewControls;
|
||||
const Params = imports.misc.params;
|
||||
const WorkspaceThumbnail = imports.ui.workspaceThumbnail;
|
||||
|
||||
// Time for initial animation going into Overview mode
|
||||
var ANIMATION_TIME = 250;
|
||||
|
||||
// Must be less than ANIMATION_TIME, since we switch to
|
||||
// or from the overview completely after ANIMATION_TIME,
|
||||
// and don't want the shading animation to get cut off
|
||||
@@ -440,19 +439,19 @@ var Overview = class {
|
||||
this.emit('windows-restacked', stackIndices);
|
||||
}
|
||||
|
||||
beginItemDrag(source) {
|
||||
this.emit('item-drag-begin', source);
|
||||
beginItemDrag(_source) {
|
||||
this.emit('item-drag-begin');
|
||||
this._inItemDrag = true;
|
||||
}
|
||||
|
||||
cancelledItemDrag(source) {
|
||||
this.emit('item-drag-cancelled', source);
|
||||
cancelledItemDrag(_source) {
|
||||
this.emit('item-drag-cancelled');
|
||||
}
|
||||
|
||||
endItemDrag(source) {
|
||||
endItemDrag(_source) {
|
||||
if (!this._inItemDrag)
|
||||
return;
|
||||
this.emit('item-drag-end', source);
|
||||
this.emit('item-drag-end');
|
||||
this._inItemDrag = false;
|
||||
}
|
||||
|
||||
|
@@ -8,9 +8,8 @@ const Main = imports.ui.main;
|
||||
const Params = imports.misc.params;
|
||||
const ViewSelector = imports.ui.viewSelector;
|
||||
const WorkspaceThumbnail = imports.ui.workspaceThumbnail;
|
||||
const Overview = imports.ui.overview;
|
||||
|
||||
var SIDE_CONTROLS_ANIMATION_TIME = Overview.ANIMATION_TIME;
|
||||
var SIDE_CONTROLS_ANIMATION_TIME = 160;
|
||||
|
||||
function getRtlSlideDirection(direction, actor) {
|
||||
let rtl = actor.text_direction == Clutter.TextDirection.RTL;
|
||||
@@ -423,7 +422,6 @@ class ControlsManager extends St.Widget {
|
||||
let activeWorkspaceIndex = workspaceManager.get_active_workspace_index();
|
||||
|
||||
this._workspaceAdjustment = new St.Adjustment({
|
||||
actor: this,
|
||||
value: activeWorkspaceIndex,
|
||||
lower: 0,
|
||||
page_increment: 1,
|
||||
@@ -455,6 +453,8 @@ class ControlsManager extends St.Widget {
|
||||
this._group.add_child(this.viewSelector);
|
||||
this._group.add_actor(this._thumbnailsSlider);
|
||||
|
||||
layout.connect('allocation-changed', this._updateWorkspacesGeometry.bind(this));
|
||||
|
||||
Main.overview.connect('showing', this._updateSpacerVisibility.bind(this));
|
||||
|
||||
this.connect('destroy', this._onDestroy.bind(this));
|
||||
@@ -477,6 +477,26 @@ class ControlsManager extends St.Widget {
|
||||
this._workspaceAdjustment.value = activeIndex;
|
||||
}
|
||||
|
||||
_updateWorkspacesGeometry() {
|
||||
let [x, y] = this.get_transformed_position();
|
||||
let [width, height] = this.get_transformed_size();
|
||||
let geometry = { x, y, width, height };
|
||||
|
||||
let spacing = this.get_theme_node().get_length('spacing');
|
||||
let dashWidth = this._dashSlider.getVisibleWidth() + spacing;
|
||||
let thumbnailsWidth = this._thumbnailsSlider.getNonExpandedWidth() + spacing;
|
||||
|
||||
geometry.width -= dashWidth;
|
||||
geometry.width -= thumbnailsWidth;
|
||||
|
||||
if (this.get_text_direction() == Clutter.TextDirection.LTR)
|
||||
geometry.x += dashWidth;
|
||||
else
|
||||
geometry.x += thumbnailsWidth;
|
||||
|
||||
this.viewSelector.setWorkspacesFullGeometry(geometry);
|
||||
}
|
||||
|
||||
_setVisibility() {
|
||||
// Ignore the case when we're leaving the overview, since
|
||||
// actors will be made visible again when entering the overview
|
||||
|
@@ -5,6 +5,7 @@ const { Atk, Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi;
|
||||
const Cairo = imports.cairo;
|
||||
|
||||
const Animation = imports.ui.animation;
|
||||
const AppDisplay = imports.ui.appDisplay;
|
||||
const Config = imports.misc.config;
|
||||
const CtrlAltTab = imports.ui.ctrlAltTab;
|
||||
const DND = imports.ui.dnd;
|
||||
@@ -60,69 +61,20 @@ function _unpremultiply(color) {
|
||||
return new Clutter.Color({ red, green, blue, alpha: color.alpha });
|
||||
}
|
||||
|
||||
class AppMenu extends PopupMenu.PopupMenu {
|
||||
class AppMenu extends AppDisplay.BaseAppMenu {
|
||||
constructor(sourceActor) {
|
||||
super(sourceActor, 0.5, St.Side.TOP);
|
||||
super(sourceActor, St.Side.TOP);
|
||||
|
||||
this.actor.add_style_class_name('app-menu');
|
||||
|
||||
this._app = null;
|
||||
this._appSystem = Shell.AppSystem.get_default();
|
||||
|
||||
this._windowsChangedId = 0;
|
||||
|
||||
/* Translators: This is the heading of a list of open windows */
|
||||
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem(_("Open Windows")));
|
||||
|
||||
this._windowSection = new PopupMenu.PopupMenuSection();
|
||||
this.addMenuItem(this._windowSection);
|
||||
|
||||
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||
|
||||
this._newWindowItem = this.addAction(_("New Window"), () => {
|
||||
this._app.open_new_window(-1);
|
||||
});
|
||||
|
||||
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||
|
||||
this._actionSection = new PopupMenu.PopupMenuSection();
|
||||
this.addMenuItem(this._actionSection);
|
||||
|
||||
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||
|
||||
this._detailsItem = this.addAction(_('Show Details'), async () => {
|
||||
let id = this._app.get_id();
|
||||
let args = GLib.Variant.new('(ss)', [id, '']);
|
||||
const bus = await Gio.DBus.get(Gio.BusType.SESSION, null);
|
||||
bus.call(
|
||||
'org.gnome.Software',
|
||||
'/org/gnome/Software',
|
||||
'org.gtk.Actions', 'Activate',
|
||||
new GLib.Variant('(sava{sv})', ['details', [args], null]),
|
||||
null, 0, -1, null);
|
||||
});
|
||||
|
||||
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||
|
||||
this.addAction(_("Quit"), () => {
|
||||
this._app.request_quit();
|
||||
});
|
||||
|
||||
this._appSystem.connect('installed-changed', () => {
|
||||
this._updateDetailsVisibility();
|
||||
});
|
||||
this._updateDetailsVisibility();
|
||||
}
|
||||
|
||||
_updateDetailsVisibility() {
|
||||
let sw = this._appSystem.lookup_app('org.gnome.Software.desktop');
|
||||
this._detailsItem.visible = sw != null;
|
||||
}
|
||||
|
||||
isEmpty() {
|
||||
if (!this._app)
|
||||
return true;
|
||||
return super.isEmpty();
|
||||
get app() {
|
||||
return this._app;
|
||||
}
|
||||
|
||||
setApp(app) {
|
||||
@@ -157,25 +109,6 @@ class AppMenu extends PopupMenu.PopupMenu {
|
||||
this._newWindowItem.visible =
|
||||
app && app.can_open_new_window() && !actions.includes('new-window');
|
||||
}
|
||||
|
||||
_updateWindowsSection() {
|
||||
this._windowSection.removeAll();
|
||||
|
||||
if (!this._app)
|
||||
return;
|
||||
|
||||
let windows = this._app.get_windows();
|
||||
windows.forEach(window => {
|
||||
let title = window.title || this._app.get_name();
|
||||
let item = this._windowSection.addAction(title, event => {
|
||||
Main.activateWindow(window, event.get_time());
|
||||
});
|
||||
let id = window.connect('notify::title', () => {
|
||||
item.label.text = window.title || this._app.get_name();
|
||||
});
|
||||
item.connect('destroy', () => window.disconnect(id));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -675,7 +608,7 @@ class PanelCorner extends St.DrawingArea {
|
||||
let borderWidth = node.get_length('-panel-corner-border-width');
|
||||
|
||||
this.set_size(cornerRadius, borderWidth + cornerRadius);
|
||||
this.translation_y = -borderWidth;
|
||||
this.set_anchor_point(0, borderWidth);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -736,11 +669,13 @@ 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,9 +183,10 @@ var Button = GObject.registerClass({
|
||||
}
|
||||
|
||||
_onDestroy() {
|
||||
super._onDestroy();
|
||||
|
||||
if (this.menu)
|
||||
this.menu.destroy();
|
||||
super._onDestroy();
|
||||
}
|
||||
});
|
||||
|
||||
|
@@ -881,10 +881,9 @@ var PopupMenu = class extends PopupMenuBase {
|
||||
|
||||
let state = event.get_state();
|
||||
|
||||
// if user has a modifier down (except capslock and numlock)
|
||||
// if user has a modifier down (except capslock)
|
||||
// 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)
|
||||
@@ -1325,7 +1324,7 @@ var PopupMenuManager = class {
|
||||
|
||||
removeMenu(menu) {
|
||||
if (menu == this.activeMenu)
|
||||
this._grabHelper.ungrab({ actor: menu.actor });
|
||||
this._closeMenu(false, menu);
|
||||
|
||||
let position = this._findMenu(menu);
|
||||
if (position == -1) // not a menu we manage
|
||||
|
146
js/ui/screencast.js
Normal file
146
js/ui/screencast.js
Normal file
@@ -0,0 +1,146 @@
|
||||
// -*- 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);
|
@@ -113,10 +113,10 @@ function _loadMode(file, info) {
|
||||
}
|
||||
|
||||
_modes[modeName] = {};
|
||||
const excludedProps = ['unlockDialog'];
|
||||
let propBlacklist = ['unlockDialog'];
|
||||
for (let prop in _modes[DEFAULT_MODE]) {
|
||||
if (newMode[prop] !== undefined &&
|
||||
!excludedProps.includes(prop))
|
||||
!propBlacklist.includes(prop))
|
||||
_modes[modeName][prop] = newMode[prop];
|
||||
}
|
||||
_modes[modeName]['isPrimary'] = true;
|
||||
|
@@ -15,7 +15,6 @@ const Util = imports.misc.util;
|
||||
|
||||
const { loadInterfaceXML } = imports.misc.fileUtils;
|
||||
|
||||
Gio._promisify(Gio.DBusConnection.prototype, 'call', 'call_finish');
|
||||
Gio._promisify(NM.Client, 'new_async', 'new_finish');
|
||||
Gio._promisify(NM.Client.prototype,
|
||||
'check_connectivity_async', 'check_connectivity_finish');
|
||||
@@ -83,30 +82,6 @@ function ensureActiveConnectionProps(active) {
|
||||
}
|
||||
}
|
||||
|
||||
function launchSettingsPanel(panel, ...args) {
|
||||
const param = new GLib.Variant('(sav)',
|
||||
[panel, args.map(s => new GLib.Variant('s', s))]);
|
||||
const platformData = {
|
||||
'desktop-startup-id': new GLib.Variant('s',
|
||||
'_TIME%s'.format(global.get_current_time())),
|
||||
};
|
||||
try {
|
||||
Gio.DBus.session.call(
|
||||
'org.gnome.ControlCenter',
|
||||
'/org/gnome/ControlCenter',
|
||||
'org.freedesktop.Application',
|
||||
'ActivateAction',
|
||||
new GLib.Variant('(sava{sv})',
|
||||
['launch-panel', [param], platformData]),
|
||||
null,
|
||||
Gio.DBusCallFlags.NONE,
|
||||
-1,
|
||||
null);
|
||||
} catch (e) {
|
||||
log('Failed to launch Settings panel: %s'.format(e.message));
|
||||
}
|
||||
}
|
||||
|
||||
var NMConnectionItem = class {
|
||||
constructor(section, connection) {
|
||||
this._section = section;
|
||||
@@ -564,7 +539,8 @@ var NMDeviceModem = class extends NMConnectionDevice {
|
||||
}
|
||||
|
||||
_autoConnect() {
|
||||
launchSettingsPanel('network', 'connect-3g', this._device.get_path());
|
||||
Util.spawn(['gnome-control-center', 'network',
|
||||
'connect-3g', this._device.get_path()]);
|
||||
}
|
||||
|
||||
destroy() {
|
||||
@@ -955,8 +931,8 @@ class NMWirelessDialog extends ModalDialog.ModalDialog {
|
||||
(accessPoints[0]._secType == NMAccessPointSecurity.WPA_ENT)) {
|
||||
// 802.1x-enabled APs require further configuration, so they're
|
||||
// handled in gnome-control-center
|
||||
launchSettingsPanel('wifi', 'connect-8021x-wifi',
|
||||
this._device.get_path(), accessPoints[0].get_path());
|
||||
Util.spawn(['gnome-control-center', 'wifi', 'connect-8021x-wifi',
|
||||
this._device.get_path(), accessPoints[0].get_path()]);
|
||||
} else {
|
||||
let connection = new NM.SimpleConnection();
|
||||
this._client.add_and_activate_connection_async(connection, this._device, accessPoints[0].get_path(), null, null);
|
||||
|
@@ -24,8 +24,7 @@ class RemoteAccessApplet extends PanelMenu.SystemIndicator {
|
||||
return;
|
||||
|
||||
this._handles = new Set();
|
||||
this._sharedIndicator = null;
|
||||
this._recordingIndicator = null;
|
||||
this._indicator = null;
|
||||
this._menuSection = null;
|
||||
|
||||
controller.connect('new-handle', (o, handle) => {
|
||||
@@ -34,49 +33,32 @@ class RemoteAccessApplet extends PanelMenu.SystemIndicator {
|
||||
}
|
||||
|
||||
_ensureControls() {
|
||||
if (this._sharedIndicator && this._recordingIndicator)
|
||||
if (this._indicator)
|
||||
return;
|
||||
|
||||
this._sharedIndicator = this._addIndicator();
|
||||
this._sharedIndicator.icon_name = 'screen-shared-symbolic';
|
||||
this._sharedIndicator.add_style_class_name('remote-access-indicator');
|
||||
|
||||
this._sharedItem =
|
||||
this._indicator = this._addIndicator();
|
||||
this._indicator.icon_name = 'screen-shared-symbolic';
|
||||
this._indicator.add_style_class_name('remote-access-indicator');
|
||||
this._item =
|
||||
new PopupMenu.PopupSubMenuMenuItem(_("Screen is Being Shared"),
|
||||
true);
|
||||
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);
|
||||
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);
|
||||
}
|
||||
|
||||
_sync() {
|
||||
if (this._isScreenShared()) {
|
||||
this._sharedIndicator.visible = true;
|
||||
this._sharedItem.visible = true;
|
||||
if (this._handles.size == 0) {
|
||||
this._indicator.visible = false;
|
||||
this._item.visible = false;
|
||||
} else {
|
||||
this._sharedIndicator.visible = false;
|
||||
this._sharedItem.visible = false;
|
||||
this._indicator.visible = true;
|
||||
this._item.visible = true;
|
||||
}
|
||||
|
||||
this._recordingIndicator.visible = this._isRecording();
|
||||
}
|
||||
|
||||
_onStopped(handle) {
|
||||
@@ -88,7 +70,9 @@ class RemoteAccessApplet extends PanelMenu.SystemIndicator {
|
||||
this._handles.add(handle);
|
||||
handle.connect('stopped', this._onStopped.bind(this));
|
||||
|
||||
this._ensureControls();
|
||||
this._sync();
|
||||
if (this._handles.size == 1) {
|
||||
this._ensureControls();
|
||||
this._sync();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@@ -86,8 +86,6 @@ class Indicator extends PanelMenu.SystemIndicator {
|
||||
|
||||
Main.sessionMode.connect('updated', this._sessionUpdated.bind(this));
|
||||
this._sessionUpdated();
|
||||
|
||||
this._sync();
|
||||
}
|
||||
|
||||
_sessionUpdated() {
|
||||
|
25
js/ui/status/screencast.js
Normal file
25
js/ui/status/screencast.js
Normal file
@@ -0,0 +1,25 @@
|
||||
// -*- 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;
|
||||
}
|
||||
});
|
@@ -27,8 +27,6 @@ class Indicator extends PanelMenu.SystemIndicator {
|
||||
() => this._updateSessionSubMenu());
|
||||
this._powerOffItem.connect('notify::visible',
|
||||
() => this._updateSessionSubMenu());
|
||||
this._restartItem.connect('notify::visible',
|
||||
() => this._updateSessionSubMenu());
|
||||
// Whether shutdown is available or not depends on both lockdown
|
||||
// settings (disable-log-out) and Polkit policy - the latter doesn't
|
||||
// notify, so we update the menu item each time the menu opens or
|
||||
@@ -54,7 +52,6 @@ class Indicator extends PanelMenu.SystemIndicator {
|
||||
this._loginScreenItem.visible ||
|
||||
this._logoutItem.visible ||
|
||||
this._suspendItem.visible ||
|
||||
this._restartItem.visible ||
|
||||
this._powerOffItem.visible;
|
||||
}
|
||||
|
||||
@@ -73,8 +70,9 @@ class Indicator extends PanelMenu.SystemIndicator {
|
||||
this.menu.addMenuItem(item);
|
||||
this._orientationLockItem = item;
|
||||
this._systemActions.bind_property('can-lock-orientation',
|
||||
this._orientationLockItem, 'visible',
|
||||
bindFlags);
|
||||
this._orientationLockItem,
|
||||
'visible',
|
||||
bindFlags);
|
||||
this._systemActions.connect('notify::orientation-lock-icon', () => {
|
||||
let iconName = this._systemActions.orientation_lock_icon;
|
||||
let labelText = this._systemActions.getName("lock-orientation");
|
||||
@@ -86,8 +84,8 @@ class Indicator extends PanelMenu.SystemIndicator {
|
||||
let app = this._settingsApp = Shell.AppSystem.get_default().lookup_app(
|
||||
'gnome-control-center.desktop');
|
||||
if (app) {
|
||||
const [icon] = app.app_info.get_icon().names;
|
||||
const name = app.app_info.get_name();
|
||||
let [icon, name] = [app.app_info.get_icon().names[0],
|
||||
app.get_name()];
|
||||
item = new PopupMenu.PopupImageMenuItem(name, icon);
|
||||
item.connect('activate', () => {
|
||||
this.menu.itemActivated(BoxPointer.PopupAnimation.NONE);
|
||||
@@ -109,49 +107,15 @@ class Indicator extends PanelMenu.SystemIndicator {
|
||||
this.menu.addMenuItem(item);
|
||||
this._lockScreenItem = item;
|
||||
this._systemActions.bind_property('can-lock-screen',
|
||||
this._lockScreenItem, 'visible',
|
||||
bindFlags);
|
||||
this._lockScreenItem,
|
||||
'visible',
|
||||
bindFlags);
|
||||
|
||||
this._sessionSubMenu = new PopupMenu.PopupSubMenuMenuItem(
|
||||
_('Power Off / Log Out'), true);
|
||||
this._sessionSubMenu.icon.icon_name = 'system-shutdown-symbolic';
|
||||
|
||||
item = new PopupMenu.PopupMenuItem(_('Suspend'));
|
||||
item.connect('activate', () => {
|
||||
this.menu.itemActivated(BoxPointer.PopupAnimation.NONE);
|
||||
this._systemActions.activateSuspend();
|
||||
});
|
||||
this._sessionSubMenu.menu.addMenuItem(item);
|
||||
this._suspendItem = item;
|
||||
this._systemActions.bind_property('can-suspend',
|
||||
this._suspendItem, 'visible',
|
||||
bindFlags);
|
||||
|
||||
item = new PopupMenu.PopupMenuItem(_('Restart…'));
|
||||
item.connect('activate', () => {
|
||||
this.menu.itemActivated(BoxPointer.PopupAnimation.NONE);
|
||||
this._systemActions.activateRestart();
|
||||
});
|
||||
this._sessionSubMenu.menu.addMenuItem(item);
|
||||
this._restartItem = item;
|
||||
this._systemActions.bind_property('can-restart',
|
||||
this._restartItem, 'visible',
|
||||
bindFlags);
|
||||
|
||||
item = new PopupMenu.PopupMenuItem(_('Power Off…'));
|
||||
item.connect('activate', () => {
|
||||
this.menu.itemActivated(BoxPointer.PopupAnimation.NONE);
|
||||
this._systemActions.activatePowerOff();
|
||||
});
|
||||
this._sessionSubMenu.menu.addMenuItem(item);
|
||||
this._powerOffItem = item;
|
||||
this._systemActions.bind_property('can-power-off',
|
||||
this._powerOffItem, 'visible',
|
||||
bindFlags);
|
||||
|
||||
this._sessionSubMenu.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||
|
||||
item = new PopupMenu.PopupMenuItem(_('Log Out'));
|
||||
item = new PopupMenu.PopupMenuItem(_("Log Out"));
|
||||
item.connect('activate', () => {
|
||||
this.menu.itemActivated(BoxPointer.PopupAnimation.NONE);
|
||||
this._systemActions.activateLogout();
|
||||
@@ -159,10 +123,11 @@ class Indicator extends PanelMenu.SystemIndicator {
|
||||
this._sessionSubMenu.menu.addMenuItem(item);
|
||||
this._logoutItem = item;
|
||||
this._systemActions.bind_property('can-logout',
|
||||
this._logoutItem, 'visible',
|
||||
bindFlags);
|
||||
this._logoutItem,
|
||||
'visible',
|
||||
bindFlags);
|
||||
|
||||
item = new PopupMenu.PopupMenuItem(_('Switch User…'));
|
||||
item = new PopupMenu.PopupMenuItem(_("Switch User…"));
|
||||
item.connect('activate', () => {
|
||||
this.menu.itemActivated(BoxPointer.PopupAnimation.NONE);
|
||||
this._systemActions.activateSwitchUser();
|
||||
@@ -170,8 +135,35 @@ class Indicator extends PanelMenu.SystemIndicator {
|
||||
this._sessionSubMenu.menu.addMenuItem(item);
|
||||
this._loginScreenItem = item;
|
||||
this._systemActions.bind_property('can-switch-user',
|
||||
this._loginScreenItem, 'visible',
|
||||
bindFlags);
|
||||
this._loginScreenItem,
|
||||
'visible',
|
||||
bindFlags);
|
||||
|
||||
this._sessionSubMenu.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||
|
||||
item = new PopupMenu.PopupMenuItem(_("Suspend"));
|
||||
item.connect('activate', () => {
|
||||
this.menu.itemActivated(BoxPointer.PopupAnimation.NONE);
|
||||
this._systemActions.activateSuspend();
|
||||
});
|
||||
this._sessionSubMenu.menu.addMenuItem(item);
|
||||
this._suspendItem = item;
|
||||
this._systemActions.bind_property('can-suspend',
|
||||
this._suspendItem,
|
||||
'visible',
|
||||
bindFlags);
|
||||
|
||||
item = new PopupMenu.PopupMenuItem(_("Power Off…"));
|
||||
item.connect('activate', () => {
|
||||
this.menu.itemActivated(BoxPointer.PopupAnimation.NONE);
|
||||
this._systemActions.activatePowerOff();
|
||||
});
|
||||
this._sessionSubMenu.menu.addMenuItem(item);
|
||||
this._powerOffItem = item;
|
||||
this._systemActions.bind_property('can-power-off',
|
||||
this._powerOffItem,
|
||||
'visible',
|
||||
bindFlags);
|
||||
|
||||
this.menu.addMenuItem(this._sessionSubMenu);
|
||||
}
|
||||
|
@@ -62,7 +62,6 @@ var StreamSlider = class {
|
||||
|
||||
this._stream = null;
|
||||
this._volumeCancellable = null;
|
||||
this._icons = [];
|
||||
}
|
||||
|
||||
get stream() {
|
||||
@@ -183,15 +182,24 @@ var StreamSlider = class {
|
||||
if (!this._stream)
|
||||
return null;
|
||||
|
||||
let icons = ["audio-volume-muted-symbolic",
|
||||
"audio-volume-low-symbolic",
|
||||
"audio-volume-medium-symbolic",
|
||||
"audio-volume-high-symbolic",
|
||||
"audio-volume-overamplified-symbolic"];
|
||||
|
||||
let volume = this._stream.volume;
|
||||
let n;
|
||||
if (this._stream.is_muted || volume <= 0) {
|
||||
n = 0;
|
||||
} else {
|
||||
n = Math.ceil(3 * volume / this._control.get_vol_max_norm());
|
||||
n = Math.clamp(n, 1, this._icons.length - 1);
|
||||
if (n < 1)
|
||||
n = 1;
|
||||
else if (n > 3)
|
||||
n = 4;
|
||||
}
|
||||
return this._icons[n];
|
||||
return icons[n];
|
||||
}
|
||||
|
||||
getLevel() {
|
||||
@@ -215,13 +223,6 @@ var OutputStreamSlider = class extends StreamSlider {
|
||||
constructor(control) {
|
||||
super(control);
|
||||
this._slider.accessible_name = _("Volume");
|
||||
this._icons = [
|
||||
'audio-volume-muted-symbolic',
|
||||
'audio-volume-low-symbolic',
|
||||
'audio-volume-medium-symbolic',
|
||||
'audio-volume-high-symbolic',
|
||||
'audio-volume-overamplified-symbolic',
|
||||
];
|
||||
}
|
||||
|
||||
_connectStream(stream) {
|
||||
@@ -273,12 +274,6 @@ var InputStreamSlider = class extends StreamSlider {
|
||||
this._control.connect('stream-added', this._maybeShowInput.bind(this));
|
||||
this._control.connect('stream-removed', this._maybeShowInput.bind(this));
|
||||
this._icon.icon_name = 'audio-input-microphone-symbolic';
|
||||
this._icons = [
|
||||
'microphone-sensitivity-muted-symbolic',
|
||||
'microphone-sensitivity-low-symbolic',
|
||||
'microphone-sensitivity-medium-symbolic',
|
||||
'microphone-sensitivity-high-symbolic',
|
||||
];
|
||||
}
|
||||
|
||||
_connectStream(stream) {
|
||||
@@ -324,7 +319,7 @@ var VolumeMenu = class extends PopupMenu.PopupMenuSection {
|
||||
|
||||
this._output = new OutputStreamSlider(this._control);
|
||||
this._output.connect('stream-updated', () => {
|
||||
this.emit('output-icon-changed');
|
||||
this.emit('icon-changed');
|
||||
});
|
||||
this.addMenuItem(this._output.item);
|
||||
|
||||
@@ -332,9 +327,6 @@ var VolumeMenu = class extends PopupMenu.PopupMenuSection {
|
||||
this._input.item.connect('notify::visible', () => {
|
||||
this.emit('input-visible-changed');
|
||||
});
|
||||
this._input.connect('stream-updated', () => {
|
||||
this.emit('input-icon-changed');
|
||||
});
|
||||
this.addMenuItem(this._input.item);
|
||||
|
||||
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||
@@ -351,7 +343,7 @@ var VolumeMenu = class extends PopupMenu.PopupMenuSection {
|
||||
this._readInput();
|
||||
this._readOutput();
|
||||
} else {
|
||||
this.emit('output-icon-changed');
|
||||
this.emit('icon-changed');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -363,14 +355,10 @@ var VolumeMenu = class extends PopupMenu.PopupMenuSection {
|
||||
this._input.stream = this._control.get_default_source();
|
||||
}
|
||||
|
||||
getOutputIcon() {
|
||||
getIcon() {
|
||||
return this._output.getIcon();
|
||||
}
|
||||
|
||||
getInputIcon() {
|
||||
return this._input.getIcon();
|
||||
}
|
||||
|
||||
getLevel() {
|
||||
return this._output.getLevel();
|
||||
}
|
||||
@@ -394,24 +382,21 @@ class Indicator extends PanelMenu.SystemIndicator {
|
||||
|
||||
this._control = getMixerControl();
|
||||
this._volumeMenu = new VolumeMenu(this._control);
|
||||
this._volumeMenu.connect('output-icon-changed', () => {
|
||||
let icon = this._volumeMenu.getOutputIcon();
|
||||
this._volumeMenu.connect('icon-changed', () => {
|
||||
let icon = this._volumeMenu.getIcon();
|
||||
|
||||
if (icon != null)
|
||||
this._primaryIndicator.icon_name = icon;
|
||||
this._primaryIndicator.visible = icon !== null;
|
||||
});
|
||||
|
||||
this._inputIndicator.visible = this._volumeMenu.getInputVisible();
|
||||
this._inputIndicator.set({
|
||||
icon_name: 'audio-input-microphone-symbolic',
|
||||
visible: this._volumeMenu.getInputVisible(),
|
||||
});
|
||||
this._volumeMenu.connect('input-visible-changed', () => {
|
||||
this._inputIndicator.visible = this._volumeMenu.getInputVisible();
|
||||
});
|
||||
this._volumeMenu.connect('input-icon-changed', () => {
|
||||
let icon = this._volumeMenu.getInputIcon();
|
||||
|
||||
if (icon !== null)
|
||||
this._inputIndicator.icon_name = icon;
|
||||
});
|
||||
|
||||
this.menu.addMenuItem(this._volumeMenu);
|
||||
}
|
||||
@@ -421,7 +406,7 @@ class Indicator extends PanelMenu.SystemIndicator {
|
||||
if (result == Clutter.EVENT_PROPAGATE || this.menu.actor.mapped)
|
||||
return result;
|
||||
|
||||
let gicon = new Gio.ThemedIcon({ name: this._volumeMenu.getOutputIcon() });
|
||||
let gicon = new Gio.ThemedIcon({ name: this._volumeMenu.getIcon() });
|
||||
let level = this._volumeMenu.getLevel();
|
||||
let maxLevel = this._volumeMenu.getMaxLevel();
|
||||
Main.osdWindowManager.show(-1, gicon, null, level, maxLevel);
|
||||
|
@@ -485,7 +485,6 @@ var UnlockDialog = GObject.registerClass({
|
||||
this._gdmClient = new Gdm.Client();
|
||||
|
||||
this._adjustment = new St.Adjustment({
|
||||
actor: this,
|
||||
lower: 0,
|
||||
upper: 2,
|
||||
page_size: 1,
|
||||
@@ -525,10 +524,6 @@ var UnlockDialog = GObject.registerClass({
|
||||
|
||||
this._bgManagers = [];
|
||||
|
||||
const themeContext = St.ThemeContext.get_for_stage(global.stage);
|
||||
this._scaleChangedId = themeContext.connect('notify::scale-factor',
|
||||
() => this._updateBackgroundEffects());
|
||||
|
||||
this._updateBackgrounds();
|
||||
this._monitorsChangedId =
|
||||
Main.layoutManager.connect('monitors-changed', this._updateBackgrounds.bind(this));
|
||||
@@ -573,9 +568,11 @@ var UnlockDialog = GObject.registerClass({
|
||||
|
||||
this._screenSaverSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.screensaver' });
|
||||
|
||||
this._userSwitchEnabledId = 0;
|
||||
this._userSwitchEnabledId = this._screenSaverSettings.connect('changed::user-switch-enabled',
|
||||
this._updateUserSwitchVisibility.bind(this));
|
||||
|
||||
this._userLoadedId = 0;
|
||||
this._userLoadedId = this._user.connect('notify::is-loaded',
|
||||
this._updateUserSwitchVisibility.bind(this));
|
||||
|
||||
@@ -629,7 +626,6 @@ var UnlockDialog = GObject.registerClass({
|
||||
y: monitor.y,
|
||||
width: monitor.width,
|
||||
height: monitor.height,
|
||||
effect: new Shell.BlurEffect({ name: 'blur' }),
|
||||
});
|
||||
|
||||
let bgManager = new Background.BackgroundManager({
|
||||
@@ -641,17 +637,19 @@ var UnlockDialog = GObject.registerClass({
|
||||
this._bgManagers.push(bgManager);
|
||||
|
||||
this._backgroundGroup.add_child(widget);
|
||||
}
|
||||
|
||||
_updateBackgroundEffects() {
|
||||
const themeContext = St.ThemeContext.get_for_stage(global.stage);
|
||||
|
||||
for (const widget of this._backgroundGroup) {
|
||||
widget.get_effect('blur').set({
|
||||
brightness: BLUR_BRIGHTNESS,
|
||||
sigma: BLUR_SIGMA * themeContext.scale_factor,
|
||||
});
|
||||
}
|
||||
let effect = new Shell.BlurEffect({
|
||||
brightness: BLUR_BRIGHTNESS,
|
||||
sigma: BLUR_SIGMA * themeContext.scale_factor,
|
||||
});
|
||||
|
||||
this._scaleChangedId = themeContext.connect('notify::scale-factor', () => {
|
||||
effect.sigma = BLUR_SIGMA * themeContext.scale_factor;
|
||||
});
|
||||
|
||||
widget.add_effect(effect);
|
||||
}
|
||||
|
||||
_updateBackgrounds() {
|
||||
@@ -663,7 +661,6 @@ var UnlockDialog = GObject.registerClass({
|
||||
|
||||
for (let i = 0; i < Main.layoutManager.monitors.length; i++)
|
||||
this._createBackground(i);
|
||||
this._updateBackgroundEffects();
|
||||
}
|
||||
|
||||
_ensureAuthPrompt() {
|
||||
|
@@ -299,6 +299,10 @@ var ViewSelector = GObject.registerClass({
|
||||
Main.overview.fadeInDesktop();
|
||||
}
|
||||
|
||||
setWorkspacesFullGeometry(geom) {
|
||||
this._workspacesDisplay.setWorkspacesFullGeometry(geom);
|
||||
}
|
||||
|
||||
vfunc_hide() {
|
||||
this.reset();
|
||||
this._workspacesDisplay.hide();
|
||||
|
@@ -42,11 +42,6 @@ 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) {
|
||||
@@ -906,23 +901,46 @@ var WindowManager = class {
|
||||
global.display.connect('init-xserver', (display, task) => {
|
||||
IBusManager.getIBusManager().restartDaemon(['--xim']);
|
||||
|
||||
/* 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;
|
||||
});
|
||||
try {
|
||||
if (!Shell.util_start_systemd_unit('gsd-xsettings.target', 'fail'))
|
||||
log('Not starting gsd-xsettings; waiting for gnome-session to do so');
|
||||
|
||||
this._startX11Services(task, cancellable);
|
||||
/* 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);
|
||||
}
|
||||
|
||||
return true;
|
||||
});
|
||||
global.display.connect('x11-display-closing', () => {
|
||||
if (!Meta.is_wayland_compositor())
|
||||
return;
|
||||
|
||||
this._stopX11Services(null);
|
||||
|
||||
try {
|
||||
Shell.util_stop_systemd_unit('gsd-xsettings.target', 'fail');
|
||||
} catch (e) {
|
||||
log('Error stopping gsd-xsettings: %s'.format(e.message));
|
||||
}
|
||||
IBusManager.getIBusManager().restartDaemon();
|
||||
});
|
||||
|
||||
@@ -990,36 +1008,6 @@ 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));
|
||||
@@ -1812,7 +1800,8 @@ var WindowManager = class {
|
||||
w.window.get_parent().remove_child(w.window);
|
||||
w.parent.add_child(w.window);
|
||||
|
||||
if (!w.window.get_meta_window().get_workspace().active)
|
||||
if (w.window.get_meta_window().get_workspace() !=
|
||||
global.workspace_manager.get_active_workspace())
|
||||
w.window.hide();
|
||||
}
|
||||
switchData.container.destroy();
|
||||
@@ -1996,7 +1985,7 @@ var WindowManager = class {
|
||||
duration,
|
||||
mode: Clutter.AnimationMode.EASE_OUT_CUBIC,
|
||||
onComplete: () => {
|
||||
if (!newWs.active)
|
||||
if (newWs !== activeWorkspace)
|
||||
this.actionMoveWorkspace(newWs);
|
||||
this._finishWorkspaceSwitch(switchData);
|
||||
},
|
||||
@@ -2196,7 +2185,10 @@ var WindowManager = class {
|
||||
if (!Main.sessionMode.hasWorkspaces)
|
||||
return;
|
||||
|
||||
if (!workspace.active)
|
||||
let workspaceManager = global.workspace_manager;
|
||||
let activeWorkspace = workspaceManager.get_active_workspace();
|
||||
|
||||
if (activeWorkspace != workspace)
|
||||
workspace.activate(global.get_current_time());
|
||||
}
|
||||
|
||||
@@ -2204,7 +2196,10 @@ var WindowManager = class {
|
||||
if (!Main.sessionMode.hasWorkspaces)
|
||||
return;
|
||||
|
||||
if (!workspace.active) {
|
||||
let workspaceManager = global.workspace_manager;
|
||||
let activeWorkspace = workspaceManager.get_active_workspace();
|
||||
|
||||
if (activeWorkspace != workspace) {
|
||||
// This won't have any effect for "always sticky" windows
|
||||
// (like desktop windows or docks)
|
||||
|
||||
|
@@ -67,12 +67,8 @@ var WindowPreviewLayout = GObject.registerClass({
|
||||
vfunc_allocate(container, box) {
|
||||
// If the scale isn't 1, we weren't allocated our preferred size
|
||||
// and have to scale the children allocations accordingly.
|
||||
const scaleX = this._boundingBox.get_width() > 0
|
||||
? box.get_width() / this._boundingBox.get_width()
|
||||
: 1;
|
||||
const scaleY = this._boundingBox.get_height() > 0
|
||||
? box.get_height() / this._boundingBox.get_height()
|
||||
: 1;
|
||||
const scaleX = box.get_width() / this._boundingBox.get_width();
|
||||
const scaleY = box.get_height() / this._boundingBox.get_height();
|
||||
|
||||
const childBox = new Clutter.ActorBox();
|
||||
|
||||
@@ -97,7 +93,7 @@ var WindowPreviewLayout = GObject.registerClass({
|
||||
|
||||
child.allocate(childBox);
|
||||
} else {
|
||||
child.allocate_preferred_size(0, 0);
|
||||
child.allocate_preferred_size();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -189,12 +185,6 @@ var WindowPreviewLayout = GObject.registerClass({
|
||||
});
|
||||
|
||||
var WindowPreview = GObject.registerClass({
|
||||
Properties: {
|
||||
'overlay-enabled': GObject.ParamSpec.boolean(
|
||||
'overlay-enabled', 'overlay-enabled', 'overlay-enabled',
|
||||
GObject.ParamFlags.READWRITE,
|
||||
true),
|
||||
},
|
||||
Signals: {
|
||||
'drag-begin': {},
|
||||
'drag-cancelled': {},
|
||||
@@ -229,6 +219,7 @@ var WindowPreview = GObject.registerClass({
|
||||
|
||||
this._delegate = this;
|
||||
|
||||
this.slotId = 0;
|
||||
this._stackAbove = null;
|
||||
|
||||
this._windowContainer.layout_manager.connect(
|
||||
@@ -242,6 +233,8 @@ var WindowPreview = GObject.registerClass({
|
||||
this._windowActor.connect('destroy', () => this.destroy());
|
||||
|
||||
this._updateAttachedDialogs();
|
||||
this.x = this.boundingBox.x;
|
||||
this.y = this.boundingBox.y;
|
||||
|
||||
let clickAction = new Clutter.ClickAction();
|
||||
clickAction.connect('clicked', () => this._activate());
|
||||
@@ -260,7 +253,6 @@ var WindowPreview = GObject.registerClass({
|
||||
this.inDrag = false;
|
||||
|
||||
this._selected = false;
|
||||
this._overlayEnabled = true;
|
||||
this._closeRequested = false;
|
||||
this._idleHideOverlayId = 0;
|
||||
|
||||
@@ -353,14 +345,6 @@ var WindowPreview = GObject.registerClass({
|
||||
this.add_child(this._border);
|
||||
this.add_child(this._title);
|
||||
this.add_child(this._closeButton);
|
||||
|
||||
this.connect('notify::realized', () => {
|
||||
if (!this.realized)
|
||||
return;
|
||||
|
||||
this._border.ensure_style();
|
||||
this._title.ensure_style();
|
||||
});
|
||||
}
|
||||
|
||||
vfunc_get_preferred_width(forHeight) {
|
||||
@@ -415,6 +399,8 @@ var WindowPreview = GObject.registerClass({
|
||||
}
|
||||
|
||||
chromeHeights() {
|
||||
this._border.ensure_style();
|
||||
this._title.ensure_style();
|
||||
const [, closeButtonHeight] = this._closeButton.get_preferred_height(-1);
|
||||
const [, titleHeight] = this._title.get_preferred_height(-1);
|
||||
|
||||
@@ -427,6 +413,7 @@ var WindowPreview = GObject.registerClass({
|
||||
}
|
||||
|
||||
chromeWidths() {
|
||||
this._border.ensure_style();
|
||||
const [, closeButtonWidth] = this._closeButton.get_preferred_width(-1);
|
||||
|
||||
const leftOversize = this._closeButtonSide === St.Side.LEFT
|
||||
@@ -440,9 +427,6 @@ var WindowPreview = GObject.registerClass({
|
||||
}
|
||||
|
||||
showOverlay(animate) {
|
||||
if (!this._overlayEnabled)
|
||||
return;
|
||||
|
||||
const ongoingTransition = this._border.get_transition('opacity');
|
||||
|
||||
// Don't do anything if we're fully visible already
|
||||
@@ -578,25 +562,6 @@ var WindowPreview = GObject.registerClass({
|
||||
});
|
||||
}
|
||||
|
||||
// eslint-disable-next-line camelcase
|
||||
get overlay_enabled() {
|
||||
return this._overlayEnabled;
|
||||
}
|
||||
|
||||
// eslint-disable-next-line camelcase
|
||||
set overlay_enabled(enabled) {
|
||||
if (this._overlayEnabled === enabled)
|
||||
return;
|
||||
|
||||
this._overlayEnabled = enabled;
|
||||
this.notify('overlay-enabled');
|
||||
|
||||
if (!enabled)
|
||||
this.hideOverlay(false);
|
||||
else if (this['has-pointer'] || global.stage.key_focus === this)
|
||||
this.showOverlay(true);
|
||||
}
|
||||
|
||||
// Find the actor just below us, respecting reparenting done by DND code
|
||||
_getActualStackAbove() {
|
||||
if (this._stackAbove == null)
|
||||
|
1069
js/ui/workspace.js
1069
js/ui/workspace.js
File diff suppressed because it is too large
Load Diff
@@ -11,10 +11,7 @@ var DISPLAY_TIMEOUT = 600;
|
||||
var WorkspaceSwitcherPopupList = GObject.registerClass(
|
||||
class WorkspaceSwitcherPopupList extends St.Widget {
|
||||
_init() {
|
||||
super._init({
|
||||
style_class: 'workspace-switcher',
|
||||
offscreen_redirect: Clutter.OffscreenRedirect.ALWAYS,
|
||||
});
|
||||
super._init({ style_class: 'workspace-switcher' });
|
||||
|
||||
this._itemSpacing = 0;
|
||||
this._childHeight = 0;
|
||||
|
@@ -549,7 +549,9 @@ var WorkspaceThumbnail = GObject.registerClass({
|
||||
return;
|
||||
|
||||
// a click on the already current workspace should go back to the main view
|
||||
if (this.metaWorkspace.active)
|
||||
let workspaceManager = global.workspace_manager;
|
||||
let activeWorkspace = workspaceManager.get_active_workspace();
|
||||
if (this.metaWorkspace == activeWorkspace)
|
||||
Main.overview.hide();
|
||||
else
|
||||
this.metaWorkspace.activate(time);
|
||||
|
@@ -7,7 +7,6 @@ const Main = imports.ui.main;
|
||||
const SwipeTracker = imports.ui.swipeTracker;
|
||||
const Workspace = imports.ui.workspace;
|
||||
|
||||
var { ANIMATION_TIME } = imports.ui.overview;
|
||||
var WORKSPACE_SWITCH_TIME = 250;
|
||||
var SCROLL_TIMEOUT_TIME = 150;
|
||||
|
||||
@@ -22,18 +21,18 @@ var WorkspacesViewBase = GObject.registerClass({
|
||||
GTypeFlags: GObject.TypeFlags.ABSTRACT,
|
||||
}, class WorkspacesViewBase extends St.Widget {
|
||||
_init(monitorIndex) {
|
||||
const { x, y, width, height } =
|
||||
Main.layoutManager.getWorkAreaForMonitor(monitorIndex);
|
||||
|
||||
super._init({
|
||||
style_class: 'workspaces-view',
|
||||
x, y, width, height,
|
||||
});
|
||||
super._init({ style_class: 'workspaces-view', reactive: true });
|
||||
this.connect('destroy', this._onDestroy.bind(this));
|
||||
global.focus_manager.add_group(this);
|
||||
|
||||
// The actor itself isn't a drop target, so we don't want to pick on its area
|
||||
this.set_size(0, 0);
|
||||
|
||||
this._monitorIndex = monitorIndex;
|
||||
|
||||
this._fullGeometry = null;
|
||||
this._actualGeometry = null;
|
||||
|
||||
this._inDrag = false;
|
||||
this._windowDragBeginId = Main.overview.connect('window-drag-begin', this._dragBegin.bind(this));
|
||||
this._windowDragEndId = Main.overview.connect('window-drag-end', this._dragEnd.bind(this));
|
||||
@@ -52,19 +51,24 @@ var WorkspacesViewBase = GObject.registerClass({
|
||||
}
|
||||
}
|
||||
|
||||
_dragBegin() {
|
||||
_dragBegin(overview, window) {
|
||||
this._inDrag = true;
|
||||
this._setReservedSlot(window);
|
||||
}
|
||||
|
||||
_dragEnd() {
|
||||
this._inDrag = false;
|
||||
this._setReservedSlot(null);
|
||||
}
|
||||
|
||||
vfunc_allocate(box) {
|
||||
this.set_allocation(box);
|
||||
setFullGeometry(geom) {
|
||||
this._fullGeometry = geom;
|
||||
this._syncFullGeometry();
|
||||
}
|
||||
|
||||
for (const child of this)
|
||||
child.allocate_available_size(0, 0, box.get_width(), box.get_height());
|
||||
setActualGeometry(geom) {
|
||||
this._actualGeometry = geom;
|
||||
this._syncActualGeometry();
|
||||
}
|
||||
});
|
||||
|
||||
@@ -79,8 +83,9 @@ class WorkspacesView extends WorkspacesViewBase {
|
||||
this._gestureActive = false; // touch(pad) gestures
|
||||
|
||||
this._scrollAdjustment = scrollAdjustment;
|
||||
this._onScrollId = this._scrollAdjustment.connect('notify::value',
|
||||
this._updateScrollPosition.bind(this));
|
||||
this._onScrollId =
|
||||
this._scrollAdjustment.connect('notify::value',
|
||||
this._onScroll.bind(this));
|
||||
|
||||
this._workspaces = [];
|
||||
this._updateWorkspaces();
|
||||
@@ -92,42 +97,34 @@ class WorkspacesView extends WorkspacesViewBase {
|
||||
this._workspaces.sort((a, b) => {
|
||||
return a.metaWorkspace.index() - b.metaWorkspace.index();
|
||||
});
|
||||
this._workspaces.forEach(
|
||||
(ws, i) => this.set_child_at_index(ws, i));
|
||||
this._updateWorkspaceActors(false);
|
||||
});
|
||||
|
||||
this._overviewShownId = Main.overview.connect('shown', () => {
|
||||
this.clip_to_allocation = true;
|
||||
});
|
||||
|
||||
this._overviewShownId =
|
||||
Main.overview.connect('shown', () => {
|
||||
this.set_clip(this._fullGeometry.x, this._fullGeometry.y,
|
||||
this._fullGeometry.width, this._fullGeometry.height);
|
||||
});
|
||||
|
||||
this._switchWorkspaceNotifyId =
|
||||
global.window_manager.connect('switch-workspace',
|
||||
this._activeWorkspaceChanged.bind(this));
|
||||
}
|
||||
|
||||
vfunc_allocate(box) {
|
||||
this.set_allocation(box);
|
||||
_setReservedSlot(window) {
|
||||
for (let i = 0; i < this._workspaces.length; i++)
|
||||
this._workspaces[i].setReservedSlot(window);
|
||||
}
|
||||
|
||||
if (this.get_n_children() === 0)
|
||||
return;
|
||||
_syncFullGeometry() {
|
||||
for (let i = 0; i < this._workspaces.length; i++)
|
||||
this._workspaces[i].setFullGeometry(this._fullGeometry);
|
||||
}
|
||||
|
||||
const { workspaceManager } = global;
|
||||
const { nWorkspaces } = workspaceManager;
|
||||
|
||||
const vertical = workspaceManager.layout_rows === -1;
|
||||
const rtl = this.text_direction === Clutter.TextDirection.RTL;
|
||||
|
||||
this._workspaces.forEach((child, index) => {
|
||||
if (rtl && !vertical)
|
||||
index = nWorkspaces - index - 1;
|
||||
|
||||
const x = vertical ? 0 : index * this.width;
|
||||
const y = vertical ? index * this.height : 0;
|
||||
|
||||
child.allocate_available_size(x, y, box.get_width(), box.get_height());
|
||||
});
|
||||
|
||||
this._updateScrollPosition();
|
||||
_syncActualGeometry() {
|
||||
for (let i = 0; i < this._workspaces.length; i++)
|
||||
this._workspaces[i].setActualGeometry(this._actualGeometry);
|
||||
}
|
||||
|
||||
getActiveWorkspace() {
|
||||
@@ -143,11 +140,11 @@ class WorkspacesView extends WorkspacesViewBase {
|
||||
else
|
||||
this._workspaces[w].fadeToOverview();
|
||||
}
|
||||
this._updateScrollPosition();
|
||||
this._updateWorkspaceActors(false);
|
||||
}
|
||||
|
||||
animateFromOverview(animationType) {
|
||||
this.clip_to_allocation = false;
|
||||
this.remove_clip();
|
||||
|
||||
for (let w = 0; w < this._workspaces.length; w++) {
|
||||
if (animationType == AnimationType.ZOOM)
|
||||
@@ -162,22 +159,49 @@ class WorkspacesView extends WorkspacesViewBase {
|
||||
this._workspaces[i].syncStacking(stackIndices);
|
||||
}
|
||||
|
||||
_scrollToActive() {
|
||||
const { workspaceManager } = global;
|
||||
const active = workspaceManager.get_active_workspace_index();
|
||||
// Update workspace actors parameters
|
||||
// @showAnimation: iff %true, transition between states
|
||||
_updateWorkspaceActors(showAnimation) {
|
||||
let workspaceManager = global.workspace_manager;
|
||||
let active = workspaceManager.get_active_workspace_index();
|
||||
|
||||
this._animating = true;
|
||||
this._updateVisibility();
|
||||
this._animating = showAnimation;
|
||||
|
||||
this._scrollAdjustment.remove_transition('value');
|
||||
this._scrollAdjustment.ease(active, {
|
||||
duration: WORKSPACE_SWITCH_TIME,
|
||||
mode: Clutter.AnimationMode.EASE_OUT_CUBIC,
|
||||
onComplete: () => {
|
||||
this._animating = false;
|
||||
this._updateVisibility();
|
||||
},
|
||||
});
|
||||
for (let w = 0; w < this._workspaces.length; w++) {
|
||||
let workspace = this._workspaces[w];
|
||||
|
||||
workspace.remove_all_transitions();
|
||||
|
||||
let params = {};
|
||||
if (workspaceManager.layout_rows == -1)
|
||||
params.y = (w - active) * this._fullGeometry.height;
|
||||
else if (this.text_direction == Clutter.TextDirection.RTL)
|
||||
params.x = (active - w) * this._fullGeometry.width;
|
||||
else
|
||||
params.x = (w - active) * this._fullGeometry.width;
|
||||
|
||||
if (showAnimation) {
|
||||
let easeParams = Object.assign(params, {
|
||||
duration: WORKSPACE_SWITCH_TIME,
|
||||
mode: Clutter.AnimationMode.EASE_OUT_CUBIC,
|
||||
});
|
||||
// we have to call _updateVisibility() once before the
|
||||
// animation and once afterwards - it does not really
|
||||
// matter which tween we use, so we pick the first one ...
|
||||
if (w == 0) {
|
||||
this._updateVisibility();
|
||||
easeParams.onComplete = () => {
|
||||
this._animating = false;
|
||||
this._updateVisibility();
|
||||
};
|
||||
}
|
||||
workspace.ease(easeParams);
|
||||
} else {
|
||||
workspace.set(params);
|
||||
if (w == 0)
|
||||
this._updateVisibility();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_updateVisibility() {
|
||||
@@ -218,14 +242,19 @@ class WorkspacesView extends WorkspacesViewBase {
|
||||
}
|
||||
}
|
||||
|
||||
this._updateScrollPosition();
|
||||
if (this._fullGeometry) {
|
||||
this._updateWorkspaceActors(false);
|
||||
this._syncFullGeometry();
|
||||
}
|
||||
if (this._actualGeometry)
|
||||
this._syncActualGeometry();
|
||||
}
|
||||
|
||||
_activeWorkspaceChanged(_wm, _from, _to, _direction) {
|
||||
if (this._scrolling)
|
||||
return;
|
||||
|
||||
this._scrollToActive();
|
||||
this._updateWorkspaceActors(true);
|
||||
}
|
||||
|
||||
_onDestroy() {
|
||||
@@ -241,33 +270,27 @@ class WorkspacesView extends WorkspacesViewBase {
|
||||
|
||||
startTouchGesture() {
|
||||
this._gestureActive = true;
|
||||
|
||||
this._updateVisibility();
|
||||
}
|
||||
|
||||
endTouchGesture() {
|
||||
this._gestureActive = false;
|
||||
|
||||
// Make sure title captions etc are shown as necessary
|
||||
this._scrollToActive();
|
||||
this._updateWorkspaceActors(true);
|
||||
this._updateVisibility();
|
||||
}
|
||||
|
||||
// sync the workspaces' positions to the value of the scroll adjustment
|
||||
// and change the active workspace if appropriate
|
||||
_updateScrollPosition() {
|
||||
if (!this.has_allocation())
|
||||
_onScroll(adj) {
|
||||
if (adj.get_transition('value') !== null && !this._gestureActive)
|
||||
return;
|
||||
|
||||
const adj = this._scrollAdjustment;
|
||||
const allowSwitch =
|
||||
adj.get_transition('value') === null && !this._gestureActive;
|
||||
|
||||
let workspaceManager = global.workspace_manager;
|
||||
let active = workspaceManager.get_active_workspace_index();
|
||||
let current = Math.round(adj.value);
|
||||
|
||||
if (allowSwitch && active !== current) {
|
||||
if (active != current && !this._gestureActive) {
|
||||
if (!this._workspaces[current]) {
|
||||
// The current workspace was destroyed. This could happen
|
||||
// when you are on the last empty workspace, and consolidate
|
||||
@@ -284,16 +307,36 @@ class WorkspacesView extends WorkspacesViewBase {
|
||||
if (adj.upper == 1)
|
||||
return;
|
||||
|
||||
const vertical = workspaceManager.layout_rows === -1;
|
||||
const rtl = this.text_direction === Clutter.TextDirection.RTL;
|
||||
const progress = vertical || !rtl
|
||||
? adj.value : adj.upper - adj.value;
|
||||
let last = this._workspaces.length - 1;
|
||||
|
||||
for (const ws of this._workspaces) {
|
||||
if (vertical)
|
||||
ws.translation_y = -progress * this.height;
|
||||
else
|
||||
ws.translation_x = -progress * this.width;
|
||||
if (workspaceManager.layout_rows == -1) {
|
||||
let firstWorkspaceY = this._workspaces[0].y;
|
||||
let lastWorkspaceY = this._workspaces[last].y;
|
||||
let workspacesHeight = lastWorkspaceY - firstWorkspaceY;
|
||||
|
||||
let currentY = firstWorkspaceY;
|
||||
let newY = -Math.round(adj.value / (adj.upper - 1) * workspacesHeight);
|
||||
|
||||
let dy = newY - currentY;
|
||||
|
||||
for (let i = 0; i < this._workspaces.length; i++) {
|
||||
this._workspaces[i].visible = Math.abs(i - adj.value) <= 1;
|
||||
this._workspaces[i].y += dy;
|
||||
}
|
||||
} else {
|
||||
let firstWorkspaceX = this._workspaces[0].x;
|
||||
let lastWorkspaceX = this._workspaces[last].x;
|
||||
let workspacesWidth = lastWorkspaceX - firstWorkspaceX;
|
||||
|
||||
let currentX = firstWorkspaceX;
|
||||
let newX = -Math.round(adj.value / (adj.upper - 1) * workspacesWidth);
|
||||
|
||||
let dx = newX - currentX;
|
||||
|
||||
for (let i = 0; i < this._workspaces.length; i++) {
|
||||
this._workspaces[i].visible = Math.abs(i - adj.value) <= 1;
|
||||
this._workspaces[i].x += dx;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -306,6 +349,18 @@ class ExtraWorkspaceView extends WorkspacesViewBase {
|
||||
this.add_actor(this._workspace);
|
||||
}
|
||||
|
||||
_setReservedSlot(window) {
|
||||
this._workspace.setReservedSlot(window);
|
||||
}
|
||||
|
||||
_syncFullGeometry() {
|
||||
this._workspace.setFullGeometry(this._fullGeometry);
|
||||
}
|
||||
|
||||
_syncActualGeometry() {
|
||||
this._workspace.setActualGeometry(this._actualGeometry);
|
||||
}
|
||||
|
||||
getActiveWorkspace() {
|
||||
return this._workspace;
|
||||
}
|
||||
@@ -383,10 +438,6 @@ class WorkspacesDisplay extends St.Widget {
|
||||
this._windowDragEndId =
|
||||
Main.overview.connect('window-drag-begin',
|
||||
this._windowDragEnd.bind(this));
|
||||
this._overviewShownId = Main.overview.connect('shown', () => {
|
||||
this._inWindowFade = false;
|
||||
this._syncWorkspacesActualGeometry();
|
||||
});
|
||||
|
||||
this._primaryIndex = Main.layoutManager.primaryIndex;
|
||||
this._workspacesViews = [];
|
||||
@@ -401,11 +452,10 @@ class WorkspacesDisplay extends St.Widget {
|
||||
this._scrollEventId = 0;
|
||||
this._keyPressEventId = 0;
|
||||
this._scrollTimeoutId = 0;
|
||||
this._syncActualGeometryLater = 0;
|
||||
|
||||
this._actualGeometry = null;
|
||||
this._fullGeometry = null;
|
||||
this._inWindowDrag = false;
|
||||
this._inWindowFade = false;
|
||||
|
||||
this._gestureActive = false; // touch(pad) gestures
|
||||
this._canScroll = true; // limiting scrolling speed
|
||||
@@ -426,11 +476,6 @@ class WorkspacesDisplay extends St.Widget {
|
||||
this._parentSetLater = 0;
|
||||
}
|
||||
|
||||
if (this._syncActualGeometryLater) {
|
||||
Meta.later_remove(this._syncActualGeometryLater);
|
||||
this._syncActualGeometryLater = 0;
|
||||
}
|
||||
|
||||
if (this._scrollTimeoutId !== 0) {
|
||||
GLib.source_remove(this._scrollTimeoutId);
|
||||
this._scrollTimeoutId = 0;
|
||||
@@ -440,7 +485,6 @@ class WorkspacesDisplay extends St.Widget {
|
||||
global.workspace_manager.disconnect(this._reorderWorkspacesdId);
|
||||
Main.overview.disconnect(this._windowDragBeginId);
|
||||
Main.overview.disconnect(this._windowDragEndId);
|
||||
Main.overview.disconnect(this._overviewShownId);
|
||||
}
|
||||
|
||||
_windowDragBegin() {
|
||||
@@ -464,11 +508,25 @@ class WorkspacesDisplay extends St.Widget {
|
||||
workspaceManager.get_active_workspace_index();
|
||||
}
|
||||
|
||||
_activeWorkspaceChanged(_wm, _from, to, _direction) {
|
||||
_activeWorkspaceChanged(_wm, _from, _to, _direction) {
|
||||
if (this._gestureActive)
|
||||
return;
|
||||
|
||||
this._scrollAdjustment.ease(to, {
|
||||
this._scrollToActive();
|
||||
}
|
||||
|
||||
_scrollToActive() {
|
||||
let workspaceManager = global.workspace_manager;
|
||||
let active = workspaceManager.get_active_workspace_index();
|
||||
|
||||
this._updateScrollAdjustment(active);
|
||||
}
|
||||
|
||||
_updateScrollAdjustment(index) {
|
||||
if (this._gestureActive)
|
||||
return;
|
||||
|
||||
this._scrollAdjustment.ease(index, {
|
||||
mode: Clutter.AnimationMode.EASE_OUT_CUBIC,
|
||||
duration: WORKSPACE_SWITCH_TIME,
|
||||
});
|
||||
@@ -506,8 +564,11 @@ class WorkspacesDisplay extends St.Widget {
|
||||
for (let i = 0; i < this._workspacesViews.length; i++)
|
||||
this._workspacesViews[i].startTouchGesture();
|
||||
|
||||
let monitors = Main.layoutManager.monitors;
|
||||
let geometry = monitor === this._primaryIndex
|
||||
? this._fullGeometry : monitors[monitor];
|
||||
let distance = global.workspace_manager.layout_rows === -1
|
||||
? this.height : this.width;
|
||||
? geometry.height : geometry.width;
|
||||
|
||||
let progress = adjustment.value / adjustment.page_size;
|
||||
let points = Array.from(
|
||||
@@ -527,13 +588,14 @@ class WorkspacesDisplay extends St.Widget {
|
||||
this._clickAction.release();
|
||||
|
||||
let workspaceManager = global.workspace_manager;
|
||||
let activeWorkspace = workspaceManager.get_active_workspace();
|
||||
let newWs = workspaceManager.get_workspace_by_index(endProgress);
|
||||
|
||||
this._scrollAdjustment.ease(endProgress, {
|
||||
mode: Clutter.AnimationMode.EASE_OUT_CUBIC,
|
||||
duration,
|
||||
onComplete: () => {
|
||||
if (!newWs.active)
|
||||
if (newWs !== activeWorkspace)
|
||||
newWs.activate(global.get_current_time());
|
||||
this._endTouchGesture();
|
||||
},
|
||||
@@ -554,20 +616,17 @@ class WorkspacesDisplay extends St.Widget {
|
||||
this.show();
|
||||
this._updateWorkspacesViews();
|
||||
|
||||
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 (this._actualGeometry && this._fullGeometry) {
|
||||
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));
|
||||
@@ -587,17 +646,6 @@ class WorkspacesDisplay extends St.Widget {
|
||||
animationType = AnimationType.ZOOM;
|
||||
this._workspacesViews[i].animateFromOverview(animationType);
|
||||
}
|
||||
|
||||
this._inWindowFade = fadeOnPrimary;
|
||||
|
||||
const { primaryIndex } = Main.layoutManager;
|
||||
const { x, y, width, height } =
|
||||
Main.layoutManager.getWorkAreaForMonitor(primaryIndex);
|
||||
this._getPrimaryView().ease({
|
||||
x, y, width, height,
|
||||
duration: fadeOnPrimary ? 0 : ANIMATION_TIME,
|
||||
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
|
||||
});
|
||||
}
|
||||
|
||||
vfunc_hide() {
|
||||
@@ -627,7 +675,6 @@ class WorkspacesDisplay extends St.Widget {
|
||||
return;
|
||||
|
||||
this._updateWorkspacesViews();
|
||||
this._syncWorkspacesActualGeometry();
|
||||
}
|
||||
|
||||
_updateWorkspacesViews() {
|
||||
@@ -644,9 +691,19 @@ class WorkspacesDisplay extends St.Widget {
|
||||
else
|
||||
view = new WorkspacesView(i, this._scrollAdjustment);
|
||||
|
||||
// HACK: Avoid spurious allocation changes while updating views
|
||||
view.hide();
|
||||
|
||||
this._workspacesViews.push(view);
|
||||
Main.layoutManager.overviewGroup.add_actor(view);
|
||||
}
|
||||
|
||||
this._workspacesViews.forEach(v => v.show());
|
||||
|
||||
if (this._fullGeometry)
|
||||
this._syncWorkspacesFullGeometry();
|
||||
if (this._actualGeometry)
|
||||
this._syncWorkspacesActualGeometry();
|
||||
}
|
||||
|
||||
_getMonitorIndexForEvent(event) {
|
||||
@@ -693,35 +750,43 @@ class WorkspacesDisplay extends St.Widget {
|
||||
});
|
||||
}
|
||||
|
||||
// This geometry should always be the fullest geometry
|
||||
// the workspaces switcher can ever be allocated, as if
|
||||
// the sliding controls were never slid in at all.
|
||||
setWorkspacesFullGeometry(geom) {
|
||||
this._fullGeometry = geom;
|
||||
this._syncWorkspacesFullGeometry();
|
||||
}
|
||||
|
||||
_syncWorkspacesFullGeometry() {
|
||||
if (!this._workspacesViews.length)
|
||||
return;
|
||||
|
||||
let monitors = Main.layoutManager.monitors;
|
||||
for (let i = 0; i < monitors.length; i++) {
|
||||
let geometry = i == this._primaryIndex ? this._fullGeometry : monitors[i];
|
||||
this._workspacesViews[i].setFullGeometry(geometry);
|
||||
}
|
||||
}
|
||||
|
||||
_updateWorkspacesActualGeometry() {
|
||||
const [x, y] = this.get_transformed_position();
|
||||
const width = this.allocation.get_width();
|
||||
const height = this.allocation.get_height();
|
||||
|
||||
this._actualGeometry = { x, y, width, height };
|
||||
|
||||
if (this._syncActualGeometryLater > 0)
|
||||
return;
|
||||
|
||||
this._syncActualGeometryLater =
|
||||
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => {
|
||||
this._syncWorkspacesActualGeometry();
|
||||
|
||||
this._syncActualGeometryLater = 0;
|
||||
return GLib.SOURCE_REMOVE;
|
||||
});
|
||||
this._syncWorkspacesActualGeometry();
|
||||
}
|
||||
|
||||
_syncWorkspacesActualGeometry() {
|
||||
const primaryView = this._getPrimaryView();
|
||||
if (!primaryView || this._inWindowFade)
|
||||
if (!this._workspacesViews.length)
|
||||
return;
|
||||
|
||||
primaryView.ease({
|
||||
...this._actualGeometry,
|
||||
duration: Main.overview.animationInProgress ? ANIMATION_TIME : 0,
|
||||
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
|
||||
});
|
||||
let monitors = Main.layoutManager.monitors;
|
||||
for (let i = 0; i < monitors.length; i++) {
|
||||
let geometry = i === this._primaryIndex ? this._actualGeometry : monitors[i];
|
||||
this._workspacesViews[i].setActualGeometry(geometry);
|
||||
}
|
||||
}
|
||||
|
||||
_onRestacked(overview, stackIndices) {
|
||||
|
@@ -1,5 +1,5 @@
|
||||
project('gnome-shell', 'c',
|
||||
version: '3.37.90',
|
||||
version: '3.37.2',
|
||||
meson_version: '>= 0.53.0',
|
||||
license: 'GPLv2+'
|
||||
)
|
||||
@@ -25,7 +25,7 @@ gio_req = '>= 2.56.0'
|
||||
gi_req = '>= 1.49.1'
|
||||
gjs_req = '>= 1.65.1'
|
||||
gtk_req = '>= 3.15.0'
|
||||
mutter_req = '>= 3.37.90'
|
||||
mutter_req = '>= 3.37.2'
|
||||
polkit_req = '>= 0.100'
|
||||
schemas_req = '>= 3.33.1'
|
||||
startup_req = '>= 0.11'
|
||||
@@ -96,10 +96,9 @@ 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() and pipewire_dep.found()
|
||||
enable_recorder = gst_dep.found() and gst_base_dep.found()
|
||||
if enable_recorder
|
||||
recorder_deps += [gst_dep, gst_base_dep, gtk_dep, x11_dep]
|
||||
endif
|
||||
|
1
mutter
Submodule
1
mutter
Submodule
Submodule mutter added at 1551b6d386
@@ -1,3 +1 @@
|
||||
data/org.gnome.Shell@wayland.service.in
|
||||
data/org.gnome.Shell@x11.service.in
|
||||
subprojects/extensions-tool/src/templates/indicator/extension.js
|
||||
|
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-07-22 01:49+0000\n"
|
||||
"POT-Creation-Date: 2020-06-05 23:11+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,19 +92,18 @@ 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"
|
||||
@@ -128,21 +127,20 @@ 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."
|
||||
@@ -160,8 +158,7 @@ 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"
|
||||
@@ -172,8 +169,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ó."
|
||||
@@ -182,7 +179,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 xifrat o "
|
||||
"Si s'han de recordar les contrasenyes dels punts de muntatge encriptats o "
|
||||
"els sistemes de fitxers remots"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:87
|
||||
@@ -193,7 +190,7 @@ msgid ""
|
||||
"state of the checkbox."
|
||||
msgstr ""
|
||||
"El GNOME Shell us demanarà la contrasenya quan es munti un dispositiu "
|
||||
"xifrat o un sistema de fitxers remot. Si es pot desar la contrasenya per "
|
||||
"encriptat 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ó."
|
||||
@@ -229,110 +226,93 @@ 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: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
|
||||
#: data/org.gnome.shell.gschema.xml.in:119
|
||||
msgid "Keybinding to open the application menu"
|
||||
msgstr "Vinculació per a obrir el menú d'aplicació"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:131
|
||||
#: data/org.gnome.shell.gschema.xml.in:120
|
||||
msgid "Keybinding to open the application menu."
|
||||
msgstr "La vinculació per a obrir el menú d'aplicació."
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:137
|
||||
#: data/org.gnome.shell.gschema.xml.in:126
|
||||
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:138
|
||||
#: data/org.gnome.shell.gschema.xml.in:127
|
||||
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:145
|
||||
#: data/org.gnome.shell.gschema.xml.in:134
|
||||
msgid "Keybinding to open the overview"
|
||||
msgstr "Vinculació per a obrir la vista general"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:146
|
||||
#: data/org.gnome.shell.gschema.xml.in:135
|
||||
msgid "Keybinding to open the Activities Overview."
|
||||
msgstr "Vinculació per a obrir la vista general d'activitats."
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:152
|
||||
#: data/org.gnome.shell.gschema.xml.in:141
|
||||
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:153
|
||||
#: data/org.gnome.shell.gschema.xml.in:142
|
||||
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:159
|
||||
#: data/org.gnome.shell.gschema.xml.in:148
|
||||
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:160
|
||||
#: data/org.gnome.shell.gschema.xml.in:149
|
||||
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:166
|
||||
#: data/org.gnome.shell.gschema.xml.in:155
|
||||
msgid "Switch to application 1"
|
||||
msgstr "Commuta a l'aplicació 1"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:170
|
||||
#: data/org.gnome.shell.gschema.xml.in:159
|
||||
msgid "Switch to application 2"
|
||||
msgstr "Commuta a l'aplicació 2"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:174
|
||||
#: data/org.gnome.shell.gschema.xml.in:163
|
||||
msgid "Switch to application 3"
|
||||
msgstr "Commuta a l'aplicació 3"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:178
|
||||
#: data/org.gnome.shell.gschema.xml.in:167
|
||||
msgid "Switch to application 4"
|
||||
msgstr "Commuta a l'aplicació 4"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:182
|
||||
#: data/org.gnome.shell.gschema.xml.in:171
|
||||
msgid "Switch to application 5"
|
||||
msgstr "Commuta a l'aplicació 5"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:186
|
||||
#: data/org.gnome.shell.gschema.xml.in:175
|
||||
msgid "Switch to application 6"
|
||||
msgstr "Commuta a l'aplicació 6"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:190
|
||||
#: data/org.gnome.shell.gschema.xml.in:179
|
||||
msgid "Switch to application 7"
|
||||
msgstr "Commuta a l'aplicació 7"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:194
|
||||
#: data/org.gnome.shell.gschema.xml.in:183
|
||||
msgid "Switch to application 8"
|
||||
msgstr "Commuta a l'aplicació 8"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:198
|
||||
#: data/org.gnome.shell.gschema.xml.in:187
|
||||
msgid "Switch to application 9"
|
||||
msgstr "Commuta a l'aplicació 9"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:207
|
||||
#: data/org.gnome.shell.gschema.xml.in:234
|
||||
#: data/org.gnome.shell.gschema.xml.in:196
|
||||
#: data/org.gnome.shell.gschema.xml.in:223
|
||||
msgid "Limit switcher to current workspace."
|
||||
msgstr "Limita el canviador a l'espai de treball actual."
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:208
|
||||
#: data/org.gnome.shell.gschema.xml.in:197
|
||||
msgid ""
|
||||
"If true, only applications that have windows on the current workspace are "
|
||||
"shown in the switcher. Otherwise, all applications are included."
|
||||
@@ -341,21 +321,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:225
|
||||
#: data/org.gnome.shell.gschema.xml.in:214
|
||||
msgid "The application icon mode."
|
||||
msgstr "El mode d'icona de les aplicacions."
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:226
|
||||
#: data/org.gnome.shell.gschema.xml.in:215
|
||||
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:235
|
||||
#: data/org.gnome.shell.gschema.xml.in:224
|
||||
msgid ""
|
||||
"If true, only windows from the current workspace are shown in the switcher. "
|
||||
"Otherwise, all windows are included."
|
||||
@@ -363,60 +343,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:245
|
||||
#: data/org.gnome.shell.gschema.xml.in:234
|
||||
msgid "Locations"
|
||||
msgstr "Ubicacions"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:246
|
||||
#: data/org.gnome.shell.gschema.xml.in:235
|
||||
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:256
|
||||
#: data/org.gnome.shell.gschema.xml.in:245
|
||||
msgid "Automatic location"
|
||||
msgstr "Ubicació automàtica"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:257
|
||||
#: data/org.gnome.shell.gschema.xml.in:246
|
||||
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:264
|
||||
#: data/org.gnome.shell.gschema.xml.in:253
|
||||
msgid "Location"
|
||||
msgstr "Ubicació"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:265
|
||||
#: data/org.gnome.shell.gschema.xml.in:254
|
||||
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:277
|
||||
#: data/org.gnome.shell.gschema.xml.in:266
|
||||
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: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
|
||||
#: 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
|
||||
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:286
|
||||
#: data/org.gnome.shell.gschema.xml.in:275
|
||||
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:294
|
||||
#: data/org.gnome.shell.gschema.xml.in:283
|
||||
msgid "Workspaces are managed dynamically"
|
||||
msgstr "Els espais de treball es gestionen dinàmicament"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:302
|
||||
#: data/org.gnome.shell.gschema.xml.in:291
|
||||
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:310
|
||||
#: data/org.gnome.shell.gschema.xml.in:299
|
||||
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 "
|
||||
@@ -454,7 +434,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:183
|
||||
#: js/ui/endSessionDialog.js:369 js/ui/extensionDownloader.js:181
|
||||
#: 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"
|
||||
@@ -496,7 +476,7 @@ msgstr "Nom d'usuari"
|
||||
msgid "Login Window"
|
||||
msgstr "Finestra d'entrada"
|
||||
|
||||
#: js/gdm/util.js:355
|
||||
#: js/gdm/util.js:345
|
||||
msgid "Authentication error"
|
||||
msgstr "Error d'autenticació"
|
||||
|
||||
@@ -505,7 +485,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:481
|
||||
#: js/gdm/util.js:471
|
||||
msgid "(or swipe finger)"
|
||||
msgstr "(o passeu el dit)"
|
||||
|
||||
@@ -515,8 +495,7 @@ 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"
|
||||
@@ -527,8 +506,7 @@ 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"
|
||||
@@ -539,8 +517,7 @@ 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"
|
||||
@@ -551,8 +528,7 @@ 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"
|
||||
@@ -563,14 +539,12 @@ 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ó"
|
||||
@@ -746,36 +720,36 @@ msgstr "Denega l'accés"
|
||||
msgid "Grant Access"
|
||||
msgstr "Permet l'accés"
|
||||
|
||||
#: js/ui/appDisplay.js:1297
|
||||
#: js/ui/appDisplay.js:956
|
||||
msgid "Unnamed Folder"
|
||||
msgstr "Carpeta sense nom"
|
||||
|
||||
#. Translators: This is the heading of a list of open windows
|
||||
#: js/ui/appDisplay.js:2767 js/ui/panel.js:75
|
||||
#: js/ui/appDisplay.js:2215 js/ui/panel.js:75
|
||||
msgid "Open Windows"
|
||||
msgstr "Obre finestres"
|
||||
|
||||
#: js/ui/appDisplay.js:2786 js/ui/panel.js:82
|
||||
#: js/ui/appDisplay.js:2234 js/ui/panel.js:82
|
||||
msgid "New Window"
|
||||
msgstr "Finestra nova"
|
||||
|
||||
#: js/ui/appDisplay.js:2802
|
||||
#: js/ui/appDisplay.js:2250
|
||||
msgid "Launch using Integrated Graphics Card"
|
||||
msgstr "Inicia usant una targeta gràfica integrada"
|
||||
|
||||
#: js/ui/appDisplay.js:2803
|
||||
#: js/ui/appDisplay.js:2251
|
||||
msgid "Launch using Discrete Graphics Card"
|
||||
msgstr "Inicia usant una targeta gràfica discreta"
|
||||
|
||||
#: js/ui/appDisplay.js:2831 js/ui/dash.js:239
|
||||
#: js/ui/appDisplay.js:2279 js/ui/dash.js:239
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Suprimeix dels preferits"
|
||||
|
||||
#: js/ui/appDisplay.js:2837
|
||||
#: js/ui/appDisplay.js:2285
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Afegeix als preferits"
|
||||
|
||||
#: js/ui/appDisplay.js:2847 js/ui/panel.js:93
|
||||
#: js/ui/appDisplay.js:2295 js/ui/panel.js:93
|
||||
msgid "Show Details"
|
||||
msgstr "Mostra els detalls"
|
||||
|
||||
@@ -805,7 +779,7 @@ msgstr "Auriculars"
|
||||
msgid "Headset"
|
||||
msgstr "Auriculars amb micròfon"
|
||||
|
||||
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:272
|
||||
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:273
|
||||
msgid "Microphone"
|
||||
msgstr "Micròfon"
|
||||
|
||||
@@ -821,8 +795,7 @@ 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"
|
||||
@@ -832,6 +805,7 @@ 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"
|
||||
@@ -878,6 +852,7 @@ 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"
|
||||
@@ -890,6 +865,7 @@ 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"
|
||||
@@ -971,8 +947,7 @@ 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
|
||||
@@ -1007,7 +982,7 @@ msgid ""
|
||||
"“%s”."
|
||||
msgstr ""
|
||||
"Per a accedir a la xarxa sense fil «%s» calen les contrasenyes o les claus "
|
||||
"de xifratge."
|
||||
"d'encriptació."
|
||||
|
||||
#: js/ui/components/networkAgent.js:318 js/ui/components/networkAgent.js:685
|
||||
msgid "Wired 802.1X authentication"
|
||||
@@ -1068,8 +1043,7 @@ 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
|
||||
@@ -1094,6 +1068,7 @@ 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"
|
||||
@@ -1101,19 +1076,18 @@ 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"
|
||||
@@ -1129,6 +1103,7 @@ 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"
|
||||
@@ -1247,8 +1222,7 @@ 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] ""
|
||||
@@ -1319,15 +1293,15 @@ msgstr "%s (remot)"
|
||||
msgid "%s (console)"
|
||||
msgstr "%s (consola)"
|
||||
|
||||
#: js/ui/extensionDownloader.js:187
|
||||
#: js/ui/extensionDownloader.js:185
|
||||
msgid "Install"
|
||||
msgstr "Instal·la"
|
||||
|
||||
#: js/ui/extensionDownloader.js:193
|
||||
#: js/ui/extensionDownloader.js:191
|
||||
msgid "Install Extension"
|
||||
msgstr "Instal·la l'extensió"
|
||||
|
||||
#: js/ui/extensionDownloader.js:194
|
||||
#: js/ui/extensionDownloader.js:192
|
||||
#, javascript-format
|
||||
msgid "Download and install “%s” from extensions.gnome.org?"
|
||||
msgstr "Voleu baixar i instal·lar «%s» d'extensions.gnome.org?"
|
||||
@@ -1362,11 +1336,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:100
|
||||
#: js/ui/inhibitShortcutsDialog.js:98
|
||||
msgid "Deny"
|
||||
msgstr "Denega"
|
||||
|
||||
#: js/ui/inhibitShortcutsDialog.js:107
|
||||
#: js/ui/inhibitShortcutsDialog.js:105
|
||||
msgid "Allow"
|
||||
msgstr "Permet"
|
||||
|
||||
@@ -1380,8 +1354,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 "
|
||||
@@ -1400,8 +1374,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
|
||||
@@ -1435,7 +1409,7 @@ msgstr "Desactiva"
|
||||
msgid "Leave Off"
|
||||
msgstr "Deixa-ho desactivat"
|
||||
|
||||
#: js/ui/keyboard.js:225
|
||||
#: js/ui/keyboard.js:207
|
||||
msgid "Region & Language Settings"
|
||||
msgstr "Configuració de regió i idioma"
|
||||
|
||||
@@ -1497,8 +1471,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"
|
||||
@@ -1508,7 +1482,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:1476
|
||||
#: js/ui/messageTray.js:1547
|
||||
msgid "System Information"
|
||||
msgstr "Informació de l'ordinador"
|
||||
|
||||
@@ -1520,13 +1494,13 @@ msgstr "Artista desconegut"
|
||||
msgid "Unknown title"
|
||||
msgstr "Títol desconegut"
|
||||
|
||||
#: js/ui/overview.js:74
|
||||
#: js/ui/overview.js:73
|
||||
msgid "Undo"
|
||||
msgstr "Desfés"
|
||||
|
||||
#. Translators: This is the main view to select
|
||||
#. activities. See also note for "Activities" string.
|
||||
#: js/ui/overview.js:87
|
||||
#: js/ui/overview.js:86
|
||||
msgid "Overview"
|
||||
msgstr "Vista general"
|
||||
|
||||
@@ -1534,7 +1508,7 @@ msgstr "Vista general"
|
||||
#. in the search entry when no search is
|
||||
#. active; it should not exceed ~30
|
||||
#. characters.
|
||||
#: js/ui/overview.js:108
|
||||
#: js/ui/overview.js:107
|
||||
msgid "Type to search"
|
||||
msgstr "Teclegeu per a cercar"
|
||||
|
||||
@@ -1625,6 +1599,7 @@ 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
|
||||
@@ -1866,15 +1841,14 @@ msgstr "<desconegut>"
|
||||
msgid "%s Off"
|
||||
msgstr "%s apagat"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
# N.T.: p. ex. Connectat amb fil
|
||||
#. Translators: %s is a network identifier
|
||||
#: 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
|
||||
@@ -1894,23 +1868,20 @@ 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
|
||||
@@ -2013,8 +1984,7 @@ 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ó"
|
||||
@@ -2194,34 +2164,38 @@ 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:155
|
||||
#: js/ui/status/volume.js:154
|
||||
msgid "Volume changed"
|
||||
msgstr "S'ha canviat el volum"
|
||||
|
||||
#: js/ui/status/volume.js:217
|
||||
#: js/ui/status/volume.js:225
|
||||
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"
|
||||
@@ -2240,11 +2214,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:555
|
||||
#: js/ui/unlockDialog.js:550
|
||||
msgid "Unlock Window"
|
||||
msgstr "Desbloqueja la finestra"
|
||||
|
||||
#: js/ui/unlockDialog.js:564
|
||||
#: js/ui/unlockDialog.js:559
|
||||
msgid "Log in as another user"
|
||||
msgstr "Entra amb un altre usuari"
|
||||
|
||||
@@ -2268,6 +2242,7 @@ 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"
|
||||
@@ -2378,12 +2353,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:268
|
||||
#: src/shell-app.c:286
|
||||
msgctxt "program"
|
||||
msgid "Unknown"
|
||||
msgstr "Desconegut"
|
||||
|
||||
#: src/shell-app.c:519
|
||||
#: src/shell-app.c:537
|
||||
#, c-format
|
||||
msgid "Failed to launch “%s”"
|
||||
msgstr "No s'ha pogut iniciar «%s»"
|
||||
@@ -2439,8 +2414,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"
|
||||
@@ -2502,11 +2477,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"
|
||||
@@ -2539,8 +2514,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"
|
||||
@@ -2582,7 +2557,8 @@ 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"
|
||||
@@ -2957,3 +2933,4 @@ 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-07-27 06:59+0000\n"
|
||||
"PO-Revision-Date: 2020-07-29 09:47+0200\n"
|
||||
"POT-Creation-Date: 2020-06-05 23:11+0000\n"
|
||||
"PO-Revision-Date: 2020-06-08 16:06+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,112 +221,95 @@ 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: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
|
||||
#: data/org.gnome.shell.gschema.xml.in:119
|
||||
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:131
|
||||
#: data/org.gnome.shell.gschema.xml.in:120
|
||||
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:137
|
||||
#: data/org.gnome.shell.gschema.xml.in:126
|
||||
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:138
|
||||
#: data/org.gnome.shell.gschema.xml.in:127
|
||||
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:145
|
||||
#: data/org.gnome.shell.gschema.xml.in:134
|
||||
msgid "Keybinding to open the overview"
|
||||
msgstr "Asociación de teclas para la vista general"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:146
|
||||
#: data/org.gnome.shell.gschema.xml.in:135
|
||||
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:152
|
||||
#: data/org.gnome.shell.gschema.xml.in:141
|
||||
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:153
|
||||
#: data/org.gnome.shell.gschema.xml.in:142
|
||||
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:159
|
||||
#: data/org.gnome.shell.gschema.xml.in:148
|
||||
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:160
|
||||
#: data/org.gnome.shell.gschema.xml.in:149
|
||||
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:166
|
||||
#: data/org.gnome.shell.gschema.xml.in:155
|
||||
msgid "Switch to application 1"
|
||||
msgstr "Cambiar a la aplicación 1"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:170
|
||||
#: data/org.gnome.shell.gschema.xml.in:159
|
||||
msgid "Switch to application 2"
|
||||
msgstr "Cambiar a la aplicación 2"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:174
|
||||
#: data/org.gnome.shell.gschema.xml.in:163
|
||||
msgid "Switch to application 3"
|
||||
msgstr "Cambiar a la aplicación 3"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:178
|
||||
#: data/org.gnome.shell.gschema.xml.in:167
|
||||
msgid "Switch to application 4"
|
||||
msgstr "Cambiar a la aplicación 4"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:182
|
||||
#: data/org.gnome.shell.gschema.xml.in:171
|
||||
msgid "Switch to application 5"
|
||||
msgstr "Cambiar a la aplicación 5"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:186
|
||||
#: data/org.gnome.shell.gschema.xml.in:175
|
||||
msgid "Switch to application 6"
|
||||
msgstr "Cambiar a la aplicación 6"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:190
|
||||
#: data/org.gnome.shell.gschema.xml.in:179
|
||||
msgid "Switch to application 7"
|
||||
msgstr "Cambiar a la aplicación 7"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:194
|
||||
#: data/org.gnome.shell.gschema.xml.in:183
|
||||
msgid "Switch to application 8"
|
||||
msgstr "Cambiar a la aplicación 8"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:198
|
||||
#: data/org.gnome.shell.gschema.xml.in:187
|
||||
msgid "Switch to application 9"
|
||||
msgstr "Cambiar a la aplicación 9"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:207
|
||||
#: data/org.gnome.shell.gschema.xml.in:234
|
||||
#: data/org.gnome.shell.gschema.xml.in:196
|
||||
#: data/org.gnome.shell.gschema.xml.in:223
|
||||
msgid "Limit switcher to current workspace."
|
||||
msgstr "Limitar el intercambiador al área de trabajo actual."
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:208
|
||||
#: data/org.gnome.shell.gschema.xml.in:197
|
||||
msgid ""
|
||||
"If true, only applications that have windows on the current workspace are "
|
||||
"shown in the switcher. Otherwise, all applications are included."
|
||||
@@ -335,11 +318,11 @@ msgstr ""
|
||||
"trabajo actual se muestran en el selector. Si no, se incluyen todas las "
|
||||
"aplicaciones."
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:225
|
||||
#: data/org.gnome.shell.gschema.xml.in:214
|
||||
msgid "The application icon mode."
|
||||
msgstr "El modo de icono de la aplicación."
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:226
|
||||
#: data/org.gnome.shell.gschema.xml.in:215
|
||||
msgid ""
|
||||
"Configures how the windows are shown in the switcher. Valid possibilities "
|
||||
"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-"
|
||||
@@ -349,7 +332,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:235
|
||||
#: data/org.gnome.shell.gschema.xml.in:224
|
||||
msgid ""
|
||||
"If true, only windows from the current workspace are shown in the switcher. "
|
||||
"Otherwise, all windows are included."
|
||||
@@ -357,59 +340,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:245
|
||||
#: data/org.gnome.shell.gschema.xml.in:234
|
||||
msgid "Locations"
|
||||
msgstr "Ubicaciones"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:246
|
||||
#: data/org.gnome.shell.gschema.xml.in:235
|
||||
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:256
|
||||
#: data/org.gnome.shell.gschema.xml.in:245
|
||||
msgid "Automatic location"
|
||||
msgstr "Ubicación automática"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:257
|
||||
#: data/org.gnome.shell.gschema.xml.in:246
|
||||
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:264
|
||||
#: data/org.gnome.shell.gschema.xml.in:253
|
||||
msgid "Location"
|
||||
msgstr "Ubicación"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:265
|
||||
#: data/org.gnome.shell.gschema.xml.in:254
|
||||
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:277
|
||||
#: data/org.gnome.shell.gschema.xml.in:266
|
||||
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: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
|
||||
#: 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
|
||||
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:286
|
||||
#: data/org.gnome.shell.gschema.xml.in:275
|
||||
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:294
|
||||
#: data/org.gnome.shell.gschema.xml.in:283
|
||||
msgid "Workspaces are managed dynamically"
|
||||
msgstr "Las áreas de trabajo se gestionan dinámicamente"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:302
|
||||
#: data/org.gnome.shell.gschema.xml.in:291
|
||||
msgid "Workspaces only on primary monitor"
|
||||
msgstr "Áreas de trabajo solo en la pantalla principal"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:310
|
||||
#: data/org.gnome.shell.gschema.xml.in:299
|
||||
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"
|
||||
@@ -446,7 +429,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:183
|
||||
#: js/ui/endSessionDialog.js:369 js/ui/extensionDownloader.js:181
|
||||
#: 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"
|
||||
@@ -488,7 +471,7 @@ msgstr "Nombre de usuario"
|
||||
msgid "Login Window"
|
||||
msgstr "Ventana de inicio de sesión"
|
||||
|
||||
#: js/gdm/util.js:355
|
||||
#: js/gdm/util.js:345
|
||||
msgid "Authentication error"
|
||||
msgstr "Error de autenticación"
|
||||
|
||||
@@ -497,7 +480,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:481
|
||||
#: js/gdm/util.js:471
|
||||
msgid "(or swipe finger)"
|
||||
msgstr "(o pase el dedo)"
|
||||
|
||||
@@ -731,36 +714,36 @@ msgstr "Denegar acceso"
|
||||
msgid "Grant Access"
|
||||
msgstr "Conceder acceso"
|
||||
|
||||
#: js/ui/appDisplay.js:1297
|
||||
#: js/ui/appDisplay.js:956
|
||||
msgid "Unnamed Folder"
|
||||
msgstr "Carpeta sin nombre"
|
||||
|
||||
#. Translators: This is the heading of a list of open windows
|
||||
#: js/ui/appDisplay.js:2767 js/ui/panel.js:75
|
||||
#: js/ui/appDisplay.js:2215 js/ui/panel.js:75
|
||||
msgid "Open Windows"
|
||||
msgstr "Ventanas abiertas"
|
||||
|
||||
#: js/ui/appDisplay.js:2786 js/ui/panel.js:82
|
||||
#: js/ui/appDisplay.js:2234 js/ui/panel.js:82
|
||||
msgid "New Window"
|
||||
msgstr "Ventana nueva"
|
||||
|
||||
#: js/ui/appDisplay.js:2802
|
||||
#: js/ui/appDisplay.js:2250
|
||||
msgid "Launch using Integrated Graphics Card"
|
||||
msgstr "Lanzar usando la tarjeta gráfica integrada"
|
||||
|
||||
#: js/ui/appDisplay.js:2803
|
||||
#: js/ui/appDisplay.js:2251
|
||||
msgid "Launch using Discrete Graphics Card"
|
||||
msgstr "Lanzar usando la tarjeta gráfica discreta"
|
||||
|
||||
#: js/ui/appDisplay.js:2831 js/ui/dash.js:239
|
||||
#: js/ui/appDisplay.js:2279 js/ui/dash.js:239
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Quitar de los favoritos"
|
||||
|
||||
#: js/ui/appDisplay.js:2837
|
||||
#: js/ui/appDisplay.js:2285
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Añadir a los favoritos"
|
||||
|
||||
#: js/ui/appDisplay.js:2847 js/ui/panel.js:93
|
||||
#: js/ui/appDisplay.js:2295 js/ui/panel.js:93
|
||||
msgid "Show Details"
|
||||
msgstr "Mostrar detalles"
|
||||
|
||||
@@ -790,7 +773,7 @@ msgstr "Auriculares"
|
||||
msgid "Headset"
|
||||
msgstr "Manos libres"
|
||||
|
||||
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:272
|
||||
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:273
|
||||
msgid "Microphone"
|
||||
msgstr "Micrófono"
|
||||
|
||||
@@ -1094,12 +1077,14 @@ 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"
|
||||
@@ -1301,15 +1286,15 @@ msgstr "%s (remoto)"
|
||||
msgid "%s (console)"
|
||||
msgstr "%s (consola)"
|
||||
|
||||
#: js/ui/extensionDownloader.js:187
|
||||
#: js/ui/extensionDownloader.js:185
|
||||
msgid "Install"
|
||||
msgstr "Instalar"
|
||||
|
||||
#: js/ui/extensionDownloader.js:193
|
||||
#: js/ui/extensionDownloader.js:191
|
||||
msgid "Install Extension"
|
||||
msgstr "Instalar extensión"
|
||||
|
||||
#: js/ui/extensionDownloader.js:194
|
||||
#: js/ui/extensionDownloader.js:192
|
||||
#, javascript-format
|
||||
msgid "Download and install “%s” from extensions.gnome.org?"
|
||||
msgstr "¿Descargar e instalar «%s» desde extensions.gnome.org?"
|
||||
@@ -1342,11 +1327,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:100
|
||||
#: js/ui/inhibitShortcutsDialog.js:98
|
||||
msgid "Deny"
|
||||
msgstr "Denegar"
|
||||
|
||||
#: js/ui/inhibitShortcutsDialog.js:107
|
||||
#: js/ui/inhibitShortcutsDialog.js:105
|
||||
msgid "Allow"
|
||||
msgstr "Permitir"
|
||||
|
||||
@@ -1415,7 +1400,7 @@ msgstr "Apagar"
|
||||
msgid "Leave Off"
|
||||
msgstr "Dejar apagado"
|
||||
|
||||
#: js/ui/keyboard.js:225
|
||||
#: js/ui/keyboard.js:207
|
||||
msgid "Region & Language Settings"
|
||||
msgstr "Configuración de región e idioma"
|
||||
|
||||
@@ -1488,7 +1473,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:1476
|
||||
#: js/ui/messageTray.js:1547
|
||||
msgid "System Information"
|
||||
msgstr "Información del sistema"
|
||||
|
||||
@@ -1500,13 +1485,13 @@ msgstr "Artista desconocido"
|
||||
msgid "Unknown title"
|
||||
msgstr "Título desconocido"
|
||||
|
||||
#: js/ui/overview.js:74
|
||||
#: js/ui/overview.js:73
|
||||
msgid "Undo"
|
||||
msgstr "Deshacer"
|
||||
|
||||
#. Translators: This is the main view to select
|
||||
#. activities. See also note for "Activities" string.
|
||||
#: js/ui/overview.js:87
|
||||
#: js/ui/overview.js:86
|
||||
msgid "Overview"
|
||||
msgstr "Vista general"
|
||||
|
||||
@@ -1514,7 +1499,7 @@ msgstr "Vista general"
|
||||
#. in the search entry when no search is
|
||||
#. active; it should not exceed ~30
|
||||
#. characters.
|
||||
#: js/ui/overview.js:108
|
||||
#: js/ui/overview.js:107
|
||||
msgid "Type to search"
|
||||
msgstr "Escribir para buscar"
|
||||
|
||||
@@ -2168,11 +2153,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:155
|
||||
#: js/ui/status/volume.js:154
|
||||
msgid "Volume changed"
|
||||
msgstr "Volumen modificado"
|
||||
|
||||
#: js/ui/status/volume.js:217
|
||||
#: js/ui/status/volume.js:225
|
||||
msgid "Volume"
|
||||
msgstr "Volumen"
|
||||
|
||||
@@ -2218,11 +2203,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:555
|
||||
#: js/ui/unlockDialog.js:550
|
||||
msgid "Unlock Window"
|
||||
msgstr "Desbloquear ventana"
|
||||
|
||||
#: js/ui/unlockDialog.js:564
|
||||
#: js/ui/unlockDialog.js:559
|
||||
msgid "Log in as another user"
|
||||
msgstr "Iniciar sesión como otro usuario"
|
||||
|
||||
@@ -2359,12 +2344,12 @@ msgstr ""
|
||||
msgid "List possible modes"
|
||||
msgstr "Listar los modos posibles"
|
||||
|
||||
#: src/shell-app.c:268
|
||||
#: src/shell-app.c:286
|
||||
msgctxt "program"
|
||||
msgid "Unknown"
|
||||
msgstr "Desconocido"
|
||||
|
||||
#: src/shell-app.c:519
|
||||
#: src/shell-app.c:537
|
||||
#, c-format
|
||||
msgid "Failed to launch “%s”"
|
||||
msgstr "Falló al lanzar «%s»"
|
||||
|
313
po/kk.po
313
po/kk.po
@@ -1,14 +1,14 @@
|
||||
# Kazakh translation for gnome-shell.
|
||||
# Copyright (C) 2015 The gnome-shell authors.
|
||||
# This file is distributed under the same license as the gnome-shell package.
|
||||
# Baurzhan Muftakhidinov <baurthefirst@gmail.com>, 2012-2020.
|
||||
# Baurzhan Muftakhidinov <baurthefirst@gmail.com>, 2012-2019.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: master\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
|
||||
"POT-Creation-Date: 2020-06-25 04:35+0000\n"
|
||||
"PO-Revision-Date: 2020-06-27 23:27+0500\n"
|
||||
"POT-Creation-Date: 2020-06-05 23:11+0000\n"
|
||||
"PO-Revision-Date: 2020-06-15 18:37+0500\n"
|
||||
"Last-Translator: Baurzhan Muftakhidinov <baurthefirst@gmail.com>\n"
|
||||
"Language-Team: Kazakh <kk_KZ@googlegroups.com>\n"
|
||||
"Language: kk\n"
|
||||
@@ -81,10 +81,16 @@ msgstr ""
|
||||
"DisableExtension DBus тәсілдерімен де өзгертуге болады."
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:26
|
||||
#| msgid "UUIDs of extensions to enable"
|
||||
msgid "UUIDs of extensions to force disabling"
|
||||
msgstr "Мәжбүрлі сөндіру үшін кеңейтулер UUID-лары"
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:27
|
||||
#| msgid ""
|
||||
#| "GNOME Shell extensions have a UUID property; this key lists extensions "
|
||||
#| "which should be loaded. Any extension that wants to be loaded needs to be "
|
||||
#| "in this list. You can also manipulate this list with the EnableExtension "
|
||||
#| "and DisableExtension D-Bus methods on org.gnome.Shell."
|
||||
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 "
|
||||
@@ -92,11 +98,6 @@ msgid ""
|
||||
"methods on org.gnome.Shell. This key takes precedence over the “enabled-"
|
||||
"extensions” setting."
|
||||
msgstr ""
|
||||
"GNOME Shell кеңейтулерінде UUID қасиеті бар; бұл кілт сөндіру үшін "
|
||||
"кеңейтулер тізімін сақтайды, олар қазіргі режимде іске қосылған болса да. "
|
||||
"Сонымен қатар, бұл тізімді org.gnome.Shell EnableExtension және "
|
||||
"DisableExtension D-Bus тәсілдері арқылы түзетуге болады. Бұл кілт \"enabled-"
|
||||
"extensions\" баптауын үстінен басады."
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:37
|
||||
msgid "Disable user extensions"
|
||||
@@ -332,19 +333,19 @@ msgstr ""
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:234
|
||||
msgid "Locations"
|
||||
msgstr "Орналасулар"
|
||||
msgstr "Орналасу"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:235
|
||||
msgid "The locations to show in world clocks"
|
||||
msgstr "Дүниежүзілік сағаттарда көрсетілетін орналасулар"
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:245
|
||||
msgid "Automatic location"
|
||||
msgstr "Автоматты орналасу"
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:246
|
||||
msgid "Whether to fetch the current location or not"
|
||||
msgstr "Ағымдағы орналасуды алу керек пе, жоқ па"
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:253
|
||||
msgid "Location"
|
||||
@@ -352,7 +353,7 @@ msgstr "Орналасу"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:254
|
||||
msgid "The location for which to show a forecast"
|
||||
msgstr "Ауа райы болжамын көрсету үшін орналасу"
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:266
|
||||
msgid "Attach modal dialog to the parent window"
|
||||
@@ -531,20 +532,23 @@ msgstr "пайдаланушыны ауыстыру"
|
||||
|
||||
#. Translators: A list of keywords that match the lock orientation action, separated by semicolons
|
||||
#: js/misc/systemActions.js:135
|
||||
#| msgid "lock orientation;screen;rotation"
|
||||
msgid "lock orientation;unlock orientation;screen;rotation"
|
||||
msgstr ""
|
||||
"lock orientation;unlock orientation;screen;rotation;бұрылуды құлыптау;экран "
|
||||
"бұрылуы"
|
||||
|
||||
#: js/misc/systemActions.js:255
|
||||
#| msgctxt "search-result"
|
||||
#| msgid "Lock Orientation"
|
||||
msgctxt "search-result"
|
||||
msgid "Unlock Screen Rotation"
|
||||
msgstr "Экранды бұруды құлыптан босату"
|
||||
msgstr ""
|
||||
|
||||
#: js/misc/systemActions.js:256
|
||||
#| msgctxt "search-result"
|
||||
#| msgid "Lock Orientation"
|
||||
msgctxt "search-result"
|
||||
msgid "Lock Screen Rotation"
|
||||
msgstr "Экранды бұруды құлыптау"
|
||||
msgstr ""
|
||||
|
||||
#: js/misc/util.js:120
|
||||
msgid "Command not found"
|
||||
@@ -701,36 +705,38 @@ msgstr "Тыйым салу"
|
||||
msgid "Grant Access"
|
||||
msgstr "Рұқсат ету"
|
||||
|
||||
#: js/ui/appDisplay.js:903
|
||||
#: js/ui/appDisplay.js:956
|
||||
msgid "Unnamed Folder"
|
||||
msgstr "Атаусыз бума"
|
||||
|
||||
#. Translators: This is the heading of a list of open windows
|
||||
#: js/ui/appDisplay.js:2225 js/ui/panel.js:75
|
||||
#: js/ui/appDisplay.js:2215 js/ui/panel.js:75
|
||||
msgid "Open Windows"
|
||||
msgstr "Ашық терезелер"
|
||||
|
||||
#: js/ui/appDisplay.js:2244 js/ui/panel.js:82
|
||||
#: js/ui/appDisplay.js:2234 js/ui/panel.js:82
|
||||
msgid "New Window"
|
||||
msgstr "Жаңа терезе"
|
||||
|
||||
#: js/ui/appDisplay.js:2260
|
||||
#: js/ui/appDisplay.js:2250
|
||||
#| msgid "Launch using Dedicated Graphics Card"
|
||||
msgid "Launch using Integrated Graphics Card"
|
||||
msgstr "Құрамындағы графикалық картаны пайдаланып жөнелту"
|
||||
msgstr ""
|
||||
|
||||
#: js/ui/appDisplay.js:2261
|
||||
#: js/ui/appDisplay.js:2251
|
||||
#| msgid "Launch using Dedicated Graphics Card"
|
||||
msgid "Launch using Discrete Graphics Card"
|
||||
msgstr "Бөлек графикалық картаны пайдаланып жөнелту"
|
||||
msgstr ""
|
||||
|
||||
#: js/ui/appDisplay.js:2289 js/ui/dash.js:239
|
||||
#: js/ui/appDisplay.js:2279 js/ui/dash.js:239
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Таңдамалылардан өшіру"
|
||||
|
||||
#: js/ui/appDisplay.js:2295
|
||||
#: js/ui/appDisplay.js:2285
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Таңдамалыларға қосу"
|
||||
|
||||
#: js/ui/appDisplay.js:2305 js/ui/panel.js:93
|
||||
#: js/ui/appDisplay.js:2295 js/ui/panel.js:93
|
||||
msgid "Show Details"
|
||||
msgstr "Деректерді көрсету"
|
||||
|
||||
@@ -760,7 +766,7 @@ msgstr "Құлаққап"
|
||||
msgid "Headset"
|
||||
msgstr "Микрофонды құлаққап"
|
||||
|
||||
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:272
|
||||
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:273
|
||||
msgid "Microphone"
|
||||
msgstr "Микрофон"
|
||||
|
||||
@@ -912,8 +918,9 @@ msgid "External drive disconnected"
|
||||
msgstr "Сыртқы диск алынды"
|
||||
|
||||
#: js/ui/components/automountManager.js:208
|
||||
#| msgid "Unable to lock"
|
||||
msgid "Unable to unlock volume"
|
||||
msgstr "Томды босату мүмкін емес"
|
||||
msgstr ""
|
||||
|
||||
#: js/ui/components/automountManager.js:209
|
||||
msgid "The installed udisks version does not support the PIM setting"
|
||||
@@ -986,6 +993,7 @@ msgid "PIN code is needed for the mobile broadband device"
|
||||
msgstr "Сымсыз кеңжолақты құрылғы үшін PIN коды керек"
|
||||
|
||||
#: js/ui/components/networkAgent.js:334
|
||||
#| msgid "PIN: "
|
||||
msgid "PIN"
|
||||
msgstr "PIN"
|
||||
|
||||
@@ -1121,8 +1129,9 @@ msgid "Weather"
|
||||
msgstr "Ауа райы"
|
||||
|
||||
#: js/ui/dateMenu.js:653
|
||||
#| msgid "Select a location…"
|
||||
msgid "Select weather location…"
|
||||
msgstr "Ауа райы орнын таңдау…"
|
||||
msgstr ""
|
||||
|
||||
#: js/ui/endSessionDialog.js:37
|
||||
#, javascript-format
|
||||
@@ -1242,10 +1251,9 @@ msgstr ""
|
||||
"эл. желісіне жалғанып тұрғанына көз жеткізіңіз."
|
||||
|
||||
#: js/ui/endSessionDialog.js:259
|
||||
#| msgid "Running on battery power: please plug in before installing updates."
|
||||
msgid "Running on battery power: Please plug in before installing updates."
|
||||
msgstr ""
|
||||
"Батарея қорегінен жұмыс істеуде. Жаңартуларды орнату алдында эл. қорегі "
|
||||
"желісіне жалғаңыз."
|
||||
|
||||
#: js/ui/endSessionDialog.js:268
|
||||
msgid "Some applications are busy or have unsaved work"
|
||||
@@ -1281,26 +1289,30 @@ msgid "Download and install “%s” from extensions.gnome.org?"
|
||||
msgstr "extensions.gnome.org адресінен \"%s\" жүктеп алып, орнату керек пе?"
|
||||
|
||||
#: js/ui/extensionSystem.js:252
|
||||
#| msgid "No Extensions Installed"
|
||||
msgid "Extension Updates Available"
|
||||
msgstr "Кеңейту жаңартулары дайын"
|
||||
msgstr ""
|
||||
|
||||
#: js/ui/extensionSystem.js:253
|
||||
msgid "Extension updates are ready to be installed."
|
||||
msgstr "Кеңейту жаңартулары орнатылуға дайын."
|
||||
msgstr ""
|
||||
|
||||
#: js/ui/inhibitShortcutsDialog.js:79
|
||||
#| msgid "%s wants to inhibit shortcuts"
|
||||
msgid "Allow inhibiting shortcuts"
|
||||
msgstr "Пернелер жарлығын алмастыруды рұқсат ету"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: %s is an application name like "Settings"
|
||||
#: js/ui/inhibitShortcutsDialog.js:82
|
||||
#, javascript-format
|
||||
#| msgid "Application wants to inhibit shortcuts"
|
||||
msgid "The application %s wants to inhibit shortcuts"
|
||||
msgstr "%s қолданбасы пернелер жарлығын алмастырғысы келеді"
|
||||
msgstr ""
|
||||
|
||||
#: js/ui/inhibitShortcutsDialog.js:83
|
||||
#| msgid "Application wants to inhibit shortcuts"
|
||||
msgid "An application wants to inhibit shortcuts"
|
||||
msgstr "Қолданба пернелер жарлығын алмастырғысы келеді"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: %s is a keyboard shortcut like "Super+x"
|
||||
#: js/ui/inhibitShortcutsDialog.js:90
|
||||
@@ -1433,25 +1445,23 @@ msgid "Web Page"
|
||||
msgstr "Веб парағы"
|
||||
|
||||
#: js/ui/main.js:297
|
||||
#| msgid "Log in as another user"
|
||||
msgid "Logged in as a privileged user"
|
||||
msgstr "Привилегияланған пайдаланушы ретінде жүйеге кірген"
|
||||
msgstr ""
|
||||
|
||||
#: js/ui/main.js:298
|
||||
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 ""
|
||||
"Привилегияланған пайдаланушы ретінде сессияны орындаудан қауіпсіздік "
|
||||
"салдарынан аулақ болу керек. Мүмкін болса, қалыпты пайдаланушы ретінде "
|
||||
"жүйеге кіріңіз."
|
||||
|
||||
#: js/ui/main.js:337
|
||||
msgid "Screen Lock disabled"
|
||||
msgstr "Экранды блоктау сөндірілген"
|
||||
msgstr ""
|
||||
|
||||
#: js/ui/main.js:338
|
||||
msgid "Screen Locking requires the GNOME display manager."
|
||||
msgstr "Экранды блоктау GNOME дисплейлер басқарушысын талап етеді."
|
||||
msgstr ""
|
||||
|
||||
#: js/ui/messageTray.js:1547
|
||||
msgid "System Information"
|
||||
@@ -1465,13 +1475,13 @@ msgstr "Белгісіз әртіс"
|
||||
msgid "Unknown title"
|
||||
msgstr "Белгісіз атауы"
|
||||
|
||||
#: js/ui/overview.js:74
|
||||
#: js/ui/overview.js:73
|
||||
msgid "Undo"
|
||||
msgstr "Болдырмау"
|
||||
|
||||
#. Translators: This is the main view to select
|
||||
#. activities. See also note for "Activities" string.
|
||||
#: js/ui/overview.js:87
|
||||
#: js/ui/overview.js:86
|
||||
msgid "Overview"
|
||||
msgstr "Шолу"
|
||||
|
||||
@@ -1479,7 +1489,7 @@ msgstr "Шолу"
|
||||
#. in the search entry when no search is
|
||||
#. active; it should not exceed ~30
|
||||
#. characters.
|
||||
#: js/ui/overview.js:108
|
||||
#: js/ui/overview.js:107
|
||||
msgid "Type to search"
|
||||
msgstr "Іздеу үшін теріңіз"
|
||||
|
||||
@@ -1616,16 +1626,18 @@ msgid "Caps lock is on."
|
||||
msgstr "Caps lock іске қосылған."
|
||||
|
||||
#: js/ui/shellMountOperation.js:285
|
||||
#| msgid "Volume"
|
||||
msgid "Hidden Volume"
|
||||
msgstr "Жасырын том"
|
||||
msgstr ""
|
||||
|
||||
#: js/ui/shellMountOperation.js:288
|
||||
msgid "Windows System Volume"
|
||||
msgstr "Windows жүйелік томы"
|
||||
msgstr ""
|
||||
|
||||
#: js/ui/shellMountOperation.js:291
|
||||
#| msgid "Mouse Keys"
|
||||
msgid "Uses Keyfiles"
|
||||
msgstr "Кілт файлдарды қолданады"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: %s is the Disks application
|
||||
#: js/ui/shellMountOperation.js:298
|
||||
@@ -1633,7 +1645,6 @@ msgstr "Кілт файлдарды қолданады"
|
||||
msgid ""
|
||||
"To unlock a volume that uses keyfiles, use the <i>%s</i> utility instead."
|
||||
msgstr ""
|
||||
"Кілт файлдарын қолданатын томды босату үшін, <i>%s</i> утилитасын қолданыңыз."
|
||||
|
||||
#: js/ui/shellMountOperation.js:306
|
||||
msgid "PIM Number"
|
||||
@@ -1655,7 +1666,7 @@ msgstr "%s ашу"
|
||||
|
||||
#: js/ui/shellMountOperation.js:423
|
||||
msgid "The PIM must be a number or empty."
|
||||
msgstr "PIM тек сандардан тұруы, немесе бос болуы тиіс."
|
||||
msgstr ""
|
||||
|
||||
#. Translators: %s is the Disks application
|
||||
#: js/ui/shellMountOperation.js:465
|
||||
@@ -1667,7 +1678,7 @@ msgstr "%s іске қосу мүмкін емес"
|
||||
#: js/ui/shellMountOperation.js:467
|
||||
#, javascript-format
|
||||
msgid "Couldn’t find the %s application"
|
||||
msgstr "%s қолданбасы табылмады"
|
||||
msgstr ""
|
||||
|
||||
#: js/ui/status/accessibility.js:35
|
||||
msgid "Accessibility"
|
||||
@@ -1722,12 +1733,14 @@ msgid "Bluetooth Settings"
|
||||
msgstr "Bluetooth баптаулары"
|
||||
|
||||
#: js/ui/status/bluetooth.js:152
|
||||
#| msgid "Bluetooth"
|
||||
msgid "Bluetooth Off"
|
||||
msgstr "Bluetooth сөндірілген"
|
||||
msgstr ""
|
||||
|
||||
#: js/ui/status/bluetooth.js:154
|
||||
#| msgid "Bluetooth"
|
||||
msgid "Bluetooth On"
|
||||
msgstr "Bluetooth іске қосылған"
|
||||
msgstr ""
|
||||
|
||||
#: js/ui/status/brightness.js:39
|
||||
msgid "Brightness"
|
||||
@@ -1735,7 +1748,7 @@ msgstr "Жарықтылығы"
|
||||
|
||||
#: js/ui/status/dwellClick.js:13
|
||||
msgid "Single Click"
|
||||
msgstr "Дара шерту"
|
||||
msgstr ""
|
||||
|
||||
#: js/ui/status/dwellClick.js:18
|
||||
msgid "Double Click"
|
||||
@@ -1747,11 +1760,11 @@ msgstr "Тартып апару"
|
||||
|
||||
#: js/ui/status/dwellClick.js:28
|
||||
msgid "Secondary Click"
|
||||
msgstr "Екінші шерту"
|
||||
msgstr ""
|
||||
|
||||
#: js/ui/status/dwellClick.js:37
|
||||
msgid "Dwell Click"
|
||||
msgstr "Пернеде кідіртуден кейінгі сол жақпен шерту"
|
||||
msgstr ""
|
||||
|
||||
#: js/ui/status/keyboard.js:826
|
||||
msgid "Keyboard"
|
||||
@@ -1787,7 +1800,7 @@ msgstr "Іске қосу"
|
||||
|
||||
#: js/ui/status/location.js:350
|
||||
msgid "Allow location access"
|
||||
msgstr "Орналасуға қатынауды рұқсат ету"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: %s is an application name
|
||||
#: js/ui/status/location.js:352
|
||||
@@ -2127,11 +2140,11 @@ msgstr "Thunderbolt авторизация қатесі"
|
||||
msgid "Could not authorize the Thunderbolt device: %s"
|
||||
msgstr "Thunderbolt құралғысын авторизациялау мүмкін емес: %s"
|
||||
|
||||
#: js/ui/status/volume.js:155
|
||||
#: js/ui/status/volume.js:154
|
||||
msgid "Volume changed"
|
||||
msgstr "Дыбыс өзгертілді"
|
||||
|
||||
#: js/ui/status/volume.js:217
|
||||
#: js/ui/status/volume.js:225
|
||||
msgid "Volume"
|
||||
msgstr "Дыбыс деңгейі"
|
||||
|
||||
@@ -2166,16 +2179,18 @@ msgstr "Тек құрамындағы"
|
||||
#. Translators: This is a time format for a date in
|
||||
#. long format
|
||||
#: js/ui/unlockDialog.js:371
|
||||
#| msgctxt "calendar heading"
|
||||
#| msgid "%A, %B %-d"
|
||||
msgid "%A %B %-d"
|
||||
msgstr "%A %B %-d"
|
||||
|
||||
#: js/ui/unlockDialog.js:377
|
||||
msgid "Swipe up to unlock"
|
||||
msgstr "Босату үшін жоғары өткізіңіз"
|
||||
msgstr ""
|
||||
|
||||
#: js/ui/unlockDialog.js:378
|
||||
msgid "Click or press a key to unlock"
|
||||
msgstr "Босату үшін шертіңіз немесе пернені басыңыз"
|
||||
msgstr ""
|
||||
|
||||
#: js/ui/unlockDialog.js:550
|
||||
msgid "Unlock Window"
|
||||
@@ -2358,8 +2373,6 @@ msgid ""
|
||||
"GNOME Extensions handles updating extensions, configuring extension "
|
||||
"preferences and removing or disabling unwanted extensions."
|
||||
msgstr ""
|
||||
"GNOME кеңейтулері көмегімен кеңейтулерді жаңарту, баптау және оларды өшіру "
|
||||
"немесе сөндіруге болады."
|
||||
|
||||
#: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:7
|
||||
msgid "Configure GNOME Shell Extensions"
|
||||
@@ -2375,7 +2388,6 @@ msgid ""
|
||||
"If you remove the extension, you need to return to download it if you want "
|
||||
"to enable it again"
|
||||
msgstr ""
|
||||
"Кеңейтуді өшірсеңіз, оны қайта іске қосу үшін қайта жүктеп алу керек болады"
|
||||
|
||||
#: subprojects/extensions-app/js/main.js:150
|
||||
msgid "Remove"
|
||||
@@ -2389,15 +2401,15 @@ msgstr "Baurzhan Muftakhidinov <baurthefirst@gmail.com>"
|
||||
#, javascript-format
|
||||
msgid "%d extension will be updated on next login."
|
||||
msgid_plural "%d extensions will be updated on next login."
|
||||
msgstr[0] "%d кеңейту жүйеге келесі рет кірген кезде жаңартылатын болады."
|
||||
msgstr[0] ""
|
||||
|
||||
#: subprojects/extensions-app/js/main.js:461
|
||||
msgid "The extension is incompatible with the current GNOME version"
|
||||
msgstr "Бұл кеңейту ағымдағы GNOME нұсқасымен үйлеспейді"
|
||||
msgstr ""
|
||||
|
||||
#: subprojects/extensions-app/js/main.js:464
|
||||
msgid "The extension had an error"
|
||||
msgstr "Кеңейтуде қате болды"
|
||||
msgstr ""
|
||||
|
||||
#: subprojects/extensions-app/data/ui/extension-row.ui:109
|
||||
#: subprojects/extensions-tool/src/command-create.c:325
|
||||
@@ -2416,7 +2428,7 @@ msgstr "Авторы"
|
||||
|
||||
#: subprojects/extensions-app/data/ui/extension-row.ui:216
|
||||
msgid "Website"
|
||||
msgstr "Веб сайт"
|
||||
msgstr "Веб-сайт"
|
||||
|
||||
#: subprojects/extensions-app/data/ui/extension-row.ui:233
|
||||
msgid "Remove…"
|
||||
@@ -2448,9 +2460,6 @@ msgid ""
|
||||
"encounter problems with your system, it is recommended to disable all "
|
||||
"extensions."
|
||||
msgstr ""
|
||||
"Кеңейтулер жүйелік мәселелерді, соның ішінде өнімділік мәселелерін туғызуы "
|
||||
"мүмкін. Жүйелік мәселелерге тап болсаңыз, барлық кеңейтулерді сөндіру "
|
||||
"ұсынылады."
|
||||
|
||||
#: subprojects/extensions-app/data/ui/extensions-window.ui:135
|
||||
msgid "Manually Installed"
|
||||
@@ -2469,12 +2478,10 @@ 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 ""
|
||||
"Кешірім өтінеміз, барлық орнатылған кеңейтулер тізімін алу мүмкін болмады. "
|
||||
"GNOME ішіне кіргеніңізді тексеріп, қайталап көріңіз."
|
||||
|
||||
#: subprojects/extensions-app/data/ui/extensions-window.ui:273
|
||||
msgid "Extension Updates Ready"
|
||||
msgstr "Кеңейту жаңартулары дайын"
|
||||
msgstr ""
|
||||
|
||||
#: subprojects/extensions-app/data/ui/extensions-window.ui:289
|
||||
msgid "Log Out…"
|
||||
@@ -2484,7 +2491,7 @@ msgstr "Жүйеден шығу…"
|
||||
#: subprojects/extensions-tool/src/command-create.c:226
|
||||
#, c-format
|
||||
msgid "The new extension was successfully created in %s.\n"
|
||||
msgstr "Жаңа кеңейту %s ішінде сәтті жасалды.\n"
|
||||
msgstr ""
|
||||
|
||||
#: subprojects/extensions-tool/src/command-create.c:299
|
||||
#, c-format
|
||||
@@ -2492,13 +2499,11 @@ msgid ""
|
||||
"Name should be a very short (ideally descriptive) string.\n"
|
||||
"Examples are: %s"
|
||||
msgstr ""
|
||||
"Атауы қысқа мәтіндік жол (сипаттайтын) болуы тиіс.\n"
|
||||
"Мысалы: %s"
|
||||
|
||||
#: subprojects/extensions-tool/src/command-create.c:305
|
||||
#: subprojects/extensions-tool/src/main.c:238
|
||||
msgid "Name"
|
||||
msgstr "Аты"
|
||||
msgstr "Атауы"
|
||||
|
||||
#: subprojects/extensions-tool/src/command-create.c:319
|
||||
#, c-format
|
||||
@@ -2506,9 +2511,6 @@ msgid ""
|
||||
"Description is a single-sentence explanation of what your extension does.\n"
|
||||
"Examples are: %s"
|
||||
msgstr ""
|
||||
"Сипаттамасы - бұл сіздің кеңейтуіңіз жасайтын әрекеттің бір сөйлемді "
|
||||
"анықтамасы.\n"
|
||||
"Мысалы: %s"
|
||||
|
||||
#: subprojects/extensions-tool/src/command-create.c:339
|
||||
msgid ""
|
||||
@@ -2516,12 +2518,10 @@ msgid ""
|
||||
"This should be in the format of an email address (clicktofocus@janedoe."
|
||||
"example.com)\n"
|
||||
msgstr ""
|
||||
"UUID - бұл кеңейтуңіздің глобалды деңгейдегі бірегей идентификаторы.\n"
|
||||
"Ол эл. пошта адресі пішімінде болуы тиіс (clicktofocus@janedoe.example.com)\n"
|
||||
|
||||
#: subprojects/extensions-tool/src/command-create.c:366
|
||||
msgid "Choose one of the available templates:\n"
|
||||
msgstr "Қол жетімді үлгілердің бірін таңдаңыз:\n"
|
||||
msgstr ""
|
||||
|
||||
#: subprojects/extensions-tool/src/command-create.c:380
|
||||
msgid "Template"
|
||||
@@ -2529,7 +2529,7 @@ msgstr "Үлгі"
|
||||
|
||||
#: subprojects/extensions-tool/src/command-create.c:435
|
||||
msgid "The unique identifier of the new extension"
|
||||
msgstr "Жаңа кеңейтудің бірегей идентификаторы"
|
||||
msgstr ""
|
||||
|
||||
#: subprojects/extensions-tool/src/command-create.c:438
|
||||
msgid "NAME"
|
||||
@@ -2537,7 +2537,7 @@ msgstr "АТАУЫ"
|
||||
|
||||
#: subprojects/extensions-tool/src/command-create.c:439
|
||||
msgid "The user-visible name of the new extension"
|
||||
msgstr "Жаңа кеңейтудің пайдаланушыға көрінетін атауы"
|
||||
msgstr ""
|
||||
|
||||
#: subprojects/extensions-tool/src/command-create.c:441
|
||||
msgid "DESCRIPTION"
|
||||
@@ -2545,7 +2545,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"
|
||||
@@ -2553,11 +2553,11 @@ msgstr "ҮЛГІ"
|
||||
|
||||
#: subprojects/extensions-tool/src/command-create.c:447
|
||||
msgid "The template to use for the new extension"
|
||||
msgstr "Жаңа кеңейту үшін қолданылатын үлгі"
|
||||
msgstr ""
|
||||
|
||||
#: subprojects/extensions-tool/src/command-create.c:453
|
||||
msgid "Enter extension information interactively"
|
||||
msgstr "Кеңейту ақпаратын интерактивті түрде енгізу"
|
||||
msgstr ""
|
||||
|
||||
#: subprojects/extensions-tool/src/command-create.c:461
|
||||
msgid "Create a new extension"
|
||||
@@ -2570,20 +2570,20 @@ msgstr "Белгісіз аргументтер"
|
||||
|
||||
#: subprojects/extensions-tool/src/command-create.c:504
|
||||
msgid "UUID, name and description are required"
|
||||
msgstr "UUID, аты және сипаттамасы керек"
|
||||
msgstr ""
|
||||
|
||||
#: subprojects/extensions-tool/src/command-disable.c:46
|
||||
#: subprojects/extensions-tool/src/command-enable.c:46
|
||||
#: subprojects/extensions-tool/src/command-info.c:50
|
||||
#: subprojects/extensions-tool/src/command-list.c:64
|
||||
msgid "Failed to connect to GNOME Shell\n"
|
||||
msgstr "GNOME Shell-ға байланысты орнату сәтсіз аяқталды\n"
|
||||
msgstr "GNOME Shell-ға байланысты орнату мүмкін емес\n"
|
||||
|
||||
#: subprojects/extensions-tool/src/command-disable.c:53
|
||||
#: subprojects/extensions-tool/src/command-enable.c:53
|
||||
#, c-format
|
||||
msgid "Extension “%s” does not exist\n"
|
||||
msgstr "\"%s\" кеңейтуі жоқ\n"
|
||||
msgstr ""
|
||||
|
||||
#: subprojects/extensions-tool/src/command-disable.c:101
|
||||
msgid "Disable an extension"
|
||||
@@ -2605,7 +2605,7 @@ msgstr "UUID көрсетілмеген"
|
||||
#: subprojects/extensions-tool/src/command-reset.c:81
|
||||
#: subprojects/extensions-tool/src/command-uninstall.c:109
|
||||
msgid "More than one UUID given"
|
||||
msgstr "Бірден көп UUID көрсетілген"
|
||||
msgstr ""
|
||||
|
||||
#: subprojects/extensions-tool/src/command-enable.c:101
|
||||
msgid "Enable an extension"
|
||||
@@ -2615,7 +2615,7 @@ msgstr "Кеңейтуді іске қосу"
|
||||
#: subprojects/extensions-tool/src/main.c:155
|
||||
#, c-format
|
||||
msgid "Extension “%s” doesn't exist\n"
|
||||
msgstr "\"%s\" кеңейтуі жоқ\n"
|
||||
msgstr ""
|
||||
|
||||
#: subprojects/extensions-tool/src/command-info.c:85
|
||||
msgid "Show extensions info"
|
||||
@@ -2623,51 +2623,60 @@ msgstr "Кеңейтулер ақпаратын көрсету"
|
||||
|
||||
#: subprojects/extensions-tool/src/command-install.c:173
|
||||
msgid "Overwrite an existing extension"
|
||||
msgstr "Бар болып тұрған кеңейтуді үстінен жазу"
|
||||
msgstr ""
|
||||
|
||||
#: subprojects/extensions-tool/src/command-install.c:175
|
||||
msgid "EXTENSION_BUNDLE"
|
||||
msgstr "КЕҢЕЙТУ_ДЕСТЕСІ"
|
||||
msgstr ""
|
||||
|
||||
#: subprojects/extensions-tool/src/command-install.c:184
|
||||
#| msgid "UUIDs of extensions to enable"
|
||||
msgid "Install an extension bundle"
|
||||
msgstr "Кеңейту дестесін орнату"
|
||||
msgstr ""
|
||||
|
||||
#: subprojects/extensions-tool/src/command-install.c:202
|
||||
#| msgid "No extensions installed"
|
||||
msgid "No extension bundle specified"
|
||||
msgstr "Кеңейту дестесі көрсетілмеген"
|
||||
msgstr ""
|
||||
|
||||
#: subprojects/extensions-tool/src/command-install.c:208
|
||||
msgid "More than one extension bundle specified"
|
||||
msgstr "Бірден көп кеңейту дестесі көрсетілген"
|
||||
msgstr ""
|
||||
|
||||
#: subprojects/extensions-tool/src/command-list.c:128
|
||||
#| msgid "Shell Extensions"
|
||||
msgid "Show user-installed extensions"
|
||||
msgstr "Пайдаланушы орнатқан кеңейтулерді көрсету"
|
||||
msgstr ""
|
||||
|
||||
#: subprojects/extensions-tool/src/command-list.c:131
|
||||
#| msgid "Shell Extensions"
|
||||
msgid "Show system-installed extensions"
|
||||
msgstr "Жүйелік деңгейде орнатылған кеңейтулерді көрсету"
|
||||
msgstr ""
|
||||
|
||||
#: subprojects/extensions-tool/src/command-list.c:134
|
||||
#| msgid "Shell Extensions"
|
||||
msgid "Show enabled extensions"
|
||||
msgstr "Іске қосылған кеңейтулерді көрсету"
|
||||
msgstr ""
|
||||
|
||||
#: subprojects/extensions-tool/src/command-list.c:137
|
||||
#| msgid "Disable user extensions"
|
||||
msgid "Show disabled extensions"
|
||||
msgstr "Сөндірілген кеңейтулерді көрсету"
|
||||
msgstr ""
|
||||
|
||||
#: subprojects/extensions-tool/src/command-list.c:140
|
||||
#| msgid "GNOME Shell Extension Preferences"
|
||||
msgid "Show extensions with preferences"
|
||||
msgstr "Баптаулары бар кеңейтулерді көрсету"
|
||||
msgstr ""
|
||||
|
||||
#: subprojects/extensions-tool/src/command-list.c:143
|
||||
#| msgid "No extensions installed"
|
||||
msgid "Show extensions with updates"
|
||||
msgstr "Жаңартулары бар кеңейтулерді көрсету"
|
||||
msgstr ""
|
||||
|
||||
#: subprojects/extensions-tool/src/command-list.c:146
|
||||
#| msgid "Visit extension homepage"
|
||||
msgid "Print extension details"
|
||||
msgstr "Кеңейту ақпаратын басып шығару"
|
||||
msgstr ""
|
||||
|
||||
#: subprojects/extensions-tool/src/command-list.c:154
|
||||
msgid "List installed extensions"
|
||||
@@ -2679,7 +2688,7 @@ msgstr "ФАЙЛ"
|
||||
|
||||
#: subprojects/extensions-tool/src/command-pack.c:451
|
||||
msgid "Additional source to include in the bundle"
|
||||
msgstr "Дестеге қосылатын қосымша қайнар көз"
|
||||
msgstr ""
|
||||
|
||||
#: subprojects/extensions-tool/src/command-pack.c:454
|
||||
msgid "SCHEMA"
|
||||
@@ -2687,7 +2696,7 @@ msgstr "СҰЛБА"
|
||||
|
||||
#: subprojects/extensions-tool/src/command-pack.c:455
|
||||
msgid "A GSettings schema that should be included"
|
||||
msgstr "Құрамына енуі тиіс GSettings сұлбасы"
|
||||
msgstr ""
|
||||
|
||||
#: subprojects/extensions-tool/src/command-pack.c:457
|
||||
#: subprojects/extensions-tool/src/command-pack.c:468
|
||||
@@ -2696,7 +2705,7 @@ msgstr "БУМА"
|
||||
|
||||
#: subprojects/extensions-tool/src/command-pack.c:459
|
||||
msgid "The directory where translations are found"
|
||||
msgstr "Аудармалар орналасқан бума"
|
||||
msgstr ""
|
||||
|
||||
#: subprojects/extensions-tool/src/command-pack.c:461
|
||||
msgid "DOMAIN"
|
||||
@@ -2704,37 +2713,37 @@ msgstr "ДОМЕН"
|
||||
|
||||
#: subprojects/extensions-tool/src/command-pack.c:463
|
||||
msgid "The gettext domain to use for translations"
|
||||
msgstr "Аудармалар үшін қолданылуы тиіс gettext домені"
|
||||
msgstr ""
|
||||
|
||||
#: subprojects/extensions-tool/src/command-pack.c:466
|
||||
msgid "Overwrite an existing pack"
|
||||
msgstr "Бар болып тұрған пакетті үстінен жазу"
|
||||
msgstr ""
|
||||
|
||||
#: subprojects/extensions-tool/src/command-pack.c:470
|
||||
msgid "The directory where the pack should be created"
|
||||
msgstr "Десте жасалуы тиіс бума"
|
||||
msgstr ""
|
||||
|
||||
#: subprojects/extensions-tool/src/command-pack.c:472
|
||||
msgid "SOURCE_DIRECTORY"
|
||||
msgstr "ҚАЙНАР_КӨЗ_БУМАСЫ"
|
||||
msgstr ""
|
||||
|
||||
#: subprojects/extensions-tool/src/command-pack.c:481
|
||||
msgid "Create an extension bundle"
|
||||
msgstr "Кеңейту дестесін жасау"
|
||||
msgstr ""
|
||||
|
||||
#: subprojects/extensions-tool/src/command-pack.c:501
|
||||
msgid "More than one source directory specified"
|
||||
msgstr "Бірден көп қайнар көз бумасы көрсетілген"
|
||||
msgstr ""
|
||||
|
||||
#: subprojects/extensions-tool/src/command-prefs.c:47
|
||||
#, c-format
|
||||
#| msgid "Show extensions with preferences"
|
||||
msgid "Extension “%s” doesn't have preferences\n"
|
||||
msgstr "\"%s\" кеңейтудің баптаулары жоқ\n"
|
||||
msgstr ""
|
||||
|
||||
#: subprojects/extensions-tool/src/command-prefs.c:79
|
||||
#| msgid "GNOME Shell Extension Preferences"
|
||||
msgid "Opens extension preferences"
|
||||
msgstr "Кеңейту баптауларын ашады"
|
||||
msgstr ""
|
||||
|
||||
#: subprojects/extensions-tool/src/command-reset.c:58
|
||||
msgid "Reset an extension"
|
||||
@@ -2755,11 +2764,11 @@ msgstr "Кеңейтуді өшіру"
|
||||
|
||||
#: subprojects/extensions-tool/src/main.c:72
|
||||
msgid "Do not print error messages"
|
||||
msgstr "Қате туралы хабарламаларды басып шығармау"
|
||||
msgstr ""
|
||||
|
||||
#: subprojects/extensions-tool/src/main.c:146
|
||||
msgid "Failed to connect to GNOME Shell"
|
||||
msgstr "GNOME Shell-ға байланысты орнату сәтсіз аяқталды"
|
||||
msgstr "GNOME Shell-ға байланысты орнату мүмкін емес"
|
||||
|
||||
#: subprojects/extensions-tool/src/main.c:244
|
||||
msgid "Path"
|
||||
@@ -2779,7 +2788,7 @@ msgstr "Қалып-күйі"
|
||||
|
||||
#: subprojects/extensions-tool/src/main.c:290
|
||||
msgid "“version” takes no arguments"
|
||||
msgstr "“version” аргументтерді қабылдамайды"
|
||||
msgstr ""
|
||||
|
||||
#: subprojects/extensions-tool/src/main.c:292
|
||||
#: subprojects/extensions-tool/src/main.c:312
|
||||
@@ -2851,11 +2860,11 @@ msgstr "Кеңейту дестесін орнату"
|
||||
#: subprojects/extensions-tool/src/main.c:330
|
||||
#, c-format
|
||||
msgid "Use “%s” to get detailed help.\n"
|
||||
msgstr "Толық көмекті алу үшін \"%s\" пайдаланыңыз.\n"
|
||||
msgstr ""
|
||||
|
||||
#: subprojects/extensions-tool/src/templates/00-plain.desktop.in:4
|
||||
msgid "Plain"
|
||||
msgstr "Қалыпты"
|
||||
msgstr "Кәдімгі"
|
||||
|
||||
#: subprojects/extensions-tool/src/templates/00-plain.desktop.in:5
|
||||
msgid "An empty extension"
|
||||
@@ -2867,7 +2876,7 @@ msgstr "Индикатор"
|
||||
|
||||
#: subprojects/extensions-tool/src/templates/indicator.desktop.in:5
|
||||
msgid "Add an icon to the top bar"
|
||||
msgstr "Жоғарғы панельге таңбашаны қосу"
|
||||
msgstr ""
|
||||
|
||||
#. translators:
|
||||
#. * The number of sound outputs on a particular device
|
||||
@@ -2889,33 +2898,6 @@ msgstr[0] "%u кірісі"
|
||||
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, %B %-d"
|
||||
|
||||
#~ msgctxt "calendar heading"
|
||||
#~ msgid "%A, %B %-d, %Y"
|
||||
#~ msgstr "%A, %B %-d, %Y"
|
||||
|
||||
#~ msgid "%d Connected"
|
||||
#~ msgid_plural "%d Connected"
|
||||
#~ msgstr[0] "%d байланысқан"
|
||||
|
||||
#~ msgid "Off"
|
||||
#~ msgstr "Сөнд."
|
||||
|
||||
#~ msgid "On"
|
||||
#~ msgstr "Іске қос."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Keybinding that pauses and resumes all running tweens, for debugging "
|
||||
#~ "purposes"
|
||||
@@ -2945,6 +2927,21 @@ msgstr "Жүйелік дыбыстар"
|
||||
#~ msgid "Sign In"
|
||||
#~ msgstr "Кіру"
|
||||
|
||||
#~ msgid "Frequently used applications will appear here"
|
||||
#~ msgstr "Жиі қолданылатын қолданбалар осында көрінеді"
|
||||
|
||||
#~ msgid "Frequent"
|
||||
#~ msgstr "Жиі қолданылатын"
|
||||
|
||||
#~ msgid "All"
|
||||
#~ msgstr "Барлығы"
|
||||
|
||||
#~| msgctxt "calendar heading"
|
||||
#~| msgid "%A, %B %d, %Y"
|
||||
#~ msgctxt "calendar heading"
|
||||
#~ msgid "%A, %B %-d, %Y"
|
||||
#~ msgstr "%A, %B %-d, %Y"
|
||||
|
||||
#~ msgid "Password:"
|
||||
#~ msgstr "Пароль:"
|
||||
|
||||
@@ -2974,6 +2971,16 @@ msgstr "Жүйелік дыбыстар"
|
||||
#~ msgid_plural "%d new notifications"
|
||||
#~ msgstr[0] "%d жаңа ескерту"
|
||||
|
||||
#~ msgid "%d Connected"
|
||||
#~ msgid_plural "%d Connected"
|
||||
#~ msgstr[0] "%d байланысқан"
|
||||
|
||||
#~ msgid "Off"
|
||||
#~ msgstr "Сөнд."
|
||||
|
||||
#~ msgid "On"
|
||||
#~ msgstr "Іске қос."
|
||||
|
||||
#~ msgid "Account Settings"
|
||||
#~ msgstr "Тіркелгі баптаулары"
|
||||
|
||||
|
1003
po/pt_BR.po
1003
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-07-21 05:44+0000\n"
|
||||
"PO-Revision-Date: 2020-07-21 09:07+0200\n"
|
||||
"POT-Creation-Date: 2020-06-09 19:41+0000\n"
|
||||
"PO-Revision-Date: 2020-06-17 18:47+0300\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,112 +224,95 @@ msgid ""
|
||||
msgstr ""
|
||||
"Activează un API D-Bus care permite introspecția stării aplicației shell."
|
||||
|
||||
#: 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
|
||||
#: data/org.gnome.shell.gschema.xml.in:119
|
||||
msgid "Keybinding to open the application menu"
|
||||
msgstr "Combinație de taste pentru deschiderea meniului aplicației"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:131
|
||||
#: data/org.gnome.shell.gschema.xml.in:120
|
||||
msgid "Keybinding to open the application menu."
|
||||
msgstr "Combinație de taste pentru deschiderea meniului aplicației."
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:137
|
||||
#: data/org.gnome.shell.gschema.xml.in:126
|
||||
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:138
|
||||
#: data/org.gnome.shell.gschema.xml.in:127
|
||||
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:145
|
||||
#: data/org.gnome.shell.gschema.xml.in:134
|
||||
msgid "Keybinding to open the overview"
|
||||
msgstr "Combinație de taste pentru deschiderea prezentării generale"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:146
|
||||
#: data/org.gnome.shell.gschema.xml.in:135
|
||||
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:152
|
||||
#: data/org.gnome.shell.gschema.xml.in:141
|
||||
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:153
|
||||
#: data/org.gnome.shell.gschema.xml.in:142
|
||||
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:159
|
||||
#: data/org.gnome.shell.gschema.xml.in:148
|
||||
msgid "Keybinding to focus the active notification"
|
||||
msgstr "Combinație de taste pentru focalizarea notificării active"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:160
|
||||
#: data/org.gnome.shell.gschema.xml.in:149
|
||||
msgid "Keybinding to focus the active notification."
|
||||
msgstr "Combinație de taste pentru focalizarea notificării active."
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:166
|
||||
#: data/org.gnome.shell.gschema.xml.in:155
|
||||
msgid "Switch to application 1"
|
||||
msgstr "Comută la aplicația 1"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:170
|
||||
#: data/org.gnome.shell.gschema.xml.in:159
|
||||
msgid "Switch to application 2"
|
||||
msgstr "Comută la aplicația 2"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:174
|
||||
#: data/org.gnome.shell.gschema.xml.in:163
|
||||
msgid "Switch to application 3"
|
||||
msgstr "Comută la aplicația 3"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:178
|
||||
#: data/org.gnome.shell.gschema.xml.in:167
|
||||
msgid "Switch to application 4"
|
||||
msgstr "Comută la aplicația 4"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:182
|
||||
#: data/org.gnome.shell.gschema.xml.in:171
|
||||
msgid "Switch to application 5"
|
||||
msgstr "Comută la aplicația 5"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:186
|
||||
#: data/org.gnome.shell.gschema.xml.in:175
|
||||
msgid "Switch to application 6"
|
||||
msgstr "Comută la aplicația 6"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:190
|
||||
#: data/org.gnome.shell.gschema.xml.in:179
|
||||
msgid "Switch to application 7"
|
||||
msgstr "Comută la aplicația 7"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:194
|
||||
#: data/org.gnome.shell.gschema.xml.in:183
|
||||
msgid "Switch to application 8"
|
||||
msgstr "Comută la aplicația 8"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:198
|
||||
#: data/org.gnome.shell.gschema.xml.in:187
|
||||
msgid "Switch to application 9"
|
||||
msgstr "Comută la aplicația 9"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:207
|
||||
#: data/org.gnome.shell.gschema.xml.in:234
|
||||
#: data/org.gnome.shell.gschema.xml.in:196
|
||||
#: data/org.gnome.shell.gschema.xml.in:223
|
||||
msgid "Limit switcher to current workspace."
|
||||
msgstr "Limitează comutatorul la spațiul de lucru curent."
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:208
|
||||
#: data/org.gnome.shell.gschema.xml.in:197
|
||||
msgid ""
|
||||
"If true, only applications that have windows on the current workspace are "
|
||||
"shown in the switcher. Otherwise, all applications are included."
|
||||
@@ -337,11 +320,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:225
|
||||
#: data/org.gnome.shell.gschema.xml.in:214
|
||||
msgid "The application icon mode."
|
||||
msgstr "Miniatură și pictograma aplicației."
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:226
|
||||
#: data/org.gnome.shell.gschema.xml.in:215
|
||||
msgid ""
|
||||
"Configures how the windows are shown in the switcher. Valid possibilities "
|
||||
"are “thumbnail-only” (shows a thumbnail of the window), “app-icon-"
|
||||
@@ -351,7 +334,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:235
|
||||
#: data/org.gnome.shell.gschema.xml.in:224
|
||||
msgid ""
|
||||
"If true, only windows from the current workspace are shown in the switcher. "
|
||||
"Otherwise, all windows are included."
|
||||
@@ -359,59 +342,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:245
|
||||
#: data/org.gnome.shell.gschema.xml.in:234
|
||||
msgid "Locations"
|
||||
msgstr "Locații"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:246
|
||||
#: data/org.gnome.shell.gschema.xml.in:235
|
||||
msgid "The locations to show in world clocks"
|
||||
msgstr "Locațiile de arătat în ceasuri globale"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:256
|
||||
#: data/org.gnome.shell.gschema.xml.in:245
|
||||
msgid "Automatic location"
|
||||
msgstr "Locație automată"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:257
|
||||
#: data/org.gnome.shell.gschema.xml.in:246
|
||||
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:264
|
||||
#: data/org.gnome.shell.gschema.xml.in:253
|
||||
msgid "Location"
|
||||
msgstr "Locație"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:265
|
||||
#: data/org.gnome.shell.gschema.xml.in:254
|
||||
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:277
|
||||
#: data/org.gnome.shell.gschema.xml.in:266
|
||||
msgid "Attach modal dialog to the parent window"
|
||||
msgstr "Atașează dialogul modal la fereastra părinte"
|
||||
|
||||
#: 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
|
||||
#: 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
|
||||
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:286
|
||||
#: data/org.gnome.shell.gschema.xml.in:275
|
||||
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:294
|
||||
#: data/org.gnome.shell.gschema.xml.in:283
|
||||
msgid "Workspaces are managed dynamically"
|
||||
msgstr "Spațiile de lucru sunt gestionate în mod dinamic"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:302
|
||||
#: data/org.gnome.shell.gschema.xml.in:291
|
||||
msgid "Workspaces only on primary monitor"
|
||||
msgstr "Spații de lucru doar pe monitorul principal"
|
||||
|
||||
#: data/org.gnome.shell.gschema.xml.in:310
|
||||
#: data/org.gnome.shell.gschema.xml.in:299
|
||||
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ă "
|
||||
@@ -450,7 +433,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:183
|
||||
#: js/ui/endSessionDialog.js:369 js/ui/extensionDownloader.js:181
|
||||
#: 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"
|
||||
@@ -492,7 +475,7 @@ msgstr "Nume de utilizator"
|
||||
msgid "Login Window"
|
||||
msgstr "Fereastră de autentificare"
|
||||
|
||||
#: js/gdm/util.js:355
|
||||
#: js/gdm/util.js:345
|
||||
msgid "Authentication error"
|
||||
msgstr "Eroare de autentificare"
|
||||
|
||||
@@ -501,7 +484,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:481
|
||||
#: js/gdm/util.js:471
|
||||
msgid "(or swipe finger)"
|
||||
msgstr "(sau treceți degetul peste)"
|
||||
|
||||
@@ -744,36 +727,36 @@ msgstr "Refuză accesul"
|
||||
msgid "Grant Access"
|
||||
msgstr "Permite accesul"
|
||||
|
||||
#: js/ui/appDisplay.js:1297
|
||||
#: js/ui/appDisplay.js:902
|
||||
msgid "Unnamed Folder"
|
||||
msgstr "Dosar nedenumit"
|
||||
|
||||
#. Translators: This is the heading of a list of open windows
|
||||
#: js/ui/appDisplay.js:2767 js/ui/panel.js:75
|
||||
#: js/ui/appDisplay.js:2241 js/ui/panel.js:75
|
||||
msgid "Open Windows"
|
||||
msgstr "Ferestre deschise"
|
||||
|
||||
#: js/ui/appDisplay.js:2786 js/ui/panel.js:82
|
||||
#: js/ui/appDisplay.js:2260 js/ui/panel.js:82
|
||||
msgid "New Window"
|
||||
msgstr "Fereastră nouă"
|
||||
|
||||
#: js/ui/appDisplay.js:2802
|
||||
#: js/ui/appDisplay.js:2276
|
||||
msgid "Launch using Integrated Graphics Card"
|
||||
msgstr "Lansează folosind placa grafică integrată"
|
||||
|
||||
#: js/ui/appDisplay.js:2803
|
||||
#: js/ui/appDisplay.js:2277
|
||||
msgid "Launch using Discrete Graphics Card"
|
||||
msgstr "Lansează folosind placa grafică discretă"
|
||||
|
||||
#: js/ui/appDisplay.js:2831 js/ui/dash.js:239
|
||||
#: js/ui/appDisplay.js:2305 js/ui/dash.js:239
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Elimină din favorite"
|
||||
|
||||
#: js/ui/appDisplay.js:2837
|
||||
#: js/ui/appDisplay.js:2311
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Adaugă la Favorite"
|
||||
|
||||
#: js/ui/appDisplay.js:2847 js/ui/panel.js:93
|
||||
#: js/ui/appDisplay.js:2321 js/ui/panel.js:93
|
||||
msgid "Show Details"
|
||||
msgstr "Arată detaliile"
|
||||
|
||||
@@ -803,7 +786,7 @@ msgstr "Căști auriculare"
|
||||
msgid "Headset"
|
||||
msgstr "Căști cu microfon"
|
||||
|
||||
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:272
|
||||
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:273
|
||||
msgid "Microphone"
|
||||
msgstr "Microfon"
|
||||
|
||||
@@ -1317,15 +1300,15 @@ msgstr "%s (la distanță)"
|
||||
msgid "%s (console)"
|
||||
msgstr "%s (consolă)"
|
||||
|
||||
#: js/ui/extensionDownloader.js:187
|
||||
#: js/ui/extensionDownloader.js:185
|
||||
msgid "Install"
|
||||
msgstr "Instalează"
|
||||
|
||||
#: js/ui/extensionDownloader.js:193
|
||||
#: js/ui/extensionDownloader.js:191
|
||||
msgid "Install Extension"
|
||||
msgstr "Instalează extensia"
|
||||
|
||||
#: js/ui/extensionDownloader.js:194
|
||||
#: js/ui/extensionDownloader.js:192
|
||||
#, javascript-format
|
||||
msgid "Download and install “%s” from extensions.gnome.org?"
|
||||
msgstr "Descărcați și instalați „%s” de la extensions.gnome.org?"
|
||||
@@ -1358,11 +1341,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:100
|
||||
#: js/ui/inhibitShortcutsDialog.js:98
|
||||
msgid "Deny"
|
||||
msgstr "Refuză"
|
||||
|
||||
#: js/ui/inhibitShortcutsDialog.js:107
|
||||
#: js/ui/inhibitShortcutsDialog.js:105
|
||||
msgid "Allow"
|
||||
msgstr "Permite"
|
||||
|
||||
@@ -1431,7 +1414,7 @@ msgstr "Oprește"
|
||||
msgid "Leave Off"
|
||||
msgstr "Lasă oprit"
|
||||
|
||||
#: js/ui/keyboard.js:225
|
||||
#: js/ui/keyboard.js:207
|
||||
msgid "Region & Language Settings"
|
||||
msgstr "Configurări de regiune și limbă"
|
||||
|
||||
@@ -1505,7 +1488,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:1476
|
||||
#: js/ui/messageTray.js:1547
|
||||
msgid "System Information"
|
||||
msgstr "Informații despre sistem"
|
||||
|
||||
@@ -1517,13 +1500,13 @@ msgstr "Artist necunoscut"
|
||||
msgid "Unknown title"
|
||||
msgstr "Titlu necunoscut"
|
||||
|
||||
#: js/ui/overview.js:74
|
||||
#: js/ui/overview.js:73
|
||||
msgid "Undo"
|
||||
msgstr "Anulează"
|
||||
|
||||
#. Translators: This is the main view to select
|
||||
#. activities. See also note for "Activities" string.
|
||||
#: js/ui/overview.js:87
|
||||
#: js/ui/overview.js:86
|
||||
msgid "Overview"
|
||||
msgstr "Prezentare generală"
|
||||
|
||||
@@ -1531,7 +1514,7 @@ msgstr "Prezentare generală"
|
||||
#. in the search entry when no search is
|
||||
#. active; it should not exceed ~30
|
||||
#. characters.
|
||||
#: js/ui/overview.js:108
|
||||
#: js/ui/overview.js:107
|
||||
msgid "Type to search"
|
||||
msgstr "Tastați pentru a căuta"
|
||||
|
||||
@@ -2189,11 +2172,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:155
|
||||
#: js/ui/status/volume.js:154
|
||||
msgid "Volume changed"
|
||||
msgstr "Volumul a fost schimbat"
|
||||
|
||||
#: js/ui/status/volume.js:217
|
||||
#: js/ui/status/volume.js:225
|
||||
msgid "Volume"
|
||||
msgstr "Volum"
|
||||
|
||||
@@ -2239,11 +2222,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:555
|
||||
#: js/ui/unlockDialog.js:550
|
||||
msgid "Unlock Window"
|
||||
msgstr "Deblochează fereastră"
|
||||
|
||||
#: js/ui/unlockDialog.js:564
|
||||
#: js/ui/unlockDialog.js:559
|
||||
msgid "Log in as another user"
|
||||
msgstr "Intră în sesiune ca utilizator diferit"
|
||||
|
||||
@@ -2379,12 +2362,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:268
|
||||
#: src/shell-app.c:286
|
||||
msgctxt "program"
|
||||
msgid "Unknown"
|
||||
msgstr "Necunoscut"
|
||||
|
||||
#: src/shell-app.c:519
|
||||
#: src/shell-app.c:537
|
||||
#, c-format
|
||||
msgid "Failed to launch “%s”"
|
||||
msgstr "Nu s-a putut lansa „%s”"
|
||||
|
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-07-12 02:14+0000\n"
|
||||
"PO-Revision-Date: 2020-07-11 22:32-0400\n"
|
||||
"POT-Creation-Date: 2020-05-28 11:29+0000\n"
|
||||
"PO-Revision-Date: 2020-05-29 09:03-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:355
|
||||
#: js/gdm/util.js:345
|
||||
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:481
|
||||
#: js/gdm/util.js:471
|
||||
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/ui/dateMenu.js:162
|
||||
#: js/misc/util.js:191
|
||||
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:369
|
||||
#: js/ui/accessDialog.js:39 js/ui/status/location.js:374
|
||||
msgid "Deny Access"
|
||||
msgstr "拒绝访问"
|
||||
|
||||
#: js/ui/accessDialog.js:40 js/ui/status/location.js:372
|
||||
#: js/ui/accessDialog.js:40 js/ui/status/location.js:377
|
||||
msgid "Grant Access"
|
||||
msgstr "允许访问"
|
||||
|
||||
#: js/ui/appDisplay.js:903
|
||||
#: js/ui/appDisplay.js:960
|
||||
msgid "Unnamed Folder"
|
||||
msgstr "未命名文件夹"
|
||||
|
||||
#. Translators: This is the heading of a list of open windows
|
||||
#: js/ui/appDisplay.js:2225 js/ui/panel.js:75
|
||||
#: js/ui/appDisplay.js:2219 js/ui/panel.js:75
|
||||
msgid "Open Windows"
|
||||
msgstr "打开窗口"
|
||||
|
||||
#: js/ui/appDisplay.js:2244 js/ui/panel.js:82
|
||||
#: js/ui/appDisplay.js:2238 js/ui/panel.js:82
|
||||
msgid "New Window"
|
||||
msgstr "新窗口"
|
||||
|
||||
#: js/ui/appDisplay.js:2260
|
||||
#: js/ui/appDisplay.js:2254
|
||||
msgid "Launch using Integrated Graphics Card"
|
||||
msgstr "使用集成显卡启动"
|
||||
|
||||
#: js/ui/appDisplay.js:2261
|
||||
#: js/ui/appDisplay.js:2255
|
||||
msgid "Launch using Discrete Graphics Card"
|
||||
msgstr "使用独立显卡启动"
|
||||
|
||||
#: js/ui/appDisplay.js:2289 js/ui/dash.js:239
|
||||
#: js/ui/appDisplay.js:2283 js/ui/dash.js:239
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "从收藏夹中移除"
|
||||
|
||||
#: js/ui/appDisplay.js:2295
|
||||
#: js/ui/appDisplay.js:2289
|
||||
msgid "Add to Favorites"
|
||||
msgstr "添加到收藏夹"
|
||||
|
||||
#: js/ui/appDisplay.js:2305 js/ui/panel.js:93
|
||||
#: js/ui/appDisplay.js:2299 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:272
|
||||
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:273
|
||||
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:36
|
||||
#: js/ui/calendar.js:41
|
||||
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:65
|
||||
#: js/ui/calendar.js:70
|
||||
msgctxt "grid sunday"
|
||||
msgid "S"
|
||||
msgstr "日"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Monday
|
||||
#: js/ui/calendar.js:67
|
||||
#: js/ui/calendar.js:72
|
||||
msgctxt "grid monday"
|
||||
msgid "M"
|
||||
msgstr "一"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Tuesday
|
||||
#: js/ui/calendar.js:69
|
||||
#: js/ui/calendar.js:74
|
||||
msgctxt "grid tuesday"
|
||||
msgid "T"
|
||||
msgstr "二"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Wednesday
|
||||
#: js/ui/calendar.js:71
|
||||
#: js/ui/calendar.js:76
|
||||
msgctxt "grid wednesday"
|
||||
msgid "W"
|
||||
msgstr "三"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Thursday
|
||||
#: js/ui/calendar.js:73
|
||||
#: js/ui/calendar.js:78
|
||||
msgctxt "grid thursday"
|
||||
msgid "T"
|
||||
msgstr "四"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Friday
|
||||
#: js/ui/calendar.js:75
|
||||
#: js/ui/calendar.js:80
|
||||
msgctxt "grid friday"
|
||||
msgid "F"
|
||||
msgstr "五"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Saturday
|
||||
#: js/ui/calendar.js:77
|
||||
#: js/ui/calendar.js:82
|
||||
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:392
|
||||
#: js/ui/calendar.js:397
|
||||
msgid "%OB"
|
||||
msgstr "%OB"
|
||||
|
||||
@@ -826,37 +826,61 @@ 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:402
|
||||
#: js/ui/calendar.js:407
|
||||
msgid "%OB %Y"
|
||||
msgstr "%Y %OB"
|
||||
|
||||
#: js/ui/calendar.js:461
|
||||
#: js/ui/calendar.js:466
|
||||
msgid "Previous month"
|
||||
msgstr "上个月"
|
||||
|
||||
#: js/ui/calendar.js:476
|
||||
#: js/ui/calendar.js:481
|
||||
msgid "Next month"
|
||||
msgstr "下个月"
|
||||
|
||||
#: js/ui/calendar.js:626
|
||||
#: js/ui/calendar.js:631
|
||||
#, no-javascript-format
|
||||
msgctxt "date day number format"
|
||||
msgid "%d"
|
||||
msgstr "%d"
|
||||
|
||||
#: js/ui/calendar.js:682
|
||||
#: js/ui/calendar.js:687
|
||||
msgid "Week %V"
|
||||
msgstr "第 %V 个星期"
|
||||
|
||||
#: js/ui/calendar.js:895
|
||||
#. 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
|
||||
msgid "No Notifications"
|
||||
msgstr "无通知"
|
||||
|
||||
#: js/ui/calendar.js:949
|
||||
#: js/ui/calendar.js:1136
|
||||
msgid "No Events"
|
||||
msgstr "无事件"
|
||||
|
||||
#: js/ui/calendar.js:1190
|
||||
msgid "Do Not Disturb"
|
||||
msgstr "请勿打扰"
|
||||
|
||||
#: js/ui/calendar.js:968
|
||||
#: js/ui/calendar.js:1209
|
||||
msgid "Clear"
|
||||
msgstr "清除"
|
||||
|
||||
@@ -1006,7 +1030,7 @@ msgstr "抱歉,认证失败。请重试。"
|
||||
msgid "%s is now known as %s"
|
||||
msgstr "%s 现在叫做 %s"
|
||||
|
||||
#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:178
|
||||
#: js/ui/ctrlAltTab.js:21 js/ui/viewSelector.js:177
|
||||
msgid "Windows"
|
||||
msgstr "窗口"
|
||||
|
||||
@@ -1025,7 +1049,7 @@ msgstr "Dash"
|
||||
#. * "Tue 9:29 AM"). The string itself should become a full date, e.g.,
|
||||
#. * "February 17 2015".
|
||||
#.
|
||||
#: js/ui/dateMenu.js:79
|
||||
#: js/ui/dateMenu.js:75
|
||||
msgid "%B %-d %Y"
|
||||
msgstr "%Y年%-m月%-d日"
|
||||
|
||||
@@ -1033,67 +1057,35 @@ 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:86
|
||||
#: js/ui/dateMenu.js:82
|
||||
msgid "%A %B %e %Y"
|
||||
msgstr "%Y年%-m月%-d日 %A"
|
||||
|
||||
#. 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
|
||||
#: js/ui/dateMenu.js:162
|
||||
msgid "Add world clocks…"
|
||||
msgstr "添加世界时钟…"
|
||||
|
||||
#: js/ui/dateMenu.js:349
|
||||
#: js/ui/dateMenu.js:163
|
||||
msgid "World Clocks"
|
||||
msgstr "世界时钟"
|
||||
|
||||
#: js/ui/dateMenu.js:629
|
||||
#: js/ui/dateMenu.js:443
|
||||
msgid "Loading…"
|
||||
msgstr "正在载入……"
|
||||
|
||||
#: js/ui/dateMenu.js:639
|
||||
#: js/ui/dateMenu.js:453
|
||||
msgid "Go online for weather information"
|
||||
msgstr "通过互联网查看天气信息"
|
||||
|
||||
#: js/ui/dateMenu.js:641
|
||||
#: js/ui/dateMenu.js:455
|
||||
msgid "Weather information is currently unavailable"
|
||||
msgstr "天气信息目前不可用"
|
||||
|
||||
#: js/ui/dateMenu.js:651
|
||||
#: js/ui/dateMenu.js:465
|
||||
msgid "Weather"
|
||||
msgstr "天气"
|
||||
|
||||
#: js/ui/dateMenu.js:653
|
||||
#: js/ui/dateMenu.js:467
|
||||
msgid "Select weather location…"
|
||||
msgstr "选择天气地点…"
|
||||
|
||||
@@ -1276,11 +1268,11 @@ msgstr "某应用程序希望禁用快捷键"
|
||||
msgid "You can restore shortcuts by pressing %s."
|
||||
msgstr "按 %s 以恢复快捷键。"
|
||||
|
||||
#: js/ui/inhibitShortcutsDialog.js:100
|
||||
#: js/ui/inhibitShortcutsDialog.js:98
|
||||
msgid "Deny"
|
||||
msgstr "拒绝"
|
||||
|
||||
#: js/ui/inhibitShortcutsDialog.js:107
|
||||
#: js/ui/inhibitShortcutsDialog.js:105
|
||||
msgid "Allow"
|
||||
msgstr "允许"
|
||||
|
||||
@@ -1345,7 +1337,7 @@ msgstr "关闭"
|
||||
msgid "Leave Off"
|
||||
msgstr "保持关闭"
|
||||
|
||||
#: js/ui/keyboard.js:225
|
||||
#: js/ui/keyboard.js:207
|
||||
msgid "Region & Language Settings"
|
||||
msgstr "区域与语言设置"
|
||||
|
||||
@@ -1418,25 +1410,25 @@ msgstr "屏幕锁定已禁用"
|
||||
msgid "Screen Locking requires the GNOME display manager."
|
||||
msgstr "屏幕锁定需要 GNOME 显示管理器。"
|
||||
|
||||
#: js/ui/messageTray.js:1476
|
||||
#: js/ui/messageTray.js:1547
|
||||
msgid "System Information"
|
||||
msgstr "系统信息"
|
||||
|
||||
#: js/ui/mpris.js:203
|
||||
#: js/ui/mpris.js:204
|
||||
msgid "Unknown artist"
|
||||
msgstr "未知艺人"
|
||||
|
||||
#: js/ui/mpris.js:213
|
||||
#: js/ui/mpris.js:214
|
||||
msgid "Unknown title"
|
||||
msgstr "未知标题"
|
||||
|
||||
#: js/ui/overview.js:74
|
||||
#: js/ui/overview.js:73
|
||||
msgid "Undo"
|
||||
msgstr "撤消"
|
||||
|
||||
#. Translators: This is the main view to select
|
||||
#. activities. See also note for "Activities" string.
|
||||
#: js/ui/overview.js:87
|
||||
#: js/ui/overview.js:86
|
||||
msgid "Overview"
|
||||
msgstr "概览"
|
||||
|
||||
@@ -1444,7 +1436,7 @@ msgstr "概览"
|
||||
#. in the search entry when no search is
|
||||
#. active; it should not exceed ~30
|
||||
#. characters.
|
||||
#: js/ui/overview.js:108
|
||||
#: js/ui/overview.js:107
|
||||
msgid "Type to search"
|
||||
msgstr "输入以搜索"
|
||||
|
||||
@@ -1472,23 +1464,23 @@ msgstr "分配按键"
|
||||
msgid "Done"
|
||||
msgstr "完成"
|
||||
|
||||
#: js/ui/padOsd.js:732
|
||||
#: js/ui/padOsd.js:745
|
||||
msgid "Edit…"
|
||||
msgstr "编辑…"
|
||||
|
||||
#: js/ui/padOsd.js:774 js/ui/padOsd.js:891
|
||||
#: js/ui/padOsd.js:787 js/ui/padOsd.js:910
|
||||
msgid "None"
|
||||
msgstr "无"
|
||||
|
||||
#: js/ui/padOsd.js:845
|
||||
#: js/ui/padOsd.js:863
|
||||
msgid "Press a button to configure"
|
||||
msgstr "按下按键以配置"
|
||||
|
||||
#: js/ui/padOsd.js:846
|
||||
#: js/ui/padOsd.js:864
|
||||
msgid "Press Esc to exit"
|
||||
msgstr "按 Esc 以退出"
|
||||
|
||||
#: js/ui/padOsd.js:849
|
||||
#: js/ui/padOsd.js:867
|
||||
msgid "Press any key to exit"
|
||||
msgstr "按任意键退出"
|
||||
|
||||
@@ -1578,7 +1570,7 @@ msgstr "隐藏文本"
|
||||
|
||||
#: js/ui/shellEntry.js:162
|
||||
msgid "Caps lock is on."
|
||||
msgstr "大写锁定已开启。"
|
||||
msgstr "大写锁定键已开启。"
|
||||
|
||||
#: js/ui/shellMountOperation.js:285
|
||||
msgid "Hidden Volume"
|
||||
@@ -1750,17 +1742,17 @@ msgstr "定位服务已禁用"
|
||||
msgid "Enable"
|
||||
msgstr "启用"
|
||||
|
||||
#: js/ui/status/location.js:350
|
||||
#: js/ui/status/location.js:355
|
||||
msgid "Allow location access"
|
||||
msgstr "允许获取位置信息"
|
||||
|
||||
#. Translators: %s is an application name
|
||||
#: js/ui/status/location.js:352
|
||||
#: js/ui/status/location.js:357
|
||||
#, javascript-format
|
||||
msgid "The app %s wants to access your location"
|
||||
msgstr "应用 %s 想要获取您的位置信息"
|
||||
|
||||
#: js/ui/status/location.js:362
|
||||
#: js/ui/status/location.js:367
|
||||
msgid "Location access can be changed at any time from the privacy settings."
|
||||
msgstr "位置访问权限可以随时在隐私设置里更改。"
|
||||
|
||||
@@ -2089,11 +2081,11 @@ msgstr "Thunderbolt 授权错误"
|
||||
msgid "Could not authorize the Thunderbolt device: %s"
|
||||
msgstr "无法授权 Thunderbolt 设备:%s"
|
||||
|
||||
#: js/ui/status/volume.js:155
|
||||
#: js/ui/status/volume.js:154
|
||||
msgid "Volume changed"
|
||||
msgstr "音量已变更"
|
||||
|
||||
#: js/ui/status/volume.js:217
|
||||
#: js/ui/status/volume.js:225
|
||||
msgid "Volume"
|
||||
msgstr "音量"
|
||||
|
||||
@@ -2139,19 +2131,19 @@ msgstr "向上滑动解锁"
|
||||
msgid "Click or press a key to unlock"
|
||||
msgstr "单击或按键解锁"
|
||||
|
||||
#: js/ui/unlockDialog.js:555
|
||||
#: js/ui/unlockDialog.js:550
|
||||
msgid "Unlock Window"
|
||||
msgstr "解锁窗口"
|
||||
|
||||
#: js/ui/unlockDialog.js:564
|
||||
#: js/ui/unlockDialog.js:559
|
||||
msgid "Log in as another user"
|
||||
msgstr "以另一个用户身份登录"
|
||||
|
||||
#: js/ui/viewSelector.js:182
|
||||
#: js/ui/viewSelector.js:181
|
||||
msgid "Applications"
|
||||
msgstr "应用程序"
|
||||
|
||||
#: js/ui/viewSelector.js:186
|
||||
#: js/ui/viewSelector.js:185
|
||||
msgid "Search"
|
||||
msgstr "搜索"
|
||||
|
||||
@@ -2277,12 +2269,12 @@ msgstr "使用指定模式,如“gdm”用于登录屏幕"
|
||||
msgid "List possible modes"
|
||||
msgstr "列出可用的模式"
|
||||
|
||||
#: src/shell-app.c:268
|
||||
#: src/shell-app.c:286
|
||||
msgctxt "program"
|
||||
msgid "Unknown"
|
||||
msgstr "未知"
|
||||
|
||||
#: src/shell-app.c:519
|
||||
#: src/shell-app.c:537
|
||||
#, c-format
|
||||
msgid "Failed to launch “%s”"
|
||||
msgstr "启动“%s”失败"
|
||||
@@ -2512,7 +2504,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"
|
||||
@@ -2855,14 +2847,6 @@ 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,6 +346,8 @@ 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;
|
||||
};
|
||||
@@ -368,19 +370,24 @@ app_update_timezone (App *app)
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
app_notify_events_added (App *app)
|
||||
static gboolean
|
||||
on_app_schedule_events_added_cb (gpointer user_data)
|
||||
{
|
||||
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;
|
||||
return FALSE;
|
||||
|
||||
/* The a{sv} is used as an escape hatch in case we want to provide more
|
||||
* information in the future without breaking ABI
|
||||
@@ -421,21 +428,41 @@ app_notify_events_added (App *app)
|
||||
g_variant_builder_clear (&builder);
|
||||
|
||||
g_slist_free_full (events, calendar_appointment_free);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
app_notify_events_removed (App *app)
|
||||
app_schedule_events_added (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;
|
||||
return FALSE;
|
||||
|
||||
g_variant_builder_init (&builder, G_VARIANT_TYPE ("as"));
|
||||
for (link = ids; link; link = g_slist_next (link))
|
||||
@@ -456,7 +483,20 @@ app_notify_events_removed (App *app)
|
||||
|
||||
g_slist_free_full (ids, g_free);
|
||||
|
||||
return;
|
||||
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");
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -506,7 +546,7 @@ app_process_added_modified_objects (App *app,
|
||||
g_clear_object (&cal_client);
|
||||
|
||||
if (app->notify_appointments)
|
||||
app_notify_events_added (app);
|
||||
app_schedule_events_added (app);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -570,7 +610,7 @@ on_objects_removed (ECalClientView *view,
|
||||
g_clear_object (&client);
|
||||
|
||||
if (app->notify_ids)
|
||||
app_notify_events_removed (app);
|
||||
app_schedule_events_removed (app);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
@@ -834,6 +874,9 @@ 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,6 +163,15 @@ 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
|
||||
)
|
||||
|
@@ -78,7 +78,6 @@ struct _ShellApp
|
||||
* want (e.g. it will be of TYPE_NORMAL from
|
||||
* the way shell-window-tracker.c works).
|
||||
*/
|
||||
GIcon *fallback_icon;
|
||||
|
||||
ShellAppRunningState *running_state;
|
||||
|
||||
@@ -181,47 +180,66 @@ window_backed_app_get_window (ShellApp *app)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* shell_app_get_icon:
|
||||
*
|
||||
* Look up the icon for this application
|
||||
*
|
||||
* Return value: (transfer none): A #GIcon
|
||||
*/
|
||||
GIcon *
|
||||
shell_app_get_icon (ShellApp *app)
|
||||
static ClutterActor *
|
||||
window_backed_app_get_icon (ShellApp *app,
|
||||
int size)
|
||||
{
|
||||
MetaWindow *window = NULL;
|
||||
StWidget *widget;
|
||||
int scale, scaled_size;
|
||||
ShellGlobal *global;
|
||||
StThemeContext *context;
|
||||
|
||||
g_return_val_if_fail (SHELL_IS_APP (app), NULL);
|
||||
global = shell_global_get ();
|
||||
context = st_theme_context_get_for_stage (shell_global_get_stage (global));
|
||||
g_object_get (context, "scale-factor", &scale, NULL);
|
||||
|
||||
if (app->info)
|
||||
return g_app_info_get_icon (G_APP_INFO (app->info));
|
||||
|
||||
if (app->fallback_icon)
|
||||
return app->fallback_icon;
|
||||
scaled_size = size * scale;
|
||||
|
||||
/* During a state transition from running to not-running for
|
||||
* window-backend apps, it's possible we get a request for the icon.
|
||||
* Avoid asserting here and just return a fallback icon
|
||||
* Avoid asserting here and just return an empty image.
|
||||
*/
|
||||
if (app->running_state != NULL)
|
||||
window = window_backed_app_get_window (app);
|
||||
|
||||
if (window &&
|
||||
meta_window_get_client_type (window) == META_WINDOW_CLIENT_TYPE_X11)
|
||||
if (window == NULL)
|
||||
{
|
||||
app->fallback_icon =
|
||||
ClutterActor *actor;
|
||||
|
||||
actor = clutter_actor_new ();
|
||||
g_object_set (actor,
|
||||
"opacity", 0,
|
||||
"width", (float) scaled_size,
|
||||
"height", (float) scaled_size,
|
||||
NULL);
|
||||
return actor;
|
||||
}
|
||||
|
||||
if (meta_window_get_client_type (window) == META_WINDOW_CLIENT_TYPE_X11)
|
||||
{
|
||||
StWidget *texture_actor;
|
||||
|
||||
texture_actor =
|
||||
st_texture_cache_bind_cairo_surface_property (st_texture_cache_get_default (),
|
||||
G_OBJECT (window),
|
||||
"icon");
|
||||
"icon",
|
||||
scaled_size);
|
||||
|
||||
widget = g_object_new (ST_TYPE_BIN,
|
||||
"child", texture_actor,
|
||||
NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
app->fallback_icon = g_themed_icon_new ("application-x-executable");
|
||||
widget = g_object_new (ST_TYPE_ICON,
|
||||
"icon-size", size,
|
||||
"icon-name", "application-x-executable",
|
||||
NULL);
|
||||
}
|
||||
st_widget_add_style_class_name (widget, "fallback-app-icon");
|
||||
|
||||
return app->fallback_icon;
|
||||
return CLUTTER_ACTOR (widget);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -239,16 +257,16 @@ shell_app_create_icon_texture (ShellApp *app,
|
||||
GIcon *icon;
|
||||
ClutterActor *ret;
|
||||
|
||||
if (app->info == NULL)
|
||||
return window_backed_app_get_icon (app, size);
|
||||
|
||||
ret = st_icon_new ();
|
||||
st_icon_set_icon_size (ST_ICON (ret), size);
|
||||
st_icon_set_fallback_icon_name (ST_ICON (ret), "application-x-executable");
|
||||
|
||||
icon = shell_app_get_icon (app);
|
||||
icon = g_app_info_get_icon (G_APP_INFO (app->info));
|
||||
st_icon_set_gicon (ST_ICON (ret), icon);
|
||||
|
||||
if (shell_app_is_window_backed (app))
|
||||
st_widget_add_style_class_name (ST_WIDGET (ret), "fallback-app-icon");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1558,7 +1576,6 @@ shell_app_dispose (GObject *object)
|
||||
ShellApp *app = SHELL_APP (object);
|
||||
|
||||
g_clear_object (&app->info);
|
||||
g_clear_object (&app->fallback_icon);
|
||||
|
||||
while (app->running_state)
|
||||
_shell_app_remove_window (app, app->running_state->windows->data);
|
||||
|
@@ -29,7 +29,6 @@ const char *shell_app_get_id (ShellApp *app);
|
||||
GDesktopAppInfo *shell_app_get_app_info (ShellApp *app);
|
||||
|
||||
ClutterActor *shell_app_create_icon_texture (ShellApp *app, int size);
|
||||
GIcon *shell_app_get_icon (ShellApp *app);
|
||||
const char *shell_app_get_name (ShellApp *app);
|
||||
const char *shell_app_get_description (ShellApp *app);
|
||||
gboolean shell_app_is_window_backed (ShellApp *app);
|
||||
|
@@ -899,9 +899,8 @@ load_gl_symbol (const char *name,
|
||||
}
|
||||
|
||||
static void
|
||||
global_stage_after_paint (ClutterStage *stage,
|
||||
ClutterStageView *stage_view,
|
||||
ShellGlobal *global)
|
||||
global_stage_after_paint (ClutterStage *stage,
|
||||
ShellGlobal *global)
|
||||
{
|
||||
/* At this point, we've finished all layout and painting, but haven't
|
||||
* actually flushed or swapped */
|
||||
|
425
src/shell-recorder-src.c
Normal file
425
src/shell-recorder-src.c
Normal file
@@ -0,0 +1,425 @@
|
||||
/* -*- 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;
|
||||
}
|
40
src/shell-recorder-src.h
Normal file
40
src/shell-recorder-src.h
Normal file
@@ -0,0 +1,40 @@
|
||||
/* -*- 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__ */
|
1624
src/shell-recorder.c
Normal file
1624
src/shell-recorder.c
Normal file
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user