Compare commits

..

4 Commits

Author SHA1 Message Date
966d4b164c st/theme-context: Invalidate texture cache when scaling changes 2020-04-03 19:01:08 -03:00
a3cf41734a appDisplay: Set the folder icon geometry through CSS
The CSS engine is scale-aware, whereas simply setting the
width and height properties directly isn't.

Use CSS to set the folder icon.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1176
2020-04-03 18:20:57 -03:00
76811b4ebc st/theme-node: Use the node's scale factor
Each node stores the scale factor in place when it was created.
Creating nodes with the same style, but with different scale
factors, yields different nodes.

Use the node's scale factor instead of retrieving the context's
one.

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1176
2020-04-03 18:20:57 -03:00
2721c306af st/theme-node: Consider scale factor when comparing
The CSS engine of St is scale-aware, which means every length
and size it produces is multiplied by the current scale factor.

However, the individual nodes aren't aware of the scale factor
when they compare to each other.

Store and compare the scale factors in the nodes themselves.

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

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1176
2020-04-03 18:20:57 -03:00
196 changed files with 13742 additions and 19296 deletions

1
.gitignore vendored
View File

@ -60,6 +60,7 @@ src/calendar-server/evolution-calendar.desktop
src/calendar-server/org.gnome.Shell.CalendarServer.service src/calendar-server/org.gnome.Shell.CalendarServer.service
src/gnome-shell src/gnome-shell
src/gnome-shell-calendar-server src/gnome-shell-calendar-server
src/gnome-shell-extension-prefs
src/gnome-shell-extension-tool src/gnome-shell-extension-tool
src/gnome-shell-hotplug-sniffer src/gnome-shell-hotplug-sniffer
src/gnome-shell-perf-helper src/gnome-shell-perf-helper

View File

@ -18,7 +18,7 @@ variables:
- merge_requests - merge_requests
check_commit_log: check_commit_log:
image: registry.gitlab.gnome.org/gnome/mutter/master:v4 image: registry.gitlab.gnome.org/gnome/mutter/master:v3
stage: review stage: review
variables: variables:
GIT_DEPTH: "100" GIT_DEPTH: "100"
@ -28,10 +28,10 @@ check_commit_log:
- merge_requests - merge_requests
js_check: js_check:
image: registry.gitlab.gnome.org/gnome/gnome-shell/extension-ci:v2 image: registry.gitlab.gnome.org/gnome/gnome-shell/extension-ci:v1
stage: review stage: review
script: script:
- find js -name '*.js' -exec js68 -c -s '{}' ';' 2>&1 | tee $JS_LOG - find js -name '*.js' -exec js60 -c -s '{}' ';' 2>&1 | tee $JS_LOG
- (! grep -q . $JS_LOG) - (! grep -q . $JS_LOG)
<<: *only_default <<: *only_default
artifacts: artifacts:
@ -40,7 +40,7 @@ js_check:
when: on_failure when: on_failure
eslint: eslint:
image: registry.gitlab.gnome.org/gnome/gnome-shell/extension-ci:v2 image: registry.gitlab.gnome.org/gnome/gnome-shell/extension-ci:v1
stage: review stage: review
script: script:
- ./.gitlab-ci/run-eslint.sh - ./.gitlab-ci/run-eslint.sh
@ -51,21 +51,21 @@ eslint:
when: always when: always
potfile_check: potfile_check:
image: registry.gitlab.gnome.org/gnome/gnome-shell/extension-ci:v2 image: registry.gitlab.gnome.org/gnome/gnome-shell/extension-ci:v1
stage: review stage: review
script: script:
- ./.gitlab-ci/check-potfiles.sh - ./.gitlab-ci/check-potfiles.sh
<<: *only_default <<: *only_default
no_template_check: no_template_check:
image: registry.gitlab.gnome.org/gnome/gnome-shell/extension-ci:v2 image: registry.gitlab.gnome.org/gnome/gnome-shell/extension-ci:v1
stage: review stage: review
script: script:
- ./.gitlab-ci/check-template-strings.sh - ./.gitlab-ci/check-template-strings.sh
<<: *only_default <<: *only_default
build: build:
image: registry.gitlab.gnome.org/gnome/mutter/master:v4 image: registry.gitlab.gnome.org/gnome/mutter/master:v3
stage: build stage: build
before_script: before_script:
- .gitlab-ci/checkout-mutter.sh - .gitlab-ci/checkout-mutter.sh
@ -83,7 +83,7 @@ build:
- build - build
test: test:
image: registry.gitlab.gnome.org/gnome/mutter/master:v4 image: registry.gitlab.gnome.org/gnome/mutter/master:v3
stage: test stage: test
variables: variables:
XDG_RUNTIME_DIR: "$CI_PROJECT_DIR/runtime-dir" XDG_RUNTIME_DIR: "$CI_PROJECT_DIR/runtime-dir"
@ -100,7 +100,7 @@ test:
when: on_failure when: on_failure
test-pot: test-pot:
image: registry.gitlab.gnome.org/gnome/mutter/master:v4 image: registry.gitlab.gnome.org/gnome/mutter/master:v3
stage: test stage: test
before_script: before_script:
- ninja -C mutter/build install - ninja -C mutter/build install
@ -124,7 +124,11 @@ flatpak:
RUNTIME_REPO: "https://nightly.gnome.org/gnome-nightly.flatpakrepo" RUNTIME_REPO: "https://nightly.gnome.org/gnome-nightly.flatpakrepo"
FLATPAK_MODULE: "gnome-extensions-app" FLATPAK_MODULE: "gnome-extensions-app"
APP_ID: "org.gnome.Extensions" APP_ID: "org.gnome.Extensions"
MESON_ARGS: "$SUBPROJECT"
extends: .flatpak extends: .flatpak
before_script:
- flatpak run --command=$SUBPROJECT/generate-translations.sh
--filesystem=host org.gnome.Sdk//master
<<: *only_default <<: *only_default
nightly: nightly:

View File

@ -1,24 +0,0 @@
# Rebuild and push with
#
# cd .gitlab-ci/
# podman build --format docker --no-cache -t registry.gitlab.gnome.org/gnome/gnome-shell/extension-ci:v2 .
# podman push registry.gitlab.gnome.org/gnome/gnome-shell/extension-ci:v2
#
FROM registry.fedoraproject.org/fedora:32
RUN dnf -y update && dnf -y upgrade && \
dnf install -y 'dnf-command(copr)' git && \
# For syntax checks with `find . -name '*.js' -exec js68 -c -s '{}' ';'`
dnf install -y findutils mozjs68-devel && \
# For static analysis with eslint
dnf install -y nodejs && \
npm install -g eslint && \
# Shameless plug for my own tooling; useful for generating zip
dnf copr enable -y fmuellner/gnome-shell-ci && \
dnf install -y gnome-extensions-tool meson && \
dnf clean all

View File

@ -0,0 +1,18 @@
FROM registry.fedoraproject.org/fedora:latest
RUN dnf -y update && dnf -y upgrade && \
dnf install -y 'dnf-command(copr)' git && \
# For syntax checks with `find . -name '*.js' -exec js60 -c -s '{}' ';'`
dnf install -y findutils mozjs60-devel && \
# For static analysis with eslint
dnf install -y nodejs && \
npm install -g eslint && \
# Shameless plug for my own tooling; useful for generating zip
dnf copr enable -y fmuellner/gnome-shell-ci && \
dnf install -y gnome-extensions-tool meson && \
dnf clean all && \
rm -rf /var/cache/dnf

View File

@ -6,11 +6,6 @@ globs=('*.js' '*.c')
# find source files that contain gettext keywords # find source files that contain gettext keywords
files=$(grep -lR ${globs[@]/#/--include=} '\(gettext\|[^I_)]_\)(' $srcdirs) files=$(grep -lR ${globs[@]/#/--include=} '\(gettext\|[^I_)]_\)(' $srcdirs)
# filter out excluded files
if [ -f po/POTFILES.skip ]; then
files=$(for f in $files; do ! grep -q ^$f po/POTFILES.skip && echo $f; done)
fi
# find those that aren't listed in POTFILES.in # find those that aren't listed in POTFILES.in
missing=$(for f in $files; do ! grep -q ^$f po/POTFILES.in && echo $f; done) missing=$(for f in $files; do ! grep -q ^$f po/POTFILES.in && echo $f; done)

View File

@ -18,14 +18,12 @@ run_eslint() {
local extra_args=ARGS_$1 local extra_args=ARGS_$1
local output_var=OUTPUT_$1 local output_var=OUTPUT_$1
local output=${!output_var} local output=${!output_var}
local cache=.eslintcache-${1,,}
# ensure output exists even if eslint doesn't report any errors # ensure output exists even if eslint doesn't report any errors
mkdir -p $(dirname $output) mkdir -p $(dirname $output)
touch $output touch $output
eslint -f unix --cache --cache-location $cache ${!extra_args} -o $output \ eslint -f unix ${!extra_args} -o $output js subprojects/extensions-app/js
js subprojects/extensions-app/js
} }
list_commit_range_additions() { list_commit_range_additions() {

85
NEWS
View File

@ -1,88 +1,3 @@
3.37.2
======
* Add support for "PrefersNonDefaultGPU" desktop key [Bastien; !1226]
* Only start systemd units when running under systemd
[Carlos, Florian; #2755, !1242, !1252]
* Fix "ghost" media controls [Bryan; #2776]
* Fix zombie sockets from extensions downloader [Michael; #2774]
* Update world clocks offsets when timezone changes [Bryan; #2209]
* Support scrolling anywhere in slider menu items [Peter; #2795]
* Fix "Do Not Disturb" setting getting reset on startup [Florian; #2804]
* Only allow updates for extensions that aren't cached [Florian; !1248]
* Fix matching notifications by PID [Florian; #2592]
* Indicate extension errors in Extensions app [Florian; #2337]
* Add clipboard API for querying supported mimetypes [Andy; #2819]
* Add preview to color picker [Florian; #451]
* Improve world clocks styling [PrOF-kk; #2825]
* Remove Frequent view from app picker [Georges; !880]
* Fix pad OSD glitches [Carlos; !1290]
* Expose actor tree in looking glass [Georges; !1292]
* Fixed crashes [Jonas D., Florian; #2709, #2757]
* Misc. bug fixes and cleanups [Florian, AsciiWolf, Michael, Piotr, Ting-Wei,
Amr, Alexander, Bryan, Georges, Jonas D., Andy, Björn, Koki, Carlos; !1229,
!1231, !1233, !1235, #2578, #2735, #2751, #2602, #2777, !1249, #2796, !1268,
!1269, !1265, !1245, !1273, #2816, !1274, !1263, !1188, !1276, #2652, !1277,
!1281, #2286, !1267, !1286, !1279, !1288, !1293, !1294, !1291]
Contributors:
AsciiWolf, Michael Catanzaro, Björn Daase, Jonas Dreßler, Bryan Dunsmore,
Koki Fukuda, Carlos Garnacho, Andy Holmes, Amr Ibrahim, Soslan Khubulov,
Ting-Wei Lan, Michael Lass, Alexander Mikhaylenko, Florian Müllner,
Georges Basile Stavracas Neto, Bastien Nocera, PrOF-kk, Peter Simonyi
Translators:
Fabio Tomat [fur], Cheng-Chia Tseng [zh_TW], Yuri Chornoivan [uk],
Dušan Kazik [sk], Piotr Drąg [pl], Soslan Khubulov [os],
Daniel Mustieles [es], Nathan Follens [nl], Bruce Cowan [en_GB],
Florentina Mușat [ro], Milo Casagrande [it], Anders Jonsson [sv],
Charles Monzat [fr], Danial Behzadi [fa], sicklylife [ja], Kukuh Syafaat [id],
Jordi Mas [ca], Emin Tufan Çetin [tr], Jiri Grönroos [fi], Марко Костић [sr],
Christian Kirbach [de], Changwoo Ryu [ko], Matej Urbančič [sl]
3.37.1
======
* Improve bluetooth submenu title [Mariana; #2340]
* Add openPrefs() convenience method for extensions [Florian; !1163]
* Bring back support for empty StIcons [Andre, Jonas D.; !1173, !1178]
* Wake up screen when unlocking programmatically [Florian; !1158]
* Improve extensions tool error reporting [Florian; #2391]
* Improve handling of scale-factor changes [Georges; !1176]
* Tone down weekend days with events in calendar [Jakub; #2588]
* Fix showing bluetooth submenu when devices were set up [Florian; !1174]
* Add support for parental controls filtering [Philip W.; !465]
* Provide alternative extension templates [Florian; !812]
* Improve weather section's empty state [Mariana; #2179]
* Fix translations of folder names [Florian; #2623]
* Drop Tweener [Jonas Å.; !1200]
* Match ASCII alternatives of system actions [Will; #2688]
* Fix delay on lock screen after entering wrong password [Jonas D.; #2655]
* Use globalThis instead of window [Andy; #2322]
* Inhibit remote access when disabled by session mode [Jonas Å.; !1210]
* Improve calendar-server performance [Milan; #1875]
* Add gnome-shell-extension-prefs wrapper for compatibility [Florian; !1220]
* Fix stuck lock screen after unlock [Jonas D., Florian; #2446]
* Fixed crashes [Jonas D., Florian, Carlos; #2584, #2625, !1223, !1218]
* Misc. bug fixes and cleanups [Florian, Jonas Å., Marco, Andre, Georges,
Jonas D., Jan, Philip Ch.,, Xiaoguang, Will, Jordan, Matthew, qarmin;
!1126, !1155, !1156, !1165, !1168, !1169, #2551, #2563, !1172, !1175, !1179,
!1160, #2562, #2578, !1184, #2559, !1186, #2607, !1191, !1194, !1199, !1203,
#2649, #2628, !1205, !1206, !1208, !1207, !1211, !1214, !1213, !1192, !1217,
!1219, #1615, #2691, !1094, !1177]
Contributors:
Marco Trevisan (Treviño), Philip Chimento, Milan Crha, Jonas Dreßler,
Carlos Garnacho, Andy Holmes, Matthew Leeds, Andre Moreira Magalhaes,
Florian Müllner, Georges Basile Stavracas Neto, Jordan Petridis,
Mariana Picolo, Jakub Steiner, Will Thompson, Jan Tojnar, Xiaoguang Wang,
Philip Withnall, qarmin, Jonas Ådahl
Translators:
Fabio Tomat [fur], Cheng-Chia Tseng [zh_TW], Danial Behzadi [fa],
Jiri Grönroos [fi], Ibai Oihanguren Sala [eu], Марко Костић [sr],
Rūdolfs Mazurs [lv], Yuri Chornoivan [uk], Carmen Bianca BAKKER [eo],
Dingzhong Chen [zh_CN], Rafael Fontenelle [pt_BR], Petr Kovář [cs],
Asier Sarasua Garmendia [eu], Daniel Mustieles [es], Emin Tufan Çetin [tr]
3.36.0 3.36.0
====== ======
* Fix off-by-1900 error in date conversions [Florian; !1061] * Fix off-by-1900 error in date conversions [Florian; !1061]

View File

@ -1,19 +1,12 @@
<node> <node>
<interface name="org.gnome.Shell.CalendarServer"> <interface name="org.gnome.Shell.CalendarServer">
<method name="SetTimeRange"> <method name="GetEvents">
<arg type="x" name="since" direction="in"/> <arg type="x" direction="in" />
<arg type="x" name="until" direction="in"/> <arg type="x" direction="in" />
<arg type="b" name="force_reload" direction="in"/> <arg type="b" direction="in" />
<arg type="a(sssbxxa{sv})" direction="out" />
</method> </method>
<signal name="EventsAddedOrUpdated">
<arg type="a(ssbxxa{sv})" name="events" direction="out"/>
</signal>
<signal name="EventsRemoved">
<arg type="as" name="ids" direction="out"/>
</signal>
<signal name="ClientDisappeared">
<arg type="s" name="source_uid" direction="out"/>
</signal>
<property name="HasCalendars" type="b" access="read" /> <property name="HasCalendars" type="b" access="read" />
<signal name="Changed" />
</interface> </interface>
</node> </node>

View File

@ -2,6 +2,7 @@
<gresources> <gresources>
<gresource prefix="/org/gnome/shell/dbus-interfaces"> <gresource prefix="/org/gnome/shell/dbus-interfaces">
<file preprocess="xml-stripblanks">net.hadess.SensorProxy.xml</file> <file preprocess="xml-stripblanks">net.hadess.SensorProxy.xml</file>
<file preprocess="xml-stripblanks">net.hadess.SwitcherooControl.xml</file>
<file preprocess="xml-stripblanks">org.freedesktop.Application.xml</file> <file preprocess="xml-stripblanks">org.freedesktop.Application.xml</file>
<file preprocess="xml-stripblanks">org.freedesktop.bolt1.Device.xml</file> <file preprocess="xml-stripblanks">org.freedesktop.bolt1.Device.xml</file>
<file preprocess="xml-stripblanks">org.freedesktop.bolt1.Manager.xml</file> <file preprocess="xml-stripblanks">org.freedesktop.bolt1.Manager.xml</file>

View File

@ -6,7 +6,6 @@
<file>checkbox-off-focused.svg</file> <file>checkbox-off-focused.svg</file>
<file>checkbox-off.svg</file> <file>checkbox-off.svg</file>
<file>checkbox.svg</file> <file>checkbox.svg</file>
<file alias="icons/color-pick.svg">color-pick.svg</file>
<file>dash-placeholder.svg</file> <file>dash-placeholder.svg</file>
<file>gnome-shell.css</file> <file>gnome-shell.css</file>
<file>gnome-shell-high-contrast.css</file> <file>gnome-shell-high-contrast.css</file>

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 6.1 KiB

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M6.5 1.031c-.371 0-.742-.035-1.11.016-.367.05-.73.203-.972.476-.125.141-.215.309-.266.485-.047.18-.054.367-.02.55.032.184.102.356.192.516.09.164.203.309.317.457L5 4H2a1.8 1.8 0 00-.41.035.791.791 0 00-.36.195.791.791 0 00-.195.36C1 4.723 1 4.863 1 5v2.75l.77-.344c.265-.117.542-.23.832-.242.289-.016.586.074.812.254.227.18.383.441.465.723.082.277.101.57.121.859.02.316.04.637-.016.95-.058.312-.199.616-.43.831a1.264 1.264 0 01-.874.32c-.317-.007-.618-.128-.91-.257L1 10.5V14c0 .137.004.277.035.41a.791.791 0 00.195.36c.098.097.227.16.36.195.133.035.273.035.41.035h3l-.328-.68c-.14-.293-.274-.597-.29-.922-.015-.32.095-.652.31-.894.214-.242.523-.39.84-.453.316-.067.644-.059.968-.059.324 0 .652-.008.969.059.316.062.625.21.84.453.214.242.324.574.308.894-.015.325-.148.63-.289.922L8 15h3a1.8 1.8 0 00.41-.035.791.791 0 00.36-.195.791.791 0 00.195-.36C12 14.277 12 14.137 12 14v-3.563l.703.297c.29.125.59.239.902.246.313.004.63-.101.864-.308.238-.203.386-.496.46-.8C15 9.565 15 9.25 15 8.937c0-.313 0-.63-.07-.934-.075-.305-.223-.598-.461-.8a1.288 1.288 0 00-.864-.31c-.312.008-.613.122-.902.247L12 7.437V5a1.8 1.8 0 00-.035-.41.791.791 0 00-.195-.36.791.791 0 00-.36-.195C11.277 4 11.137 4 11 4H8l.36-.469c.113-.148.226-.293.316-.457.09-.16.16-.332.191-.515a1.248 1.248 0 00-.02-.551 1.256 1.256 0 00-.265-.485c-.242-.273-.605-.425-.973-.476-.367-.05-.738-.016-1.109-.016zm0 0" fill="#474747"/></svg>

Before

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -1 +0,0 @@
install_subdir('hicolor', install_dir: icondir)

View File

@ -1,6 +1,5 @@
desktop_files = [ desktop_files = [
'org.gnome.Shell.desktop', 'org.gnome.Shell.desktop',
'org.gnome.Shell.Extensions.desktop',
] ]
service_files = [] service_files = []
@ -43,7 +42,6 @@ endforeach
subdir('dbus-interfaces') subdir('dbus-interfaces')
subdir('icons')
subdir('theme') subdir('theme')
data_resources = [ data_resources = [

View File

@ -1,10 +0,0 @@
[Desktop Entry]
Type=Application
# Keep in sync with subprojects/extensions-app
Name=Extensions
# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
Icon=org.gnome.Shell.Extensions
# Never launch this, just provide name+icon to portal dialog
Exec=false
OnlyShowIn=GNOME;
NoDisplay=true

View File

@ -1,94 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="5.4116011mm"
height="5.1374583mm"
viewBox="0 0 5.4116011 5.1374583"
version="1.1"
id="svg5595"
inkscape:version="0.92.4 (unknown)"
sodipodi:docname="color-pick.svg">
<defs
id="defs5589">
<filter
inkscape:collect="always"
x="-0.10291173"
width="1.2058235"
y="-0.065432459"
height="1.1308649"
id="filter5601"
style="color-interpolation-filters:sRGB">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="0.610872"
id="feGaussianBlur5603" />
</filter>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="15.839192"
inkscape:cx="39.387731"
inkscape:cy="12.554326"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1016"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0" />
<metadata
id="metadata5592">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-103.12753,-146.26461)">
<circle
r="8.4810486"
cy="9.82623"
cx="10.226647"
id="circle7584"
style="color:#000000;display:inline;overflow:visible;opacity:0.6;vector-effect:none;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;filter:url(#filter5601)"
transform="matrix(0.26458333,0,0,0.26458333,103.12753,146.26461)" />
<path
style="color:#000000;display:inline;overflow:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.26399338;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
d="m 108.07728,148.64122 c 0,1.2393 -1.00465,2.24394 -2.24395,2.24394 -1.23929,0 -2.24716,-1.00465 -2.25221,-2.24394 l -0.009,-2.24458 2.26136,6.4e-4 c 1.2393,3.4e-4 2.24395,1.00464 2.24395,2.24394 z"
id="path7523-7"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ssscss" />
<circle
style="color:#000000;display:inline;overflow:visible;opacity:1;vector-effect:none;fill:#50dbb5;fill-opacity:1;stroke:none;stroke-width:0.36885914;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
id="path7482-1"
cx="105.83707"
cy="148.64352"
r="1.844296" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.7 KiB

View File

@ -14,6 +14,8 @@ $app_icon_padding: 24px;
} }
} }
//.app-display { spacing: 20px; }
/* App Icons */ /* App Icons */
$app_grid_fg_color: #fff; $app_grid_fg_color: #fff;
@ -121,11 +123,15 @@ $app_grid_fg_color: #fff;
} }
// Some hacks I don't even know // Some hacks I don't even know
.all-apps { .all-apps,
.frequent-apps > StBoxLayout {
// horizontal padding to make sure scrollbars or dash don't overlap content // horizontal padding to make sure scrollbars or dash don't overlap content
padding: 0px 88px 10px 88px; padding: 0px 88px 10px 88px;
} }
// Label when no frequent apps
.no-frequent-applications-label { @extend %status_text; }
// shutdown and other actions in the grid // shutdown and other actions in the grid
.system-action-icon { .system-action-icon {
background-color: rgba(0,0,0,0.8); background-color: rgba(0,0,0,0.8);
@ -133,3 +139,44 @@ $app_grid_fg_color: #fff;
border-radius: 99px; border-radius: 99px;
icon-size: $app_icon_size * 0.5; icon-size: $app_icon_size * 0.5;
} }
/* Frequent | All toggle */
// container
.app-view-controls {
padding-bottom: 32px;
}
// buttons
.app-view-control {
padding: 4px 32px;
margin: 0 4px;
&, &:hover, &:checked {
@include button(undecorated);
color: darken($osd_fg_color, 25%);
}
&:hover {
color: $osd_fg_color;
box-shadow: inset 0 -2px darken($osd_fg_color, 25%);
}
&:active {
box-shadow: inset 0 -2px $osd_fg_color;
}
&:checked {
color: $osd_fg_color;
box-shadow: inset 0 -2px $selected_bg_color;
}
&:first-child {
border-right-width: 0;
border-radius: 0;
}
&:last-child {
border-radius: 0;
}
}

View File

@ -153,11 +153,9 @@
} }
.calendar-day-with-events { .calendar-day-with-events {
background-image: url("resource:///org/gnome/shell/theme/calendar-today.svg");
&.calendar-work-day {
color: lighten($fg_color,10%); color: lighten($fg_color,10%);
font-weight: bold; font-weight: bold;
} background-image: url("resource:///org/gnome/shell/theme/calendar-today.svg");
} }
.calendar-other-month-day { .calendar-other-month-day {
@ -204,7 +202,7 @@
.world-clocks-time { .world-clocks-time {
font-weight: bold; font-weight: bold;
color: $fg_color; color: $fg_color;
font-feature-settings: "tnum"; font-feature-settings: "lnum";
@include fontsize($base_font_size); @include fontsize($base_font_size);
text-align: right; text-align: right;
} }

View File

@ -1,7 +1,5 @@
/* Looking Glass */ /* Looking Glass */
$text_fg_color: #ccc;
// Dialog // Dialog
#LookingGlassDialog { #LookingGlassDialog {
background-color: $osd_bg_color; background-color: $osd_bg_color;
@ -54,11 +52,6 @@ $text_fg_color: #ccc;
&:hover { color: lighten($link_color, 10%); } &:hover { color: lighten($link_color, 10%); }
&:active { color: darken($link_color, 10%); } &:active { color: darken($link_color, 10%); }
} }
.actor-link {
color: $text_fg_color;
&:hover { color: lighten($text_fg_color, 20%); }
&:active { color: darken($text_fg_color, 20%); }
}
} }
.lg-completions-text { .lg-completions-text {

View File

@ -54,10 +54,6 @@
@extend %status_text; @extend %status_text;
} }
.grid-search-results {
spacing: $base_spacing * 6;
}
// Search results with icons // Search results with icons
.grid-search-result { .grid-search-result {
@extend %app-well-app; @extend %app-well-app;

View File

@ -9,8 +9,6 @@ const { ServiceImplementation } = imports.dbusService;
const NotificationsIface = loadInterfaceXML('org.freedesktop.Notifications'); const NotificationsIface = loadInterfaceXML('org.freedesktop.Notifications');
const NotificationsProxy = Gio.DBusProxy.makeProxyWrapper(NotificationsIface); const NotificationsProxy = Gio.DBusProxy.makeProxyWrapper(NotificationsIface);
Gio._promisify(Gio.DBusConnection.prototype, 'call', 'call_finish');
var NotificationDaemon = class extends ServiceImplementation { var NotificationDaemon = class extends ServiceImplementation {
constructor() { constructor() {
super(NotificationsIface, '/org/freedesktop/Notifications'); super(NotificationsIface, '/org/freedesktop/Notifications');
@ -44,15 +42,7 @@ var NotificationDaemon = class extends ServiceImplementation {
null, null); null, null);
} }
async NotifyAsync(params, invocation) { NotifyAsync(params, invocation) {
const pid = await this._getSenderPid(invocation.get_sender());
const hints = params[6];
params[6] = {
...hints,
'sender-pid': new GLib.Variant('u', pid),
};
this._proxy.NotifyRemote(...params, (res, error) => { this._proxy.NotifyRemote(...params, (res, error) => {
if (this._handleError(invocation, error)) if (this._handleError(invocation, error))
return; return;
@ -87,19 +77,4 @@ var NotificationDaemon = class extends ServiceImplementation {
invocation.return_value(new GLib.Variant('(ssss)', res)); invocation.return_value(new GLib.Variant('(ssss)', res));
}); });
} }
async _getSenderPid(sender) {
const res = await Gio.DBus.session.call(
'org.freedesktop.DBus',
'/',
'org.freedesktop.DBus',
'GetConnectionUnixProcessID',
new GLib.Variant('(s)', [sender]),
new GLib.VariantType('(u)'),
Gio.DBusCallFlags.NONE,
-1,
null);
const [pid] = res.deepUnpack();
return pid;
}
}; };

View File

@ -184,7 +184,7 @@ var AuthPrompt = GObject.registerClass({
}); });
this._defaultButtonWell.add_constraint(new Clutter.BindConstraint({ this._defaultButtonWell.add_constraint(new Clutter.BindConstraint({
source: this.cancelButton, source: this.cancelButton,
coordinate: Clutter.BindCoordinate.WIDTH, coordinate: Clutter.BindCoordinate.SIZE,
})); }));
this._mainBox.add_child(this._defaultButtonWell); this._mainBox.add_child(this._defaultButtonWell);
@ -424,13 +424,7 @@ var AuthPrompt = GObject.registerClass({
} }
updateSensitivity(sensitive) { updateSensitivity(sensitive) {
if (this._entry.reactive === sensitive)
return;
this._entry.reactive = sensitive; this._entry.reactive = sensitive;
if (sensitive)
this._entry.grab_key_focus();
} }
vfunc_hide() { vfunc_hide() {

View File

@ -589,8 +589,8 @@ var LoginDialog = GObject.registerClass({
return actorBox; return actorBox;
} }
vfunc_allocate(dialogBox) { vfunc_allocate(dialogBox, flags) {
this.set_allocation(dialogBox); this.set_allocation(dialogBox, flags);
let themeNode = this.get_theme_node(); let themeNode = this.get_theme_node();
dialogBox = themeNode.get_content_box(dialogBox); dialogBox = themeNode.get_content_box(dialogBox);
@ -719,19 +719,19 @@ var LoginDialog = GObject.registerClass({
// Finally hand out the allocations // Finally hand out the allocations
if (bannerAllocation) if (bannerAllocation)
this._bannerView.allocate(bannerAllocation); this._bannerView.allocate(bannerAllocation, flags);
if (authPromptAllocation) if (authPromptAllocation)
this._authPrompt.allocate(authPromptAllocation); this._authPrompt.allocate(authPromptAllocation, flags);
if (userSelectionAllocation) if (userSelectionAllocation)
this._userSelectionBox.allocate(userSelectionAllocation); this._userSelectionBox.allocate(userSelectionAllocation, flags);
if (logoAllocation) if (logoAllocation)
this._logoBin.allocate(logoAllocation); this._logoBin.allocate(logoAllocation, flags);
if (sessionMenuButtonAllocation) if (sessionMenuButtonAllocation)
this._sessionMenuButton.allocate(sessionMenuButtonAllocation); this._sessionMenuButton.allocate(sessionMenuButtonAllocation, flags);
} }
_ensureUserListLoaded() { _ensureUserListLoaded() {
@ -810,13 +810,12 @@ var LoginDialog = GObject.registerClass({
return; return;
this._logoBin.destroy_all_children(); this._logoBin.destroy_all_children();
const [valid, resourceScale] = this._logoBin.get_resource_scale(); if (this._logoFile && this._logoBin.resource_scale > 0) {
if (this._logoFile && valid) {
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
this._logoBin.add_child(this._textureCache.load_file_async(this._logoFile, this._logoBin.add_child(this._textureCache.load_file_async(this._logoFile,
-1, -1, -1, -1,
scaleFactor, scaleFactor,
resourceScale)); this._logoBin.resource_scale));
} }
} }

View File

@ -23,7 +23,6 @@
<file>misc/modemManager.js</file> <file>misc/modemManager.js</file>
<file>misc/objectManager.js</file> <file>misc/objectManager.js</file>
<file>misc/params.js</file> <file>misc/params.js</file>
<file>misc/parentalControlsManager.js</file>
<file>misc/permissionStore.js</file> <file>misc/permissionStore.js</file>
<file>misc/smartcardManager.js</file> <file>misc/smartcardManager.js</file>
<file>misc/systemActions.js</file> <file>misc/systemActions.js</file>
@ -102,6 +101,7 @@
<file>ui/swipeTracker.js</file> <file>ui/swipeTracker.js</file>
<file>ui/switcherPopup.js</file> <file>ui/switcherPopup.js</file>
<file>ui/switchMonitor.js</file> <file>ui/switchMonitor.js</file>
<file>ui/tweener.js</file>
<file>ui/unlockDialog.js</file> <file>ui/unlockDialog.js</file>
<file>ui/userWidget.js</file> <file>ui/userWidget.js</file>
<file>ui/viewSelector.js</file> <file>ui/viewSelector.js</file>

View File

@ -171,13 +171,13 @@ var IBusManager = class {
this._panelService.connect('set-content-type', this._setContentType.bind(this)); this._panelService.connect('set-content-type', this._setContentType.bind(this));
} catch (e) { } catch (e) {
} }
this._updateReadiness();
try { try {
// If an engine is already active we need to get its properties // If an engine is already active we need to get its properties
const engine = const engine =
await this._ibus.get_global_engine_async(-1, this._cancellable); await this._ibus.get_global_engine_async(-1, this._cancellable);
this._engineChanged(this._ibus, engine.get_name()); this._engineChanged(this._ibus, engine.get_name());
this._updateReadiness();
} catch (e) { } catch (e) {
} }
} }

View File

@ -24,7 +24,8 @@ function getCompletions(text, commandHeader, globalCompletionList) {
[expr_, base, attrHead] = matches; [expr_, base, attrHead] = matches;
methods = getPropertyNamesFromExpression(base, commandHeader).filter( methods = getPropertyNamesFromExpression(base, commandHeader).filter(
attr => attr.slice(0, attrHead.length) === attrHead); attr => attr.slice(0, attrHead.length) == attrHead
);
} }
// Look for the empty expression or partially entered words // Look for the empty expression or partially entered words
@ -33,7 +34,8 @@ function getCompletions(text, commandHeader, globalCompletionList) {
if (text == '' || matches) { if (text == '' || matches) {
[expr_, attrHead] = matches; [expr_, attrHead] = matches;
methods = globalCompletionList.filter( methods = globalCompletionList.filter(
attr => attr.slice(0, attrHead.length) === attrHead); attr => attr.slice(0, attrHead.length) == attrHead
);
} }
} }

View File

@ -1,7 +1,7 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
/* exported getKeyboardManager, holdKeyboard, releaseKeyboard */ /* exported getKeyboardManager, holdKeyboard, releaseKeyboard */
const { GLib, GnomeDesktop } = imports.gi; const { GLib, GnomeDesktop, Meta } = imports.gi;
const Main = imports.ui.main; const Main = imports.ui.main;
@ -62,11 +62,11 @@ var KeyboardManager = class {
return; return;
this._currentKeymap = { layouts, variants, options }; this._currentKeymap = { layouts, variants, options };
global.backend.set_keymap(layouts, variants, options); Meta.get_backend().set_keymap(layouts, variants, options);
} }
_applyLayoutGroupIndex(idx) { _applyLayoutGroupIndex(idx) {
global.backend.lock_layout_group(idx); Meta.get_backend().lock_layout_group(idx);
} }
apply(id) { apply(id) {

View File

@ -1,146 +0,0 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
//
// Copyright (C) 2018, 2019, 2020 Endless Mobile, Inc.
//
// This is a GNOME Shell component to wrap the interactions over
// D-Bus with the malcontent library.
//
// Licensed under the GNU General Public License Version 2
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
/* exported getDefault */
const { Gio, GObject, Shell } = imports.gi;
// We require libmalcontent ≥ 0.6.0
const HAVE_MALCONTENT = imports.package.checkSymbol(
'Malcontent', '0', 'ManagerGetValueFlags');
var Malcontent = null;
if (HAVE_MALCONTENT) {
Malcontent = imports.gi.Malcontent;
Gio._promisify(Malcontent.Manager.prototype, 'get_app_filter_async', 'get_app_filter_finish');
}
let _singleton = null;
function getDefault() {
if (_singleton === null)
_singleton = new ParentalControlsManager();
return _singleton;
}
// A manager class which provides cached access to the constructing users
// parental controls settings. Its possible for the users parental controls
// to change at runtime if the Parental Controls application is used by an
// administrator from within the users session.
var ParentalControlsManager = GObject.registerClass({
Signals: {
'app-filter-changed': {},
},
}, class ParentalControlsManager extends GObject.Object {
_init() {
super._init();
this._initialized = false;
this._disabled = false;
this._appFilter = null;
this._initializeManager();
}
async _initializeManager() {
if (!HAVE_MALCONTENT) {
log('Skipping parental controls support as its disabled');
this._initialized = true;
this.emit('app-filter-changed');
return;
}
log(`Getting parental controls for user ${Shell.util_get_uid()}`);
try {
const connection = await Gio.DBus.get(Gio.BusType.SYSTEM, null);
this._manager = new Malcontent.Manager({ connection });
this._appFilter = await this._manager.get_app_filter_async(
Shell.util_get_uid(),
Malcontent.ManagerGetValueFlags.NONE,
null);
} catch (e) {
if (e.matches(Malcontent.ManagerError, Malcontent.ManagerError.DISABLED)) {
log('Parental controls globally disabled');
this._disabled = true;
} else {
logError(e, 'Failed to get parental controls settings');
return;
}
}
this._manager.connect('app-filter-changed', this._onAppFilterChanged.bind(this));
// Signal initialisation is complete.
this._initialized = true;
this.emit('app-filter-changed');
}
async _onAppFilterChanged(manager, uid) {
// Emit 'changed' signal only if app-filter is changed for currently logged-in user.
let currentUid = Shell.util_get_uid();
if (currentUid !== uid)
return;
try {
this._appFilter = await this._manager.get_app_filter_async(
currentUid,
Malcontent.ManagerGetValueFlags.NONE,
null);
this.emit('app-filter-changed');
} catch (e) {
// Log an error and keep the old app filter.
logError(e, `Failed to get new MctAppFilter for uid ${Shell.util_get_uid()} on app-filter-changed`);
}
}
get initialized() {
return this._initialized;
}
// 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 doesnt say it should be hidden.
// - The executable from the .desktop files Exec line isnt blacklisted in
// the users parental controls.
// - None of the flatpak app IDs from the X-Flatpak and the
// X-Flatpak-RenamedFrom lines are blacklisted in the users parental
// controls.
shouldShowApp(appInfo) {
// Quick decision?
if (!appInfo.should_show())
return false;
// Are parental controls enabled (at configure time or runtime)?
if (!HAVE_MALCONTENT || this._disabled)
return true;
// Have we finished initialising yet?
if (!this.initialized) {
log(`Warning: Hiding app because parental controls not yet initialised: ${appInfo.get_id()}`);
return false;
}
return this._appFilter.is_appinfo_allowed(appInfo);
}
});

View File

@ -83,17 +83,13 @@ const SystemActions = GObject.registerClass({
this._canHavePowerOff = true; this._canHavePowerOff = true;
this._canHaveSuspend = true; this._canHaveSuspend = true;
function tokenizeKeywords(keywords) {
return keywords.split(';').map(keyword => GLib.str_tokenize_and_fold(keyword, null)).flat(2);
}
this._actions = new Map(); this._actions = new Map();
this._actions.set(POWER_OFF_ACTION_ID, { this._actions.set(POWER_OFF_ACTION_ID, {
// Translators: The name of the power-off action in search // Translators: The name of the power-off action in search
name: C_("search-result", "Power Off"), name: C_("search-result", "Power Off"),
iconName: 'system-shutdown-symbolic', iconName: 'system-shutdown-symbolic',
// Translators: A list of keywords that match the power-off action, separated by semicolons // Translators: A list of keywords that match the power-off action, separated by semicolons
keywords: tokenizeKeywords(_('power off;shutdown;reboot;restart;halt;stop')), keywords: _('power off;shutdown;reboot;restart;halt;stop').split(/[; ]/),
available: false, available: false,
}); });
this._actions.set(LOCK_SCREEN_ACTION_ID, { this._actions.set(LOCK_SCREEN_ACTION_ID, {
@ -101,15 +97,15 @@ const SystemActions = GObject.registerClass({
name: C_("search-result", "Lock Screen"), name: C_("search-result", "Lock Screen"),
iconName: 'system-lock-screen-symbolic', iconName: 'system-lock-screen-symbolic',
// Translators: A list of keywords that match the lock screen action, separated by semicolons // Translators: A list of keywords that match the lock screen action, separated by semicolons
keywords: tokenizeKeywords(_('lock screen')), keywords: _("lock screen").split(/[; ]/),
available: false, available: false,
}); });
this._actions.set(LOGOUT_ACTION_ID, { this._actions.set(LOGOUT_ACTION_ID, {
// Translators: The name of the logout action in search // Translators: The name of the logout action in search
name: C_("search-result", "Log Out"), name: C_("search-result", "Log Out"),
iconName: 'system-log-out-symbolic', iconName: 'application-exit-symbolic',
// Translators: A list of keywords that match the logout action, separated by semicolons // Translators: A list of keywords that match the logout action, separated by semicolons
keywords: tokenizeKeywords(_('logout;log out;sign off')), keywords: _("logout;log out;sign off").split(/[; ]/),
available: false, available: false,
}); });
this._actions.set(SUSPEND_ACTION_ID, { this._actions.set(SUSPEND_ACTION_ID, {
@ -117,7 +113,7 @@ const SystemActions = GObject.registerClass({
name: C_("search-result", "Suspend"), name: C_("search-result", "Suspend"),
iconName: 'media-playback-pause-symbolic', iconName: 'media-playback-pause-symbolic',
// Translators: A list of keywords that match the suspend action, separated by semicolons // Translators: A list of keywords that match the suspend action, separated by semicolons
keywords: tokenizeKeywords(_('suspend;sleep')), keywords: _("suspend;sleep").split(/[; ]/),
available: false, available: false,
}); });
this._actions.set(SWITCH_USER_ACTION_ID, { this._actions.set(SWITCH_USER_ACTION_ID, {
@ -125,14 +121,14 @@ const SystemActions = GObject.registerClass({
name: C_("search-result", "Switch User"), name: C_("search-result", "Switch User"),
iconName: 'system-switch-user-symbolic', iconName: 'system-switch-user-symbolic',
// Translators: A list of keywords that match the switch user action, separated by semicolons // Translators: A list of keywords that match the switch user action, separated by semicolons
keywords: tokenizeKeywords(_('switch user')), keywords: _("switch user").split(/[; ]/),
available: false, available: false,
}); });
this._actions.set(LOCK_ORIENTATION_ACTION_ID, { this._actions.set(LOCK_ORIENTATION_ACTION_ID, {
name: '', name: '',
iconName: '', iconName: '',
// Translators: A list of keywords that match the lock orientation action, separated by semicolons // Translators: A list of keywords that match the lock orientation action, separated by semicolons
keywords: tokenizeKeywords(_('lock orientation;unlock orientation;screen;rotation')), keywords: _("lock orientation;unlock orientation;screen;rotation").split(/[; ]/),
available: false, available: false,
}); });
@ -281,7 +277,7 @@ const SystemActions = GObject.registerClass({
getMatchingActions(terms) { getMatchingActions(terms) {
// terms is a list of strings // terms is a list of strings
terms = terms.map(term => GLib.str_tokenize_and_fold(term, null)[0]); terms = terms.map(term => term.toLowerCase());
let results = []; let results = [];

View File

@ -68,8 +68,8 @@ class AppSwitcherPopup extends SwitcherPopup.SwitcherPopup {
this._items = this._switcherList.icons; this._items = this._switcherList.icons;
} }
vfunc_allocate(box) { vfunc_allocate(box, flags) {
super.vfunc_allocate(box); super.vfunc_allocate(box, flags);
// Allocate the thumbnails // Allocate the thumbnails
// We try to avoid overflowing the screen so we base the resulting size on // We try to avoid overflowing the screen so we base the resulting size on
@ -102,7 +102,7 @@ class AppSwitcherPopup extends SwitcherPopup.SwitcherPopup {
this._thumbnails.addClones(primary.y + primary.height - bottomPadding - childBox.y1); this._thumbnails.addClones(primary.y + primary.height - bottomPadding - childBox.y1);
let [, childNaturalHeight] = this._thumbnails.get_preferred_height(-1); let [, childNaturalHeight] = this._thumbnails.get_preferred_height(-1);
childBox.y2 = childBox.y1 + childNaturalHeight; childBox.y2 = childBox.y1 + childNaturalHeight;
this._thumbnails.allocate(childBox); this._thumbnails.allocate(childBox, flags);
} }
} }
@ -681,7 +681,8 @@ class AppSwitcher extends SwitcherPopup.SwitcherList {
// Cache the window list now; we don't handle dynamic changes here, // Cache the window list now; we don't handle dynamic changes here,
// and we don't want to be continually retrieving it // and we don't want to be continually retrieving it
appIcon.cachedWindows = allWindows.filter( appIcon.cachedWindows = allWindows.filter(
w => windowTracker.get_window_app(w) === appIcon.app); w => windowTracker.get_window_app(w) == appIcon.app
);
if (appIcon.cachedWindows.length > 0) if (appIcon.cachedWindows.length > 0)
this._addIcon(appIcon); this._addIcon(appIcon);
} }
@ -749,9 +750,9 @@ class AppSwitcher extends SwitcherPopup.SwitcherList {
return super.vfunc_get_preferred_height(forWidth); return super.vfunc_get_preferred_height(forWidth);
} }
vfunc_allocate(box) { vfunc_allocate(box, flags) {
// Allocate the main list items // Allocate the main list items
super.vfunc_allocate(box); super.vfunc_allocate(box, flags);
let contentBox = this.get_theme_node().get_content_box(box); let contentBox = this.get_theme_node().get_content_box(box);
@ -766,7 +767,7 @@ class AppSwitcher extends SwitcherPopup.SwitcherList {
childBox.x2 = childBox.x1 + arrowWidth; childBox.x2 = childBox.x1 + arrowWidth;
childBox.y1 = contentBox.y1 + itemBox.y2 + arrowHeight; childBox.y1 = contentBox.y1 + itemBox.y2 + arrowHeight;
childBox.y2 = childBox.y1 + arrowHeight; childBox.y2 = childBox.y1 + arrowHeight;
this._arrows[i].allocate(childBox); this._arrows[i].allocate(childBox, flags);
} }
} }
@ -1056,28 +1057,28 @@ class WindowSwitcher extends SwitcherPopup.SwitcherList {
return [minHeight, natHeight]; return [minHeight, natHeight];
} }
vfunc_allocate(box) { vfunc_allocate(box, flags) {
let themeNode = this.get_theme_node(); let themeNode = this.get_theme_node();
let contentBox = themeNode.get_content_box(box); let contentBox = themeNode.get_content_box(box);
const labelHeight = this._label.height;
const totalLabelHeight =
labelHeight + themeNode.get_padding(St.Side.BOTTOM);
box.y2 -= totalLabelHeight; let childBox = new Clutter.ActorBox();
super.vfunc_allocate(box); childBox.x1 = contentBox.x1;
childBox.x2 = contentBox.x2;
childBox.y2 = contentBox.y2;
childBox.y1 = childBox.y2 - this._label.height;
this._label.allocate(childBox, flags);
let totalLabelHeight = this._label.height + themeNode.get_padding(St.Side.BOTTOM);
childBox.x1 = box.x1;
childBox.x2 = box.x2;
childBox.y1 = box.y1;
childBox.y2 = box.y2 - totalLabelHeight;
super.vfunc_allocate(childBox, flags);
// Hooking up the parent vfunc will call this.set_allocation() with // Hooking up the parent vfunc will call this.set_allocation() with
// the height without the label height, so call it again with the // the height without the label height, so call it again with the
// correct size here. // correct size here.
box.y2 += totalLabelHeight; this.set_allocation(box, flags);
this.set_allocation(box);
const childBox = new Clutter.ActorBox();
childBox.x1 = contentBox.x1;
childBox.x2 = contentBox.x2;
childBox.y2 = contentBox.y2;
childBox.y1 = childBox.y2 - labelHeight;
this._label.allocate(childBox);
} }
highlight(index, justOutline) { highlight(index, justOutline) {

View File

@ -15,7 +15,8 @@ class Animation extends St.Bin {
const themeContext = St.ThemeContext.get_for_stage(global.stage); const themeContext = St.ThemeContext.get_for_stage(global.stage);
super._init({ super._init({
style: `width: ${width}px; height: ${height}px;`, width: width * themeContext.scale_factor,
height: height * themeContext.scale_factor,
}); });
this.connect('destroy', this._onDestroy.bind(this)); this.connect('destroy', this._onDestroy.bind(this));

View File

@ -10,7 +10,6 @@ const GrabHelper = imports.ui.grabHelper;
const IconGrid = imports.ui.iconGrid; const IconGrid = imports.ui.iconGrid;
const Main = imports.ui.main; const Main = imports.ui.main;
const PageIndicators = imports.ui.pageIndicators; const PageIndicators = imports.ui.pageIndicators;
const ParentalControlsManager = imports.misc.parentalControlsManager;
const PopupMenu = imports.ui.popupMenu; const PopupMenu = imports.ui.popupMenu;
const Search = imports.ui.search; const Search = imports.ui.search;
const SwipeTracker = imports.ui.swipeTracker; const SwipeTracker = imports.ui.swipeTracker;
@ -18,6 +17,8 @@ const Params = imports.misc.params;
const Util = imports.misc.util; const Util = imports.misc.util;
const SystemActions = imports.misc.systemActions; const SystemActions = imports.misc.systemActions;
const { loadInterfaceXML } = imports.misc.fileUtils;
var MENU_POPUP_TIMEOUT = 600; var MENU_POPUP_TIMEOUT = 600;
var MAX_COLUMNS = 6; var MAX_COLUMNS = 6;
var MIN_COLUMNS = 4; var MIN_COLUMNS = 4;
@ -29,11 +30,12 @@ var INACTIVE_GRID_OPACITY = 77;
var INACTIVE_GRID_OPACITY_ANIMATION_TIME = 240; var INACTIVE_GRID_OPACITY_ANIMATION_TIME = 240;
var FOLDER_SUBICON_FRACTION = .4; var FOLDER_SUBICON_FRACTION = .4;
var MIN_FREQUENT_APPS_COUNT = 3;
var VIEWS_SWITCH_TIME = 400; var VIEWS_SWITCH_TIME = 400;
var VIEWS_SWITCH_ANIMATION_DELAY = 100; var VIEWS_SWITCH_ANIMATION_DELAY = 100;
var PAGE_SWITCH_TIME = 250; var PAGE_SWITCH_TIME = 250;
var SCROLL_TIMEOUT_TIME = 150;
var APP_ICON_SCALE_IN_TIME = 500; var APP_ICON_SCALE_IN_TIME = 500;
var APP_ICON_SCALE_IN_DELAY = 700; var APP_ICON_SCALE_IN_DELAY = 700;
@ -43,6 +45,11 @@ const FOLDER_DIALOG_ANIMATION_TIME = 200;
const OVERSHOOT_THRESHOLD = 20; const OVERSHOOT_THRESHOLD = 20;
const OVERSHOOT_TIMEOUT = 1000; const OVERSHOOT_TIMEOUT = 1000;
const SWITCHEROO_BUS_NAME = 'net.hadess.SwitcherooControl';
const SWITCHEROO_OBJECT_PATH = '/net/hadess/SwitcherooControl';
const SwitcherooProxyInterface = loadInterfaceXML('net.hadess.SwitcherooControl');
const SwitcherooProxy = Gio.DBusProxy.makeProxyWrapper(SwitcherooProxyInterface);
let discreteGpuAvailable = false; let discreteGpuAvailable = false;
function _getCategories(info) { function _getCategories(info) {
@ -107,8 +114,7 @@ function _findBestFolderName(apps) {
}, commonCategories); }, commonCategories);
for (let category of commonCategories) { for (let category of commonCategories) {
const directory = '%s.directory'.format(category); let translated = Shell.util_get_translated_folder_name(category);
const translated = Shell.util_get_translated_folder_name(directory);
if (translated !== null) if (translated !== null)
return translated; return translated;
} }
@ -138,7 +144,11 @@ var BaseAppView = GObject.registerClass({
padWithSpacing: true, padWithSpacing: true,
}, true); }, true);
if (this.use_pagination)
this._grid = new IconGrid.PaginatedIconGrid(gridParams);
else
this._grid = new IconGrid.IconGrid(gridParams); this._grid = new IconGrid.IconGrid(gridParams);
this._grid.connect('child-focused', (grid, actor) => { this._grid.connect('child-focused', (grid, actor) => {
this._childFocused(actor); this._childFocused(actor);
}); });
@ -151,12 +161,6 @@ var BaseAppView = GObject.registerClass({
this._animateLaterId = 0; this._animateLaterId = 0;
this._viewLoadedHandlerId = 0; this._viewLoadedHandlerId = 0;
this._viewIsReady = false; this._viewIsReady = false;
// Filter the apps through the users parental controls.
this._parentalControlsManager = ParentalControlsManager.getDefault();
this._parentalControlsManager.connect('app-filter-changed', () => {
this._redisplay();
});
} }
_childFocused(_actor) { _childFocused(_actor) {
@ -320,46 +324,24 @@ var BaseAppView = GObject.registerClass({
} }
}); });
var AppDisplay = GObject.registerClass( var AllView = GObject.registerClass({
class AppDisplay extends BaseAppView { }, class AllView extends BaseAppView {
_init() { _init() {
super._init({ super._init({
layout_manager: new Clutter.BinLayout(), layout_manager: new Clutter.BinLayout(),
x_expand: true, x_expand: true,
y_expand: true, y_expand: true,
use_pagination: true,
}); });
this._grid._delegate = this;
this._stack = new St.Widget({
layout_manager: new Clutter.BinLayout(),
x_expand: true,
y_expand: true,
});
this.add_actor(this._stack);
let box = new St.BoxLayout({
vertical: true,
y_align: Clutter.ActorAlign.START,
});
box.add_child(this._grid);
this._scrollView = new St.ScrollView({ this._scrollView = new St.ScrollView({
style_class: 'all-apps', style_class: 'all-apps',
x_expand: true, x_expand: true,
y_expand: true, y_expand: true,
reactive: true, reactive: true,
}); });
this._scrollView.add_actor(box); this.add_actor(this._scrollView);
this._stack.add_actor(this._scrollView); this._grid._delegate = this;
this._eventBlocker = new St.Widget({
x_expand: true,
y_expand: true,
reactive: true,
visible: false,
});
this._stack.add_actor(this._eventBlocker);
this._scrollView.set_policy(St.PolicyType.NEVER, this._scrollView.set_policy(St.PolicyType.NEVER,
St.PolicyType.EXTERNAL); St.PolicyType.EXTERNAL);
@ -380,7 +362,24 @@ class AppDisplay extends BaseAppView {
this._folderIcons = []; this._folderIcons = [];
this._stack = new St.Widget({ layout_manager: new Clutter.BinLayout() });
let box = new St.BoxLayout({
vertical: true,
y_align: Clutter.ActorAlign.START,
});
this._grid.currentPage = 0; this._grid.currentPage = 0;
this._stack.add_actor(this._grid);
this._eventBlocker = new St.Widget({
x_expand: true,
y_expand: true,
reactive: true,
visible: false,
});
this._stack.add_actor(this._eventBlocker);
box.add_actor(this._stack);
this._scrollView.add_actor(box);
this._scrollView.connect('scroll-event', this._onScroll.bind(this)); this._scrollView.connect('scroll-event', this._onScroll.bind(this));
@ -433,29 +432,6 @@ class AppDisplay extends BaseAppView {
Main.overview.connect('item-drag-end', this._onDragEnd.bind(this)); Main.overview.connect('item-drag-end', this._onDragEnd.bind(this));
this.connect('destroy', this._onDestroy.bind(this)); this.connect('destroy', this._onDestroy.bind(this));
this._switcherooNotifyId = global.connect('notify::switcheroo-control',
() => this._updateDiscreteGpuAvailable());
this._updateDiscreteGpuAvailable();
}
_updateDiscreteGpuAvailable() {
this._switcherooProxy = global.get_switcheroo_control();
if (this._switcherooProxy) {
let prop = this._switcherooProxy.get_cached_property('HasDualGpu');
discreteGpuAvailable = prop ? prop.unpack() : false;
} else {
discreteGpuAvailable = false;
}
}
vfunc_allocate(box) {
box = this.get_theme_node().get_content_box(box);
let availWidth = box.get_width();
let availHeight = box.get_height();
this.adaptToSize(availWidth, availHeight);
super.vfunc_allocate(box);
} }
_onDestroy() { _onDestroy() {
@ -538,7 +514,7 @@ class AppDisplay extends BaseAppView {
} catch (e) { } catch (e) {
return false; return false;
} }
return this._parentalControlsManager.shouldShowApp(appInfo); return appInfo.should_show();
}); });
let apps = this._appInfoList.map(app => app.get_id()); let apps = this._appInfoList.map(app => app.get_id());
@ -648,7 +624,7 @@ class AppDisplay extends BaseAppView {
this._grid.currentPage = pageNumber; this._grid.currentPage = pageNumber;
// Animate the change between pages. // Tween the change between pages.
this._adjustment.ease(this._grid.getPageY(this._grid.currentPage), { this._adjustment.ease(this._grid.getPageY(this._grid.currentPage), {
mode: Clutter.AnimationMode.EASE_OUT_CUBIC, mode: Clutter.AnimationMode.EASE_OUT_CUBIC,
duration: animate ? PAGE_SWITCH_TIME : 0, duration: animate ? PAGE_SWITCH_TIME : 0,
@ -675,11 +651,12 @@ class AppDisplay extends BaseAppView {
this._canScroll = false; this._canScroll = false;
this._scrollTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, this._scrollTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT,
SCROLL_TIMEOUT_TIME, () => { PAGE_SWITCH_TIME, () => {
this._canScroll = true; this._canScroll = true;
this._scrollTimeoutId = 0; this._scrollTimeoutId = 0;
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
}); }
);
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
} }
@ -970,6 +947,301 @@ class AppDisplay extends BaseAppView {
} }
}); });
var FrequentView = GObject.registerClass(
class FrequentView extends BaseAppView {
_init() {
super._init({
style_class: 'frequent-apps',
layout_manager: new Clutter.BinLayout(),
x_expand: true,
y_expand: true,
}, { fillParent: true });
this._noFrequentAppsLabel = new St.Label({ text: _("Frequently used applications will appear here"),
style_class: 'no-frequent-applications-label',
x_align: Clutter.ActorAlign.CENTER,
x_expand: true,
y_align: Clutter.ActorAlign.CENTER,
y_expand: true });
this._grid.y_expand = true;
this.add_actor(this._grid);
this.add_actor(this._noFrequentAppsLabel);
this._noFrequentAppsLabel.hide();
this._usage = Shell.AppUsage.get_default();
}
vfunc_map() {
this._redisplay();
super.vfunc_map();
}
hasUsefulData() {
return this._usage.get_most_used().length >= MIN_FREQUENT_APPS_COUNT;
}
_compareItems() {
// The FrequentView does not need to be sorted alphabetically
return 0;
}
_loadApps() {
let apps = [];
let mostUsed = this._usage.get_most_used();
let hasUsefulData = this.hasUsefulData();
this._noFrequentAppsLabel.visible = !hasUsefulData;
if (!hasUsefulData)
return [];
// Allow dragging of the icon only if the Dash would accept a drop to
// change favorite-apps. There are no other possible drop targets from
// the app picker, so there's no other need for a drag to start,
// at least on single-monitor setups.
// This also disables drag-to-launch on multi-monitor setups,
// but we hope that is not used much.
let favoritesWritable = global.settings.is_writable('favorite-apps');
for (let i = 0; i < mostUsed.length; i++) {
if (!mostUsed[i].get_app_info().should_show())
continue;
let appIcon = this._items.get(mostUsed[i].get_id());
if (!appIcon) {
appIcon = new AppIcon(mostUsed[i], {
isDraggable: favoritesWritable,
});
}
apps.push(appIcon);
}
return apps;
}
// Called before allocation to calculate dynamic spacing
adaptToSize(width, height) {
let box = new Clutter.ActorBox();
box.x1 = box.y1 = 0;
box.x2 = width;
box.y2 = height;
box = this.get_theme_node().get_content_box(box);
box = this._grid.get_theme_node().get_content_box(box);
let availWidth = box.x2 - box.x1;
let availHeight = box.y2 - box.y1;
this._grid.adaptToSize(availWidth, availHeight);
}
});
var Views = {
FREQUENT: 0,
ALL: 1,
};
var ControlsBoxLayout = GObject.registerClass(
class ControlsBoxLayout extends Clutter.BoxLayout {
/*
* Override the BoxLayout behavior to use the maximum preferred width of all
* buttons for each child
*/
vfunc_get_preferred_width(container, forHeight) {
let maxMinWidth = 0;
let maxNaturalWidth = 0;
for (let child = container.get_first_child();
child;
child = child.get_next_sibling()) {
let [minWidth, natWidth] = child.get_preferred_width(forHeight);
maxMinWidth = Math.max(maxMinWidth, minWidth);
maxNaturalWidth = Math.max(maxNaturalWidth, natWidth);
}
let childrenCount = container.get_n_children();
let totalSpacing = this.spacing * (childrenCount - 1);
return [maxMinWidth * childrenCount + totalSpacing,
maxNaturalWidth * childrenCount + totalSpacing];
}
});
var ViewStackLayout = GObject.registerClass({
Signals: { 'allocated-size-changed': { param_types: [GObject.TYPE_INT,
GObject.TYPE_INT] } },
}, class ViewStackLayout extends Clutter.BinLayout {
vfunc_allocate(actor, box, flags) {
let availWidth = box.x2 - box.x1;
let availHeight = box.y2 - box.y1;
// Prepare children of all views for the upcoming allocation, calculate all
// the needed values to adapt available size
this.emit('allocated-size-changed', availWidth, availHeight);
super.vfunc_allocate(actor, box, flags);
}
});
var AppDisplay = GObject.registerClass(
class AppDisplay extends St.BoxLayout {
_init() {
super._init({
style_class: 'app-display',
vertical: true,
x_expand: true,
y_expand: true,
});
this._privacySettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.privacy' });
this._privacySettings.connect('changed::remember-app-usage',
this._updateFrequentVisibility.bind(this));
this._views = [];
let view, button;
view = new FrequentView();
button = new St.Button({ label: _("Frequent"),
style_class: 'app-view-control button',
can_focus: true,
x_expand: true });
this._views[Views.FREQUENT] = { view, 'control': button };
view = new AllView();
button = new St.Button({ label: _("All"),
style_class: 'app-view-control button',
can_focus: true,
x_expand: true });
this._views[Views.ALL] = { view, 'control': button };
this._viewStackLayout = new ViewStackLayout();
this._viewStack = new St.Widget({ x_expand: true, y_expand: true,
layout_manager: this._viewStackLayout });
this._viewStackLayout.connect('allocated-size-changed', this._onAllocatedSizeChanged.bind(this));
this.add_actor(this._viewStack);
let layout = new ControlsBoxLayout({ homogeneous: true });
this._controls = new St.Widget({
style_class: 'app-view-controls',
layout_manager: layout,
x_align: Clutter.ActorAlign.CENTER,
});
this._controls.connect('notify::mapped', () => {
// controls are faded either with their parent or
// explicitly in animate(); we can't know how they'll be
// shown next, so make sure to restore their opacity
// when they are hidden
if (this._controls.mapped)
return;
this._controls.remove_all_transitions();
this._controls.opacity = 255;
});
layout.hookup_style(this._controls);
this.add_actor(new St.Bin({ child: this._controls }));
for (let i = 0; i < this._views.length; i++) {
this._viewStack.add_actor(this._views[i].view);
this._controls.add_actor(this._views[i].control);
let viewIndex = i;
this._views[i].control.connect('clicked', () => {
this._showView(viewIndex);
global.settings.set_uint('app-picker-view', viewIndex);
});
}
let initialView = Math.min(global.settings.get_uint('app-picker-view'),
this._views.length - 1);
let frequentUseful = this._views[Views.FREQUENT].view.hasUsefulData();
if (initialView == Views.FREQUENT && !frequentUseful)
initialView = Views.ALL;
this._showView(initialView);
this._updateFrequentVisibility();
Gio.DBus.system.watch_name(SWITCHEROO_BUS_NAME,
Gio.BusNameWatcherFlags.NONE,
this._switcherooProxyAppeared.bind(this),
() => {
this._switcherooProxy = null;
this._updateDiscreteGpuAvailable();
});
}
_updateDiscreteGpuAvailable() {
if (!this._switcherooProxy)
discreteGpuAvailable = false;
else
discreteGpuAvailable = this._switcherooProxy.HasDualGpu;
}
_switcherooProxyAppeared() {
this._switcherooProxy = new SwitcherooProxy(Gio.DBus.system, SWITCHEROO_BUS_NAME, SWITCHEROO_OBJECT_PATH,
(proxy, error) => {
if (error) {
log(error.message);
return;
}
this._updateDiscreteGpuAvailable();
});
}
animate(animationDirection, onComplete) {
let currentView = this._views.filter(v => v.control.has_style_pseudo_class('checked')).pop().view;
// Animate controls opacity using iconGrid animation time, since
// it will be the time the AllView or FrequentView takes to show
// it entirely.
let finalOpacity;
if (animationDirection == IconGrid.AnimationDirection.IN) {
this._controls.opacity = 0;
finalOpacity = 255;
} else {
finalOpacity = 0;
}
this._controls.ease({
opacity: finalOpacity,
duration: IconGrid.ANIMATION_TIME_IN,
mode: Clutter.AnimationMode.EASE_IN_OUT_QUAD,
});
currentView.animate(animationDirection, onComplete);
}
_showView(activeIndex) {
for (let i = 0; i < this._views.length; i++) {
if (i == activeIndex)
this._views[i].control.add_style_pseudo_class('checked');
else
this._views[i].control.remove_style_pseudo_class('checked');
let animationDirection = i == activeIndex
? IconGrid.AnimationDirection.IN
: IconGrid.AnimationDirection.OUT;
this._views[i].view.animateSwitch(animationDirection);
}
}
_updateFrequentVisibility() {
let enabled = this._privacySettings.get_boolean('remember-app-usage');
this._views[Views.FREQUENT].control.visible = enabled;
let visibleViews = this._views.filter(v => v.control.visible);
this._controls.visible = visibleViews.length > 1;
if (!enabled && this._views[Views.FREQUENT].view.visible)
this._showView(Views.ALL);
}
selectApp(id) {
this._showView(Views.ALL);
this._views[Views.ALL].view.selectApp(id);
}
_onAllocatedSizeChanged(actor, width, height) {
let box = new Clutter.ActorBox();
box.x1 = box.y1 = 0;
box.x2 = width;
box.y2 = height;
box = this._viewStack.get_theme_node().get_content_box(box);
let availWidth = box.x2 - box.x1;
let availHeight = box.y2 - box.y1;
for (let i = 0; i < this._views.length; i++)
this._views[i].view.adaptToSize(availWidth, availHeight);
}
});
var AppSearchProvider = class AppSearchProvider { var AppSearchProvider = class AppSearchProvider {
constructor() { constructor() {
this._appSys = Shell.AppSystem.get_default(); this._appSys = Shell.AppSystem.get_default();
@ -978,8 +1250,6 @@ var AppSearchProvider = class AppSearchProvider {
this.canLaunchSearch = false; this.canLaunchSearch = false;
this._systemActions = new SystemActions.getDefault(); this._systemActions = new SystemActions.getDefault();
this._parentalControlsManager = ParentalControlsManager.getDefault();
} }
getResultMetas(apps, callback) { getResultMetas(apps, callback) {
@ -1014,30 +1284,18 @@ var AppSearchProvider = class AppSearchProvider {
} }
getInitialResultSet(terms, callback, _cancellable) { getInitialResultSet(terms, callback, _cancellable) {
// Defer until the parental controls manager is initialised, so the
// results can be filtered correctly.
if (!this._parentalControlsManager.initialized) {
let initializedId = this._parentalControlsManager.connect('app-filter-changed', () => {
if (this._parentalControlsManager.initialized) {
this._parentalControlsManager.disconnect(initializedId);
this.getInitialResultSet(terms, callback, _cancellable);
}
});
return;
}
let query = terms.join(' '); let query = terms.join(' ');
let groups = Shell.AppSystem.search(query); let groups = Shell.AppSystem.search(query);
let usage = Shell.AppUsage.get_default(); let usage = Shell.AppUsage.get_default();
let results = []; let results = [];
groups.forEach(group => { groups.forEach(group => {
group = group.filter(appID => { group = group.filter(appID => {
const app = this._appSys.lookup_app(appID); const app = this._appSys.lookup_app(appID);
return app && this._parentalControlsManager.shouldShowApp(app.app_info); return app && app.app_info.should_show();
}); });
results = results.concat(group.sort( results = results.concat(group.sort(
(a, b) => usage.compare(a, b))); (a, b) => usage.compare(a, b)
));
}); });
results = results.concat(this._systemActions.getMatchingActions(terms)); results = results.concat(this._systemActions.getMatchingActions(terms));
@ -1172,7 +1430,7 @@ class FolderView extends BaseAppView {
if (!app) if (!app)
return; return;
if (!this._parentalControlsManager.shouldShowApp(app.get_app_info())) if (!app.get_app_info().should_show())
return; return;
if (apps.some(appIcon => appIcon.id == appId)) if (apps.some(appIcon => appIcon.id == appId))
@ -1358,7 +1616,7 @@ var FolderIcon = GObject.registerClass({
return false; return false;
let view = _getViewFromIcon(source); let view = _getViewFromIcon(source);
if (!view || !(view instanceof AppDisplay)) if (!view || !(view instanceof AllView))
return false; return false;
if (this._folder.get_strv('apps').includes(source.id)) if (this._folder.get_strv('apps').includes(source.id))
@ -1680,7 +1938,7 @@ var AppFolderDialog = GObject.registerClass({
} }
} }
vfunc_allocate(box) { vfunc_allocate(box, flags) {
let contentBox = this.get_theme_node().get_content_box(box); let contentBox = this.get_theme_node().get_content_box(box);
contentBox = this._viewBox.get_theme_node().get_content_box(contentBox); contentBox = this._viewBox.get_theme_node().get_content_box(contentBox);
@ -1693,7 +1951,7 @@ var AppFolderDialog = GObject.registerClass({
this._view._grid.topPadding = 0; this._view._grid.topPadding = 0;
super.vfunc_allocate(box); super.vfunc_allocate(box, flags);
// We can only start zooming after receiving an allocation // We can only start zooming after receiving an allocation
if (this._needsZoomAndFade) if (this._needsZoomAndFade)
@ -1918,7 +2176,7 @@ var AppIcon = GObject.registerClass({
} }
vfunc_leave_event(crossingEvent) { vfunc_leave_event(crossingEvent) {
const ret = super.vfunc_leave_event(crossingEvent); let ret = super.vfunc_leave_event(crossingEvent);
this.fake_release(); this.fake_release();
this._removeMenuTimeout(); this._removeMenuTimeout();
@ -1926,22 +2184,22 @@ var AppIcon = GObject.registerClass({
} }
vfunc_button_press_event(buttonEvent) { vfunc_button_press_event(buttonEvent) {
const ret = super.vfunc_button_press_event(buttonEvent); super.vfunc_button_press_event(buttonEvent);
if (buttonEvent.button == 1) { if (buttonEvent.button == 1) {
this._setPopupTimeout(); this._setPopupTimeout();
} else if (buttonEvent.button == 3) { } else if (buttonEvent.button == 3) {
this.popupMenu(); this.popupMenu();
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
} }
return ret; return Clutter.EVENT_PROPAGATE;
} }
vfunc_touch_event(touchEvent) { vfunc_touch_event(touchEvent) {
const ret = super.vfunc_touch_event(touchEvent); super.vfunc_touch_event(touchEvent);
if (touchEvent.type == Clutter.EventType.TOUCH_BEGIN) if (touchEvent.type == Clutter.EventType.TOUCH_BEGIN)
this._setPopupTimeout(); this._setPopupTimeout();
return ret; return Clutter.EVENT_PROPAGATE;
} }
vfunc_clicked(button) { vfunc_clicked(button) {
@ -2110,7 +2368,7 @@ var AppIcon = GObject.registerClass({
return source != this && return source != this &&
(source instanceof this.constructor) && (source instanceof this.constructor) &&
(view instanceof AppDisplay); (view instanceof AllView);
} }
_setHoveringByDnd(hovering) { _setHoveringByDnd(hovering) {
@ -2211,12 +2469,14 @@ var AppIconMenu = class AppIconMenu extends PopupMenu.PopupMenu {
this.removeAll(); this.removeAll();
let windows = this._source.app.get_windows().filter( let windows = this._source.app.get_windows().filter(
w => !w.skip_taskbar); w => !w.skip_taskbar
);
if (windows.length > 0) { if (windows.length > 0) {
this.addMenuItem( this.addMenuItem(
/* Translators: This is the heading of a list of open windows */ /* Translators: This is the heading of a list of open windows */
new PopupMenu.PopupSeparatorMenuItem(_('Open Windows'))); new PopupMenu.PopupSeparatorMenuItem(_("Open Windows"))
);
} }
windows.forEach(window => { windows.forEach(window => {
@ -2246,16 +2506,10 @@ var AppIconMenu = class AppIconMenu extends PopupMenu.PopupMenu {
if (discreteGpuAvailable && if (discreteGpuAvailable &&
this._source.app.state == Shell.AppState.STOPPED) { this._source.app.state == Shell.AppState.STOPPED) {
const appPrefersNonDefaultGPU = appInfo.get_boolean('PrefersNonDefaultGPU'); this._onDiscreteGpuMenuItem = this._appendMenuItem(_("Launch using Dedicated Graphics Card"));
const gpuPref = appPrefersNonDefaultGPU this._onDiscreteGpuMenuItem.connect('activate', () => {
? Shell.AppLaunchGpu.DEFAULT
: Shell.AppLaunchGpu.DISCRETE;
this._onGpuMenuItem = this._appendMenuItem(appPrefersNonDefaultGPU
? _('Launch using Integrated Graphics Card')
: _('Launch using Discrete Graphics Card'));
this._onGpuMenuItem.connect('activate', () => {
this._source.animateLaunch(); this._source.animateLaunch();
this._source.app.launch(0, -1, gpuPref); this._source.app.launch(0, -1, true);
this.emit('activate-window', null); this.emit('activate-window', null);
}); });
} }

View File

@ -2,7 +2,6 @@
/* exported getAppFavorites */ /* exported getAppFavorites */
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const ParentalControlsManager = imports.misc.parentalControlsManager;
const Signals = imports.signals; const Signals = imports.signals;
const Main = imports.ui.main; const Main = imports.ui.main;
@ -13,7 +12,6 @@ const RENAMED_DESKTOP_IDS = {
'cheese.desktop': 'org.gnome.Cheese.desktop', 'cheese.desktop': 'org.gnome.Cheese.desktop',
'dconf-editor.desktop': 'ca.desrt.dconf-editor.desktop', 'dconf-editor.desktop': 'ca.desrt.dconf-editor.desktop',
'empathy.desktop': 'org.gnome.Empathy.desktop', 'empathy.desktop': 'org.gnome.Empathy.desktop',
'eog.desktop': 'org.gnome.eog.desktop',
'epiphany.desktop': 'org.gnome.Epiphany.desktop', 'epiphany.desktop': 'org.gnome.Epiphany.desktop',
'evolution.desktop': 'org.gnome.Evolution.desktop', 'evolution.desktop': 'org.gnome.Evolution.desktop',
'file-roller.desktop': 'org.gnome.FileRoller.desktop', 'file-roller.desktop': 'org.gnome.FileRoller.desktop',
@ -66,13 +64,6 @@ const RENAMED_DESKTOP_IDS = {
class AppFavorites { class AppFavorites {
constructor() { constructor() {
// Filter the apps through the users parental controls.
this._parentalControlsManager = ParentalControlsManager.getDefault();
this._parentalControlsManager.connect('app-filter-changed', () => {
this.reload();
this.emit('changed');
});
this.FAVORITE_APPS_KEY = 'favorite-apps'; this.FAVORITE_APPS_KEY = 'favorite-apps';
this._favorites = {}; this._favorites = {};
global.settings.connect('changed::%s'.format(this.FAVORITE_APPS_KEY), this._onFavsChanged.bind(this)); global.settings.connect('changed::%s'.format(this.FAVORITE_APPS_KEY), this._onFavsChanged.bind(this));
@ -104,7 +95,7 @@ class AppFavorites {
global.settings.set_strv(this.FAVORITE_APPS_KEY, ids); global.settings.set_strv(this.FAVORITE_APPS_KEY, ids);
let apps = ids.map(id => appSys.lookup_app(id)) let apps = ids.map(id => appSys.lookup_app(id))
.filter(app => app !== null && this._parentalControlsManager.shouldShowApp(app.app_info)); .filter(app => app != null);
this._favorites = {}; this._favorites = {};
for (let i = 0; i < apps.length; i++) { for (let i = 0; i < apps.length; i++) {
let app = apps[i]; let app = apps[i];
@ -143,9 +134,6 @@ class AppFavorites {
if (!app) if (!app)
return false; return false;
if (!this._parentalControlsManager.shouldShowApp(app.app_info))
return false;
let ids = this._getIds(); let ids = this._getIds();
if (pos == -1) if (pos == -1)
ids.push(appId); ids.push(appId);

View File

@ -147,8 +147,9 @@ var AudioDeviceSelectionDBus = class AudioDeviceSelectionDBus {
_onDeviceSelected(dialog, device) { _onDeviceSelected(dialog, device) {
let connection = this._dbusImpl.get_connection(); let connection = this._dbusImpl.get_connection();
let info = this._dbusImpl.get_info(); let info = this._dbusImpl.get_info();
const deviceName = Object.keys(AudioDevice) let deviceName = Object.keys(AudioDevice).filter(
.filter(dev => AudioDevice[dev] === device)[0].toLowerCase(); dev => AudioDevice[dev] == device
)[0].toLowerCase();
connection.emit_signal(this._audioSelectionDialog._sender, connection.emit_signal(this._audioSelectionDialog._sender,
this._dbusImpl.get_object_path(), this._dbusImpl.get_object_path(),
info ? info.name : null, info ? info.name : null,

View File

@ -30,8 +30,8 @@ var BarLevel = GObject.registerClass({
accessible_role: Atk.Role.LEVEL_BAR, accessible_role: Atk.Role.LEVEL_BAR,
}; };
super._init(Object.assign(defaultParams, params)); super._init(Object.assign(defaultParams, params));
this.connect('notify::allocation', () => { this.connect('allocation-changed', (actor, box) => {
this._barLevelWidth = this.allocation.get_width(); this._barLevelWidth = box.get_width();
}); });
this._customAccessible = St.GenericAccessible.new_for_actor(this); this._customAccessible = St.GenericAccessible.new_for_actor(this);

View File

@ -196,13 +196,8 @@ var BoxPointer = GObject.registerClass({
return themeNode.adjust_preferred_height(...height); return themeNode.adjust_preferred_height(...height);
} }
vfunc_allocate(box) { vfunc_allocate(box, flags) {
if (this._sourceActor && this._sourceActor.mapped) { this.set_allocation(box, flags);
this._reposition(box);
this._updateFlip(box);
}
this.set_allocation(box);
let themeNode = this.get_theme_node(); let themeNode = this.get_theme_node();
let borderWidth = themeNode.get_length('-arrow-border-width'); let borderWidth = themeNode.get_length('-arrow-border-width');
@ -214,7 +209,7 @@ var BoxPointer = GObject.registerClass({
childBox.y1 = 0; childBox.y1 = 0;
childBox.x2 = availWidth; childBox.x2 = availWidth;
childBox.y2 = availHeight; childBox.y2 = availHeight;
this._border.allocate(childBox); this._border.allocate(childBox, flags);
childBox.x1 = borderWidth; childBox.x1 = borderWidth;
childBox.y1 = borderWidth; childBox.y1 = borderWidth;
@ -234,7 +229,13 @@ var BoxPointer = GObject.registerClass({
childBox.x2 -= rise; childBox.x2 -= rise;
break; break;
} }
this.bin.allocate(childBox); this.bin.allocate(childBox, flags);
if (this._sourceActor && this._sourceActor.mapped) {
this._reposition(box);
this._updateFlip(box);
this.set_allocation(box, flags);
}
} }
_drawBorder(area) { _drawBorder(area) {

View File

@ -222,12 +222,7 @@ class DBusEventSource extends EventSourceBase {
} }
} }
this._dbusProxy.connectSignal('EventsAddedOrUpdated', this._dbusProxy.connectSignal('Changed', this._onChanged.bind(this));
this._onEventsAddedOrUpdated.bind(this));
this._dbusProxy.connectSignal('EventsRemoved',
this._onEventsRemoved.bind(this));
this._dbusProxy.connectSignal('ClientDisappeared',
this._onClientDisappeared.bind(this));
this._dbusProxy.connect('notify::g-name-owner', () => { this._dbusProxy.connect('notify::g-name-owner', () => {
if (this._dbusProxy.g_name_owner) if (this._dbusProxy.g_name_owner)
@ -263,7 +258,7 @@ class DBusEventSource extends EventSourceBase {
} }
_resetCache() { _resetCache() {
this._events = new Map(); this._events = [];
this._lastRequestBegin = null; this._lastRequestBegin = null;
this._lastRequestEnd = null; this._lastRequestEnd = null;
} }
@ -279,46 +274,27 @@ class DBusEventSource extends EventSourceBase {
this.emit('changed'); this.emit('changed');
} }
_onEventsAddedOrUpdated(dbusProxy, nameOwner, argArray) { _onChanged() {
const [appointments = []] = argArray; this._loadEvents(false);
let changed = false; }
_onEventsReceived(results, _error) {
let newEvents = [];
let appointments = results[0] || [];
for (let n = 0; n < appointments.length; n++) { for (let n = 0; n < appointments.length; n++) {
const [id, summary, allDay, startTime, endTime] = appointments[n]; let a = appointments[n];
const date = new Date(startTime * 1000); let date = new Date(a[4] * 1000);
const end = new Date(endTime * 1000); let end = new Date(a[5] * 1000);
let id = a[0];
let summary = a[1];
let allDay = a[3];
let event = new CalendarEvent(id, date, end, summary, allDay); let event = new CalendarEvent(id, date, end, summary, allDay);
this._events.set(event.id, event); newEvents.push(event);
changed = true;
} }
newEvents.sort((ev1, ev2) => ev1.date.getTime() - ev2.date.getTime());
if (changed) this._events = newEvents;
this.emit('changed'); this._isLoading = false;
}
_onEventsRemoved(dbusProxy, nameOwner, argArray) {
const [ids = []] = argArray;
let changed = false;
for (const id of ids)
changed |= this._events.delete(id);
if (changed)
this.emit('changed');
}
_onClientDisappeared(dbusProxy, nameOwner, argArray) {
let [sourceUid = ''] = argArray;
sourceUid += '\n';
let changed = false;
for (const id of this._events.keys()) {
if (id.startsWith(sourceUid))
changed |= this._events.delete(id);
}
if (changed)
this.emit('changed'); this.emit('changed');
} }
@ -328,38 +304,33 @@ class DBusEventSource extends EventSourceBase {
return; return;
if (this._curRequestBegin && this._curRequestEnd) { if (this._curRequestBegin && this._curRequestEnd) {
if (forceReload) { this._dbusProxy.GetEventsRemote(this._curRequestBegin.getTime() / 1000,
this._events.clear();
this.emit('changed');
}
this._dbusProxy.SetTimeRangeRemote(
this._curRequestBegin.getTime() / 1000,
this._curRequestEnd.getTime() / 1000, this._curRequestEnd.getTime() / 1000,
forceReload, forceReload,
this._onEventsReceived.bind(this),
Gio.DBusCallFlags.NONE); Gio.DBusCallFlags.NONE);
} }
} }
requestRange(begin, end) { requestRange(begin, end) {
if (!(_datesEqual(begin, this._lastRequestBegin) && _datesEqual(end, this._lastRequestEnd))) { if (!(_datesEqual(begin, this._lastRequestBegin) && _datesEqual(end, this._lastRequestEnd))) {
this._isLoading = true;
this._lastRequestBegin = begin; this._lastRequestBegin = begin;
this._lastRequestEnd = end; this._lastRequestEnd = end;
this._curRequestBegin = begin; this._curRequestBegin = begin;
this._curRequestEnd = end; this._curRequestEnd = end;
this._loadEvents(true); this._loadEvents(false);
}
}
*_getFilteredEvents(begin, end) {
for (const event of this._events.values()) {
if (_dateIntervalsOverlap(event.date, event.end, begin, end))
yield event;
} }
} }
getEvents(begin, end) { getEvents(begin, end) {
let result = [...this._getFilteredEvents(begin, end)]; let result = [];
for (let n = 0; n < this._events.length; n++) {
let event = this._events[n];
if (_dateIntervalsOverlap(event.date, event.end, begin, end))
result.push(event);
}
result.sort((event1, event2) => { result.sort((event1, event2) => {
// sort events by end time on ending day // sort events by end time on ending day
let d1 = event1.date < begin && event1.end <= end ? event1.end : event1.date; let d1 = event1.date < begin && event1.end <= end ? event1.end : event1.date;
@ -373,8 +344,12 @@ class DBusEventSource extends EventSourceBase {
let dayBegin = _getBeginningOfDay(day); let dayBegin = _getBeginningOfDay(day);
let dayEnd = _getEndOfDay(day); let dayEnd = _getEndOfDay(day);
const { done } = this._getFilteredEvents(dayBegin, dayEnd).next(); let events = this.getEvents(dayBegin, dayEnd);
return !done;
if (events.length == 0)
return false;
return true;
} }
}); });
@ -726,11 +701,12 @@ var Calendar = GObject.registerClass({
var EventMessage = GObject.registerClass( var EventMessage = GObject.registerClass(
class EventMessage extends MessageList.Message { class EventMessage extends MessageList.Message {
_init(event, date) { _init(event, date) {
super._init('', ''); super._init('', event.summary);
this._event = event;
this._date = date; this._date = date;
this.update(event); this.setTitle(this._formatEventTime());
this._icon = new St.Icon({ icon_name: 'x-office-calendar-symbolic' }); this._icon = new St.Icon({ icon_name: 'x-office-calendar-symbolic' });
this.setIcon(this._icon); this.setIcon(this._icon);
@ -742,13 +718,6 @@ class EventMessage extends MessageList.Message {
super.vfunc_style_changed(); super.vfunc_style_changed();
} }
update(event) {
this._event = event;
this.setTitle(this._formatEventTime());
this.setBody(event.summary);
}
_formatEventTime() { _formatEventTime() {
let periodBegin = _getBeginningOfDay(this._date); let periodBegin = _getBeginningOfDay(this._date);
let periodEnd = _getEndOfDay(this._date); let periodEnd = _getEndOfDay(this._date);
@ -906,7 +875,7 @@ class EventsSection extends MessageList.MessageListSection {
} }
_reloadEvents() { _reloadEvents() {
if (this._eventSource.isLoading || this._reloading) if (this._eventSource.isLoading)
return; return;
this._reloading = true; this._reloading = true;
@ -932,7 +901,6 @@ class EventsSection extends MessageList.MessageListSection {
this._messageById.set(event.id, message); this._messageById.set(event.id, message);
this.addMessage(message, false); this.addMessage(message, false);
} else { } else {
message.update(event);
this.moveMessage(message, i, false); this.moveMessage(message, i, false);
} }
} }
@ -1199,8 +1167,8 @@ class CalendarMessageList extends St.Widget {
child: this._dndSwitch, child: this._dndSwitch,
label_actor: dndLabel, label_actor: dndLabel,
}); });
this._dndSwitch.bind_property('state', this._dndButton.bind_property('checked',
this._dndButton, 'checked', this._dndSwitch, 'state',
GObject.BindingFlags.BIDIRECTIONAL | GObject.BindingFlags.SYNC_CREATE); GObject.BindingFlags.BIDIRECTIONAL | GObject.BindingFlags.SYNC_CREATE);
hbox.add_child(this._dndButton); hbox.add_child(this._dndButton);

View File

@ -13,13 +13,17 @@ var ComponentManager = class {
_sessionUpdated() { _sessionUpdated() {
let newEnabledComponents = Main.sessionMode.components; let newEnabledComponents = Main.sessionMode.components;
newEnabledComponents newEnabledComponents.filter(
.filter(name => !this._enabledComponents.includes(name)) name => !this._enabledComponents.includes(name)
.forEach(name => this._enableComponent(name)); ).forEach(name => {
this._enableComponent(name);
});
this._enabledComponents this._enabledComponents.filter(
.filter(name => !newEnabledComponents.includes(name)) name => !newEnabledComponents.includes(name)
.forEach(name => this._disableComponent(name)); ).forEach(name => {
this._disableComponent(name);
});
this._enabledComponents = newEnabledComponents; this._enabledComponents = newEnabledComponents;
} }

View File

@ -125,7 +125,8 @@ var ContentTypeDiscoverer = class {
_emitCallback(mount, contentTypes = []) { _emitCallback(mount, contentTypes = []) {
// we're not interested in win32 software content types here // we're not interested in win32 software content types here
contentTypes = contentTypes.filter( contentTypes = contentTypes.filter(
type => type !== 'x-content/win32-software'); type => type != 'x-content/win32-software'
);
let apps = []; let apps = [];
contentTypes.forEach(type => { contentTypes.forEach(type => {

View File

@ -327,16 +327,12 @@ var AuthenticationDialog = GObject.registerClass({
} }
let resetDialog = () => { let resetDialog = () => {
this._sessionRequestTimeoutId = 0;
if (this.state != ModalDialog.State.OPENED) if (this.state != ModalDialog.State.OPENED)
return GLib.SOURCE_REMOVE; return;
this._passwordEntry.hide(); this._passwordEntry.hide();
this._cancelButton.grab_key_focus(); this._cancelButton.grab_key_focus();
this._okButton.reactive = false; this._okButton.reactive = false;
return GLib.SOURCE_REMOVE;
}; };
if (delay) { if (delay) {

View File

@ -292,11 +292,11 @@ class DashActor extends St.Widget {
}); });
} }
vfunc_allocate(box) { vfunc_allocate(box, flags) {
let contentBox = this.get_theme_node().get_content_box(box); let contentBox = this.get_theme_node().get_content_box(box);
let availWidth = contentBox.x2 - contentBox.x1; let availWidth = contentBox.x2 - contentBox.x1;
this.set_allocation(box); this.set_allocation(box, flags);
let [appIcons, showAppsButton] = this.get_children(); let [appIcons, showAppsButton] = this.get_children();
let [, showAppsNatHeight] = showAppsButton.get_preferred_height(availWidth); let [, showAppsNatHeight] = showAppsButton.get_preferred_height(availWidth);
@ -306,11 +306,11 @@ class DashActor extends St.Widget {
childBox.y1 = contentBox.y1; childBox.y1 = contentBox.y1;
childBox.x2 = contentBox.x2; childBox.x2 = contentBox.x2;
childBox.y2 = contentBox.y2 - showAppsNatHeight; childBox.y2 = contentBox.y2 - showAppsNatHeight;
appIcons.allocate(childBox); appIcons.allocate(childBox, flags);
childBox.y1 = contentBox.y2 - showAppsNatHeight; childBox.y1 = contentBox.y2 - showAppsNatHeight;
childBox.y2 = contentBox.y2; childBox.y2 = contentBox.y2;
showAppsButton.allocate(childBox); showAppsButton.allocate(childBox, flags);
} }
vfunc_get_preferred_height(forWidth) { vfunc_get_preferred_height(forWidth) {
@ -815,12 +815,7 @@ var Dash = GObject.registerClass({
else else
pos = 0; // always insert at the top when dash is empty pos = 0; // always insert at the top when dash is empty
// Put the placeholder after the last favorite if we are not if (pos != this._dragPlaceholderPos && pos <= numFavorites && this._animatingPlaceholdersCount == 0) {
// in the favorites zone
if (pos > numFavorites)
pos = numFavorites;
if (pos !== this._dragPlaceholderPos && this._animatingPlaceholdersCount === 0) {
this._dragPlaceholderPos = pos; this._dragPlaceholderPos = pos;
// Don't allow positioning before or after self // Don't allow positioning before or after self
@ -848,6 +843,11 @@ var Dash = GObject.registerClass({
this._dragPlaceholder.show(fadeIn); this._dragPlaceholder.show(fadeIn);
} }
// Remove the drag placeholder if we are not in the
// "favorites zone"
if (pos > numFavorites)
this._clearDragPlaceholder();
if (!this._dragPlaceholder) if (!this._dragPlaceholder)
return DND.DragMotionResult.NO_DROP; return DND.DragMotionResult.NO_DROP;

View File

@ -94,7 +94,6 @@ class WorldClocksSection extends St.Button {
}); });
this._clock = new GnomeDesktop.WallClock(); this._clock = new GnomeDesktop.WallClock();
this._clockNotifyId = 0; this._clockNotifyId = 0;
this._tzNotifyId = 0;
this._locations = []; this._locations = [];
@ -167,6 +166,8 @@ class WorldClocksSection extends St.Button {
layout.attach(header, 0, 0, 2, 1); layout.attach(header, 0, 0, 2, 1);
this.label_actor = header; this.label_actor = header;
let localOffset = GLib.DateTime.new_now_local().get_utc_offset();
for (let i = 0; i < this._locations.length; i++) { for (let i = 0; i < this._locations.length; i++) {
let l = this._locations[i].location; let l = this._locations[i].location;
@ -179,8 +180,21 @@ class WorldClocksSection extends St.Button {
let time = new St.Label({ style_class: 'world-clocks-time' }); let time = new St.Label({ style_class: 'world-clocks-time' });
const utcOffset = this._getTimeAtLocation(l).get_utc_offset();
const offsetCurrentTz = utcOffset - localOffset;
const offsetHours = Math.abs(offsetCurrentTz) / GLib.TIME_SPAN_HOUR;
const offsetMinutes =
(Math.abs(offsetCurrentTz) % GLib.TIME_SPAN_HOUR) /
GLib.TIME_SPAN_MINUTE;
const prefix = offsetCurrentTz >= 0 ? '+' : '-';
const text = offsetMinutes === 0
? '%s%d'.format(prefix, offsetHours)
: '%s%d\u2236%d'.format(prefix, offsetHours, offsetMinutes);
const tz = new St.Label({ const tz = new St.Label({
style_class: 'world-clocks-timezone', style_class: 'world-clocks-timezone',
text,
x_align: Clutter.ActorAlign.END, x_align: Clutter.ActorAlign.END,
y_align: Clutter.ActorAlign.CENTER, y_align: Clutter.ActorAlign.CENTER,
}); });
@ -198,65 +212,32 @@ class WorldClocksSection extends St.Button {
layout.attach(tz, 2, i + 1, 1, 1); layout.attach(tz, 2, i + 1, 1, 1);
} }
this._locations[i].timeLabel = time; this._locations[i].actor = time;
this._locations[i].tzLabel = tz;
} }
if (this._grid.get_n_children() > 1) { if (this._grid.get_n_children() > 1) {
if (!this._clockNotifyId) { if (!this._clockNotifyId) {
this._clockNotifyId = this._clockNotifyId =
this._clock.connect('notify::clock', this._updateTimeLabels.bind(this)); this._clock.connect('notify::clock', this._updateLabels.bind(this));
} }
if (!this._tzNotifyId) { this._updateLabels();
this._tzNotifyId =
this._clock.connect('notify::timezone', this._updateTimezoneLabels.bind(this));
}
this._updateTimeLabels();
this._updateTimezoneLabels();
} else { } else {
if (this._clockNotifyId) if (this._clockNotifyId)
this._clock.disconnect(this._clockNotifyId); this._clock.disconnect(this._clockNotifyId);
this._clockNotifyId = 0; this._clockNotifyId = 0;
if (this._tzNotifyId)
this._clock.disconnect(this._tzNotifyId);
this._tzNotifyId = 0;
} }
} }
_getTimezoneOffsetAtLocation(location) {
const localOffset = GLib.DateTime.new_now_local().get_utc_offset();
const utcOffset = this._getTimeAtLocation(location).get_utc_offset();
const offsetCurrentTz = utcOffset - localOffset;
const offsetHours = Math.abs(offsetCurrentTz) / GLib.TIME_SPAN_HOUR;
const offsetMinutes =
(Math.abs(offsetCurrentTz) % GLib.TIME_SPAN_HOUR) /
GLib.TIME_SPAN_MINUTE;
const prefix = offsetCurrentTz >= 0 ? '+' : '-';
const text = offsetMinutes === 0
? '%s%d'.format(prefix, offsetHours)
: '%s%d\u2236%d'.format(prefix, offsetHours, offsetMinutes);
return text;
}
_getTimeAtLocation(location) { _getTimeAtLocation(location) {
let tz = GLib.TimeZone.new(location.get_timezone().get_tzid()); let tz = GLib.TimeZone.new(location.get_timezone().get_tzid());
return GLib.DateTime.new_now(tz); return GLib.DateTime.new_now(tz);
} }
_updateTimeLabels() { _updateLabels() {
for (let i = 0; i < this._locations.length; i++) { for (let i = 0; i < this._locations.length; i++) {
let l = this._locations[i]; let l = this._locations[i];
let now = this._getTimeAtLocation(l.location); let now = this._getTimeAtLocation(l.location);
l.timeLabel.text = Util.formatTime(now, { timeOnly: true }); l.actor.text = Util.formatTime(now, { timeOnly: true });
}
}
_updateTimezoneLabels() {
for (let i = 0; i < this._locations.length; i++) {
let l = this._locations[i];
l.tzLabel.text = this._getTimezoneOffsetAtLocation(l.location);
} }
} }
@ -300,13 +281,13 @@ class WeatherSection extends St.Button {
this.child = box; this.child = box;
let titleBox = new St.BoxLayout({ style_class: 'weather-header-box' }); let titleBox = new St.BoxLayout({ style_class: 'weather-header-box' });
this._titleLabel = new St.Label({ titleBox.add_child(new St.Label({
style_class: 'weather-header', style_class: 'weather-header',
x_align: Clutter.ActorAlign.START, x_align: Clutter.ActorAlign.START,
x_expand: true, x_expand: true,
y_align: Clutter.ActorAlign.END, y_align: Clutter.ActorAlign.END,
}); text: _('Weather'),
titleBox.add_child(this._titleLabel); }));
box.add_child(titleBox); box.add_child(titleBox);
this._titleLocation = new St.Label({ this._titleLocation = new St.Label({
@ -433,8 +414,10 @@ class WeatherSection extends St.Button {
_updateForecasts() { _updateForecasts() {
this._forecastGrid.destroy_all_children(); this._forecastGrid.destroy_all_children();
if (!this._weatherClient.hasLocation) if (!this._weatherClient.hasLocation) {
this._setStatusLabel(_("Select a location…"));
return; return;
}
const { info } = this._weatherClient; const { info } = this._weatherClient;
this._titleLocation.text = this._findBestLocationName(info.location); this._titleLocation.text = this._findBestLocationName(info.location);
@ -461,12 +444,6 @@ class WeatherSection extends St.Button {
if (!this.visible) if (!this.visible)
return; return;
if (this._weatherClient.hasLocation)
this._titleLabel.text = _('Weather');
else
this._titleLabel.text = _('Select weather location…');
this._forecastGrid.visible = this._weatherClient.hasLocation;
this._titleLocation.visible = this._weatherClient.hasLocation; this._titleLocation.visible = this._weatherClient.hasLocation;
this._updateForecasts(); this._updateForecasts();
@ -485,6 +462,7 @@ class MessagesIndicator extends St.Icon {
this._sources = []; this._sources = [];
this._count = 0; this._count = 0;
this._doNotDisturb = false;
this._settings = new Gio.Settings({ this._settings = new Gio.Settings({
schema_id: 'org.gnome.desktop.notifications', schema_id: 'org.gnome.desktop.notifications',
@ -565,8 +543,8 @@ class FreezableBinLayout extends Clutter.BinLayout {
return this._savedHeight; return this._savedHeight;
} }
vfunc_allocate(container, allocation) { vfunc_allocate(container, allocation, flags) {
super.vfunc_allocate(container, allocation); super.vfunc_allocate(container, allocation, flags);
let [width, height] = allocation.get_size(); let [width, height] = allocation.get_size();
this._savedWidth = [width, width]; this._savedWidth = [width, width];

View File

@ -245,15 +245,16 @@ function _loggingFunc(...args) {
} }
function init() { function init() {
// Add some bindings to the global JS namespace // Add some bindings to the global JS namespace; (gjs keeps the web
globalThis.global = Shell.Global.get(); // browser convention of having that namespace be called 'window'.)
window.global = Shell.Global.get();
globalThis.log = _loggingFunc; window.log = _loggingFunc;
globalThis._ = Gettext.gettext; window._ = Gettext.gettext;
globalThis.C_ = Gettext.pgettext; window.C_ = Gettext.pgettext;
globalThis.ngettext = Gettext.ngettext; window.ngettext = Gettext.ngettext;
globalThis.N_ = s => s; window.N_ = s => s;
GObject.gtypeNameBasedOnJSPath = true; GObject.gtypeNameBasedOnJSPath = true;
@ -285,11 +286,6 @@ function init() {
_easeActorProperty(this, 'value', target, params); _easeActorProperty(this, 'value', target, params);
}; };
Clutter.Actor.prototype[Symbol.iterator] = function* () {
for (let c = this.get_first_child(); c; c = c.get_next_sibling())
yield c;
};
Clutter.Actor.prototype.toString = function () { Clutter.Actor.prototype.toString = function () {
return St.describe_actor(this); return St.describe_actor(this);
}; };
@ -360,7 +356,9 @@ function init() {
// OK, now things are initialized enough that we can import shell JS // OK, now things are initialized enough that we can import shell JS
const Format = imports.format; const Format = imports.format;
const Tweener = imports.ui.tweener;
Tweener.init();
String.prototype.format = Format.format; String.prototype.format = Format.format;
} }

View File

@ -238,7 +238,7 @@ class InstallExtensionDialog extends ModalDialog.ModalDialog {
}); });
function init() { function init() {
_httpSession = new Soup.Session({ ssl_use_system_ca_file: true }); _httpSession = new Soup.SessionAsync({ ssl_use_system_ca_file: true });
// See: https://bugzilla.gnome.org/show_bug.cgi?id=655189 for context. // See: https://bugzilla.gnome.org/show_bug.cgi?id=655189 for context.
// _httpSession.add_feature(new Soup.ProxyResolverDefault()); // _httpSession.add_feature(new Soup.ProxyResolverDefault());

View File

@ -26,7 +26,6 @@ var ExtensionManager = class {
this._updateNotified = false; this._updateNotified = false;
this._extensions = new Map(); this._extensions = new Map();
this._unloadedExtensions = new Map();
this._enabledExtensions = []; this._enabledExtensions = [];
this._extensionOrder = []; this._extensionOrder = [];
@ -103,18 +102,18 @@ var ExtensionManager = class {
} }
} }
try {
extension.stateObj.disable();
} catch (e) {
this.logExtensionError(uuid, e);
}
if (extension.stylesheet) { if (extension.stylesheet) {
let theme = St.ThemeContext.get_for_stage(global.stage).get_theme(); let theme = St.ThemeContext.get_for_stage(global.stage).get_theme();
theme.unload_stylesheet(extension.stylesheet); theme.unload_stylesheet(extension.stylesheet);
delete extension.stylesheet; delete extension.stylesheet;
} }
try {
extension.stateObj.disable();
} catch (e) {
this.logExtensionError(uuid, e);
}
for (let i = 0; i < order.length; i++) { for (let i = 0; i < order.length; i++) {
let otherUuid = order[i]; let otherUuid = order[i];
try { try {
@ -260,8 +259,7 @@ var ExtensionManager = class {
if (!extension) if (!extension)
return; return;
const message = error instanceof Error let message = error.toString();
? error.message : error.toString();
extension.error = message; extension.error = message;
extension.state = ExtensionState.ERROR; extension.state = ExtensionState.ERROR;
@ -270,7 +268,6 @@ var ExtensionManager = class {
extension.errors.push(message); extension.errors.push(message);
logError(error, 'Extension %s'.format(uuid)); logError(error, 'Extension %s'.format(uuid));
this._updateCanChange(extension);
this.emit('extension-state-changed', extension); this.emit('extension-state-changed', extension);
} }
@ -320,14 +317,6 @@ var ExtensionManager = class {
return extension; return extension;
} }
_canLoad(extension) {
if (!this._unloadedExtensions.has(extension.uuid))
return true;
const version = this._unloadedExtensions.get(extension.uuid);
return extension.metadata.version === version;
}
loadExtension(extension) { loadExtension(extension) {
// Default to error, we set success as the last step // Default to error, we set success as the last step
extension.state = ExtensionState.ERROR; extension.state = ExtensionState.ERROR;
@ -336,9 +325,6 @@ var ExtensionManager = class {
if (checkVersion && ExtensionUtils.isOutOfDate(extension)) { if (checkVersion && ExtensionUtils.isOutOfDate(extension)) {
extension.state = ExtensionState.OUT_OF_DATE; extension.state = ExtensionState.OUT_OF_DATE;
} else if (!this._canLoad(extension)) {
this.logExtensionError(extension.uuid, new Error(
'A different version was loaded previously. You need to log out for changes to take effect.'));
} else { } else {
let enabled = this._enabledExtensions.includes(extension.uuid); let enabled = this._enabledExtensions.includes(extension.uuid);
if (enabled) { if (enabled) {
@ -349,8 +335,6 @@ var ExtensionManager = class {
} else { } else {
extension.state = ExtensionState.INITIALIZED; extension.state = ExtensionState.INITIALIZED;
} }
this._unloadedExtensions.delete(extension.uuid);
} }
this._updateCanChange(extension); this._updateCanChange(extension);
@ -358,22 +342,15 @@ var ExtensionManager = class {
} }
unloadExtension(extension) { unloadExtension(extension) {
const { uuid, type } = extension;
// Try to disable it -- if it's ERROR'd, we can't guarantee that, // Try to disable it -- if it's ERROR'd, we can't guarantee that,
// but it will be removed on next reboot, and hopefully nothing // but it will be removed on next reboot, and hopefully nothing
// broke too much. // broke too much.
this._callExtensionDisable(uuid); this._callExtensionDisable(extension.uuid);
extension.state = ExtensionState.UNINSTALLED; extension.state = ExtensionState.UNINSTALLED;
this.emit('extension-state-changed', extension); this.emit('extension-state-changed', extension);
// If we did install an importer, it is now cached and it's this._extensions.delete(extension.uuid);
// impossible to load a different version
if (type === ExtensionType.PER_USER && extension.imports)
this._unloadedExtensions.set(uuid, extension.metadata.version);
this._extensions.delete(uuid);
return true; return true;
} }
@ -486,15 +463,19 @@ var ExtensionManager = class {
// Find and enable all the newly enabled extensions: UUIDs found in the // Find and enable all the newly enabled extensions: UUIDs found in the
// new setting, but not in the old one. // new setting, but not in the old one.
newEnabledExtensions newEnabledExtensions.filter(
.filter(uuid => !this._enabledExtensions.includes(uuid)) uuid => !this._enabledExtensions.includes(uuid)
.forEach(uuid => this._callExtensionEnable(uuid)); ).forEach(uuid => {
this._callExtensionEnable(uuid);
});
// Find and disable all the newly disabled extensions: UUIDs found in the // Find and disable all the newly disabled extensions: UUIDs found in the
// old setting, but not in the new one. // old setting, but not in the new one.
this._extensionOrder this._extensionOrder.filter(
.filter(uuid => !newEnabledExtensions.includes(uuid)) uuid => !newEnabledExtensions.includes(uuid)
.reverse().forEach(uuid => this._callExtensionDisable(uuid)); ).reverse().forEach(uuid => {
this._callExtensionDisable(uuid);
});
this._enabledExtensions = newEnabledExtensions; this._enabledExtensions = newEnabledExtensions;
} }

View File

@ -197,9 +197,9 @@ function zoomOutActorAtPos(actor, x, y) {
}); });
} }
function animateIconPosition(icon, box, nChangedIcons) { function animateIconPosition(icon, box, flags, nChangedIcons) {
if (!icon.has_allocation() || icon.allocation.equal(box) || icon.opacity === 0) { if (!icon.has_allocation() || icon.allocation.equal(box) || icon.opacity === 0) {
icon.allocate(box); icon.allocate(box, flags);
return false; return false;
} }
@ -207,7 +207,7 @@ function animateIconPosition(icon, box, nChangedIcons) {
icon.set_easing_mode(Clutter.AnimationMode.EASE_OUT_QUAD); icon.set_easing_mode(Clutter.AnimationMode.EASE_OUT_QUAD);
icon.set_easing_delay(nChangedIcons * ICON_POSITION_DELAY); icon.set_easing_delay(nChangedIcons * ICON_POSITION_DELAY);
icon.allocate(box); icon.allocate(box, flags);
icon.restore_easing_state(); icon.restore_easing_state();
@ -226,6 +226,7 @@ var IconGrid = GObject.registerClass({
columnLimit: null, columnLimit: null,
minRows: 1, minRows: 1,
minColumns: 1, minColumns: 1,
fillParent: false,
xAlign: St.Align.MIDDLE, xAlign: St.Align.MIDDLE,
padWithSpacing: false }); padWithSpacing: false });
this._rowLimit = params.rowLimit; this._rowLimit = params.rowLimit;
@ -233,6 +234,7 @@ var IconGrid = GObject.registerClass({
this._minRows = params.minRows; this._minRows = params.minRows;
this._minColumns = params.minColumns; this._minColumns = params.minColumns;
this._xAlign = params.xAlign; this._xAlign = params.xAlign;
this._fillParent = params.fillParent;
this._padWithSpacing = params.padWithSpacing; this._padWithSpacing = params.padWithSpacing;
this.topPadding = 0; this.topPadding = 0;
@ -240,12 +242,6 @@ var IconGrid = GObject.registerClass({
this.rightPadding = 0; this.rightPadding = 0;
this.leftPadding = 0; this.leftPadding = 0;
this._nPages = 0;
this.currentPage = 0;
this._rowsPerPage = 0;
this._spaceBetweenPages = 0;
this._childrenPerPage = 0;
this._updateIconSizesLaterId = 0; this._updateIconSizesLaterId = 0;
this._items = []; this._items = [];
@ -301,6 +297,11 @@ var IconGrid = GObject.registerClass({
} }
vfunc_get_preferred_width(_forHeight) { vfunc_get_preferred_width(_forHeight) {
if (this._fillParent)
// Ignore all size requests of children and request a size of 0;
// later we'll allocate as many children as fit the parent
return [0, 0];
let nChildren = this.get_n_children(); let nChildren = this.get_n_children();
let nColumns = this._colLimit let nColumns = this._colLimit
? Math.min(this._colLimit, nChildren) ? Math.min(this._colLimit, nChildren)
@ -319,23 +320,52 @@ var IconGrid = GObject.registerClass({
return this.get_children().filter(actor => actor.visible); return this.get_children().filter(actor => actor.visible);
} }
_availableHeightPerPageForItems() { vfunc_get_preferred_height(forWidth) {
return this.usedHeightForNRows(this._rowsPerPage) - (this.topPadding + this.bottomPadding); if (this._fillParent)
// Ignore all size requests of children and request a size of 0;
// later we'll allocate as many children as fit the parent
return [0, 0];
let themeNode = this.get_theme_node();
let children = this._getVisibleChildren();
let nColumns;
forWidth = themeNode.adjust_for_width(forWidth);
if (forWidth < 0)
nColumns = children.length;
else
[nColumns] = this._computeLayout(forWidth);
let nRows;
if (nColumns > 0)
nRows = Math.ceil(children.length / nColumns);
else
nRows = 0;
if (this._rowLimit)
nRows = Math.min(nRows, this._rowLimit);
let totalSpacing = Math.max(0, nRows - 1) * this._getSpacing();
let height = nRows * this._getVItemSize() + totalSpacing + this.topPadding + this.bottomPadding;
return themeNode.adjust_preferred_height(height, height);
} }
vfunc_get_preferred_height() { vfunc_allocate(box, flags) {
const height = (this._availableHeightPerPageForItems() + this.bottomPadding + this.topPadding) * this._nPages + this._spaceBetweenPages * this._nPages; this.set_allocation(box, flags);
return [height, height];
let themeNode = this.get_theme_node();
box = themeNode.get_content_box(box);
if (this._fillParent) {
// Reset the passed in box to fill the parent
let parentBox = this.get_parent().allocation;
let gridBox = themeNode.get_content_box(parentBox);
box = themeNode.get_content_box(gridBox);
} }
vfunc_allocate(box) {
if (this._childrenPerPage === 0)
log('computePages() must be called before allocate(); pagination will not work.');
this.set_allocation(box);
let children = this._getVisibleChildren(); let children = this._getVisibleChildren();
let availWidth = box.x2 - box.x1; let availWidth = box.x2 - box.x1;
let availHeight = box.y2 - box.y1;
let spacing = this._getSpacing(); let spacing = this._getSpacing();
let [nColumns, usedWidth] = this._computeLayout(availWidth); let [nColumns, usedWidth] = this._computeLayout(availWidth);
@ -351,27 +381,34 @@ var IconGrid = GObject.registerClass({
leftEmptySpace = availWidth - usedWidth; leftEmptySpace = availWidth - usedWidth;
} }
let animating = this._clonesAnimating.length > 0;
let x = box.x1 + leftEmptySpace + this.leftPadding; let x = box.x1 + leftEmptySpace + this.leftPadding;
let y = box.y1 + this.topPadding; let y = box.y1 + this.topPadding;
let columnIndex = 0; let columnIndex = 0;
let rowIndex = 0;
let nChangedIcons = 0; let nChangedIcons = 0;
for (let i = 0; i < children.length; i++) { for (let i = 0; i < children.length; i++) {
let childBox = this._calculateChildBox(children[i], x, y, box); let childBox = this._calculateChildBox(children[i], x, y, box);
if (animateIconPosition(children[i], childBox, nChangedIcons)) if (this._rowLimit && rowIndex >= this._rowLimit ||
nChangedIcons++; this._fillParent && childBox.y2 > availHeight - this.bottomPadding) {
children[i].opacity = 0;
} else {
if (!animating)
children[i].opacity = 255;
children[i].show(); if (animateIconPosition(children[i], childBox, flags, nChangedIcons))
nChangedIcons++;
}
columnIndex++; columnIndex++;
if (columnIndex === nColumns) if (columnIndex == nColumns) {
columnIndex = 0; columnIndex = 0;
rowIndex++;
}
if (columnIndex == 0) { if (columnIndex == 0) {
y += this._getVItemSize() + spacing; y += this._getVItemSize() + spacing;
if ((i + 1) % this._childrenPerPage === 0)
y += this._spaceBetweenPages - spacing + this.bottomPadding + this.topPadding;
x = box.x1 + leftEmptySpace + this.leftPadding; x = box.x1 + leftEmptySpace + this.leftPadding;
} else { } else {
x += this._getHItemSize() + spacing; x += this._getHItemSize() + spacing;
@ -423,11 +460,7 @@ var IconGrid = GObject.registerClass({
* set of items to be animated. * set of items to be animated.
*/ */
_getChildrenToAnimate() { _getChildrenToAnimate() {
const children = this._getVisibleChildren().filter(child => child.opacity > 0); return this._getVisibleChildren().filter(child => child.opacity > 0);
const firstIndex = this._childrenPerPage * this.currentPage;
const lastIndex = firstIndex + this._childrenPerPage;
return children.slice(firstIndex, lastIndex);
} }
_resetAnimationActors() { _resetAnimationActors() {
@ -703,6 +736,16 @@ var IconGrid = GObject.registerClass({
return usedWidth + this.leftPadding + this.rightPadding; return usedWidth + this.leftPadding + this.rightPadding;
} }
removeAll() {
this._items = [];
this.remove_all_children();
}
destroyAll() {
this._items = [];
this.destroy_all_children();
}
addItem(item, index) { addItem(item, index) {
if (!(item.icon instanceof BaseIcon)) if (!(item.icon instanceof BaseIcon))
throw new Error('Only items with a BaseIcon icon property can be added to IconGrid'); throw new Error('Only items with a BaseIcon icon property can be added to IconGrid');
@ -718,6 +761,14 @@ var IconGrid = GObject.registerClass({
this.remove_child(item); this.remove_child(item);
} }
getItemAtIndex(index) {
return this.get_child_at_index(index);
}
visibleItemsCount() {
return this.get_children().filter(c => c.is_visible()).length;
}
setSpacing(spacing) { setSpacing(spacing) {
this._fixedSpacing = spacing; this._fixedSpacing = spacing;
} }
@ -767,24 +818,6 @@ var IconGrid = GObject.registerClass({
this.topPadding = this.rightPadding = this.bottomPadding = this.leftPadding = spacing; this.topPadding = this.rightPadding = this.bottomPadding = this.leftPadding = spacing;
} }
_computePages(availWidthPerPage, availHeightPerPage) {
const [nColumns] = this._computeLayout(availWidthPerPage);
const children = this._getVisibleChildren();
let nRows;
if (nColumns > 0)
nRows = Math.ceil(children.length / nColumns);
else
nRows = 0;
if (this._rowLimit)
nRows = Math.min(nRows, this._rowLimit);
// We want to contain the grid inside the parent box with padding
this._rowsPerPage = this.rowsForHeight(availHeightPerPage);
this._nPages = Math.ceil(nRows / this._rowsPerPage);
this._spaceBetweenPages = availHeightPerPage - (this.topPadding + this.bottomPadding) - this._availableHeightPerPageForItems();
this._childrenPerPage = nColumns * this._rowsPerPage;
}
/* /*
* This function must to be called before iconGrid allocation, * This function must to be called before iconGrid allocation,
* to know how much spacing can the grid has * to know how much spacing can the grid has
@ -810,7 +843,6 @@ var IconGrid = GObject.registerClass({
this._updateIconSizesLaterId = Meta.later_add(Meta.LaterType.BEFORE_REDRAW, this._updateIconSizesLaterId = Meta.later_add(Meta.LaterType.BEFORE_REDRAW,
this._updateIconSizes.bind(this)); this._updateIconSizes.bind(this));
} }
this._computePages(availWidth, availHeight);
} }
// Note that this is ICON_SIZE as used by BaseIcon, not elsewhere in IconGrid; it's a bit messed up // Note that this is ICON_SIZE as used by BaseIcon, not elsewhere in IconGrid; it's a bit messed up
@ -823,6 +855,116 @@ var IconGrid = GObject.registerClass({
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
} }
});
var PaginatedIconGrid = GObject.registerClass(
class PaginatedIconGrid extends IconGrid {
_init(params) {
super._init(params);
this._nPages = 0;
this.currentPage = 0;
this._rowsPerPage = 0;
this._spaceBetweenPages = 0;
this._childrenPerPage = 0;
}
vfunc_get_preferred_height(_forWidth) {
let height = (this._availableHeightPerPageForItems() + this.bottomPadding + this.topPadding) * this._nPages + this._spaceBetweenPages * this._nPages;
return [height, height];
}
vfunc_allocate(box, flags) {
if (this._childrenPerPage == 0)
log('computePages() must be called before allocate(); pagination will not work.');
this.set_allocation(box, flags);
if (this._fillParent) {
// Reset the passed in box to fill the parent
let parentBox = this.get_parent().allocation;
let gridBox = this.get_theme_node().get_content_box(parentBox);
box = this.get_theme_node().get_content_box(gridBox);
}
let children = this._getVisibleChildren();
let availWidth = box.x2 - box.x1;
let spacing = this._getSpacing();
let [nColumns, usedWidth] = this._computeLayout(availWidth);
let leftEmptySpace;
switch (this._xAlign) {
case St.Align.START:
leftEmptySpace = 0;
break;
case St.Align.MIDDLE:
leftEmptySpace = Math.floor((availWidth - usedWidth) / 2);
break;
case St.Align.END:
leftEmptySpace = availWidth - usedWidth;
}
let x = box.x1 + leftEmptySpace + this.leftPadding;
let y = box.y1 + this.topPadding;
let columnIndex = 0;
let nChangedIcons = 0;
for (let i = 0; i < children.length; i++) {
let childBox = this._calculateChildBox(children[i], x, y, box);
if (animateIconPosition(children[i], childBox, flags, nChangedIcons))
nChangedIcons++;
children[i].show();
columnIndex++;
if (columnIndex == nColumns)
columnIndex = 0;
if (columnIndex == 0) {
y += this._getVItemSize() + spacing;
if ((i + 1) % this._childrenPerPage == 0)
y += this._spaceBetweenPages - spacing + this.bottomPadding + this.topPadding;
x = box.x1 + leftEmptySpace + this.leftPadding;
} else {
x += this._getHItemSize() + spacing;
}
}
}
// Overridden from IconGrid
_getChildrenToAnimate() {
let children = super._getChildrenToAnimate();
let firstIndex = this._childrenPerPage * this.currentPage;
let lastIndex = firstIndex + this._childrenPerPage;
return children.slice(firstIndex, lastIndex);
}
_computePages(availWidthPerPage, availHeightPerPage) {
let [nColumns, usedWidth_] = this._computeLayout(availWidthPerPage);
let nRows;
let children = this._getVisibleChildren();
if (nColumns > 0)
nRows = Math.ceil(children.length / nColumns);
else
nRows = 0;
if (this._rowLimit)
nRows = Math.min(nRows, this._rowLimit);
// We want to contain the grid inside the parent box with padding
this._rowsPerPage = this.rowsForHeight(availHeightPerPage);
this._nPages = Math.ceil(nRows / this._rowsPerPage);
this._spaceBetweenPages = availHeightPerPage - (this.topPadding + this.bottomPadding) - this._availableHeightPerPageForItems();
this._childrenPerPage = nColumns * this._rowsPerPage;
}
adaptToSize(availWidth, availHeight) {
super.adaptToSize(availWidth, availHeight);
this._computePages(availWidth, availHeight);
}
_availableHeightPerPageForItems() {
return this.usedHeightForNRows(this._rowsPerPage) - (this.topPadding + this.bottomPadding);
}
nPages() { nPages() {
return this._nPages; return this._nPages;

View File

@ -61,7 +61,7 @@ class AspectContainer extends St.Widget {
this.queue_relayout(); this.queue_relayout();
} }
vfunc_allocate(box) { vfunc_allocate(box, flags) {
if (box.get_width() > 0 && box.get_height() > 0) { if (box.get_width() > 0 && box.get_height() > 0) {
let sizeRatio = box.get_width() / box.get_height(); let sizeRatio = box.get_width() / box.get_height();
@ -79,7 +79,7 @@ class AspectContainer extends St.Widget {
} }
} }
super.vfunc_allocate(box); super.vfunc_allocate(box, flags);
} }
}); });
@ -722,7 +722,7 @@ var EmojiPager = GObject.registerClass({
_onPan(action) { _onPan(action) {
let [dist_, dx, dy_] = action.get_motion_delta(0); let [dist_, dx, dy_] = action.get_motion_delta(0);
this.delta += dx; this.delta = this.delta + dx;
if (this._currentKey != null) { if (this._currentKey != null) {
this._currentKey.cancel(); this._currentKey.cancel();
@ -935,7 +935,8 @@ var EmojiSelection = GObject.registerClass({
this.add_child(this._emojiPager); this.add_child(this._emojiPager);
this._pageIndicator = new PageIndicators.PageIndicators( this._pageIndicator = new PageIndicators.PageIndicators(
Clutter.Orientation.HORIZONTAL); Clutter.Orientation.HORIZONTAL
);
this.add_child(this._pageIndicator); this.add_child(this._pageIndicator);
this._pageIndicator.setReactive(false); this._pageIndicator.setReactive(false);
@ -1118,7 +1119,7 @@ var KeyboardManager = class KeyBoardManager {
this._seat.connect('notify::touch-mode', this._syncEnabled.bind(this)); this._seat.connect('notify::touch-mode', this._syncEnabled.bind(this));
this._lastDevice = null; this._lastDevice = null;
global.backend.connect('last-device-changed', (backend, device) => { Meta.get_backend().connect('last-device-changed', (backend, device) => {
if (device.device_type === Clutter.InputDeviceType.KEYBOARD_DEVICE) if (device.device_type === Clutter.InputDeviceType.KEYBOARD_DEVICE)
return; return;
@ -1256,10 +1257,6 @@ class Keyboard extends St.BoxLayout {
return this._keyboardVisible && super.visible; return this._keyboardVisible && super.visible;
} }
set visible(visible) {
super.visible = visible;
}
_onFocusPositionChanged(focusTracker) { _onFocusPositionChanged(focusTracker) {
let rect = focusTracker.getCurrentRect(); let rect = focusTracker.getCurrentRect();
this.setCursorLocation(focusTracker.currentWindow, rect.x, rect.y, rect.width, rect.height); this.setCursorLocation(focusTracker.currentWindow, rect.x, rect.y, rect.width, rect.height);

View File

@ -246,7 +246,7 @@ var LayoutManager = GObject.registerClass({
vertical: true }); vertical: true });
this.addChrome(this.panelBox, { affectsStruts: true, this.addChrome(this.panelBox, { affectsStruts: true,
trackFullscreen: true }); trackFullscreen: true });
this.panelBox.connect('notify::allocation', this.panelBox.connect('allocation-changed',
this._panelBoxChanged.bind(this)); this._panelBoxChanged.bind(this));
this.modalDialogGroup = new St.Widget({ name: 'modalDialogGroup', this.modalDialogGroup = new St.Widget({ name: 'modalDialogGroup',

View File

@ -27,11 +27,13 @@ var RadialShaderEffect = GObject.registerClass({
'brightness': GObject.ParamSpec.float( 'brightness': GObject.ParamSpec.float(
'brightness', 'brightness', 'brightness', 'brightness', 'brightness', 'brightness',
GObject.ParamFlags.READWRITE, GObject.ParamFlags.READWRITE,
0, 1, 1), 0, 1, 1
),
'sharpness': GObject.ParamSpec.float( 'sharpness': GObject.ParamSpec.float(
'sharpness', 'sharpness', 'sharpness', 'sharpness', 'sharpness', 'sharpness',
GObject.ParamFlags.READWRITE, GObject.ParamFlags.READWRITE,
0, 1, 0), 0, 1, 0
),
}, },
}, class RadialShaderEffect extends Shell.GLSLEffect { }, class RadialShaderEffect extends Shell.GLSLEffect {
_init(params) { _init(params) {

View File

@ -37,9 +37,10 @@ const LG_ANIMATION_TIME = 500;
function _getAutoCompleteGlobalKeywords() { function _getAutoCompleteGlobalKeywords() {
const keywords = ['true', 'false', 'null', 'new']; const keywords = ['true', 'false', 'null', 'new'];
// Don't add the private properties of globalThis (i.e., ones starting with '_') // Don't add the private properties of window (i.e., ones starting with '_')
const windowProperties = Object.getOwnPropertyNames(globalThis).filter( const windowProperties = Object.getOwnPropertyNames(window).filter(
a => a.charAt(0) !== '_'); a => a.charAt(0) != '_'
);
const headerProperties = JsParse.getDeclaredConstants(commandHeader); const headerProperties = JsParse.getDeclaredConstants(commandHeader);
return keywords.concat(windowProperties).concat(headerProperties); return keywords.concat(windowProperties).concat(headerProperties);
@ -554,8 +555,8 @@ var Inspector = GObject.registerClass({
this._lookingGlass = lookingGlass; this._lookingGlass = lookingGlass;
} }
vfunc_allocate(box) { vfunc_allocate(box, flags) {
this.set_allocation(box); this.set_allocation(box, flags);
if (!this._eventHandler) if (!this._eventHandler)
return; return;
@ -570,7 +571,7 @@ var Inspector = GObject.registerClass({
childBox.x2 = childBox.x1 + natWidth; childBox.x2 = childBox.x1 + natWidth;
childBox.y1 = primary.y + Math.floor((primary.height - natHeight) / 2); childBox.y1 = primary.y + Math.floor((primary.height - natHeight) / 2);
childBox.y2 = childBox.y1 + natHeight; childBox.y2 = childBox.y1 + natHeight;
this._eventHandler.allocate(childBox); this._eventHandler.allocate(childBox, flags);
} }
_close() { _close() {
@ -802,191 +803,6 @@ var Extensions = GObject.registerClass({
} }
}); });
var ActorLink = GObject.registerClass({
Signals: {
'inspect-actor': {},
},
}, class ActorLink extends St.Button {
_init(actor) {
this._arrow = new St.Icon({
icon_name: 'pan-end-symbolic',
icon_size: 8,
x_align: Clutter.ActorAlign.CENTER,
y_align: Clutter.ActorAlign.CENTER,
pivot_point: new Graphene.Point({ x: 0.5, y: 0.5 }),
});
const label = new St.Label({
text: actor.toString(),
x_align: Clutter.ActorAlign.START,
});
const inspectButton = new St.Button({
child: new St.Icon({
icon_name: 'insert-object-symbolic',
icon_size: 12,
y_align: Clutter.ActorAlign.CENTER,
}),
reactive: true,
x_expand: true,
x_align: Clutter.ActorAlign.START,
y_align: Clutter.ActorAlign.CENTER,
});
inspectButton.connect('clicked', () => this.emit('inspect-actor'));
const box = new St.BoxLayout();
box.add_child(this._arrow);
box.add_child(label);
box.add_child(inspectButton);
super._init({
reactive: true,
track_hover: true,
toggle_mode: true,
style_class: 'actor-link',
child: box,
x_align: Clutter.ActorAlign.START,
});
this._actor = actor;
}
vfunc_clicked() {
this._arrow.ease({
rotation_angle_z: this.checked ? 90 : 0,
duration: 250,
});
}
});
var ActorTreeViewer = GObject.registerClass(
class ActorTreeViewer extends St.BoxLayout {
_init(lookingGlass) {
super._init();
this._lookingGlass = lookingGlass;
this._actorData = new Map();
}
_showActorChildren(actor) {
const data = this._actorData.get(actor);
if (!data || data.visible)
return;
data.visible = true;
data.actorAddedId = actor.connect('actor-added', (container, child) => {
this._addActor(data.children, child);
});
data.actorRemovedId = actor.connect('actor-removed', (container, child) => {
this._removeActor(child);
});
for (let child of actor)
this._addActor(data.children, child);
}
_hideActorChildren(actor) {
const data = this._actorData.get(actor);
if (!data || !data.visible)
return;
for (let child of actor)
this._removeActor(child);
data.visible = false;
if (data.actorAddedId > 0) {
actor.disconnect(data.actorAddedId);
data.actorAddedId = 0;
}
if (data.actorRemovedId > 0) {
actor.disconnect(data.actorRemovedId);
data.actorRemovedId = 0;
}
data.children.remove_all_children();
}
_addActor(container, actor) {
if (this._actorData.has(actor))
return;
if (actor === this._lookingGlass)
return;
const button = new ActorLink(actor);
button.connect('notify::checked', () => {
this._lookingGlass.setBorderPaintTarget(actor);
if (button.checked)
this._showActorChildren(actor);
else
this._hideActorChildren(actor);
});
button.connect('inspect-actor', () => {
this._lookingGlass.inspectObject(actor, button);
});
const mainContainer = new St.BoxLayout({ vertical: true });
const childrenContainer = new St.BoxLayout({
vertical: true,
style: 'padding: 0 0 0 18px',
});
mainContainer.add_child(button);
mainContainer.add_child(childrenContainer);
this._actorData.set(actor, {
button,
container: mainContainer,
children: childrenContainer,
visible: false,
actorAddedId: 0,
actorRemovedId: 0,
actorDestroyedId: actor.connect('destroy', () => this._removeActor(actor)),
});
let belowChild = null;
const nextSibling = actor.get_next_sibling();
if (nextSibling && this._actorData.has(nextSibling))
belowChild = this._actorData.get(nextSibling).container;
container.insert_child_above(mainContainer, belowChild);
}
_removeActor(actor) {
const data = this._actorData.get(actor);
if (!data)
return;
for (let child of actor)
this._removeActor(child);
if (data.actorAddedId > 0) {
actor.disconnect(data.actorAddedId);
data.actorAddedId = 0;
}
if (data.actorRemovedId > 0) {
actor.disconnect(data.actorRemovedId);
data.actorRemovedId = 0;
}
if (data.actorDestroyedId > 0) {
actor.disconnect(data.actorDestroyedId);
data.actorDestroyedId = 0;
}
data.container.destroy();
this._actorData.delete(actor);
}
vfunc_map() {
super.vfunc_map();
this._addActor(this, global.stage);
}
vfunc_unmap() {
super.vfunc_unmap();
this._removeActor(global.stage);
}
});
var LookingGlass = GObject.registerClass( var LookingGlass = GObject.registerClass(
class LookingGlass extends St.BoxLayout { class LookingGlass extends St.BoxLayout {
_init() { _init() {
@ -1018,9 +834,9 @@ class LookingGlass extends St.BoxLayout {
Main.uiGroup.add_actor(this); Main.uiGroup.add_actor(this);
Main.uiGroup.set_child_below_sibling(this, Main.uiGroup.set_child_below_sibling(this,
Main.layoutManager.panelBox); Main.layoutManager.panelBox);
Main.layoutManager.panelBox.connect('notify::allocation', Main.layoutManager.panelBox.connect('allocation-changed',
this._queueResize.bind(this)); this._queueResize.bind(this));
Main.layoutManager.keyboardBox.connect('notify::allocation', Main.layoutManager.keyboardBox.connect('allocation-changed',
this._queueResize.bind(this)); this._queueResize.bind(this));
this._objInspector = new ObjInspector(this); this._objInspector = new ObjInspector(this);
@ -1102,9 +918,6 @@ class LookingGlass extends St.BoxLayout {
this._extensions = new Extensions(this); this._extensions = new Extensions(this);
notebook.appendPage('Extensions', this._extensions); notebook.appendPage('Extensions', this._extensions);
this._actorTreeViewer = new ActorTreeViewer(this);
notebook.appendPage('Actors', this._actorTreeViewer);
this._entry.clutter_text.connect('activate', (o, _e) => { this._entry.clutter_text.connect('activate', (o, _e) => {
// Hide any completions we are currently showing // Hide any completions we are currently showing
this._hideCompletions(); this._hideCompletions();

View File

@ -643,7 +643,8 @@ var Magnifier = class Magnifier {
// Applies only to the first zoom region. // Applies only to the first zoom region.
if (this._zoomRegions.length) { if (this._zoomRegions.length) {
this._zoomRegions[0].setClampScrollingAtEdges( this._zoomRegions[0].setClampScrollingAtEdges(
!this._settings.get_boolean(CLAMP_MODE_KEY)); !this._settings.get_boolean(CLAMP_MODE_KEY)
);
} }
} }
@ -651,7 +652,8 @@ var Magnifier = class Magnifier {
// Applies only to the first zoom region. // Applies only to the first zoom region.
if (this._zoomRegions.length) { if (this._zoomRegions.length) {
this._zoomRegions[0].setMouseTrackingMode( this._zoomRegions[0].setMouseTrackingMode(
this._settings.get_enum(MOUSE_TRACKING_KEY)); this._settings.get_enum(MOUSE_TRACKING_KEY)
);
} }
} }
@ -659,7 +661,8 @@ var Magnifier = class Magnifier {
// Applies only to the first zoom region. // Applies only to the first zoom region.
if (this._zoomRegions.length) { if (this._zoomRegions.length) {
this._zoomRegions[0].setFocusTrackingMode( this._zoomRegions[0].setFocusTrackingMode(
this._settings.get_enum(FOCUS_TRACKING_KEY)); this._settings.get_enum(FOCUS_TRACKING_KEY)
);
} }
} }
@ -667,7 +670,8 @@ var Magnifier = class Magnifier {
// Applies only to the first zoom region. // Applies only to the first zoom region.
if (this._zoomRegions.length) { if (this._zoomRegions.length) {
this._zoomRegions[0].setCaretTrackingMode( this._zoomRegions[0].setCaretTrackingMode(
this._settings.get_enum(CARET_TRACKING_KEY)); this._settings.get_enum(CARET_TRACKING_KEY)
);
} }
} }
@ -675,7 +679,8 @@ var Magnifier = class Magnifier {
// Applies only to the first zoom region. // Applies only to the first zoom region.
if (this._zoomRegions.length) { if (this._zoomRegions.length) {
this._zoomRegions[0].setInvertLightness( this._zoomRegions[0].setInvertLightness(
this._settings.get_boolean(INVERT_LIGHTNESS_KEY)); this._settings.get_boolean(INVERT_LIGHTNESS_KEY)
);
} }
} }
@ -683,7 +688,8 @@ var Magnifier = class Magnifier {
// Applies only to the first zoom region. // Applies only to the first zoom region.
if (this._zoomRegions.length) { if (this._zoomRegions.length) {
this._zoomRegions[0].setColorSaturation( this._zoomRegions[0].setColorSaturation(
this._settings.get_double(COLOR_SATURATION_KEY)); this._settings.get_double(COLOR_SATURATION_KEY)
);
} }
} }
@ -1935,8 +1941,9 @@ var MagShaderEffects = class MagShaderEffects {
// it modifies the brightness and/or contrast. // it modifies the brightness and/or contrast.
let [cRed, cGreen, cBlue] = this._brightnessContrast.get_contrast(); let [cRed, cGreen, cBlue] = this._brightnessContrast.get_contrast();
this._brightnessContrast.set_enabled( this._brightnessContrast.set_enabled(
bRed !== NO_CHANGE || bGreen !== NO_CHANGE || bBlue !== NO_CHANGE || bRed != NO_CHANGE || bGreen != NO_CHANGE || bBlue != NO_CHANGE ||
cRed !== NO_CHANGE || cGreen !== NO_CHANGE || cBlue !== NO_CHANGE); cRed != NO_CHANGE || cGreen != NO_CHANGE || cBlue != NO_CHANGE
);
} }
/** /**
@ -1963,7 +1970,8 @@ var MagShaderEffects = class MagShaderEffects {
// a null first argument. // a null first argument.
let [bRed, bGreen, bBlue] = this._brightnessContrast.get_brightness(); let [bRed, bGreen, bBlue] = this._brightnessContrast.get_brightness();
this._brightnessContrast.set_enabled( this._brightnessContrast.set_enabled(
cRed !== NO_CHANGE || cGreen !== NO_CHANGE || cBlue !== NO_CHANGE || cRed != NO_CHANGE || cGreen != NO_CHANGE || cBlue != NO_CHANGE ||
bRed !== NO_CHANGE || bGreen !== NO_CHANGE || bBlue !== NO_CHANGE); bRed != NO_CHANGE || bGreen != NO_CHANGE || bBlue != NO_CHANGE
);
} }
}; };

View File

@ -46,7 +46,6 @@ const XdndHandler = imports.ui.xdndHandler;
const KbdA11yDialog = imports.ui.kbdA11yDialog; const KbdA11yDialog = imports.ui.kbdA11yDialog;
const LocatePointer = imports.ui.locatePointer; const LocatePointer = imports.ui.locatePointer;
const PointerA11yTimeout = imports.ui.pointerA11yTimeout; const PointerA11yTimeout = imports.ui.pointerA11yTimeout;
const ParentalControlsManager = imports.misc.parentalControlsManager;
const A11Y_SCHEMA = 'org.gnome.desktop.a11y.keyboard'; const A11Y_SCHEMA = 'org.gnome.desktop.a11y.keyboard';
const STICKY_KEYS_ENABLE = 'stickykeys-enable'; const STICKY_KEYS_ENABLE = 'stickykeys-enable';
@ -97,8 +96,6 @@ let _oskResource = null;
Gio._promisify(Gio._LocalFilePrototype, 'delete_async', 'delete_finish'); Gio._promisify(Gio._LocalFilePrototype, 'delete_async', 'delete_finish');
Gio._promisify(Gio._LocalFilePrototype, 'touch_async', 'touch_finish'); Gio._promisify(Gio._LocalFilePrototype, 'touch_async', 'touch_finish');
let _remoteAccessInhibited = false;
function _sessionUpdated() { function _sessionUpdated() {
if (sessionMode.isPrimary) if (sessionMode.isPrimary)
_loadDefaultStylesheet(); _loadDefaultStylesheet();
@ -123,23 +120,12 @@ function _sessionUpdated() {
if (lookingGlass) if (lookingGlass)
lookingGlass.close(); lookingGlass.close();
} }
let remoteAccessController = global.backend.get_remote_access_controller();
if (remoteAccessController) {
if (sessionMode.allowScreencast && _remoteAccessInhibited) {
remoteAccessController.uninhibit_remote_access();
_remoteAccessInhibited = false;
} else if (!sessionMode.allowScreencast && !_remoteAccessInhibited) {
remoteAccessController.inhibit_remote_access();
_remoteAccessInhibited = true;
}
}
} }
function start() { function start() {
// These are here so we don't break compatibility. // These are here so we don't break compatibility.
global.logError = globalThis.log; global.logError = window.log;
global.log = globalThis.log; global.log = window.log;
// Chain up async errors reported from C // Chain up async errors reported from C
global.connect('notify-error', (global, msg, detail) => { global.connect('notify-error', (global, msg, detail) => {
@ -154,10 +140,6 @@ function start() {
sessionMode.connect('updated', _sessionUpdated); sessionMode.connect('updated', _sessionUpdated);
St.Settings.get().connect('notify::gtk-theme', _loadDefaultStylesheet); St.Settings.get().connect('notify::gtk-theme', _loadDefaultStylesheet);
// Initialize ParentalControlsManager before the UI
ParentalControlsManager.getDefault();
_initializeUI(); _initializeUI();
shellAccessDialogDBusService = new AccessDialog.AccessDialogDBus(); shellAccessDialogDBusService = new AccessDialog.AccessDialogDBus();
@ -539,9 +521,7 @@ function pushModal(actor, params) {
let prevFocusDestroyId; let prevFocusDestroyId;
if (prevFocus != null) { if (prevFocus != null) {
prevFocusDestroyId = prevFocus.connect('destroy', () => { prevFocusDestroyId = prevFocus.connect('destroy', () => {
const index = modalActorFocusStack.findIndex( let index = _findModal(actor);
record => record.prevFocus === prevFocus);
if (index >= 0) if (index >= 0)
modalActorFocusStack[index].prevFocus = null; modalActorFocusStack[index].prevFocus = null;
}); });
@ -817,7 +797,7 @@ function showRestartMessage(message) {
var AnimationsSettings = class { var AnimationsSettings = class {
constructor() { constructor() {
let backend = global.backend; let backend = Meta.get_backend();
if (!backend.is_rendering_hardware_accelerated()) { if (!backend.is_rendering_hardware_accelerated()) {
St.Settings.get().inhibit_animations(); St.Settings.get().inhibit_animations();
return; return;

View File

@ -285,12 +285,12 @@ var LabelExpanderLayout = GObject.registerClass({
return [min, nat]; return [min, nat];
} }
vfunc_allocate(container, box) { vfunc_allocate(container, box, flags) {
for (let i = 0; i < container.get_n_children(); i++) { for (let i = 0; i < container.get_n_children(); i++) {
let child = container.get_child_at_index(i); let child = container.get_child_at_index(i);
if (child.visible) if (child.visible)
child.allocate(box); child.allocate(box, flags);
} }
} }

View File

@ -136,22 +136,29 @@ var FocusGrabber = class FocusGrabber {
var NotificationPolicy = GObject.registerClass({ var NotificationPolicy = GObject.registerClass({
Properties: { Properties: {
'enable': GObject.ParamSpec.boolean( 'enable': GObject.ParamSpec.boolean(
'enable', 'enable', 'enable', GObject.ParamFlags.READABLE, true), 'enable', 'enable', 'enable',
GObject.ParamFlags.READWRITE | GObject.ParamFlags.CONSTRUCT_ONLY,
true),
'enable-sound': GObject.ParamSpec.boolean( 'enable-sound': GObject.ParamSpec.boolean(
'enable-sound', 'enable-sound', 'enable-sound', 'enable-sound', 'enable-sound', 'enable-sound',
GObject.ParamFlags.READABLE, true), GObject.ParamFlags.READWRITE | GObject.ParamFlags.CONSTRUCT_ONLY,
true),
'show-banners': GObject.ParamSpec.boolean( 'show-banners': GObject.ParamSpec.boolean(
'show-banners', 'show-banners', 'show-banners', 'show-banners', 'show-banners', 'show-banners',
GObject.ParamFlags.READABLE, true), GObject.ParamFlags.READWRITE | GObject.ParamFlags.CONSTRUCT_ONLY,
true),
'force-expanded': GObject.ParamSpec.boolean( 'force-expanded': GObject.ParamSpec.boolean(
'force-expanded', 'force-expanded', 'force-expanded', 'force-expanded', 'force-expanded', 'force-expanded',
GObject.ParamFlags.READABLE, false), GObject.ParamFlags.READWRITE | GObject.ParamFlags.CONSTRUCT_ONLY,
false),
'show-in-lock-screen': GObject.ParamSpec.boolean( 'show-in-lock-screen': GObject.ParamSpec.boolean(
'show-in-lock-screen', 'show-in-lock-screen', 'show-in-lock-screen', 'show-in-lock-screen', 'show-in-lock-screen', 'show-in-lock-screen',
GObject.ParamFlags.READABLE, false), GObject.ParamFlags.READWRITE | GObject.ParamFlags.CONSTRUCT_ONLY,
false),
'details-in-lock-screen': GObject.ParamSpec.boolean( 'details-in-lock-screen': GObject.ParamSpec.boolean(
'details-in-lock-screen', 'details-in-lock-screen', 'details-in-lock-screen', 'details-in-lock-screen', 'details-in-lock-screen', 'details-in-lock-screen',
GObject.ParamFlags.READABLE, false), GObject.ParamFlags.READWRITE | GObject.ParamFlags.CONSTRUCT_ONLY,
false),
}, },
}, class NotificationPolicy extends GObject.Object { }, class NotificationPolicy extends GObject.Object {
// Do nothing for the default policy. These methods are only useful for the // Do nothing for the default policy. These methods are only useful for the
@ -162,28 +169,24 @@ var NotificationPolicy = GObject.registerClass({
this.run_dispose(); this.run_dispose();
} }
get enable() {
return true;
}
get enableSound() { get enableSound() {
return true; return this.enable_sound;
} }
get showBanners() { get showBanners() {
return true; return this.show_banners;
} }
get forceExpanded() { get forceExpanded() {
return false; return this.force_expanded;
} }
get showInLockScreen() { get showInLockScreen() {
return false; return this.show_in_lock_screen;
} }
get detailsInLockScreen() { get detailsInLockScreen() {
return false; return this.details_in_lock_screen;
} }
}); });
@ -686,8 +689,8 @@ class SourceActorWithLabel extends SourceActor {
}); });
} }
vfunc_allocate(box) { vfunc_allocate(box, flags) {
super.vfunc_allocate(box); super.vfunc_allocate(box, flags);
let childBox = new Clutter.ActorBox(); let childBox = new Clutter.ActorBox();
@ -707,7 +710,7 @@ class SourceActorWithLabel extends SourceActor {
childBox.y1 = box.y2 - naturalHeight; childBox.y1 = box.y2 - naturalHeight;
childBox.y2 = box.y2; childBox.y2 = box.y2;
this._counterBin.allocate(childBox); this._counterBin.allocate(childBox, flags);
} }
_updateCount() { _updateCount() {
@ -1164,7 +1167,8 @@ var MessageTray = GObject.registerClass({
this._onNotificationDestroy.bind(this)); this._onNotificationDestroy.bind(this));
this._notificationQueue.push(notification); this._notificationQueue.push(notification);
this._notificationQueue.sort( this._notificationQueue.sort(
(n1, n2) => n2.urgency - n1.urgency); (n1, n2) => n2.urgency - n1.urgency
);
this.emit('queue-changed'); this.emit('queue-changed');
} }
} }

View File

@ -173,11 +173,6 @@ var MprisPlayer = class MprisPlayer {
if (!this._mprisProxy.g_name_owner) if (!this._mprisProxy.g_name_owner)
this._close(); this._close();
}); });
// It is possible for the bus to disappear before the previous signal
// is connected, so we must ensure that the bus still exists at this
// point.
if (!this._mprisProxy.g_name_owner)
this._close();
} }
_onPlayerProxyReady() { _onPlayerProxyReady() {

View File

@ -10,6 +10,13 @@ const Params = imports.misc.params;
const { loadInterfaceXML } = imports.misc.fileUtils; const { loadInterfaceXML } = imports.misc.fileUtils;
// Should really be defined in Gio.js
const BusIface = loadInterfaceXML('org.freedesktop.DBus');
var BusProxy = Gio.DBusProxy.makeProxyWrapper(BusIface);
function Bus() {
return new BusProxy(Gio.DBus.session, 'org.freedesktop.DBus', '/org/freedesktop/DBus');
}
const FdoNotificationsIface = loadInterfaceXML('org.freedesktop.Notifications'); const FdoNotificationsIface = loadInterfaceXML('org.freedesktop.Notifications');
var NotificationClosedReason = { var NotificationClosedReason = {
@ -42,7 +49,9 @@ var FdoNotificationDaemon = class FdoNotificationDaemon {
this._dbusImpl.export(Gio.DBus.session, '/org/freedesktop/Notifications'); this._dbusImpl.export(Gio.DBus.session, '/org/freedesktop/Notifications');
this._sources = []; this._sources = [];
this._senderToPid = {};
this._notifications = {}; this._notifications = {};
this._busProxy = new Bus();
this._nextNotificationId = 1; this._nextNotificationId = 1;
@ -107,9 +116,12 @@ var FdoNotificationDaemon = class FdoNotificationDaemon {
// //
// If no existing source is found, a new source is created as long as // If no existing source is found, a new source is created as long as
// pid is provided. // pid is provided.
//
// Either a pid or ndata.notification is needed to retrieve or
// create a source.
_getSource(title, pid, ndata, sender) { _getSource(title, pid, ndata, sender) {
if (!pid && !(ndata && ndata.notification)) if (!pid && !(ndata && ndata.notification))
throw new Error('Either a pid or ndata.notification is needed'); return null;
// We use notification's source for the notifications we still have // We use notification's source for the notifications we still have
// around that are getting replaced because we don't keep sources // around that are getting replaced because we don't keep sources
@ -206,10 +218,42 @@ var FdoNotificationDaemon = class FdoNotificationDaemon {
this._notifications[id] = ndata; this._notifications[id] = ndata;
let sender = invocation.get_sender(); let sender = invocation.get_sender();
let pid = hints['sender-pid']; let pid = this._senderToPid[sender];
let source = this._getSource(appName, pid, ndata, sender, null); let source = this._getSource(appName, pid, ndata, sender, null);
if (source) {
this._notifyForSource(source, ndata); this._notifyForSource(source, ndata);
return invocation.return_value(GLib.Variant.new('(u)', [id]));
}
if (replacesId) {
// There's already a pending call to GetConnectionUnixProcessID,
// which will see the new notification data when it finishes,
// so we don't have to do anything.
return invocation.return_value(GLib.Variant.new('(u)', [id]));
}
this._busProxy.GetConnectionUnixProcessIDRemote(sender, (result, excp) => {
// The app may have updated or removed the notification
ndata = this._notifications[id];
if (!ndata)
return;
if (excp) {
logError(excp, 'Call to GetConnectionUnixProcessID failed');
return;
}
[pid] = result;
source = this._getSource(appName, pid, ndata, sender, null);
this._senderToPid[sender] = pid;
source.connect('destroy', () => {
delete this._senderToPid[sender];
});
this._notifyForSource(source, ndata);
});
return invocation.return_value(GLib.Variant.new('(u)', [id])); return invocation.return_value(GLib.Variant.new('(u)', [id]));
} }
@ -373,11 +417,12 @@ var FdoNotificationDaemonSource = GObject.registerClass(
class FdoNotificationDaemonSource extends MessageTray.Source { class FdoNotificationDaemonSource extends MessageTray.Source {
_init(title, pid, sender, appId) { _init(title, pid, sender, appId) {
this.pid = pid; this.pid = pid;
this.initialTitle = title;
this.app = this._getApp(appId); this.app = this._getApp(appId);
super._init(title); super._init(title);
this.initialTitle = title;
if (this.app) if (this.app)
this.title = this.app.get_name(); this.title = this.app.get_name();
else else
@ -425,22 +470,21 @@ class FdoNotificationDaemonSource extends MessageTray.Source {
} }
_getApp(appId) { _getApp(appId) {
const appSys = Shell.AppSystem.get_default();
let app; let app;
app = Shell.WindowTracker.get_default().get_app_from_pid(this.pid); app = Shell.WindowTracker.get_default().get_app_from_pid(this.pid);
if (app != null) if (app != null)
return app; return app;
if (appId) if (appId) {
app = appSys.lookup_app('%s.desktop'.format(appId)); app = Shell.AppSystem.get_default().lookup_app('%s.desktop'.format(appId));
if (app != null)
if (!app)
app = appSys.lookup_app('%s.desktop'.format(this.initialTitle));
return app; return app;
} }
return null;
}
setTitle(title) { setTitle(title) {
// Do nothing if .app is set, we don't want to override the // Do nothing if .app is set, we don't want to override the
// app name with whatever is provided through libnotify (usually // app name with whatever is provided through libnotify (usually

View File

@ -400,7 +400,8 @@ var Overview = class {
_getDesktopClone() { _getDesktopClone() {
let windows = global.get_window_actors().filter( let windows = global.get_window_actors().filter(
w => w.meta_window.get_window_type() === Meta.WindowType.DESKTOP); w => w.meta_window.get_window_type() == Meta.WindowType.DESKTOP
);
if (windows.length == 0) if (windows.length == 0)
return null; return null;

View File

@ -51,7 +51,7 @@ var SlideLayout = GObject.registerClass({
return [minWidth, natWidth]; return [minWidth, natWidth];
} }
vfunc_allocate(container, box) { vfunc_allocate(container, box, flags) {
let child = container.get_first_child(); let child = container.get_first_child();
let availWidth = Math.round(box.x2 - box.x1); let availWidth = Math.round(box.x2 - box.x1);
@ -72,7 +72,7 @@ var SlideLayout = GObject.registerClass({
actorBox.y1 = box.y1; actorBox.y1 = box.y1;
actorBox.y2 = actorBox.y1 + availHeight; actorBox.y2 = actorBox.y1 + availHeight;
child.allocate(actorBox); child.allocate(actorBox, flags);
} }
// eslint-disable-next-line camelcase // eslint-disable-next-line camelcase
@ -394,10 +394,10 @@ class DashSpacer extends St.Widget {
}); });
var ControlsLayout = GObject.registerClass({ var ControlsLayout = GObject.registerClass({
Signals: { 'allocation-changed': {} }, Signals: { 'allocation-changed': { flags: GObject.SignalFlags.RUN_LAST } },
}, class ControlsLayout extends Clutter.BinLayout { }, class ControlsLayout extends Clutter.BinLayout {
vfunc_allocate(container, box) { vfunc_allocate(container, box, flags) {
super.vfunc_allocate(container, box); super.vfunc_allocate(container, box, flags);
this.emit('allocation-changed'); this.emit('allocation-changed');
} }
}); });
@ -473,7 +473,6 @@ class ControlsManager extends St.Widget {
// A workspace might have been inserted or removed before the active // A workspace might have been inserted or removed before the active
// one, causing the adjustment to go out of sync, so update the value // one, causing the adjustment to go out of sync, so update the value
this._workspaceAdjustment.remove_transition('value');
this._workspaceAdjustment.value = activeIndex; this._workspaceAdjustment.value = activeIndex;
} }

View File

@ -2,7 +2,7 @@
/* exported PadOsd, PadOsdService */ /* exported PadOsd, PadOsdService */
const { Atk, Clutter, GDesktopEnums, Gio, const { Atk, Clutter, GDesktopEnums, Gio,
GLib, GObject, Gtk, Meta, Pango, Rsvg, St } = imports.gi; GLib, GObject, Gtk, Meta, Rsvg, St } = imports.gi;
const Signals = imports.signals; const Signals = imports.signals;
const Main = imports.ui.main; const Main = imports.ui.main;
@ -329,7 +329,6 @@ var PadDiagram = GObject.registerClass({
this._imagePath = imagePath; this._imagePath = imagePath;
this._handle = this._composeStyledDiagram(); this._handle = this._composeStyledDiagram();
this._initLabels();
} }
// eslint-disable-next-line camelcase // eslint-disable-next-line camelcase
@ -344,26 +343,6 @@ var PadDiagram = GObject.registerClass({
this.add_actor(actor); this.add_actor(actor);
} }
_initLabels() {
let i = 0;
for (i = 0; ; i++) {
if (!this._addLabel(Meta.PadActionType.BUTTON, i))
break;
}
for (i = 0; ; i++) {
if (!this._addLabel(Meta.PadActionType.RING, i, CW) ||
!this._addLabel(Meta.PadActionType.RING, i, CCW))
break;
}
for (i = 0; ; i++) {
if (!this._addLabel(Meta.PadActionType.STRIP, i, UP) ||
!this._addLabel(Meta.PadActionType.STRIP, i, DOWN))
break;
}
}
_wrappingSvgHeader() { _wrappingSvgHeader() {
return '<?xml version="1.0" encoding="UTF-8" standalone="no"?>' + return '<?xml version="1.0" encoding="UTF-8" standalone="no"?>' +
'<svg version="1.1" xmlns="http://www.w3.org/2000/svg" ' + '<svg version="1.1" xmlns="http://www.w3.org/2000/svg" ' +
@ -383,8 +362,10 @@ var PadDiagram = GObject.registerClass({
for (let i = 0; i < this._activeButtons.length; i++) { for (let i = 0; i < this._activeButtons.length; i++) {
let ch = String.fromCharCode('A'.charCodeAt() + this._activeButtons[i]); let ch = String.fromCharCode('A'.charCodeAt() + this._activeButtons[i]);
css += '.%s.Leader { stroke: %s !important; }'.format(ch, ACTIVE_COLOR); css += '.%s {'.format(ch);
css += '.%s.Button { stroke: %s !important; fill: %s !important; }'.format(ch, ACTIVE_COLOR, ACTIVE_COLOR); css += ' stroke: %s !important;'.format(ACTIVE_COLOR);
css += ' fill: %s !important;'.format(ACTIVE_COLOR);
css += '}';
} }
return css; return css;
@ -409,6 +390,9 @@ var PadDiagram = GObject.registerClass({
} }
_updateDiagramScale() { _updateDiagramScale() {
if (this._handle == null)
return;
[this._actorWidth, this._actorHeight] = this.get_size(); [this._actorWidth, this._actorHeight] = this.get_size();
let dimensions = this._handle.get_dimensions(); let dimensions = this._handle.get_dimensions();
let scaleX = this._actorWidth / dimensions.width; let scaleX = this._actorWidth / dimensions.width;
@ -421,11 +405,6 @@ var PadDiagram = GObject.registerClass({
let [, natWidth] = child.get_preferred_width(natHeight); let [, natWidth] = child.get_preferred_width(natHeight);
let childBox = new Clutter.ActorBox(); let childBox = new Clutter.ActorBox();
// I miss Cairo.Matrix
let dimensions = this._handle.get_dimensions();
x = x * this._scale + this._actorWidth / 2 - dimensions.width / 2 * this._scale;
y = y * this._scale + this._actorHeight / 2 - dimensions.height / 2 * this._scale;
if (direction == LTR) { if (direction == LTR) {
childBox.x1 = x; childBox.x1 = x;
childBox.x2 = x + natWidth; childBox.x2 = x + natWidth;
@ -436,23 +415,22 @@ var PadDiagram = GObject.registerClass({
childBox.y1 = y - natHeight / 2; childBox.y1 = y - natHeight / 2;
childBox.y2 = y + natHeight / 2; childBox.y2 = y + natHeight / 2;
child.allocate(childBox); child.allocate(childBox, 0);
} }
vfunc_allocate(box) { vfunc_allocate(box, flags) {
super.vfunc_allocate(box); super.vfunc_allocate(box, flags);
if (this._handle === null)
return;
this._updateDiagramScale(); this._updateDiagramScale();
for (let i = 0; i < this._labels.length; i++) { for (let i = 0; i < this._labels.length; i++) {
const { label, x, y, arrangement } = this._labels[i]; let [label, action, idx, dir] = this._labels[i];
let [found_, x, y, arrangement] = this.getLabelCoords(action, idx, dir);
this._allocateChild(label, x, y, arrangement); this._allocateChild(label, x, y, arrangement);
} }
if (this._editorActor && this._curEdited) { if (this._editorActor && this._curEdited) {
const { x, y, arrangement } = this._curEdited; let [label_, action, idx, dir] = this._curEdited;
let [found_, x, y, arrangement] = this.getLabelCoords(action, idx, dir);
this._allocateChild(this._editorActor, x, y, arrangement); this._allocateChild(this._editorActor, x, y, arrangement);
} }
} }
@ -479,6 +457,17 @@ var PadDiagram = GObject.registerClass({
cr.$dispose(); cr.$dispose();
} }
_transformPoint(x, y) {
if (this._handle == null || this._scale == null)
return [x, y];
// I miss Cairo.Matrix
let dimensions = this._handle.get_dimensions();
x = x * this._scale + this._actorWidth / 2 - dimensions.width / 2 * this._scale;
y = y * this._scale + this._actorHeight / 2 - dimensions.height / 2 * this._scale;
return [Math.round(x), Math.round(y)];
}
_getItemLabelCoords(labelName, leaderName) { _getItemLabelCoords(labelName, leaderName) {
if (this._handle == null) if (this._handle == null)
return [false]; return [false];
@ -506,39 +495,44 @@ var PadDiagram = GObject.registerClass({
pos.y = this._imageHeight - pos.y; pos.y = this._imageHeight - pos.y;
} }
return [true, pos.x, pos.y, direction]; let [x, y] = this._transformPoint(pos.x, pos.y);
return [true, x, y, direction];
} }
_getButtonLabels(button) { getButtonLabelCoords(button) {
let ch = String.fromCharCode('A'.charCodeAt() + button); let ch = String.fromCharCode('A'.charCodeAt() + button);
let labelName = 'Label%s'.format(ch); let labelName = 'Label%s'.format(ch);
let leaderName = 'Leader%s'.format(ch); let leaderName = 'Leader%s'.format(ch);
return [labelName, leaderName];
return this._getItemLabelCoords(labelName, leaderName);
} }
_getRingLabels(number, dir) { getRingLabelCoords(number, dir) {
let numStr = number > 0 ? (number + 1).toString() : ''; let numStr = number > 0 ? (number + 1).toString() : '';
let dirStr = dir == CW ? 'CW' : 'CCW'; let dirStr = dir == CW ? 'CW' : 'CCW';
let labelName = 'LabelRing%s%s'.format(numStr, dirStr); let labelName = 'LabelRing%s%s'.format(numStr, dirStr);
let leaderName = 'LeaderRing%s%s'.format(numStr, dirStr); let leaderName = 'LeaderRing%s%s'.format(numStr, dirStr);
return [labelName, leaderName];
return this._getItemLabelCoords(labelName, leaderName);
} }
_getStripLabels(number, dir) { getStripLabelCoords(number, dir) {
let numStr = number > 0 ? (number + 1).toString() : ''; let numStr = number > 0 ? (number + 1).toString() : '';
let dirStr = dir == UP ? 'Up' : 'Down'; let dirStr = dir == UP ? 'Up' : 'Down';
let labelName = 'LabelStrip%s%s'.format(numStr, dirStr); let labelName = 'LabelStrip%s%s'.format(numStr, dirStr);
let leaderName = 'LeaderStrip%s%s'.format(numStr, dirStr); let leaderName = 'LeaderStrip%s%s'.format(numStr, dirStr);
return [labelName, leaderName];
return this._getItemLabelCoords(labelName, leaderName);
} }
_getLabelCoords(action, idx, dir) { getLabelCoords(action, idx, dir) {
if (action == Meta.PadActionType.BUTTON) if (action == Meta.PadActionType.BUTTON)
return this._getItemLabelCoords(...this._getButtonLabels(idx)); return this.getButtonLabelCoords(idx);
else if (action == Meta.PadActionType.RING) else if (action == Meta.PadActionType.RING)
return this._getItemLabelCoords(...this._getRingLabels(idx, dir)); return this.getRingLabelCoords(idx, dir);
else if (action == Meta.PadActionType.STRIP) else if (action == Meta.PadActionType.STRIP)
return this._getItemLabelCoords(...this._getStripLabels(idx, dir)); return this.getStripLabelCoords(idx, dir);
return [false]; return [false];
} }
@ -563,30 +557,26 @@ var PadDiagram = GObject.registerClass({
this._invalidateSvg(); this._invalidateSvg();
} }
_addLabel(action, idx, dir) { addLabel(label, type, idx, dir) {
let [found, x, y, arrangement] = this._getLabelCoords(action, idx, dir); this._labels.push([label, type, idx, dir]);
if (!found)
return false;
let label = new St.Label();
this._labels.push({ label, action, idx, dir, x, y, arrangement });
this.add_actor(label); this.add_actor(label);
return true;
} }
updateLabels(getText) { updateLabels(getText) {
for (let i = 0; i < this._labels.length; i++) { for (let i = 0; i < this._labels.length; i++) {
const { label, action, idx, dir } = this._labels[i]; let [label, action, idx, dir] = this._labels[i];
let str = getText(action, idx, dir); let str = getText(action, idx, dir);
label.set_text(str); label.set_text(str);
} }
this.queue_relayout();
} }
_applyLabel(label, action, idx, dir, str) { _applyLabel(label, action, idx, dir, str) {
if (str !== null) if (str != null) {
label.set_text(str); label.set_text(str);
let [found_, x, y, arrangement] = this.getLabelCoords(action, idx, dir);
this._allocateChild(label, x, y, arrangement);
}
label.show(); label.show();
} }
@ -594,20 +584,18 @@ var PadDiagram = GObject.registerClass({
this._editorActor.hide(); this._editorActor.hide();
if (this._prevEdited) { if (this._prevEdited) {
const { label, action, idx, dir } = this._prevEdited; let [label, action, idx, dir] = this._prevEdited;
this._applyLabel(label, action, idx, dir, str); this._applyLabel(label, action, idx, dir, str);
this._prevEdited = null; this._prevEdited = null;
} }
if (this._curEdited) { if (this._curEdited) {
const { label, action, idx, dir } = this._curEdited; let [label, action, idx, dir] = this._curEdited;
this._applyLabel(label, action, idx, dir, str); this._applyLabel(label, action, idx, dir, str);
if (continues) if (continues)
this._prevEdited = this._curEdited; this._prevEdited = this._curEdited;
this._curEdited = null; this._curEdited = null;
} }
this.queue_relayout();
} }
startEdition(action, idx, dir) { startEdition(action, idx, dir) {
@ -617,19 +605,21 @@ var PadDiagram = GObject.registerClass({
return; return;
for (let i = 0; i < this._labels.length; i++) { for (let i = 0; i < this._labels.length; i++) {
if (action == this._labels[i].action && let [label, itemAction, itemIdx, itemDir] = this._labels[i];
idx == this._labels[i].idx && dir == this._labels[i].dir) { if (action == itemAction && idx == itemIdx && dir == itemDir) {
this._curEdited = this._labels[i]; this._curEdited = this._labels[i];
editedLabel = this._curEdited.label; editedLabel = label;
break; break;
} }
} }
if (this._curEdited == null) if (this._curEdited == null)
return; return;
let [found] = this.getLabelCoords(action, idx, dir);
if (!found)
return;
this._editorActor.show(); this._editorActor.show();
editedLabel.hide(); editedLabel.hide();
this.queue_relayout();
} }
}); });
@ -703,7 +693,6 @@ var PadOsd = GObject.registerClass({
this._titleLabel = new St.Label({ style: 'font-side: larger; font-weight: bold;', this._titleLabel = new St.Label({ style: 'font-side: larger; font-weight: bold;',
x_align: Clutter.ActorAlign.CENTER }); x_align: Clutter.ActorAlign.CENTER });
this._titleLabel.clutter_text.set_ellipsize(Pango.EllipsizeMode.NONE);
this._titleLabel.clutter_text.set_text(padDevice.get_device_name()); this._titleLabel.clutter_text.set_text(padDevice.get_device_name());
labelBox.add_actor(this._titleLabel); labelBox.add_actor(this._titleLabel);
@ -721,7 +710,31 @@ var PadOsd = GObject.registerClass({
x_expand: true, x_expand: true,
y_expand: true }); y_expand: true });
this.add_actor(this._padDiagram); this.add_actor(this._padDiagram);
this._updateActionLabels();
// FIXME: Fix num buttons.
let i = 0;
for (i = 0; i < 50; i++) {
let [found] = this._padDiagram.getButtonLabelCoords(i);
if (!found)
break;
this._createLabel(Meta.PadActionType.BUTTON, i);
}
for (i = 0; i < padDevice.get_n_rings(); i++) {
let [found] = this._padDiagram.getRingLabelCoords(i, CW);
if (!found)
break;
this._createLabel(Meta.PadActionType.RING, i, CW);
this._createLabel(Meta.PadActionType.RING, i, CCW);
}
for (i = 0; i < padDevice.get_n_strips(); i++) {
let [found] = this._padDiagram.getStripLabelCoords(i, UP);
if (!found)
break;
this._createLabel(Meta.PadActionType.STRIP, i, UP);
this._createLabel(Meta.PadActionType.STRIP, i, DOWN);
}
let buttonBox = new St.Widget({ layout_manager: new Clutter.BinLayout(), let buttonBox = new St.Widget({ layout_manager: new Clutter.BinLayout(),
x_expand: true, x_expand: true,
@ -774,6 +787,11 @@ var PadOsd = GObject.registerClass({
return str ? str : _("None"); return str ? str : _("None");
} }
_createLabel(type, number, dir) {
let label = new St.Label({ text: this._getActionText(type, number) });
this._padDiagram.addLabel(label, type, number, dir);
}
_updateActionLabels() { _updateActionLabels() {
this._padDiagram.updateLabels(this._getActionText.bind(this)); this._padDiagram.updateLabels(this._getActionText.bind(this));
} }
@ -849,7 +867,8 @@ var PadOsd = GObject.registerClass({
this._tipLabel.set_text(_("Press any key to exit")); this._tipLabel.set_text(_("Press any key to exit"));
} }
this._titleLabel.set_text(title); this._titleLabel.clutter_text.set_markup(
'<span size="larger"><b>%s</b></span>'.format(title));
} }
_isEditedAction(type, number, dir) { _isEditedAction(type, number, dir) {

View File

@ -214,10 +214,7 @@ var AppMenuButton = GObject.registerClass({
this._onIconThemeChanged.bind(this)); this._onIconThemeChanged.bind(this));
let iconEffect = new Clutter.DesaturateEffect(); let iconEffect = new Clutter.DesaturateEffect();
this._iconBox = new St.Bin({ this._iconBox = new St.Bin({ style_class: 'app-menu-icon' });
style_class: 'app-menu-icon',
y_align: Clutter.ActorAlign.CENTER,
});
this._iconBox.add_effect(iconEffect); this._iconBox.add_effect(iconEffect);
this._container.add_actor(this._iconBox); this._container.add_actor(this._iconBox);
@ -284,7 +281,7 @@ var AppMenuButton = GObject.registerClass({
this.remove_all_transitions(); this.remove_all_transitions();
this.ease({ this.ease({
opacity: 0, opacity: 0,
mode: Clutter.AnimationMode.EASE_OUT_QUAD, mode: Clutter.Animation.EASE_OUT_QUAD,
duration: Overview.ANIMATION_TIME, duration: Overview.ANIMATION_TIME,
onComplete: () => this.hide(), onComplete: () => this.hide(),
}); });
@ -842,8 +839,8 @@ class Panel extends St.Widget {
return [0, 0]; return [0, 0];
} }
vfunc_allocate(box) { vfunc_allocate(box, flags) {
this.set_allocation(box); this.set_allocation(box, flags);
let allocWidth = box.x2 - box.x1; let allocWidth = box.x2 - box.x1;
let allocHeight = box.y2 - box.y1; let allocHeight = box.y2 - box.y1;
@ -879,13 +876,13 @@ class Panel extends St.Widget {
childBox.x2 = Math.min(Math.floor(sideWidth), childBox.x2 = Math.min(Math.floor(sideWidth),
leftNaturalWidth); leftNaturalWidth);
} }
this._leftBox.allocate(childBox); this._leftBox.allocate(childBox, flags);
childBox.x1 = Math.ceil(sideWidth); childBox.x1 = Math.ceil(sideWidth);
childBox.y1 = 0; childBox.y1 = 0;
childBox.x2 = childBox.x1 + centerWidth; childBox.x2 = childBox.x1 + centerWidth;
childBox.y2 = allocHeight; childBox.y2 = allocHeight;
this._centerBox.allocate(childBox); this._centerBox.allocate(childBox, flags);
childBox.y1 = 0; childBox.y1 = 0;
childBox.y2 = allocHeight; childBox.y2 = allocHeight;
@ -899,7 +896,7 @@ class Panel extends St.Widget {
0); 0);
childBox.x2 = allocWidth; childBox.x2 = allocWidth;
} }
this._rightBox.allocate(childBox); this._rightBox.allocate(childBox, flags);
let cornerWidth, cornerHeight; let cornerWidth, cornerHeight;
@ -909,7 +906,7 @@ class Panel extends St.Widget {
childBox.x2 = cornerWidth; childBox.x2 = cornerWidth;
childBox.y1 = allocHeight; childBox.y1 = allocHeight;
childBox.y2 = allocHeight + cornerHeight; childBox.y2 = allocHeight + cornerHeight;
this._leftCorner.allocate(childBox); this._leftCorner.allocate(childBox, flags);
[, cornerWidth] = this._rightCorner.get_preferred_width(-1); [, cornerWidth] = this._rightCorner.get_preferred_width(-1);
[, cornerHeight] = this._rightCorner.get_preferred_height(-1); [, cornerHeight] = this._rightCorner.get_preferred_height(-1);
@ -917,7 +914,7 @@ class Panel extends St.Widget {
childBox.x2 = allocWidth; childBox.x2 = allocWidth;
childBox.y1 = allocHeight; childBox.y1 = allocHeight;
childBox.y2 = allocHeight + cornerHeight; childBox.y2 = allocHeight + cornerHeight;
this._rightCorner.allocate(childBox); this._rightCorner.allocate(childBox, flags);
} }
_tryDragWindow(event) { _tryDragWindow(event) {
@ -1156,9 +1153,10 @@ class Panel extends St.Widget {
_getDraggableWindowForPosition(stageX) { _getDraggableWindowForPosition(stageX) {
let workspaceManager = global.workspace_manager; let workspaceManager = global.workspace_manager;
const windows = workspaceManager.get_active_workspace().list_windows(); let workspace = workspaceManager.get_active_workspace();
const allWindowsByStacking = let allWindowsByStacking = global.display.sort_windows_by_stacking(
global.display.sort_windows_by_stacking(windows).reverse(); workspace.list_windows()
).reverse();
return allWindowsByStacking.find(metaWindow => { return allWindowsByStacking.find(metaWindow => {
let rect = metaWindow.get_frame_rect(); let rect = metaWindow.get_frame_rect();

View File

@ -59,8 +59,8 @@ class ButtonBox extends St.Widget {
return [0, 0]; return [0, 0];
} }
vfunc_allocate(box) { vfunc_allocate(box, flags) {
this.set_allocation(box); this.set_allocation(box, flags);
let child = this.get_first_child(); let child = this.get_first_child();
if (!child) if (!child)
@ -83,7 +83,7 @@ class ButtonBox extends St.Widget {
childBox.y1 = 0; childBox.y1 = 0;
childBox.y2 = availHeight; childBox.y2 = availHeight;
child.allocate(childBox); child.allocate(childBox, flags);
} }
_onDestroy() { _onDestroy() {

View File

@ -198,7 +198,7 @@ var ScreenShield = class {
let lockEnabled = this._settings.get_boolean(LOCK_ENABLED_KEY); let lockEnabled = this._settings.get_boolean(LOCK_ENABLED_KEY);
let lockLocked = this._lockSettings.get_boolean(DISABLE_LOCK_KEY); let lockLocked = this._lockSettings.get_boolean(DISABLE_LOCK_KEY);
let inhibit = this._loginSession && this._loginSession.Active && let inhibit = this._loginSession && this._loginSession.Active &&
!this._isActive && lockEnabled && !lockLocked && Main.sessionMode.unlockDialog; !this._isActive && lockEnabled && !lockLocked;
if (inhibit) { if (inhibit) {
this._loginManager.inhibit(_("GNOME needs to lock the screen"), this._loginManager.inhibit(_("GNOME needs to lock the screen"),
inhibitor => { inhibitor => {
@ -345,7 +345,7 @@ var ScreenShield = class {
this._lockDialogGroup.remove_all_transitions(); this._lockDialogGroup.remove_all_transitions();
if (animate) { if (animate) {
// Animate the lock screen out of screen // Tween the lock screen out of screen
// if velocity is not specified (i.e. we come here from pressing ESC), // if velocity is not specified (i.e. we come here from pressing ESC),
// use the same speed regardless of original position // use the same speed regardless of original position
// if velocity is specified, it's in pixels per milliseconds // if velocity is specified, it's in pixels per milliseconds
@ -561,8 +561,7 @@ var ScreenShield = class {
if (this._activationTime == 0) if (this._activationTime == 0)
this._activationTime = GLib.get_monotonic_time(); this._activationTime = GLib.get_monotonic_time();
if (!this._ensureUnlockDialog(true)) this._ensureUnlockDialog(true);
return;
this.actor.show(); this.actor.show();

View File

@ -1,7 +1,7 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
/* exported ScreenshotService */ /* exported ScreenshotService */
const { Clutter, Gio, GObject, GLib, Meta, Shell, St } = imports.gi; const { Clutter, Graphene, Gio, GObject, GLib, Meta, Shell, St } = imports.gi;
const GrabHelper = imports.ui.grabHelper; const GrabHelper = imports.ui.grabHelper;
const Lightbox = imports.ui.lightbox; const Lightbox = imports.ui.lightbox;
@ -37,9 +37,7 @@ var ScreenshotService = class {
let sender = invocation.get_sender(); let sender = invocation.get_sender();
if (this._screenShooter.has(sender) || lockedDown) { if (this._screenShooter.has(sender) || lockedDown) {
invocation.return_error_literal( invocation.return_value(GLib.Variant.new('(bs)', [false, '']));
Gio.IOErrorEnum, Gio.IOErrorEnum.BUSY,
'There is an ongoing operation for this sender');
return null; return null;
} }
@ -261,13 +259,15 @@ var ScreenshotService = class {
} }
async PickColorAsync(params, invocation) { async PickColorAsync(params, invocation) {
const screenshot = this._createScreenshot(invocation, false); let pickPixel = new PickPixel();
try {
const coords = await pickPixel.pickAsync();
let screenshot = this._createScreenshot(invocation, false);
if (!screenshot) if (!screenshot)
return; return;
const pickPixel = new PickPixel(screenshot); const [color] = await screenshot.pick_color(coords.x, coords.y);
try {
const color = await pickPixel.pickAsync();
const { red, green, blue } = color; const { red, green, blue } = color;
const retval = GLib.Variant.new('(a{sv})', [{ const retval = GLib.Variant.new('(a{sv})', [{
color: GLib.Variant.new('(ddd)', [ color: GLib.Variant.new('(ddd)', [
@ -276,13 +276,12 @@ var ScreenshotService = class {
blue / 255.0, blue / 255.0,
]), ]),
}]); }]);
this._removeShooterForSender(invocation.get_sender());
invocation.return_value(retval); invocation.return_value(retval);
} catch (e) { } catch (e) {
invocation.return_error_literal( invocation.return_error_literal(
Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED, Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED,
'Operation was cancelled'); 'Operation was cancelled');
} finally {
this._removeShooterForSender(invocation.get_sender());
} }
} }
}; };
@ -380,145 +379,12 @@ class SelectArea extends St.Widget {
} }
}); });
var RecolorEffect = GObject.registerClass({
Properties: {
color: GObject.ParamSpec.boxed(
'color', 'color', 'replacement color',
GObject.ParamFlags.WRITABLE,
Clutter.Color.$gtype),
chroma: GObject.ParamSpec.boxed(
'chroma', 'chroma', 'color to replace',
GObject.ParamFlags.WRITABLE,
Clutter.Color.$gtype),
threshold: GObject.ParamSpec.float(
'threshold', 'threshold', 'threshold',
GObject.ParamFlags.WRITABLE,
0.0, 1.0, 0.0),
smoothing: GObject.ParamSpec.float(
'smoothing', 'smoothing', 'smoothing',
GObject.ParamFlags.WRITABLE,
0.0, 1.0, 0.0),
},
}, class RecolorEffect extends Shell.GLSLEffect {
_init(params) {
this._color = new Clutter.Color();
this._chroma = new Clutter.Color();
this._threshold = 0;
this._smoothing = 0;
this._colorLocation = null;
this._chromaLocation = null;
this._thresholdLocation = null;
this._smoothingLocation = null;
super._init(params);
this._colorLocation = this.get_uniform_location('recolor_color');
this._chromaLocation = this.get_uniform_location('chroma_color');
this._thresholdLocation = this.get_uniform_location('threshold');
this._smoothingLocation = this.get_uniform_location('smoothing');
this._updateColorUniform(this._colorLocation, this._color);
this._updateColorUniform(this._chromaLocation, this._chroma);
this._updateFloatUniform(this._thresholdLocation, this._threshold);
this._updateFloatUniform(this._smoothingLocation, this._smoothing);
}
_updateColorUniform(location, color) {
if (!location)
return;
this.set_uniform_float(location,
3, [color.red / 255, color.green / 255, color.blue / 255]);
this.queue_repaint();
}
_updateFloatUniform(location, value) {
if (!location)
return;
this.set_uniform_float(location, 1, [value]);
this.queue_repaint();
}
set color(c) {
if (this._color.equal(c))
return;
this._color = c;
this.notify('color');
this._updateColorUniform(this._colorLocation, this._color);
}
set chroma(c) {
if (this._chroma.equal(c))
return;
this._chroma = c;
this.notify('chroma');
this._updateColorUniform(this._chromaLocation, this._chroma);
}
set threshold(value) {
if (this._threshold === value)
return;
this._threshold = value;
this.notify('threshold');
this._updateFloatUniform(this._thresholdLocation, this._threshold);
}
set smoothing(value) {
if (this._smoothing === value)
return;
this._smoothing = value;
this.notify('smoothing');
this._updateFloatUniform(this._smoothingLocation, this._smoothing);
}
vfunc_build_pipeline() {
// Conversion parameters from https://en.wikipedia.org/wiki/YCbCr
const decl = `
vec3 rgb2yCrCb(vec3 c) { \n
float y = 0.299 * c.r + 0.587 * c.g + 0.114 * c.b; \n
float cr = 0.7133 * (c.r - y); \n
float cb = 0.5643 * (c.b - y); \n
return vec3(y, cr, cb); \n
} \n
\n
uniform vec3 chroma_color; \n
uniform vec3 recolor_color; \n
uniform float threshold; \n
uniform float smoothing; \n`;
const src = `
vec3 mask = rgb2yCrCb(chroma_color.rgb); \n
vec3 yCrCb = rgb2yCrCb(cogl_color_out.rgb); \n
float blend = \n
smoothstep(threshold, \n
threshold + smoothing, \n
distance(yCrCb.gb, mask.gb)); \n
cogl_color_out.rgb = \n
mix(recolor_color, cogl_color_out.rgb, blend); \n`;
this.add_glsl_snippet(Shell.SnippetHook.FRAGMENT, decl, src, false);
}
});
var PickPixel = GObject.registerClass( var PickPixel = GObject.registerClass(
class PickPixel extends St.Widget { class PickPixel extends St.Widget {
_init(screenshot) { _init() {
super._init({ visible: false, reactive: true }); super._init({ visible: false, reactive: true });
this._screenshot = screenshot;
this._result = null; this._result = null;
this._color = null;
this._inPick = false;
Main.uiGroup.add_actor(this); Main.uiGroup.add_actor(this);
@ -527,44 +393,16 @@ class PickPixel extends St.Widget {
let constraint = new Clutter.BindConstraint({ source: global.stage, let constraint = new Clutter.BindConstraint({ source: global.stage,
coordinate: Clutter.BindCoordinate.ALL }); coordinate: Clutter.BindCoordinate.ALL });
this.add_constraint(constraint); this.add_constraint(constraint);
const action = new Clutter.ClickAction();
action.connect('clicked', async () => {
await this._pickColor(...action.get_coords());
this._result = this._color;
this._grabHelper.ungrab();
});
this.add_action(action);
this._recolorEffect = new RecolorEffect({
chroma: new Clutter.Color({
red: 80,
green: 219,
blue: 181,
}),
threshold: 0.04,
smoothing: 0.07,
});
this._previewCursor = new St.Icon({
icon_name: 'color-pick',
icon_size: Meta.prefs_get_cursor_size(),
effect: this._recolorEffect,
visible: false,
});
Main.uiGroup.add_actor(this._previewCursor);
} }
async pickAsync() { async pickAsync() {
global.display.set_cursor(Meta.Cursor.BLANK); global.display.set_cursor(Meta.Cursor.CROSSHAIR);
Main.uiGroup.set_child_above_sibling(this, null); Main.uiGroup.set_child_above_sibling(this, null);
this.show(); this.show();
this._pickColor(...global.get_pointer());
await this._grabHelper.grabAsync({ actor: this }); await this._grabHelper.grabAsync({ actor: this });
global.display.set_cursor(Meta.Cursor.DEFAULT); global.display.set_cursor(Meta.Cursor.DEFAULT);
this._previewCursor.destroy();
GLib.idle_add(GLib.PRIORITY_DEFAULT, () => { GLib.idle_add(GLib.PRIORITY_DEFAULT, () => {
this.destroy(); this.destroy();
@ -574,25 +412,10 @@ class PickPixel extends St.Widget {
return this._result; return this._result;
} }
async _pickColor(x, y) { vfunc_button_release_event(buttonEvent) {
if (this._inPick) let { x, y } = buttonEvent;
return; this._result = new Graphene.Point({ x, y });
this._grabHelper.ungrab();
this._inPick = true;
this._previewCursor.set_position(x, y);
[this._color] = await this._screenshot.pick_color(x, y);
this._inPick = false;
if (!this._color)
return;
this._recolorEffect.color = this._color;
this._previewCursor.show();
}
vfunc_motion_event(motionEvent) {
const { x, y } = motionEvent;
this._pickColor(x, y);
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
} }
}); });

View File

@ -6,17 +6,17 @@ const { Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi;
const AppDisplay = imports.ui.appDisplay; const AppDisplay = imports.ui.appDisplay;
const IconGrid = imports.ui.iconGrid; const IconGrid = imports.ui.iconGrid;
const Main = imports.ui.main; const Main = imports.ui.main;
const ParentalControlsManager = imports.misc.parentalControlsManager;
const RemoteSearch = imports.ui.remoteSearch; const RemoteSearch = imports.ui.remoteSearch;
const Util = imports.misc.util; const Util = imports.misc.util;
const SEARCH_PROVIDERS_SCHEMA = 'org.gnome.desktop.search-providers'; const SEARCH_PROVIDERS_SCHEMA = 'org.gnome.desktop.search-providers';
var MAX_LIST_SEARCH_RESULTS_ROWS = 5; var MAX_LIST_SEARCH_RESULTS_ROWS = 5;
var MAX_GRID_SEARCH_RESULTS_ROWS = 1;
var MaxWidthBox = GObject.registerClass( var MaxWidthBox = GObject.registerClass(
class MaxWidthBox extends St.BoxLayout { class MaxWidthBox extends St.BoxLayout {
vfunc_allocate(box) { vfunc_allocate(box, flags) {
let themeNode = this.get_theme_node(); let themeNode = this.get_theme_node();
let maxWidth = themeNode.get_max_width(); let maxWidth = themeNode.get_max_width();
let availWidth = box.x2 - box.x1; let availWidth = box.x2 - box.x1;
@ -28,7 +28,7 @@ class MaxWidthBox extends St.BoxLayout {
adjustedBox.x2 -= Math.floor(excessWidth / 2); adjustedBox.x2 -= Math.floor(excessWidth / 2);
} }
super.vfunc_allocate(adjustedBox); super.vfunc_allocate(adjustedBox, flags);
} }
}); });
@ -219,7 +219,8 @@ var SearchResultsBase = GObject.registerClass({
_ensureResultActors(results, callback) { _ensureResultActors(results, callback) {
let metasNeeded = results.filter( let metasNeeded = results.filter(
resultId => this._resultDisplays[resultId] === undefined); resultId => this._resultDisplays[resultId] === undefined
);
if (metasNeeded.length === 0) { if (metasNeeded.length === 0) {
callback(true); callback(true);
@ -348,140 +349,18 @@ class ListSearchResults extends SearchResultsBase {
} }
}); });
var GridSearchResultsLayout = GObject.registerClass({
Properties: {
'spacing': GObject.ParamSpec.int('spacing', 'Spacing', 'Spacing',
GObject.ParamFlags.READWRITE, 0, GLib.MAXINT32, 0),
},
}, class GridSearchResultsLayout extends Clutter.LayoutManager {
_init() {
super._init();
this._spacing = 0;
}
vfunc_set_container(container) {
this._container = container;
}
vfunc_get_preferred_width(container, forHeight) {
let minWidth = 0;
let natWidth = 0;
let first = true;
for (let child of container) {
if (!child.visible)
continue;
const [childMinWidth, childNatWidth] = child.get_preferred_width(forHeight);
minWidth = Math.max(minWidth, childMinWidth);
natWidth += childNatWidth;
if (first)
first = false;
else
natWidth += this._spacing;
}
return [minWidth, natWidth];
}
vfunc_get_preferred_height(container, forWidth) {
let minHeight = 0;
let natHeight = 0;
for (let child of container) {
if (!child.visible)
continue;
const [childMinHeight, childNatHeight] = child.get_preferred_height(forWidth);
minHeight = Math.max(minHeight, childMinHeight);
natHeight = Math.max(natHeight, childNatHeight);
}
return [minHeight, natHeight];
}
vfunc_allocate(container, box) {
const width = box.get_width();
const childBox = new Clutter.ActorBox();
childBox.x1 = 0;
childBox.y1 = 0;
let first = true;
for (let child of container) {
if (!child.visible)
continue;
if (first)
first = false;
else
childBox.x1 += this._spacing;
const [childWidth] = child.get_preferred_width(-1);
const [childHeight] = child.get_preferred_height(-1);
childBox.set_size(childWidth, childHeight);
if (childBox.x1 + childWidth > width)
return;
child.allocate(childBox);
childBox.x1 += childWidth;
}
}
columnsForWidth(width) {
if (!this._container)
return -1;
const [minWidth] = this.get_preferred_width(this._container, -1);
if (minWidth === 0)
return -1;
let nCols = 0;
while (width > minWidth) {
width -= minWidth;
if (nCols > 0)
width -= this._spacing;
nCols++;
}
return nCols;
}
get spacing() {
return this._spacing;
}
set spacing(v) {
if (this._spacing === v)
return;
this._spacing = v;
this.layout_changed();
}
});
var GridSearchResults = GObject.registerClass( var GridSearchResults = GObject.registerClass(
class GridSearchResults extends SearchResultsBase { class GridSearchResults extends SearchResultsBase {
_init(provider, resultsView) { _init(provider, resultsView) {
super._init(provider, resultsView); super._init(provider, resultsView);
this._grid = new St.Widget({ style_class: 'grid-search-results' }); this._grid = new IconGrid.IconGrid({ rowLimit: MAX_GRID_SEARCH_RESULTS_ROWS,
this._grid.layout_manager = new GridSearchResultsLayout(); xAlign: St.Align.START });
this._grid.connect('style-changed', () => { this._bin = new St.Bin({ x_align: Clutter.ActorAlign.CENTER });
const node = this._grid.get_theme_node(); this._bin.set_child(this._grid);
this._grid.layout_manager.spacing = node.get_length('spacing');
});
this._resultDisplayBin.set_child(new St.Bin({ this._resultDisplayBin.set_child(this._bin);
child: this._grid,
x_align: Clutter.ActorAlign.CENTER,
}));
} }
_onDestroy() { _onDestroy() {
@ -521,11 +400,12 @@ class GridSearchResults extends SearchResultsBase {
if (width == 0) if (width == 0)
return -1; return -1;
return this._grid.layout_manager.columnsForWidth(width); let nCols = this._grid.columnsForWidth(width);
return nCols * this._grid.getRowLimit();
} }
_clearResultDisplay() { _clearResultDisplay() {
this._grid.remove_all_children(); this._grid.removeAll();
} }
_createResultDisplay(meta) { _createResultDisplay(meta) {
@ -534,14 +414,13 @@ class GridSearchResults extends SearchResultsBase {
} }
_addItem(display) { _addItem(display) {
this._grid.add_child(display); this._grid.addItem(display);
} }
getFirstResult() { getFirstResult() {
for (let child of this._grid) { if (this._grid.visibleItemsCount() > 0)
if (child.visible) return this._grid.getItemAtIndex(0);
return child; else
}
return null; return null;
} }
}); });
@ -552,9 +431,6 @@ var SearchResultsView = GObject.registerClass({
_init() { _init() {
super._init({ name: 'searchResults', vertical: true }); super._init({ name: 'searchResults', vertical: true });
this._parentalControlsManager = ParentalControlsManager.getDefault();
this._parentalControlsManager.connect('app-filter-changed', this._reloadRemoteProviders.bind(this));
this._content = new MaxWidthBox({ this._content = new MaxWidthBox({
name: 'searchResultsContent', name: 'searchResultsContent',
vertical: true, vertical: true,
@ -629,11 +505,6 @@ var SearchResultsView = GObject.registerClass({
_registerProvider(provider) { _registerProvider(provider) {
provider.searchInProgress = false; provider.searchInProgress = false;
// Filter out unwanted providers.
if (provider.appInfo && !this._parentalControlsManager.shouldShowApp(provider.appInfo))
return;
this._providers.push(provider); this._providers.push(provider);
this._ensureProviderDisplay(provider); this._ensureProviderDisplay(provider);
} }

View File

@ -295,8 +295,8 @@ var ShellMountPasswordDialog = GObject.registerClass({
this._keyfilesLabel = new St.Label({ visible: false }); this._keyfilesLabel = new St.Label({ visible: false });
this._keyfilesLabel.clutter_text.set_markup( this._keyfilesLabel.clutter_text.set_markup(
/* Translators: %s is the Disks application */ /* Translators: %s is the Disks application */
_('To unlock a volume that uses keyfiles, use the <i>%s</i> utility instead.') _("To unlock a volume that uses keyfiles, use the <i>%s</i> utility instead.").format(disksApp.get_name())
.format(disksApp.get_name())); );
this._keyfilesLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE; this._keyfilesLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
this._keyfilesLabel.clutter_text.line_wrap = true; this._keyfilesLabel.clutter_text.line_wrap = true;
content.add_child(this._keyfilesLabel); content.add_child(this._keyfilesLabel);
@ -464,7 +464,8 @@ var ShellMountPasswordDialog = GObject.registerClass({
/* Translators: %s is the Disks application */ /* Translators: %s is the Disks application */
_("Unable to start %s").format(app.get_name()), _("Unable to start %s").format(app.get_name()),
/* Translators: %s is the Disks application */ /* Translators: %s is the Disks application */
_('Couldnt find the %s application').format(app.get_name())); _("Couldnt find the %s application").format(app.get_name())
);
} }
this._onCancelButton(); this._onCancelButton();
} }

View File

@ -1,7 +1,7 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
/* exported Indicator */ /* exported Indicator */
const { Gio, GLib, GnomeBluetooth, GObject } = imports.gi; const { Gio, GnomeBluetooth, GObject } = imports.gi;
const Main = imports.ui.main; const Main = imports.ui.main;
const PanelMenu = imports.ui.panelMenu; const PanelMenu = imports.ui.panelMenu;
@ -35,7 +35,7 @@ class Indicator extends PanelMenu.SystemIndicator {
this._sync(); this._sync();
}); });
this._proxy.connect('g-properties-changed', this._queueSync.bind(this)); this._proxy.connect('g-properties-changed', this._sync.bind(this));
this._item = new PopupMenu.PopupSubMenuMenuItem(_("Bluetooth"), true); this._item = new PopupMenu.PopupSubMenuMenuItem(_("Bluetooth"), true);
this._item.icon.icon_name = 'bluetooth-active-symbolic'; this._item.icon.icon_name = 'bluetooth-active-symbolic';
@ -49,27 +49,15 @@ class Indicator extends PanelMenu.SystemIndicator {
this._item.menu.addSettingsAction(_("Bluetooth Settings"), 'gnome-bluetooth-panel.desktop'); this._item.menu.addSettingsAction(_("Bluetooth Settings"), 'gnome-bluetooth-panel.desktop');
this.menu.addMenuItem(this._item); this.menu.addMenuItem(this._item);
this._syncId = 0;
this._adapter = null;
this._client = new GnomeBluetooth.Client(); this._client = new GnomeBluetooth.Client();
this._model = this._client.get_model(); this._model = this._client.get_model();
this._model.connect('row-deleted', this._queueSync.bind(this)); this._model.connect('row-changed', this._sync.bind(this));
this._model.connect('row-changed', this._queueSync.bind(this)); this._model.connect('row-deleted', this._sync.bind(this));
this._model.connect('row-inserted', this._sync.bind(this)); this._model.connect('row-inserted', this._sync.bind(this));
Main.sessionMode.connect('updated', this._sync.bind(this)); Main.sessionMode.connect('updated', this._sync.bind(this));
this._sync(); this._sync();
} }
_setHadSetupDevices(value) {
if (this._hadSetupDevices === value)
return;
this._hadSetupDevices = value;
global.settings.set_boolean(
HAD_BLUETOOTH_DEVICES_SETUP, this._hadSetupDevices);
}
_getDefaultAdapter() { _getDefaultAdapter() {
let [ret, iter] = this._model.get_iter_first(); let [ret, iter] = this._model.get_iter_first();
while (ret) { while (ret) {
@ -108,17 +96,12 @@ class Indicator extends PanelMenu.SystemIndicator {
ret = this._model.iter_next(iter); ret = this._model.iter_next(iter);
} }
return deviceInfos; if (this._hadSetupDevices !== (deviceInfos.length > 0)) {
this._hadSetupDevices = !this._hadSetupDevices;
global.settings.set_boolean(HAD_BLUETOOTH_DEVICES_SETUP, this._hadSetupDevices);
} }
_queueSync() { return deviceInfos;
if (this._syncId)
return;
this._syncId = GLib.idle_add(GLib.PRIORITY_DEFAULT, () => {
this._syncId = 0;
this._sync();
return GLib.SOURCE_REMOVE;
});
} }
_sync() { _sync() {
@ -126,10 +109,7 @@ class Indicator extends PanelMenu.SystemIndicator {
let devices = this._getDeviceInfos(adapter); let devices = this._getDeviceInfos(adapter);
const connectedDevices = devices.filter(dev => dev.connected); const connectedDevices = devices.filter(dev => dev.connected);
const nConnectedDevices = connectedDevices.length; const nConnectedDevices = connectedDevices.length;
const nDevices = devices.length;
if (adapter && this._adapter)
this._setHadSetupDevices(devices.length > 0);
this._adapter = adapter;
let sensitive = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter; let sensitive = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter;
@ -138,7 +118,7 @@ class Indicator extends PanelMenu.SystemIndicator {
// Remember if there were setup devices and show the menu // Remember if there were setup devices and show the menu
// if we've seen setup devices and we're not hard blocked // if we've seen setup devices and we're not hard blocked
if (this._hadSetupDevices) if (nDevices > 0)
this._item.visible = !this._proxy.BluetoothHardwareAirplaneMode; this._item.visible = !this._proxy.BluetoothHardwareAirplaneMode;
else else
this._item.visible = this._proxy.BluetoothHasAirplaneMode && !this._proxy.BluetoothAirplaneMode; this._item.visible = this._proxy.BluetoothHasAirplaneMode && !this._proxy.BluetoothAirplaneMode;

View File

@ -48,9 +48,7 @@ class Indicator extends PanelMenu.SystemIndicator {
this._item.connect('key-press-event', (actor, event) => { this._item.connect('key-press-event', (actor, event) => {
return this._slider.emit('key-press-event', event); return this._slider.emit('key-press-event', event);
}); });
this._item.connect('scroll-event', (actor, event) => {
return this._slider.emit('scroll-event', event);
});
} }
_sliderChanged() { _sliderChanged() {

View File

@ -805,8 +805,8 @@ class InputSourceIndicatorContainer extends St.Widget {
}, [0, 0]); }, [0, 0]);
} }
vfunc_allocate(box) { vfunc_allocate(box, flags) {
this.set_allocation(box); this.set_allocation(box, flags);
// translate box to (0, 0) // translate box to (0, 0)
box.x2 -= box.x1; box.x2 -= box.x1;
@ -815,7 +815,7 @@ class InputSourceIndicatorContainer extends St.Widget {
box.y1 = 0; box.y1 = 0;
this.get_children().forEach(c => { this.get_children().forEach(c => {
c.allocate_align_fill(box, 0.5, 0.5, false, false); c.allocate_align_fill(box, 0.5, 0.5, false, false, flags);
}); });
} }
}); });

View File

@ -716,7 +716,8 @@ class NMWirelessDialog extends ModalDialog.ModalDialog {
let connections = client.get_connections(); let connections = client.get_connections();
this._connections = connections.filter( this._connections = connections.filter(
connection => device.connection_valid(connection)); connection => device.connection_valid(connection)
);
this._apAddedId = device.connect('access-point-added', this._accessPointAdded.bind(this)); this._apAddedId = device.connect('access-point-added', this._accessPointAdded.bind(this));
this._apRemovedId = device.connect('access-point-removed', this._accessPointRemoved.bind(this)); this._apRemovedId = device.connect('access-point-removed', this._accessPointRemoved.bind(this));
@ -1862,7 +1863,8 @@ class Indicator extends PanelMenu.SystemIndicator {
_syncVpnConnections() { _syncVpnConnections() {
let activeConnections = this._client.get_active_connections() || []; let activeConnections = this._client.get_active_connections() || [];
let vpnConnections = activeConnections.filter( let vpnConnections = activeConnections.filter(
a => a instanceof NM.VpnConnection); a => a instanceof NM.VpnConnection
);
vpnConnections.forEach(a => { vpnConnections.forEach(a => {
ensureActiveConnectionProps(a); ensureActiveConnectionProps(a);
}); });

View File

@ -112,12 +112,12 @@ class Indicator extends PanelMenu.SystemIndicator {
let chargingState = this._proxy.State == UPower.DeviceState.CHARGING let chargingState = this._proxy.State == UPower.DeviceState.CHARGING
? '-charging' : ''; ? '-charging' : '';
let fillLevel = 10 * Math.floor(this._proxy.Percentage / 10); let fillLevel = 10 * Math.floor(this._proxy.Percentage / 10);
const charged = let icon;
this._proxy.State === UPower.DeviceState.FULLY_CHARGED || if (this._proxy.State == UPower.DeviceState.FULLY_CHARGED ||
(this._proxy.State === UPower.DeviceState.CHARGING && fillLevel === 100); fillLevel === 100)
const icon = charged icon = 'battery-level-100-charged-symbolic';
? 'battery-level-100-charged-symbolic' else
: 'battery-level-%d%s-symbolic'.format(fillLevel, chargingState); icon = 'battery-level-%d%s-symbolic'.format(fillLevel, chargingState);
// Make sure we fall back to fallback-icon-name and not GThemedIcon's // Make sure we fall back to fallback-icon-name and not GThemedIcon's
// default fallbacks // default fallbacks
@ -139,7 +139,7 @@ class Indicator extends PanelMenu.SystemIndicator {
label = _("%d\u2009%%").format(100); label = _("%d\u2009%%").format(100);
else else
label = _("%d\u2009%%").format(this._proxy.Percentage); label = _("%d\u2009%%").format(this._proxy.Percentage);
this._percentageLabel.text = label; this._percentageLabel.clutter_text.set_markup('<span size="smaller">' + label + '</span>');
// The status label // The status label
this._item.label.text = this._getStatus(); this._item.label.text = this._getStatus();

View File

@ -11,7 +11,8 @@ class RemoteAccessApplet extends PanelMenu.SystemIndicator {
_init() { _init() {
super._init(); super._init();
let controller = global.backend.get_remote_access_controller(); let backend = Meta.get_backend();
let controller = backend.get_remote_access_controller();
if (!controller) if (!controller)
return; return;

View File

@ -82,7 +82,8 @@ class Indicator extends PanelMenu.SystemIndicator {
}); });
let app = this._settingsApp = Shell.AppSystem.get_default().lookup_app( let app = this._settingsApp = Shell.AppSystem.get_default().lookup_app(
'gnome-control-center.desktop'); 'gnome-control-center.desktop'
);
if (app) { if (app) {
let [icon, name] = [app.app_info.get_icon().names[0], let [icon, name] = [app.app_info.get_icon().names[0],
app.get_name()]; app.get_name()];

View File

@ -56,9 +56,6 @@ var StreamSlider = class {
this.item.connect('key-press-event', (actor, event) => { this.item.connect('key-press-event', (actor, event) => {
return this._slider.emit('key-press-event', event); return this._slider.emit('key-press-event', event);
}); });
this.item.connect('scroll-event', (actor, event) => {
return this._slider.emit('scroll-event', event);
});
this._stream = null; this._stream = null;
this._volumeCancellable = null; this._volumeCancellable = null;

View File

@ -66,8 +66,8 @@ var SwitcherPopup = GObject.registerClass({
this._disableHover(); this._disableHover();
} }
vfunc_allocate(box) { vfunc_allocate(box, flags) {
this.set_allocation(box); this.set_allocation(box, flags);
let childBox = new Clutter.ActorBox(); let childBox = new Clutter.ActorBox();
let primary = Main.layoutManager.primaryMonitor; let primary = Main.layoutManager.primaryMonitor;
@ -84,7 +84,7 @@ var SwitcherPopup = GObject.registerClass({
childBox.x2 = Math.min(primary.x + primary.width - rightPadding, childBox.x1 + childNaturalWidth); childBox.x2 = Math.min(primary.x + primary.width - rightPadding, childBox.x1 + childNaturalWidth);
childBox.y1 = primary.y + Math.floor((primary.height - childNaturalHeight) / 2); childBox.y1 = primary.y + Math.floor((primary.height - childNaturalHeight) / 2);
childBox.y2 = childBox.y1 + childNaturalHeight; childBox.y2 = childBox.y1 + childNaturalHeight;
this._switcherList.allocate(childBox); this._switcherList.allocate(childBox, flags);
} }
_initialSelection(backward, _binding) { _initialSelection(backward, _binding) {
@ -317,7 +317,7 @@ var SwitcherPopup = GObject.registerClass({
this.ease({ this.ease({
opacity: 0, opacity: 0,
duration: POPUP_FADE_OUT_TIME, duration: POPUP_FADE_OUT_TIME,
mode: Clutter.AnimationMode.EASE_OUT_QUAD, mode: Clutter.Animation.EASE_OUT_QUAD,
onComplete: () => this.destroy(), onComplete: () => this.destroy(),
}); });
} else { } else {
@ -591,8 +591,8 @@ var SwitcherList = GObject.registerClass({
return themeNode.adjust_preferred_height(maxChildMin, maxChildNat); return themeNode.adjust_preferred_height(maxChildMin, maxChildNat);
} }
vfunc_allocate(box) { vfunc_allocate(box, flags) {
this.set_allocation(box); this.set_allocation(box, flags);
let contentBox = this.get_theme_node().get_content_box(box); let contentBox = this.get_theme_node().get_content_box(box);
let width = contentBox.x2 - contentBox.x1; let width = contentBox.x2 - contentBox.x1;
@ -606,7 +606,7 @@ var SwitcherList = GObject.registerClass({
let childBox = new Clutter.ActorBox(); let childBox = new Clutter.ActorBox();
let scrollable = minListWidth > width; let scrollable = minListWidth > width;
this._scrollView.allocate(contentBox); this._scrollView.allocate(contentBox, flags);
let arrowWidth = Math.floor(leftPadding / 3); let arrowWidth = Math.floor(leftPadding / 3);
let arrowHeight = arrowWidth * 2; let arrowHeight = arrowWidth * 2;
@ -614,7 +614,7 @@ var SwitcherList = GObject.registerClass({
childBox.y1 = this.height / 2 - arrowWidth; childBox.y1 = this.height / 2 - arrowWidth;
childBox.x2 = childBox.x1 + arrowWidth; childBox.x2 = childBox.x1 + arrowWidth;
childBox.y2 = childBox.y1 + arrowHeight; childBox.y2 = childBox.y1 + arrowHeight;
this._leftArrow.allocate(childBox); this._leftArrow.allocate(childBox, flags);
this._leftArrow.opacity = this._scrollableLeft && scrollable ? 255 : 0; this._leftArrow.opacity = this._scrollableLeft && scrollable ? 255 : 0;
arrowWidth = Math.floor(rightPadding / 3); arrowWidth = Math.floor(rightPadding / 3);
@ -623,7 +623,7 @@ var SwitcherList = GObject.registerClass({
childBox.y1 = this.height / 2 - arrowWidth; childBox.y1 = this.height / 2 - arrowWidth;
childBox.x2 = childBox.x1 + arrowWidth; childBox.x2 = childBox.x1 + arrowWidth;
childBox.y2 = childBox.y1 + arrowHeight; childBox.y2 = childBox.y1 + arrowHeight;
this._rightArrow.allocate(childBox); this._rightArrow.allocate(childBox, flags);
this._rightArrow.opacity = this._scrollableRight && scrollable ? 255 : 0; this._rightArrow.opacity = this._scrollableRight && scrollable ? 255 : 0;
} }
}); });

228
js/ui/tweener.js Normal file
View File

@ -0,0 +1,228 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
/* exported init, addCaller, addTween, getTweenCount, removeTweens,
pauseTweens, resumeTweens, registerSpecialProperty,
registerSpecialPropertyModifier, registerSpecialPropertySplitter */
const { Clutter, GLib, Shell } = imports.gi;
const Signals = imports.signals;
const Tweener = imports.tweener.tweener;
const { adjustAnimationTime } = imports.ui.environment;
// This is a wrapper around imports.tweener.tweener that adds a bit of
// Clutter integration. If the tweening target is a Clutter.Actor, then
// the tweenings will automatically be removed if the actor is destroyed.
// ActionScript Tweener methods that imports.tweener.tweener doesn't
// currently implement: getTweens, getVersion, registerTransition,
// setTimeScale, updateTime.
// imports.tweener.tweener methods that we don't re-export:
// pauseAllTweens, removeAllTweens, resumeAllTweens. (It would be hard
// to clean up properly after removeAllTweens, and also, any code that
// calls any of these is almost certainly wrong anyway, because they
// affect the entire application.)
// Called from Main.start
function init() {
Tweener.setFrameTicker(new ClutterFrameTicker());
}
function addCaller(target, tweeningParameters) {
_wrapTweening(target, tweeningParameters);
Tweener.addCaller(target, tweeningParameters);
}
function addTween(target, tweeningParameters) {
_wrapTweening(target, tweeningParameters);
Tweener.addTween(target, tweeningParameters);
}
function _wrapTweening(target, tweeningParameters) {
let state = _getTweenState(target);
if (!state.destroyedId) {
if (target instanceof Clutter.Actor) {
state.actor = target;
state.destroyedId = target.connect('destroy', _actorDestroyed);
} else if (target.actor && target.actor instanceof Clutter.Actor) {
state.actor = target.actor;
state.destroyedId = target.actor.connect('destroy', () => _actorDestroyed(target));
}
}
let { time, delay } = tweeningParameters;
if (!isNaN(time))
tweeningParameters['time'] = adjustAnimationTime(1000 * time) / 1000;
if (!isNaN(delay))
tweeningParameters['delay'] = adjustAnimationTime(1000 * delay) / 1000;
_addHandler(target, tweeningParameters, 'onComplete', _tweenCompleted);
}
function _getTweenState(target) {
// If we were paranoid, we could keep a plist mapping targets to
// states... but we're not that paranoid.
if (!target.__ShellTweenerState)
target.__ShellTweenerState = {};
return target.__ShellTweenerState;
}
function _resetTweenState(target) {
let state = target.__ShellTweenerState;
if (state) {
if (state.destroyedId)
state.actor.disconnect(state.destroyedId);
}
target.__ShellTweenerState = {};
}
function _addHandler(target, params, name, handler) {
if (params[name]) {
let oldHandler = params[name];
let oldScope = params[`${name}Scope`];
let oldParams = params[`${name}Params`];
let eventScope = oldScope ? oldScope : target;
params[name] = () => {
oldHandler.apply(eventScope, oldParams);
handler(target);
};
} else {
params[name] = () => handler(target);
}
}
function _actorDestroyed(target) {
_resetTweenState(target);
Tweener.removeTweens(target);
}
function _tweenCompleted(target) {
if (!isTweening(target))
_resetTweenState(target);
}
function getTweenCount(scope) {
return Tweener.getTweenCount(scope);
}
// imports.tweener.tweener doesn't provide this method (which exists
// in the ActionScript version) but it's easy to implement.
function isTweening(scope) {
return Tweener.getTweenCount(scope) != 0;
}
function removeTweens(...args) {
if (Tweener.removeTweens(args)) {
let [scope] = args;
// If we just removed the last active tween, clean up
if (Tweener.getTweenCount(scope) == 0)
_tweenCompleted(scope);
return true;
} else {
return false;
}
}
function pauseTweens(...args) {
return Tweener.pauseTweens(...args);
}
function resumeTweens(...args) {
return Tweener.resumeTweens(...args);
}
function registerSpecialProperty(...args) {
Tweener.registerSpecialProperty(...args);
}
function registerSpecialPropertyModifier(name, modifyFunction, getFunction) {
Tweener.registerSpecialPropertyModifier(name, modifyFunction, getFunction);
}
function registerSpecialPropertySplitter(name, splitFunction, parameters) {
Tweener.registerSpecialPropertySplitter(name, splitFunction, parameters);
}
// The 'FrameTicker' object is an object used to feed new frames to
// Tweener so it can update values and redraw. The default frame
// ticker for Tweener just uses a simple timeout at a fixed frame rate
// and has no idea of "catching up" by dropping frames.
//
// We substitute it with custom frame ticker here that connects
// Tweener to a Clutter.TimeLine. Now, Clutter.Timeline itself isn't a
// whole lot more sophisticated than a simple timeout at a fixed frame
// rate, but at least it knows how to drop frames. (See
// HippoAnimationManager for a more sophisticated view of continuous
// time updates; even better is to pay attention to the vertical
// vblank and sync to that when possible.)
//
var ClutterFrameTicker = class {
constructor() {
// We don't have a finite duration; tweener will tell us to stop
// when we need to stop, so use 1000 seconds as "infinity", and
// set the timeline to loop. Doing this means we have to track
// time ourselves, since clutter timeline's time will cycle
// instead of strictly increase.
this._timeline = new Clutter.Timeline({ duration: 1000 * 1000 });
this._timeline.set_loop(true);
this._startTime = -1;
this._currentTime = -1;
this._timeline.connect('new-frame', () => {
this._onNewFrame();
});
let perfLog = Shell.PerfLog.get_default();
perfLog.define_event("tweener.framePrepareStart",
"Start of a new animation frame",
"");
perfLog.define_event("tweener.framePrepareDone",
"Finished preparing frame",
"");
}
get FRAME_RATE() {
return 60;
}
_onNewFrame() {
// If there is a lot of setup to start the animation, then
// first frame number we get from clutter might be a long ways
// into the animation (or the animation might even be done).
// That looks bad, so we always start at the first frame of the
// animation then only do frame dropping from there.
if (this._startTime < 0)
this._startTime = GLib.get_monotonic_time() / 1000.0;
// currentTime is in milliseconds
let perfLog = Shell.PerfLog.get_default();
this._currentTime = GLib.get_monotonic_time() / 1000.0 - this._startTime;
perfLog.event("tweener.framePrepareStart");
this.emit('prepare-frame');
perfLog.event("tweener.framePrepareDone");
}
getTime() {
return this._currentTime;
}
start() {
this._timeline.start();
global.begin_work();
}
stop() {
this._timeline.stop();
this._startTime = -1;
this._currentTime = -1;
global.end_work();
}
};
Signals.addSignalMethods(ClutterFrameTicker.prototype);

View File

@ -405,7 +405,7 @@ class UnlockDialogLayout extends Clutter.LayoutManager {
return this._stack.get_preferred_height(forWidth); return this._stack.get_preferred_height(forWidth);
} }
vfunc_allocate(container, box) { vfunc_allocate(container, box, flags) {
let [width, height] = box.get_size(); let [width, height] = box.get_size();
let tenthOfHeight = height / 10.0; let tenthOfHeight = height / 10.0;
@ -432,7 +432,7 @@ class UnlockDialogLayout extends Clutter.LayoutManager {
actorBox.x2 = columnX1 + columnWidth; actorBox.x2 = columnX1 + columnWidth;
actorBox.y2 = actorBox.y1 + maxNotificationsHeight; actorBox.y2 = actorBox.y1 + maxNotificationsHeight;
this._notifications.allocate(actorBox); this._notifications.allocate(actorBox, flags);
// Authentication Box // Authentication Box
let stackY = Math.min( let stackY = Math.min(
@ -444,7 +444,7 @@ class UnlockDialogLayout extends Clutter.LayoutManager {
actorBox.x2 = columnX1 + columnWidth; actorBox.x2 = columnX1 + columnWidth;
actorBox.y2 = stackY + stackHeight; actorBox.y2 = stackY + stackHeight;
this._stack.allocate(actorBox); this._stack.allocate(actorBox, flags);
// Switch User button // Switch User button
if (this._switchUserButton.visible) { if (this._switchUserButton.visible) {
@ -461,7 +461,7 @@ class UnlockDialogLayout extends Clutter.LayoutManager {
actorBox.x2 = actorBox.x1 + natWidth; actorBox.x2 = actorBox.x1 + natWidth;
actorBox.y2 = actorBox.y1 + natHeight; actorBox.y2 = actorBox.y1 + natHeight;
this._switchUserButton.allocate(actorBox); this._switchUserButton.allocate(actorBox, flags);
} }
} }
}); });
@ -605,7 +605,7 @@ var UnlockDialog = GObject.registerClass({
this._showPrompt(); this._showPrompt();
if (GLib.unichar_isgraph(unichar)) if (GLib.unichar_isgraph(unichar))
this._authPrompt.addCharacter(unichar); this.addCharacter(unichar);
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
} }
@ -835,6 +835,11 @@ var UnlockDialog = GObject.registerClass({
this._authPrompt.cancel(); this._authPrompt.cancel();
} }
addCharacter(unichar) {
this._showPrompt();
this._authPrompt.addCharacter(unichar);
}
finish(onComplete) { finish(onComplete) {
this._ensureAuthPrompt(); this._ensureAuthPrompt();
this._authPrompt.finish(onComplete); this._authPrompt.finish(onComplete);

View File

@ -144,8 +144,8 @@ class UserWidgetLabel extends St.Widget {
} }
} }
vfunc_allocate(box) { vfunc_allocate(box, flags) {
this.set_allocation(box); this.set_allocation(box, flags);
let availWidth = box.x2 - box.x1; let availWidth = box.x2 - box.x1;
let availHeight = box.y2 - box.y1; let availHeight = box.y2 - box.y1;
@ -164,7 +164,7 @@ class UserWidgetLabel extends St.Widget {
childBox.x2 = availWidth; childBox.x2 = availWidth;
childBox.y2 = availHeight; childBox.y2 = availHeight;
this._currentLabel.allocate(childBox); this._currentLabel.allocate(childBox, flags);
} }
vfunc_paint(paintContext) { vfunc_paint(paintContext) {

View File

@ -82,10 +82,8 @@ class DisplayChangeDialog extends ModalDialog.ModalDialog {
} }
_formatCountDown() { _formatCountDown() {
const fmt = ngettext( let fmt = ngettext("Settings changes will revert in %d second",
'Settings changes will revert in %d second', "Settings changes will revert in %d seconds");
'Settings changes will revert in %d seconds',
this._countDown);
return fmt.format(this._countDown); return fmt.format(this._countDown);
} }
@ -900,10 +898,7 @@ var WindowManager = class {
global.display.connect('init-xserver', (display, task) => { global.display.connect('init-xserver', (display, task) => {
IBusManager.getIBusManager().restartDaemon(['--xim']); IBusManager.getIBusManager().restartDaemon(['--xim']);
Shell.util_start_systemd_unit('gsd-xsettings.target', 'fail');
try {
if (!Shell.util_start_systemd_unit('gsd-xsettings.target', 'fail'))
log('Not starting gsd-xsettings; waiting for gnome-session to do so');
/* Leave this watchdog timeout so don't block indefinitely here */ /* Leave this watchdog timeout so don't block indefinitely here */
let timeoutId = GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, 5, () => { let timeoutId = GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, 5, () => {
@ -926,21 +921,12 @@ var WindowManager = class {
} }
}, },
null); null);
} catch (e) {
log('Error starting gsd-xsettings: %s'.format(e.message));
task.return_boolean(true);
}
return true; return true;
}); });
global.display.connect('x11-display-closing', () => { global.display.connect('x11-display-closing', () => {
if (!Meta.is_wayland_compositor()) if (!Meta.is_wayland_compositor())
return; return;
try {
Shell.util_stop_systemd_unit('gsd-xsettings.target', 'fail'); Shell.util_stop_systemd_unit('gsd-xsettings.target', 'fail');
} catch (e) {
log('Error stopping gsd-xsettings: %s'.format(e.message));
}
IBusManager.getIBusManager().restartDaemon(); IBusManager.getIBusManager().restartDaemon();
}); });

View File

@ -51,22 +51,35 @@ class WindowCloneLayout extends Clutter.LayoutManager {
this.layout_changed(); this.layout_changed();
} }
_makeBoxForWindow(window) {
// We need to adjust the position of the actor because of the
// consequences of invisible borders -- in reality, the texture
// has an extra set of "padding" around it that we need to trim
// down.
// The bounding box is based on the (visible) frame rect, while
// the buffer rect contains everything, including the invisible
// border padding.
let bufferRect = window.get_buffer_rect();
let box = new Clutter.ActorBox();
box.set_origin(bufferRect.x - this._boundingBox.x,
bufferRect.y - this._boundingBox.y);
box.set_size(bufferRect.width, bufferRect.height);
return box;
}
vfunc_get_preferred_height(_container, _forWidth) { vfunc_get_preferred_height(_container, _forWidth) {
return [0, this._boundingBox.height]; return [this._boundingBox.height, this._boundingBox.height];
} }
vfunc_get_preferred_width(_container, _forHeight) { vfunc_get_preferred_width(_container, _forHeight) {
return [0, this._boundingBox.width]; return [this._boundingBox.width, this._boundingBox.width];
} }
vfunc_allocate(container, box) { vfunc_allocate(container, box, flags) {
// If the scale isn't 1, we weren't allocated our preferred size
// and have to scale the children allocations accordingly.
const scaleX = box.get_width() / this._boundingBox.width;
const scaleY = box.get_height() / this._boundingBox.height;
const childBox = new Clutter.ActorBox();
container.get_children().forEach(child => { container.get_children().forEach(child => {
let realWindow; let realWindow;
if (child == container._windowClone) if (child == container._windowClone)
@ -74,20 +87,8 @@ class WindowCloneLayout extends Clutter.LayoutManager {
else else
realWindow = child.source; realWindow = child.source;
const bufferRect = realWindow.meta_window.get_buffer_rect(); child.allocate(this._makeBoxForWindow(realWindow.meta_window),
childBox.set_origin( flags);
bufferRect.x - this._boundingBox.x,
bufferRect.y - this._boundingBox.y);
const [, , natWidth, natHeight] = child.get_preferred_size();
childBox.set_size(natWidth, natHeight);
childBox.x1 *= scaleX;
childBox.x2 *= scaleX;
childBox.y1 *= scaleY;
childBox.y2 *= scaleY;
child.allocate(childBox);
}); });
} }
}); });
@ -154,8 +155,7 @@ var WindowClone = GObject.registerClass({
this._updateAttachedDialogs(); this._updateAttachedDialogs();
this._computeBoundingBox(); this._computeBoundingBox();
this.x = this._boundingBox.x; this.set_translation(this._boundingBox.x, this._boundingBox.y, 0);
this.y = this._boundingBox.y;
this._computeWindowCenter(); this._computeWindowCenter();
@ -240,9 +240,6 @@ var WindowClone = GObject.registerClass({
this._onMetaWindowSizeChanged(); this._onMetaWindowSizeChanged();
}); });
Shell.util_set_hidden_from_pick(clone, true);
this.add_child(clone); this.add_child(clone);
} }
@ -266,6 +263,18 @@ var WindowClone = GObject.registerClass({
return this._boundingBox; return this._boundingBox;
} }
get width() {
return this._boundingBox.width;
}
get height() {
return this._boundingBox.height;
}
getOriginalPosition() {
return [this._boundingBox.x, this._boundingBox.y];
}
_computeBoundingBox() { _computeBoundingBox() {
let rect = this.metaWindow.get_frame_rect(); let rect = this.metaWindow.get_frame_rect();
@ -859,7 +868,7 @@ var LayoutStrategy = class {
// thumbnails is much more important to preserve than the width of // thumbnails is much more important to preserve than the width of
// them, so two windows with equal height, but maybe differering // them, so two windows with equal height, but maybe differering
// widths line up. // widths line up.
let ratio = window.boundingBox.height / this._monitor.height; let ratio = window.height / this._monitor.height;
// The purpose of this manipulation here is to prevent windows // The purpose of this manipulation here is to prevent windows
// from getting too small. For something like a calculator window, // from getting too small. For something like a calculator window,
@ -979,12 +988,11 @@ var LayoutStrategy = class {
let window = row.windows[j]; let window = row.windows[j];
let s = scale * this._computeWindowScale(window) * row.additionalScale; let s = scale * this._computeWindowScale(window) * row.additionalScale;
let cellWidth = window.boundingBox.width * s; let cellWidth = window.width * s;
let cellHeight = window.boundingBox.height * s; let cellHeight = window.height * s;
s = Math.min(s, WINDOW_CLONE_MAXIMUM_SCALE); s = Math.min(s, WINDOW_CLONE_MAXIMUM_SCALE);
let cloneWidth = window.boundingBox.width * s; let cloneWidth = window.width * s;
const cloneHeight = window.boundingBox.height * s;
let cloneX = x + (cellWidth - cloneWidth) / 2; let cloneX = x + (cellWidth - cloneWidth) / 2;
let cloneY = row.y + row.height * row.additionalScale - cellHeight + compensation; let cloneY = row.y + row.height * row.additionalScale - cellHeight + compensation;
@ -993,7 +1001,7 @@ var LayoutStrategy = class {
cloneX = Math.floor(cloneX); cloneX = Math.floor(cloneX);
cloneY = Math.floor(cloneY); cloneY = Math.floor(cloneY);
slots.push([cloneX, cloneY, cloneWidth, cloneHeight, window]); slots.push([cloneX, cloneY, s, window]);
x += cellWidth + this._columnSpacing; x += cellWidth + this._columnSpacing;
} }
} }
@ -1038,7 +1046,7 @@ var UnalignedLayoutStrategy = class extends LayoutStrategy {
for (let i = 0; i < windows.length; i++) { for (let i = 0; i < windows.length; i++) {
let window = windows[i]; let window = windows[i];
let s = this._computeWindowScale(window); let s = this._computeWindowScale(window);
totalWidth += window.boundingBox.width * s; totalWidth += window.width * s;
} }
let idealRowWidth = totalWidth / numRows; let idealRowWidth = totalWidth / numRows;
@ -1056,8 +1064,8 @@ var UnalignedLayoutStrategy = class extends LayoutStrategy {
for (; windowIdx < sortedWindows.length; windowIdx++) { for (; windowIdx < sortedWindows.length; windowIdx++) {
let window = sortedWindows[windowIdx]; let window = sortedWindows[windowIdx];
let s = this._computeWindowScale(window); let s = this._computeWindowScale(window);
let width = window.boundingBox.width * s; let width = window.width * s;
let height = window.boundingBox.height * s; let height = window.height * s;
row.fullHeight = Math.max(row.fullHeight, height); row.fullHeight = Math.max(row.fullHeight, height);
// either new width is < idealWidth or new width is nearer from idealWidth then oldWidth // either new width is < idealWidth or new width is nearer from idealWidth then oldWidth
@ -1332,7 +1340,7 @@ class Workspace extends St.Widget {
for (let i = 0; i < slots.length; i++) { for (let i = 0; i < slots.length; i++) {
let slot = slots[i]; let slot = slots[i];
const [x, y, cellWidth, cellHeight, clone] = slot; let [x, y, scale, clone] = slot;
clone.slotId = i; clone.slotId = i;
@ -1341,8 +1349,8 @@ class Workspace extends St.Widget {
if (clone.inDrag) if (clone.inDrag)
continue; continue;
const cloneWidth = cellWidth; let cloneWidth = clone.width * scale;
const cloneHeight = cellHeight; let cloneHeight = clone.height * scale;
clone.slot = [x, y, cloneWidth, cloneHeight]; clone.slot = [x, y, cloneWidth, cloneHeight];
let cloneCenter = x + cloneWidth / 2; let cloneCenter = x + cloneWidth / 2;
@ -1357,10 +1365,10 @@ class Workspace extends St.Widget {
if (!clone.positioned) { if (!clone.positioned) {
// This window appeared after the overview was already up // This window appeared after the overview was already up
// Grow the clone from the center of the slot // Grow the clone from the center of the slot
clone.x = x + cloneWidth / 2; clone.translation_x = x + cloneWidth / 2;
clone.y = y + cloneHeight / 2; clone.translation_y = y + cloneHeight / 2;
clone.width = 0; clone.scale_x = 0;
clone.height = 0; clone.scale_y = 0;
clone.positioned = true; clone.positioned = true;
} }
@ -1371,10 +1379,10 @@ class Workspace extends St.Widget {
* can be scaled up later */ * can be scaled up later */
if (initialPositioning) { if (initialPositioning) {
clone.opacity = 0; clone.opacity = 0;
clone.x = x; clone.scale_x = 0;
clone.y = y; clone.scale_y = 0;
clone.width = cloneWidth; clone.translation_x = x;
clone.height = cloneHeight; clone.translation_y = y;
} }
clone.ease({ clone.ease({
@ -1384,12 +1392,12 @@ class Workspace extends St.Widget {
}); });
} }
this._animateClone(clone, clone.overlay, x, y, cloneWidth, cloneHeight); this._animateClone(clone, clone.overlay, x, y, scale);
} else { } else {
// cancel any active tweens (otherwise they might override our changes) // cancel any active tweens (otherwise they might override our changes)
clone.remove_all_transitions(); clone.remove_all_transitions();
clone.set_position(x, y); clone.set_translation(x, y, 0);
clone.set_size(cloneWidth, cloneHeight); clone.set_scale(scale, scale);
clone.set_opacity(255); clone.set_opacity(255);
clone.overlay.relayout(false); clone.overlay.relayout(false);
this._showWindowOverlay(clone, clone.overlay); this._showWindowOverlay(clone, clone.overlay);
@ -1416,10 +1424,12 @@ class Workspace extends St.Widget {
} }
} }
_animateClone(clone, overlay, x, y, width, height) { _animateClone(clone, overlay, x, y, scale) {
clone.ease({ clone.ease({
x, y, translation_x: x,
width, height, translation_y: y,
scale_x: scale,
scale_y: scale,
duration: Overview.ANIMATION_TIME, duration: Overview.ANIMATION_TIME,
mode: Clutter.AnimationMode.EASE_OUT_QUAD, mode: Clutter.AnimationMode.EASE_OUT_QUAD,
onComplete: () => { onComplete: () => {
@ -1476,14 +1486,11 @@ class Workspace extends St.Widget {
// this point.) // this point.)
if (win) { if (win) {
let [stageX, stageY] = clone.get_transformed_position(); let [stageX, stageY] = clone.get_transformed_position();
const [transformedWidth, transformedHeight] = let [stageWidth] = clone.get_transformed_size();
clone.get_transformed_size();
win._overviewHint = { win._overviewHint = {
x: stageX, x: stageX,
y: stageY, y: stageY,
width: transformedWidth, scale: stageWidth / clone.width,
height: transformedHeight,
}; };
} }
clone.destroy(); clone.destroy();
@ -1559,15 +1566,14 @@ class Workspace extends St.Widget {
if (win._overviewHint) { if (win._overviewHint) {
let x = win._overviewHint.x - this.x; let x = win._overviewHint.x - this.x;
let y = win._overviewHint.y - this.y; let y = win._overviewHint.y - this.y;
const width = win._overviewHint.width; let scale = win._overviewHint.scale;
const height = win._overviewHint.height;
delete win._overviewHint; delete win._overviewHint;
clone.slot = [x, y, width, height]; clone.slot = [x, y, clone.width * scale, clone.height * scale];
clone.positioned = true; clone.positioned = true;
clone.set_position(x, y); clone.set_translation(x, y, 0);
clone.set_size(width, height); clone.set_scale(scale, scale);
clone.overlay.relayout(false); clone.overlay.relayout(false);
} }
@ -1718,10 +1724,11 @@ class Workspace extends St.Widget {
overlay.hide(); overlay.hide();
if (clone.metaWindow.showing_on_its_workspace()) { if (clone.metaWindow.showing_on_its_workspace()) {
clone.x = clone.boundingBox.x; let [origX, origY] = clone.getOriginalPosition();
clone.y = clone.boundingBox.y; clone.scale_x = 1;
clone.width = clone.boundingBox.width; clone.scale_y = 1;
clone.height = clone.boundingBox.height; clone.translation_x = origX;
clone.translation_y = origY;
clone.ease({ clone.ease({
opacity, opacity,
duration, duration,
@ -1769,11 +1776,12 @@ class Workspace extends St.Widget {
overlay.hide(); overlay.hide();
if (clone.metaWindow.showing_on_its_workspace()) { if (clone.metaWindow.showing_on_its_workspace()) {
let [origX, origY] = clone.getOriginalPosition();
clone.ease({ clone.ease({
x: clone.boundingBox.x, translation_x: origX,
y: clone.boundingBox.y, translation_y: origY,
width: clone.boundingBox.width, scale_x: 1,
height: clone.boundingBox.height, scale_y: 1,
opacity: 255, opacity: 255,
duration: Overview.ANIMATION_TIME, duration: Overview.ANIMATION_TIME,
mode: Clutter.AnimationMode.EASE_OUT_QUAD, mode: Clutter.AnimationMode.EASE_OUT_QUAD,
@ -1781,8 +1789,8 @@ class Workspace extends St.Widget {
} else { } else {
// The window is hidden, make it shrink and fade it out // The window is hidden, make it shrink and fade it out
clone.ease({ clone.ease({
width: 0, scale_x: 0,
height: 0, scale_y: 0,
opacity: 0, opacity: 0,
duration: Overview.ANIMATION_TIME, duration: Overview.ANIMATION_TIME,
mode: Clutter.AnimationMode.EASE_OUT_QUAD, mode: Clutter.AnimationMode.EASE_OUT_QUAD,
@ -2027,8 +2035,7 @@ class Workspace extends St.Widget {
win._overviewHint = { win._overviewHint = {
x: actor.x, x: actor.x,
y: actor.y, y: actor.y,
width: actor.width, scale: actor.scale_x,
heigth: actor.height,
}; };
let metaWindow = win.get_meta_window(); let metaWindow = win.get_meta_window();

View File

@ -86,8 +86,8 @@ class WorkspaceSwitcherPopupList extends St.Widget {
return this._getSizeForOppositeOrientation(); return this._getSizeForOppositeOrientation();
} }
vfunc_allocate(box) { vfunc_allocate(box, flags) {
this.set_allocation(box); this.set_allocation(box, flags);
let themeNode = this.get_theme_node(); let themeNode = this.get_theme_node();
box = themeNode.get_content_box(box); box = themeNode.get_content_box(box);
@ -111,7 +111,7 @@ class WorkspaceSwitcherPopupList extends St.Widget {
} else { } else {
y += this._childHeight + this._itemSpacing; y += this._childHeight + this._itemSpacing;
} }
child.allocate(childBox); child.allocate(childBox, flags);
} }
} }
}); });

View File

@ -1204,8 +1204,8 @@ var ThumbnailsBox = GObject.registerClass({
this.queue_relayout(); this.queue_relayout();
} }
vfunc_allocate(box) { vfunc_allocate(box, flags) {
this.set_allocation(box); this.set_allocation(box, flags);
let rtl = Clutter.get_default_text_direction() == Clutter.TextDirection.RTL; let rtl = Clutter.get_default_text_direction() == Clutter.TextDirection.RTL;
@ -1299,7 +1299,7 @@ var ThumbnailsBox = GObject.registerClass({
childBox.x2 = x2; childBox.x2 = x2;
childBox.y1 = Math.round(y); childBox.y1 = Math.round(y);
childBox.y2 = Math.round(y + placeholderHeight); childBox.y2 = Math.round(y + placeholderHeight);
this._dropPlaceholder.allocate(childBox); this._dropPlaceholder.allocate(childBox, flags);
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => {
this._dropPlaceholder.show(); this._dropPlaceholder.show();
}); });
@ -1331,7 +1331,7 @@ var ThumbnailsBox = GObject.registerClass({
childBox.y2 = y1 + portholeHeight; childBox.y2 = y1 + portholeHeight;
thumbnail.set_scale(roundedHScale, roundedVScale); thumbnail.set_scale(roundedHScale, roundedVScale);
thumbnail.allocate(childBox); thumbnail.allocate(childBox, flags);
// We round the collapsing portion so that we don't get thumbnails resizing // We round the collapsing portion so that we don't get thumbnails resizing
// during an animation due to differences in rounded, but leave the uncollapsed // during an animation due to differences in rounded, but leave the uncollapsed
@ -1355,6 +1355,6 @@ var ThumbnailsBox = GObject.registerClass({
childBox.x2 += indicatorRightFullBorder; childBox.x2 += indicatorRightFullBorder;
childBox.y1 = indicatorY1 - indicatorTopFullBorder; childBox.y1 = indicatorY1 - indicatorTopFullBorder;
childBox.y2 = indicatorY2 + indicatorBottomFullBorder; childBox.y2 = indicatorY2 + indicatorBottomFullBorder;
this._indicator.allocate(childBox); this._indicator.allocate(childBox, flags);
} }
}); });

View File

@ -8,7 +8,6 @@ const SwipeTracker = imports.ui.swipeTracker;
const Workspace = imports.ui.workspace; const Workspace = imports.ui.workspace;
var WORKSPACE_SWITCH_TIME = 250; var WORKSPACE_SWITCH_TIME = 250;
var SCROLL_TIMEOUT_TIME = 150;
var AnimationType = { var AnimationType = {
ZOOM: 0, ZOOM: 0,
@ -816,11 +815,12 @@ class WorkspacesDisplay extends St.Widget {
this._canScroll = false; this._canScroll = false;
this._scrollTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, this._scrollTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT,
SCROLL_TIMEOUT_TIME, () => { WORKSPACE_SWITCH_TIME, () => {
this._canScroll = true; this._canScroll = true;
this._scrollTimeoutId = 0; this._scrollTimeoutId = 0;
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
}); }
);
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
} }

View File

@ -1,6 +1,6 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const { Clutter } = imports.gi; const { Clutter, Meta } = imports.gi;
const Signals = imports.signals; const Signals = imports.signals;
const DND = imports.ui.dnd; const DND = imports.ui.dnd;
@ -17,7 +17,7 @@ var XdndHandler = class {
Main.uiGroup.add_actor(this._dummy); Main.uiGroup.add_actor(this._dummy);
this._dummy.hide(); this._dummy.hide();
var dnd = global.backend.get_dnd(); var dnd = Meta.get_backend().get_dnd();
dnd.connect('dnd-enter', this._onEnter.bind(this)); dnd.connect('dnd-enter', this._onEnter.bind(this));
dnd.connect('dnd-position-change', this._onPositionChanged.bind(this)); dnd.connect('dnd-position-change', this._onPositionChanged.bind(this));
dnd.connect('dnd-leave', this._onLeave.bind(this)); dnd.connect('dnd-leave', this._onLeave.bind(this));

View File

@ -218,12 +218,12 @@ globals:
ARGV: readonly ARGV: readonly
Debugger: readonly Debugger: readonly
GIRepositoryGType: readonly GIRepositoryGType: readonly
globalThis: readonly
imports: readonly imports: readonly
Intl: readonly Intl: readonly
log: readonly log: readonly
logError: readonly logError: readonly
print: readonly print: readonly
printerr: readonly printerr: readonly
window: readonly
parserOptions: parserOptions:
ecmaVersion: 2019 ecmaVersion: 2019

View File

@ -1,6 +1,6 @@
project('gnome-shell', 'c', project('gnome-shell', 'c',
version: '3.37.2', version: '3.37.0',
meson_version: '>= 0.53.0', meson_version: '>= 0.47.0',
license: 'GPLv2+' license: 'GPLv2+'
) )
@ -19,13 +19,13 @@ cogl_pango_pc = 'mutter-cogl-pango-' + mutter_api_version
libmutter_pc = 'libmutter-' + mutter_api_version libmutter_pc = 'libmutter-' + mutter_api_version
ecal_req = '>= 3.33.1' ecal_req = '>= 3.33.1'
eds_req = '>= 3.33.1' eds_req = '>= 3.17.2'
gcr_req = '>= 3.7.5' gcr_req = '>= 3.7.5'
gio_req = '>= 2.56.0' gio_req = '>= 2.56.0'
gi_req = '>= 1.49.1' gi_req = '>= 1.49.1'
gjs_req = '>= 1.65.1' gjs_req = '>= 1.63.2'
gtk_req = '>= 3.15.0' gtk_req = '>= 3.15.0'
mutter_req = '>= 3.37.2' mutter_req = '>= 3.36.0'
polkit_req = '>= 0.100' polkit_req = '>= 0.100'
schemas_req = '>= 3.33.1' schemas_req = '>= 3.33.1'
startup_req = '>= 0.11' startup_req = '>= 0.11'
@ -63,9 +63,16 @@ portaldir = join_paths(datadir, 'xdg-desktop-portal', 'portals')
schemadir = join_paths(datadir, 'glib-2.0', 'schemas') schemadir = join_paths(datadir, 'glib-2.0', 'schemas')
servicedir = join_paths(datadir, 'dbus-1', 'services') servicedir = join_paths(datadir, 'dbus-1', 'services')
# XXX: Once https://github.com/systemd/systemd/issues/9595 is fixed and we can
# depend on this version, replace with something like:
# systemduserunitdir = systemd_dep.get_pkgconfig_variable('systemduserunitdir',
# define_variable: ['prefix', prefix])
# and uncomment systemd_dep below
systemduserunitdir = join_paths(prefix, 'lib', 'systemd', 'user')
keybindings_dep = dependency('gnome-keybindings', required: false) keybindings_dep = dependency('gnome-keybindings', required: false)
if keybindings_dep.found() if keybindings_dep.found()
keysdir = keybindings_dep.get_pkgconfig_variable('keysdir', define_variable: ['datadir', datadir]) keysdir = keybindings_dep.get_pkgconfig_variable('keysdir')
else else
keysdir = join_paths(datadir, 'gnome-control-center', 'keybindings') keysdir = join_paths(datadir, 'gnome-control-center', 'keybindings')
endif endif
@ -115,9 +122,8 @@ endif
if get_option('systemd') if get_option('systemd')
libsystemd_dep = dependency('libsystemd') libsystemd_dep = dependency('libsystemd')
systemd_dep = dependency('systemd') # XXX: see systemduserunitdir
systemduserunitdir = systemd_dep.get_pkgconfig_variable('systemduserunitdir', # systemd_dep = dependency('systemd')
define_variable: ['prefix', prefix])
have_systemd = true have_systemd = true
else else
libsystemd_dep = [] libsystemd_dep = []
@ -315,6 +321,8 @@ if get_option('man')
summary_dirs += { 'mandir': get_option('mandir') } summary_dirs += { 'mandir': get_option('mandir') }
endif endif
if meson.version().version_compare('>= 0.53.0')
summary(summary_dirs, section: 'Directories') summary(summary_dirs, section: 'Directories')
summary(summary_build, section: 'Build Configuration') summary(summary_build, section: 'Build Configuration')
summary(summary_options, section: 'Build Options') summary(summary_options, section: 'Build Options')
endif

View File

@ -56,7 +56,6 @@ nl
nn nn
oc oc
or or
os
pa pa
pl pl
pt pt

View File

@ -94,7 +94,5 @@ subprojects/extensions-tool/src/command-prefs.c
subprojects/extensions-tool/src/command-reset.c subprojects/extensions-tool/src/command-reset.c
subprojects/extensions-tool/src/command-uninstall.c subprojects/extensions-tool/src/command-uninstall.c
subprojects/extensions-tool/src/main.c subprojects/extensions-tool/src/main.c
subprojects/extensions-tool/src/templates/00-plain.desktop.in
subprojects/extensions-tool/src/templates/indicator.desktop.in
# Please do not remove this file from POTFILES.in. Run "git submodule init && git submodule update" to get it. # Please do not remove this file from POTFILES.in. Run "git submodule init && git submodule update" to get it.
subprojects/gvc/gvc-mixer-control.c subprojects/gvc/gvc-mixer-control.c

View File

@ -1 +0,0 @@
subprojects/extensions-tool/src/templates/indicator/extension.js

1313
po/ca.po

File diff suppressed because it is too large Load Diff

871
po/cs.po

File diff suppressed because it is too large Load Diff

439
po/de.po
View File

@ -22,9 +22,9 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell master\n" "Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2020-05-15 03:04+0000\n" "POT-Creation-Date: 2020-03-19 14:34+0000\n"
"PO-Revision-Date: 2020-05-24 00:19+0200\n" "PO-Revision-Date: 2020-03-20 06:42+0100\n"
"Last-Translator: Christian Kirbach <christian.kirbach@gmail.com>\n" "Last-Translator: Wolfgang Stoeggl <c72578@yahoo.de>\n"
"Language-Team: Deutsch <gnome-de@gnome.org>\n" "Language-Team: Deutsch <gnome-de@gnome.org>\n"
"Language: de\n" "Language: de\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -409,12 +409,68 @@ msgstr ""
msgid "Network Login" msgid "Network Login"
msgstr "Netzwerkanmeldung" msgstr "Netzwerkanmeldung"
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:36 #: js/extensionPrefs/data/metainfo/org.gnome.Extensions.metainfo.xml.in:5
#: subprojects/extensions-app/data/ui/extensions-window.ui:224 #: js/extensionPrefs/data/org.gnome.Extensions.desktop.in.in:4
#: js/extensionPrefs/js/main.js:242
#: js/extensionPrefs/data/ui/extensions-window.ui:61
msgid "Extensions"
msgstr "Erweiterungen"
#: js/extensionPrefs/data/metainfo/org.gnome.Extensions.metainfo.xml.in:6
#: js/extensionPrefs/js/main.js:243
msgid "Manage your GNOME Extensions"
msgstr "Ihre GNOME-Erweiterungen verwalten"
#: js/extensionPrefs/data/metainfo/org.gnome.Extensions.metainfo.xml.in:35
msgid ""
"GNOME Extensions handles updating extensions, configuring extension "
"preferences and removing or disabling unwanted extensions."
msgstr ""
"GNOME-Erweiterungen dient der Aktualisierung von Erweiterungen, dem "
"Konfigurieren der Voreinstellungen von Erweiterungen und dem Entfernen oder "
"Deaktivieren nicht gewünschter Erweiterungen."
#: js/extensionPrefs/data/org.gnome.Extensions.desktop.in.in:7
msgid "Configure GNOME Shell Extensions"
msgstr "GNOME-Shell-Erweiterungen einrichten"
#: js/extensionPrefs/js/main.js:164
#, javascript-format
msgid "Remove “%s”?"
msgstr "»%s« entfernen?"
#: js/extensionPrefs/js/main.js:165
msgid ""
"If you remove the extension, you need to return to download it if you want "
"to enable it again"
msgstr ""
"Wenn Sie die Erweiterung entfernen, müssen Sie sie erneut herunterladen, um "
"sie wieder zu aktivieren"
#: js/extensionPrefs/js/main.js:168 js/gdm/authPrompt.js:135
#: js/ui/audioDeviceSelection.js:57 js/ui/components/networkAgent.js:109
#: js/ui/components/polkitAgent.js:139 js/ui/endSessionDialog.js:374
#: js/ui/extensionDownloader.js:177 js/ui/shellMountOperation.js:376
#: js/ui/shellMountOperation.js:386 js/ui/status/network.js:913
msgid "Cancel"
msgstr "Abbrechen"
#: js/extensionPrefs/js/main.js:169
msgid "Remove"
msgstr "Entfernen"
#: js/extensionPrefs/js/main.js:241
msgid "translator-credits"
msgstr ""
"Tim Sabsch <tim@sabsch.com>\n"
"Christian Kirbach <christian.kirbach@gmail.com>, 2020"
#: js/extensionPrefs/js/main.js:285
#: js/extensionPrefs/data/ui/extensions-window.ui:223
msgid "Somethings gone wrong" msgid "Somethings gone wrong"
msgstr "Etwas ist schiefgelaufen" msgstr "Etwas ist schiefgelaufen"
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:48 #: js/extensionPrefs/js/main.js:292
msgid "" msgid ""
"Were very sorry, but theres been a problem: the settings for this " "Were very sorry, but theres been a problem: the settings for this "
"extension cant be displayed. We recommend that you report the issue to the " "extension cant be displayed. We recommend that you report the issue to the "
@ -424,25 +480,106 @@ msgstr ""
"Erweiterung können nicht angezeigt werden. Wir empfehlen, dass Sie diesen " "Erweiterung können nicht angezeigt werden. Wir empfehlen, dass Sie diesen "
"Fehler den Autoren der Erweiterung melden." "Fehler den Autoren der Erweiterung melden."
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:82 #: js/extensionPrefs/js/main.js:299
msgid "Technical Details" msgid "Technical Details"
msgstr "Technische Details" msgstr "Technische Details"
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:165 #: js/extensionPrefs/js/main.js:334
msgid "Copy Error"
msgstr "Kopierfehler"
#: js/extensionPrefs/js/main.js:361
msgid "Homepage" msgid "Homepage"
msgstr "Homepage" msgstr "Homepage"
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:166 #: js/extensionPrefs/js/main.js:362
msgid "Visit extension homepage" msgid "Visit extension homepage"
msgstr "Internetseite der Erweiterung besuchen" msgstr "Internetseite der Erweiterung besuchen"
#: js/gdm/authPrompt.js:135 js/ui/audioDeviceSelection.js:57 #: js/extensionPrefs/js/main.js:479
#: js/ui/components/networkAgent.js:109 js/ui/components/polkitAgent.js:139 #, javascript-format
#: js/ui/endSessionDialog.js:372 js/ui/extensionDownloader.js:181 msgid "%d extension will be updated on next login."
#: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386 msgid_plural "%d extensions will be updated on next login."
#: js/ui/status/network.js:913 subprojects/extensions-app/js/main.js:148 msgstr[0] "%d Erweiterung wird bei der nächsten Anmeldung aktualisiert."
msgid "Cancel" msgstr[1] "%d Erweiterungen werden bei der nächsten Anmeldung aktualisiert."
msgstr "Abbrechen"
#: js/extensionPrefs/data/ui/extension-row.ui:100
#: subprojects/extensions-tool/src/command-create.c:211
#: subprojects/extensions-tool/src/main.c:173
msgid "Description"
msgstr "Beschreibung"
#: js/extensionPrefs/data/ui/extension-row.ui:123
#: subprojects/extensions-tool/src/main.c:185
msgid "Version"
msgstr "Version"
#: js/extensionPrefs/data/ui/extension-row.ui:151
msgid "Author"
msgstr "Autor"
#: js/extensionPrefs/data/ui/extension-row.ui:175
msgid "Website"
msgstr "Webseite"
#: js/extensionPrefs/data/ui/extension-row.ui:192
msgid "Remove…"
msgstr "Entfernen …"
#: js/extensionPrefs/data/ui/extensions-window.ui:8
msgid "Help"
msgstr "Hilfe"
#: js/extensionPrefs/data/ui/extensions-window.ui:12
msgid "About Extensions"
msgstr "Info zu Erweiterungen"
#: js/extensionPrefs/data/ui/extensions-window.ui:27
msgid ""
"To find and add extensions, visit <a href=\"https://extensions.gnome.org"
"\">extensions.gnome.org</a>."
msgstr ""
"Besuchen Sie <a href=\"https://extensions.gnome.org\">extensions.gnome.org</"
"a>, um Erweiterungen zu finden und hinzuzufügen."
#: js/extensionPrefs/data/ui/extensions-window.ui:35
msgid "Warning"
msgstr "Warnung"
#: js/extensionPrefs/data/ui/extensions-window.ui:46
msgid ""
"Extensions can cause system issues, including performance problems. If you "
"encounter problems with your system, it is recommended to disable all "
"extensions."
msgstr ""
"Erweiterungen können Probleme am System verursachen, darunter auch "
"Leistungsprobleme. Sollten Sie auf Probleme mit Ihrem System stoßen, wird "
"die Deaktivierung aller Erweiterungen empfohlen."
#: js/extensionPrefs/data/ui/extensions-window.ui:134
msgid "Manually Installed"
msgstr "Manuell installiert"
#: js/extensionPrefs/data/ui/extensions-window.ui:158
msgid "Built-In"
msgstr "Mitgeliefert"
#: js/extensionPrefs/data/ui/extensions-window.ui:199
msgid "No Installed Extensions"
msgstr "Keine installierten Erweiterungen"
#: js/extensionPrefs/data/ui/extensions-window.ui:235
msgid ""
"Were very sorry, but it was not possible to get the list of installed "
"extensions. Make sure you are logged into GNOME and try again."
msgstr ""
"Tut uns sehr leid, wir konnten keine Liste der installierten Erweiterungen "
"aufstellen. Stellen Sie sicher, dass Sie in GNOME angemeldet sind und "
"versuchen Sie es dann erneut."
#: js/extensionPrefs/data/ui/extensions-window.ui:288
msgid "Log Out…"
msgstr "Abmelden …"
#. Cisco LEAP #. Cisco LEAP
#: js/gdm/authPrompt.js:237 js/ui/components/networkAgent.js:204 #: js/gdm/authPrompt.js:237 js/ui/components/networkAgent.js:204
@ -494,71 +631,71 @@ msgid "(or swipe finger)"
msgstr "(oder wischen Sie mit einem Finger)" msgstr "(oder wischen Sie mit einem Finger)"
#. Translators: The name of the power-off action in search #. Translators: The name of the power-off action in search
#: js/misc/systemActions.js:93 #: js/misc/systemActions.js:89
msgctxt "search-result" msgctxt "search-result"
msgid "Power Off" msgid "Power Off"
msgstr "Ausschalten" msgstr "Ausschalten"
#. Translators: A list of keywords that match the power-off action, separated by semicolons #. Translators: A list of keywords that match the power-off action, separated by semicolons
#: js/misc/systemActions.js:96 #: js/misc/systemActions.js:92
msgid "power off;shutdown;reboot;restart;halt;stop" msgid "power off;shutdown;reboot;restart;halt;stop"
msgstr "ausschalten;herunterfahren;neustarten;halten;stoppen" msgstr "ausschalten;herunterfahren;neustarten;halten;stoppen"
#. Translators: The name of the lock screen action in search #. Translators: The name of the lock screen action in search
#: js/misc/systemActions.js:101 #: js/misc/systemActions.js:97
msgctxt "search-result" msgctxt "search-result"
msgid "Lock Screen" msgid "Lock Screen"
msgstr "Bildschirm sperren" msgstr "Bildschirm sperren"
#. Translators: A list of keywords that match the lock screen action, separated by semicolons #. Translators: A list of keywords that match the lock screen action, separated by semicolons
#: js/misc/systemActions.js:104 #: js/misc/systemActions.js:100
msgid "lock screen" msgid "lock screen"
msgstr "Bildschirm sperren" msgstr "Bildschirm sperren"
#. Translators: The name of the logout action in search #. Translators: The name of the logout action in search
#: js/misc/systemActions.js:109 #: js/misc/systemActions.js:105
msgctxt "search-result" msgctxt "search-result"
msgid "Log Out" msgid "Log Out"
msgstr "Abmelden" msgstr "Abmelden"
#. Translators: A list of keywords that match the logout action, separated by semicolons #. Translators: A list of keywords that match the logout action, separated by semicolons
#: js/misc/systemActions.js:112 #: js/misc/systemActions.js:108
msgid "logout;log out;sign off" msgid "logout;log out;sign off"
msgstr "abmelden;verlassen" msgstr "abmelden;verlassen"
#. Translators: The name of the suspend action in search #. Translators: The name of the suspend action in search
#: js/misc/systemActions.js:117 #: js/misc/systemActions.js:113
msgctxt "search-result" msgctxt "search-result"
msgid "Suspend" msgid "Suspend"
msgstr "Bereitschaft" msgstr "Bereitschaft"
#. Translators: A list of keywords that match the suspend action, separated by semicolons #. Translators: A list of keywords that match the suspend action, separated by semicolons
#: js/misc/systemActions.js:120 #: js/misc/systemActions.js:116
msgid "suspend;sleep" msgid "suspend;sleep"
msgstr "Bereitschaft;Schlafen" msgstr "Bereitschaft;Schlafen"
#. Translators: The name of the switch user action in search #. Translators: The name of the switch user action in search
#: js/misc/systemActions.js:125 #: js/misc/systemActions.js:121
msgctxt "search-result" msgctxt "search-result"
msgid "Switch User" msgid "Switch User"
msgstr "Benutzer wechseln" msgstr "Benutzer wechseln"
#. Translators: A list of keywords that match the switch user action, separated by semicolons #. Translators: A list of keywords that match the switch user action, separated by semicolons
#: js/misc/systemActions.js:128 #: js/misc/systemActions.js:124
msgid "switch user" msgid "switch user"
msgstr "Benutzer wechseln" msgstr "Benutzer wechseln"
#. Translators: A list of keywords that match the lock orientation action, separated by semicolons #. Translators: A list of keywords that match the lock orientation action, separated by semicolons
#: js/misc/systemActions.js:135 #: js/misc/systemActions.js:131
msgid "lock orientation;unlock orientation;screen;rotation" msgid "lock orientation;unlock orientation;screen;rotation"
msgstr "Hochformat;Querformat;sperren;entsperren;Bildschirm;Drehung;drehen" msgstr "Hochformat;Querformat;sperren;entsperren;Bildschirm;Drehung;drehen"
#: js/misc/systemActions.js:255 #: js/misc/systemActions.js:251
msgctxt "search-result" msgctxt "search-result"
msgid "Unlock Screen Rotation" msgid "Unlock Screen Rotation"
msgstr "Bildschirmdrehung entsperren" msgstr "Bildschirmdrehung entsperren"
#: js/misc/systemActions.js:256 #: js/misc/systemActions.js:252
msgctxt "search-result" msgctxt "search-result"
msgid "Lock Screen Rotation" msgid "Lock Screen Rotation"
msgstr "Bildschirmdrehung sperren" msgstr "Bildschirmdrehung sperren"
@ -724,54 +861,54 @@ msgstr "Zugriff verhindern"
msgid "Grant Access" msgid "Grant Access"
msgstr "Zugriff gewähren" msgstr "Zugriff gewähren"
#: js/ui/appDisplay.js:939 #: js/ui/appDisplay.js:898
msgid "Unnamed Folder" msgid "Unnamed Folder"
msgstr "Unbenannter Ordner" msgstr "Unbenannter Ordner"
#: js/ui/appDisplay.js:962 #: js/ui/appDisplay.js:921
msgid "Frequently used applications will appear here" msgid "Frequently used applications will appear here"
msgstr "Häufig genutzte Anwendungen erscheinen hier" msgstr "Häufig genutzte Anwendungen erscheinen hier"
#: js/ui/appDisplay.js:1097 #: js/ui/appDisplay.js:1056
msgid "Frequent" msgid "Frequent"
msgstr "Häufig" msgstr "Häufig"
#: js/ui/appDisplay.js:1104 #: js/ui/appDisplay.js:1063
msgid "All" msgid "All"
msgstr "Alle" msgstr "Alle"
# Fensterüberschrift # Fensterüberschrift
#. Translators: This is the heading of a list of open windows #. Translators: This is the heading of a list of open windows
#: js/ui/appDisplay.js:2480 js/ui/panel.js:75 #: js/ui/appDisplay.js:2446 js/ui/panel.js:75
msgid "Open Windows" msgid "Open Windows"
msgstr "Offene Fenster" msgstr "Offene Fenster"
#: js/ui/appDisplay.js:2500 js/ui/panel.js:82 #: js/ui/appDisplay.js:2466 js/ui/panel.js:82
msgid "New Window" msgid "New Window"
msgstr "Neues Fenster" msgstr "Neues Fenster"
#: js/ui/appDisplay.js:2511 #: js/ui/appDisplay.js:2477
msgid "Launch using Dedicated Graphics Card" msgid "Launch using Dedicated Graphics Card"
msgstr "Mit dedizierter Grafikkarte starten" msgstr "Mit dedizierter Grafikkarte starten"
#: js/ui/appDisplay.js:2539 js/ui/dash.js:239 #: js/ui/appDisplay.js:2505 js/ui/dash.js:239
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Aus Favoriten entfernen" msgstr "Aus Favoriten entfernen"
#: js/ui/appDisplay.js:2545 #: js/ui/appDisplay.js:2511
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Zu Favoriten hinzufügen" msgstr "Zu Favoriten hinzufügen"
#: js/ui/appDisplay.js:2555 js/ui/panel.js:93 #: js/ui/appDisplay.js:2521 js/ui/panel.js:93
msgid "Show Details" msgid "Show Details"
msgstr "Details anzeigen" msgstr "Details anzeigen"
#: js/ui/appFavorites.js:153 #: js/ui/appFavorites.js:152
#, javascript-format #, javascript-format
msgid "%s has been added to your favorites." msgid "%s has been added to your favorites."
msgstr "%s wurde zu Ihren Favoriten hinzugefügt." msgstr "%s wurde zu Ihren Favoriten hinzugefügt."
#: js/ui/appFavorites.js:186 #: js/ui/appFavorites.js:185
#, javascript-format #, javascript-format
msgid "%s has been removed from your favorites." msgid "%s has been removed from your favorites."
msgstr "%s wurde aus Ihren Favoriten entfernt." msgstr "%s wurde aus Ihren Favoriten entfernt."
@ -792,7 +929,7 @@ msgstr "Kopfhörer"
msgid "Headset" msgid "Headset"
msgstr "Headset" msgstr "Headset"
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:270 #: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:269
msgid "Microphone" msgid "Microphone"
msgstr "Mikrofon" msgstr "Mikrofon"
@ -933,7 +1070,7 @@ msgstr "Keine Termine"
msgid "Do Not Disturb" msgid "Do Not Disturb"
msgstr "Nicht stören" msgstr "Nicht stören"
#: js/ui/calendar.js:1176 #: js/ui/calendar.js:1171
msgid "Clear" msgid "Clear"
msgstr "Leeren" msgstr "Leeren"
@ -1086,7 +1223,7 @@ msgstr ""
#. Translators: this is the other person changing their old IM name to their new #. Translators: this is the other person changing their old IM name to their new
#. IM name. #. IM name.
#: js/ui/components/telepathyClient.js:823 #: js/ui/components/telepathyClient.js:787
#, javascript-format #, javascript-format
msgid "%s is now known as %s" msgid "%s is now known as %s"
msgstr "%s heißt jetzt %s" msgstr "%s heißt jetzt %s"
@ -1131,23 +1268,23 @@ msgstr "Weltuhren hinzufügen …"
msgid "World Clocks" msgid "World Clocks"
msgstr "Weltuhren" msgstr "Weltuhren"
#: js/ui/dateMenu.js:289 #: js/ui/dateMenu.js:279
msgid "Weather" msgid "Weather"
msgstr "Wetter" msgstr "Wetter"
#: js/ui/dateMenu.js:418 #: js/ui/dateMenu.js:394
msgid "Select a location…" msgid "Select a location…"
msgstr "Ort auswählen …" msgstr "Ort auswählen …"
#: js/ui/dateMenu.js:426 #: js/ui/dateMenu.js:407
msgid "Loading…" msgid "Loading…"
msgstr "Wird geladen …" msgstr "Wird geladen …"
#: js/ui/dateMenu.js:436 #: js/ui/dateMenu.js:417
msgid "Go online for weather information" msgid "Go online for weather information"
msgstr "Gehen Sie Online, um Wetterinformationen beziehen zu können" msgstr "Gehen Sie Online, um Wetterinformationen beziehen zu können"
#: js/ui/dateMenu.js:438 #: js/ui/dateMenu.js:419
msgid "Weather information is currently unavailable" msgid "Weather information is currently unavailable"
msgstr "Wetterinformationen sind momentan nicht verfügbar" msgstr "Wetterinformationen sind momentan nicht verfügbar"
@ -1288,35 +1425,35 @@ msgid "Other users are logged in"
msgstr "Andere Benutzer sind angemeldet" msgstr "Andere Benutzer sind angemeldet"
#. Translators: Remote here refers to a remote session, like a ssh login #. Translators: Remote here refers to a remote session, like a ssh login
#: js/ui/endSessionDialog.js:586 #: js/ui/endSessionDialog.js:588
#, javascript-format #, javascript-format
msgid "%s (remote)" msgid "%s (remote)"
msgstr "%s (Entfernt)" msgstr "%s (Entfernt)"
#. Translators: Console here refers to a tty like a VT console #. Translators: Console here refers to a tty like a VT console
#: js/ui/endSessionDialog.js:589 #: js/ui/endSessionDialog.js:591
#, javascript-format #, javascript-format
msgid "%s (console)" msgid "%s (console)"
msgstr "%s (Konsole)" msgstr "%s (Konsole)"
#: js/ui/extensionDownloader.js:185 #: js/ui/extensionDownloader.js:181
msgid "Install" msgid "Install"
msgstr "Installieren" msgstr "Installieren"
#: js/ui/extensionDownloader.js:191 #: js/ui/extensionDownloader.js:187
msgid "Install Extension" msgid "Install Extension"
msgstr "Erweiterung installieren" msgstr "Erweiterung installieren"
#: js/ui/extensionDownloader.js:192 #: js/ui/extensionDownloader.js:188
#, javascript-format #, javascript-format
msgid "Download and install “%s” from extensions.gnome.org?" msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "»%s« von extensions.gnome.org herunterladen und installieren?" msgstr "»%s« von extensions.gnome.org herunterladen und installieren?"
#: js/ui/extensionSystem.js:252 #: js/ui/extensionSystem.js:228
msgid "Extension Updates Available" msgid "Extension Updates Available"
msgstr "Aktualisierungen für Erweiterungen verfügbar" msgstr "Aktualisierungen für Erweiterungen verfügbar"
#: js/ui/extensionSystem.js:253 #: js/ui/extensionSystem.js:229
msgid "Extension updates are ready to be installed." msgid "Extension updates are ready to be installed."
msgstr "Aktualisierungen für Erweiterungen stehen bereit zur Installation." msgstr "Aktualisierungen für Erweiterungen stehen bereit zur Installation."
@ -1465,11 +1602,11 @@ msgstr "Quelle zeigen"
msgid "Web Page" msgid "Web Page"
msgstr "Webseite" msgstr "Webseite"
#: js/ui/main.js:279 #: js/ui/main.js:274
msgid "Logged in as a privileged user" msgid "Logged in as a privileged user"
msgstr "Als privilegierter Benutzer angemeldet" msgstr "Als privilegierter Benutzer angemeldet"
#: js/ui/main.js:280 #: js/ui/main.js:275
msgid "" msgid ""
"Running a session as a privileged user should be avoided for security " "Running a session as a privileged user should be avoided for security "
"reasons. If possible, you should log in as a normal user." "reasons. If possible, you should log in as a normal user."
@ -1478,23 +1615,23 @@ msgstr ""
"Sicherheitsgründen unterlassen werden. Falls möglich, melden Sie sich bitte " "Sicherheitsgründen unterlassen werden. Falls möglich, melden Sie sich bitte "
"als normaler Benutzer an." "als normaler Benutzer an."
#: js/ui/main.js:319 #: js/ui/main.js:281
msgid "Screen Lock disabled" msgid "Screen Lock disabled"
msgstr "Bildschirmsperre deaktiviert" msgstr "Bildschirmsperre deaktiviert"
#: js/ui/main.js:320 #: js/ui/main.js:282
msgid "Screen Locking requires the GNOME display manager." msgid "Screen Locking requires the GNOME display manager."
msgstr "Die Sperrung des Bildschirms erfordert den GNOME Display-Manager." msgstr "Die Sperrung des Bildschirms erfordert den GNOME Display-Manager."
#: js/ui/messageTray.js:1548 #: js/ui/messageTray.js:1554
msgid "System Information" msgid "System Information"
msgstr "Systeminformationen" msgstr "Systeminformationen"
#: js/ui/mpris.js:204 #: js/ui/mpris.js:199
msgid "Unknown artist" msgid "Unknown artist"
msgstr "Unbekannter Künstler" msgstr "Unbekannter Künstler"
#: js/ui/mpris.js:214 #: js/ui/mpris.js:209
msgid "Unknown title" msgid "Unknown title"
msgstr "Unbekannter Titel" msgstr "Unbekannter Titel"
@ -1566,16 +1703,16 @@ msgstr "Beenden"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". #. in your language, you can use the word for "Overview".
#: js/ui/panel.js:437 #: js/ui/panel.js:434
msgid "Activities" msgid "Activities"
msgstr "Aktivitäten" msgstr "Aktivitäten"
#: js/ui/panel.js:716 #: js/ui/panel.js:713
msgctxt "System menu in the top bar" msgctxt "System menu in the top bar"
msgid "System" msgid "System"
msgstr "System" msgstr "System"
#: js/ui/panel.js:829 #: js/ui/panel.js:826
msgid "Top Bar" msgid "Top Bar"
msgstr "Oberes Panel" msgstr "Oberes Panel"
@ -1606,11 +1743,11 @@ msgstr "GNOME muss den Bildschirm sperren"
#. #.
#. XXX: another option is to kick the user into the gdm login #. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs #. screen, where we're not affected by grabs
#: js/ui/screenShield.js:244 js/ui/screenShield.js:601 #: js/ui/screenShield.js:244 js/ui/screenShield.js:598
msgid "Unable to lock" msgid "Unable to lock"
msgstr "Sperrung fehlgeschlagen" msgstr "Sperrung fehlgeschlagen"
#: js/ui/screenShield.js:245 js/ui/screenShield.js:602 #: js/ui/screenShield.js:245 js/ui/screenShield.js:599
msgid "Lock was blocked by an application" msgid "Lock was blocked by an application"
msgstr "Sperrung wurde von einer Anwendung blockiert" msgstr "Sperrung wurde von einer Anwendung blockiert"
@ -1693,13 +1830,13 @@ msgid "The PIM must be a number or empty."
msgstr "Die PIM muss eine Nummer oder leer sein." msgstr "Die PIM muss eine Nummer oder leer sein."
#. Translators: %s is the Disks application #. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:465 #: js/ui/shellMountOperation.js:469
#, javascript-format #, javascript-format
msgid "Unable to start %s" msgid "Unable to start %s"
msgstr "%s konnte nicht gestartet werden" msgstr "%s konnte nicht gestartet werden"
#. Translators: %s is the Disks application #. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:467 #: js/ui/shellMountOperation.js:471
#, javascript-format #, javascript-format
msgid "Couldnt find the %s application" msgid "Couldnt find the %s application"
msgstr "Die Anwendung %s konnte nicht gefunden werden" msgstr "Die Anwendung %s konnte nicht gefunden werden"
@ -2183,11 +2320,11 @@ msgstr "Thunderbolt-Legitimierungsfehler"
msgid "Could not authorize the Thunderbolt device: %s" msgid "Could not authorize the Thunderbolt device: %s"
msgstr "Das Thunderbolt-Gerät %s konnte nicht legitimiert werden" msgstr "Das Thunderbolt-Gerät %s konnte nicht legitimiert werden"
#: js/ui/status/volume.js:151 #: js/ui/status/volume.js:150
msgid "Volume changed" msgid "Volume changed"
msgstr "Lautstärke geändert" msgstr "Lautstärke geändert"
#: js/ui/status/volume.js:222 #: js/ui/status/volume.js:221
msgid "Volume" msgid "Volume"
msgstr "Lautstärke" msgstr "Lautstärke"
@ -2221,23 +2358,23 @@ msgstr "Nur eingebaut"
#. Translators: This is a time format for a date in #. Translators: This is a time format for a date in
#. long format #. long format
#: js/ui/unlockDialog.js:371 #: js/ui/unlockDialog.js:370
msgid "%A %B %-d" msgid "%A %B %-d"
msgstr "%A, %d. %B" msgstr "%A, %d. %B"
#: js/ui/unlockDialog.js:377 #: js/ui/unlockDialog.js:376
msgid "Swipe up to unlock" msgid "Swipe up to unlock"
msgstr "Nach oben wischen zum Entsperren" msgstr "Nach oben wischen zum Entsperren"
#: js/ui/unlockDialog.js:378 #: js/ui/unlockDialog.js:377
msgid "Click or press a key to unlock" msgid "Click or press a key to unlock"
msgstr "Durch Mausklick oder Tastendruck entsperren" msgstr "Durch Mausklick oder Tastendruck entsperren"
#: js/ui/unlockDialog.js:550 #: js/ui/unlockDialog.js:549
msgid "Unlock Window" msgid "Unlock Window"
msgstr "Fenster entsperren" msgstr "Fenster entsperren"
#: js/ui/unlockDialog.js:559 #: js/ui/unlockDialog.js:558
msgid "Log in as another user" msgid "Log in as another user"
msgstr "Als anderer Benutzer anmelden" msgstr "Als anderer Benutzer anmelden"
@ -2270,7 +2407,7 @@ msgstr "Zurücksetzen"
msgid "Keep Changes" msgid "Keep Changes"
msgstr "Beibehalten" msgstr "Beibehalten"
#: js/ui/windowManager.js:86 #: js/ui/windowManager.js:85
#, javascript-format #, javascript-format
msgid "Settings changes will revert in %d second" msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds" msgid_plural "Settings changes will revert in %d seconds"
@ -2280,7 +2417,7 @@ msgstr[1] ""
#. Translators: This represents the size of a window. The first number is #. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height. #. * the width of the window and the second is the height.
#: js/ui/windowManager.js:546 #: js/ui/windowManager.js:544
#, javascript-format #, javascript-format
msgid "%d × %d" msgid "%d × %d"
msgstr "%d × %d" msgstr "%d × %d"
@ -2375,12 +2512,12 @@ msgstr ""
msgid "List possible modes" msgid "List possible modes"
msgstr "Die möglichen Modi auflisten" msgstr "Die möglichen Modi auflisten"
#: src/shell-app.c:286 #: src/shell-app.c:279
msgctxt "program" msgctxt "program"
msgid "Unknown" msgid "Unknown"
msgstr "Unbekannt" msgstr "Unbekannt"
#: src/shell-app.c:537 #: src/shell-app.c:530
#, c-format #, c-format
msgid "Failed to launch “%s”" msgid "Failed to launch “%s”"
msgstr "»%s« konnte nicht gestartet werden" msgstr "»%s« konnte nicht gestartet werden"
@ -2397,143 +2534,6 @@ msgstr "Es muss ein Passwort angegeben werden"
msgid "Authentication dialog was dismissed by the user" msgid "Authentication dialog was dismissed by the user"
msgstr "Der Dialog zur Anmeldung wurde vom Benutzer geschlossen" msgstr "Der Dialog zur Anmeldung wurde vom Benutzer geschlossen"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:5
#: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:4
#: subprojects/extensions-app/js/main.js:182
#: subprojects/extensions-app/data/ui/extensions-window.ui:61
msgid "Extensions"
msgstr "Erweiterungen"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:6
#: subprojects/extensions-app/js/main.js:183
msgid "Manage your GNOME Extensions"
msgstr "Ihre GNOME-Erweiterungen verwalten"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:35
msgid ""
"GNOME Extensions handles updating extensions, configuring extension "
"preferences and removing or disabling unwanted extensions."
msgstr ""
"GNOME-Erweiterungen dient der Aktualisierung von Erweiterungen, dem "
"Konfigurieren der Voreinstellungen von Erweiterungen und dem Entfernen oder "
"Deaktivieren nicht gewünschter Erweiterungen."
#: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:7
msgid "Configure GNOME Shell Extensions"
msgstr "GNOME-Shell-Erweiterungen einrichten"
#: subprojects/extensions-app/js/main.js:144
#, javascript-format
msgid "Remove “%s”?"
msgstr "»%s« entfernen?"
#: subprojects/extensions-app/js/main.js:145
msgid ""
"If you remove the extension, you need to return to download it if you want "
"to enable it again"
msgstr ""
"Wenn Sie die Erweiterung entfernen, müssen Sie sie erneut herunterladen, um "
"sie wieder zu aktivieren"
#: subprojects/extensions-app/js/main.js:149
msgid "Remove"
msgstr "Entfernen"
#: subprojects/extensions-app/js/main.js:181
msgid "translator-credits"
msgstr ""
"Tim Sabsch <tim@sabsch.com>\n"
"Christian Kirbach <christian.kirbach@gmail.com>, 2020"
#: subprojects/extensions-app/js/main.js:316
#, javascript-format
msgid "%d extension will be updated on next login."
msgid_plural "%d extensions will be updated on next login."
msgstr[0] "%d Erweiterung wird bei der nächsten Anmeldung aktualisiert."
msgstr[1] "%d Erweiterungen werden bei der nächsten Anmeldung aktualisiert."
#: subprojects/extensions-app/data/ui/extension-row.ui:100
#: subprojects/extensions-tool/src/command-create.c:211
#: subprojects/extensions-tool/src/main.c:173
msgid "Description"
msgstr "Beschreibung"
#: subprojects/extensions-app/data/ui/extension-row.ui:123
#: subprojects/extensions-tool/src/main.c:185
msgid "Version"
msgstr "Version"
#: subprojects/extensions-app/data/ui/extension-row.ui:151
msgid "Author"
msgstr "Autor"
#: subprojects/extensions-app/data/ui/extension-row.ui:175
msgid "Website"
msgstr "Webseite"
#: subprojects/extensions-app/data/ui/extension-row.ui:192
msgid "Remove…"
msgstr "Entfernen …"
#: subprojects/extensions-app/data/ui/extensions-window.ui:8
msgid "Help"
msgstr "Hilfe"
#: subprojects/extensions-app/data/ui/extensions-window.ui:12
msgid "About Extensions"
msgstr "Info zu Erweiterungen"
#: 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>."
msgstr ""
"Besuchen Sie <a href=\"https://extensions.gnome.org\">extensions.gnome.org</"
"a>, um Erweiterungen zu finden und hinzuzufügen."
#: subprojects/extensions-app/data/ui/extensions-window.ui:35
msgid "Warning"
msgstr "Warnung"
#: subprojects/extensions-app/data/ui/extensions-window.ui:46
msgid ""
"Extensions can cause system issues, including performance problems. If you "
"encounter problems with your system, it is recommended to disable all "
"extensions."
msgstr ""
"Erweiterungen können Probleme am System verursachen, darunter auch "
"Leistungsprobleme. Sollten Sie auf Probleme mit Ihrem System stoßen, wird "
"die Deaktivierung aller Erweiterungen empfohlen."
#: subprojects/extensions-app/data/ui/extensions-window.ui:135
msgid "Manually Installed"
msgstr "Manuell installiert"
#: subprojects/extensions-app/data/ui/extensions-window.ui:159
msgid "Built-In"
msgstr "Mitgeliefert"
#: subprojects/extensions-app/data/ui/extensions-window.ui:200
msgid "No Installed Extensions"
msgstr "Keine installierten Erweiterungen"
#: subprojects/extensions-app/data/ui/extensions-window.ui:236
msgid ""
"Were very sorry, but it was not possible to get the list of installed "
"extensions. Make sure you are logged into GNOME and try again."
msgstr ""
"Tut uns sehr leid, wir konnten keine Liste der installierten Erweiterungen "
"aufstellen. Stellen Sie sicher, dass Sie in GNOME angemeldet sind und "
"versuchen Sie es dann erneut."
#: subprojects/extensions-app/data/ui/extensions-window.ui:273
msgid "Extension Updates Ready"
msgstr "Aktualisierungen für Erweiterungen stehen bereit"
#: subprojects/extensions-app/data/ui/extensions-window.ui:289
msgid "Log Out…"
msgstr "Abmelden …"
#. Translators: a file path to an extension directory #. Translators: a file path to an extension directory
#: subprojects/extensions-tool/src/command-create.c:125 #: subprojects/extensions-tool/src/command-create.c:125
#, c-format #, c-format
@ -2872,9 +2872,6 @@ msgstr[1] "%u Eingänge"
msgid "System Sounds" msgid "System Sounds"
msgstr "Systemklänge" msgstr "Systemklänge"
#~ msgid "Copy Error"
#~ msgstr "Kopierfehler"
#~ msgid "Username…" #~ msgid "Username…"
#~ msgstr "Benutzername …" #~ msgstr "Benutzername …"

View File

@ -10,8 +10,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell master\n" "Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2020-03-31 07:15+0000\n" "POT-Creation-Date: 2020-02-21 09:52+0000\n"
"PO-Revision-Date: 2020-05-06 19:54+0100\n" "PO-Revision-Date: 2020-02-23 12:49+0000\n"
"Last-Translator: Bruce Cowan <bruce@bcowan.me.uk>\n" "Last-Translator: Bruce Cowan <bruce@bcowan.me.uk>\n"
"Language-Team: English - United Kingdom <en@li.org>\n" "Language-Team: English - United Kingdom <en@li.org>\n"
"Language: en_GB\n" "Language: en_GB\n"
@ -19,7 +19,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Gtranslator 3.36.0\n" "X-Generator: Gtranslator 3.34.0\n"
"X-Project-Style: gnome\n" "X-Project-Style: gnome\n"
#: data/50-gnome-shell-system.xml:6 #: data/50-gnome-shell-system.xml:6
@ -46,6 +46,15 @@ msgstr "Show all applications"
msgid "Open the application menu" msgid "Open the application menu"
msgstr "Open the application menu" msgstr "Open the application menu"
#: data/org.gnome.Extensions.desktop.in.in:4 js/extensionPrefs/main.js:218
#: js/extensionPrefs/ui/extensions-window.ui:61
msgid "Extensions"
msgstr "Extensions"
#: data/org.gnome.Extensions.desktop.in.in:7
msgid "Configure GNOME Shell Extensions"
msgstr "Configure GNOME Shell Extensions"
#: data/org.gnome.Shell.desktop.in.in:4 #: data/org.gnome.Shell.desktop.in.in:4
msgid "GNOME Shell" msgid "GNOME Shell"
msgstr "GNOME Shell" msgstr "GNOME Shell"
@ -386,12 +395,49 @@ msgstr "Delay focus changes in mouse mode until the pointer stops moving"
msgid "Network Login" msgid "Network Login"
msgstr "Network Login" msgstr "Network Login"
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:36 #: js/extensionPrefs/main.js:140
#: subprojects/extensions-app/data/ui/extensions-window.ui:223 #, javascript-format
msgid "Remove “%s”?"
msgstr "Remove “%s”?"
#: js/extensionPrefs/main.js:141
msgid ""
"If you remove the extension, you need to return to download it if you want "
"to enable it again"
msgstr ""
"If you remove the extension, you need to return to download it if you want "
"to enable it again"
#: js/extensionPrefs/main.js:144 js/ui/audioDeviceSelection.js:57
#: js/ui/components/networkAgent.js:107 js/ui/components/polkitAgent.js:139
#: js/ui/endSessionDialog.js:374 js/ui/extensionDownloader.js:165
#: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386
#: js/ui/status/network.js:913
msgid "Cancel"
msgstr "Cancel"
#: js/extensionPrefs/main.js:145
msgid "Remove"
msgstr "Remove"
#: js/extensionPrefs/main.js:217
msgid "translator-credits"
msgstr ""
"Philip Withnall <philip@tecnocode.co.uk>\n"
"Bruce Cowan <bruce@bcowan.me.uk>\n"
"Chris Leonard <cjl@laptop.org>\n"
"David King <amigadave@amigadave.com>\n"
"Zander Brown <zbrown@gnome.org>"
#: js/extensionPrefs/main.js:219
msgid "Manage your GNOME Extensions"
msgstr "Manage your GNOME Extensions"
#: js/extensionPrefs/main.js:261 js/extensionPrefs/ui/extensions-window.ui:222
msgid "Somethings gone wrong" msgid "Somethings gone wrong"
msgstr "Somethings gone wrong" msgstr "Somethings gone wrong"
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:48 #: js/extensionPrefs/main.js:268
msgid "" msgid ""
"Were very sorry, but theres been a problem: the settings for this " "Were very sorry, but theres been a problem: the settings for this "
"extension cant be displayed. We recommend that you report the issue to the " "extension cant be displayed. We recommend that you report the issue to the "
@ -401,32 +447,113 @@ msgstr ""
"extension cant be displayed. We recommend that you report the issue to the " "extension cant be displayed. We recommend that you report the issue to the "
"extension authors." "extension authors."
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:82 #: js/extensionPrefs/main.js:275
msgid "Technical Details" msgid "Technical Details"
msgstr "Technical Details" msgstr "Technical Details"
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:165 #: js/extensionPrefs/main.js:310
msgid "Copy Error"
msgstr "Copy Error"
#: js/extensionPrefs/main.js:337
msgid "Homepage" msgid "Homepage"
msgstr "Homepage" msgstr "Homepage"
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:166 #: js/extensionPrefs/main.js:338
msgid "Visit extension homepage" msgid "Visit extension homepage"
msgstr "Visit extension homepage" msgstr "Visit extension homepage"
#: js/gdm/authPrompt.js:135 js/ui/audioDeviceSelection.js:57 #: js/extensionPrefs/main.js:449
#: js/ui/components/networkAgent.js:109 js/ui/components/polkitAgent.js:139 #, javascript-format
#: js/ui/endSessionDialog.js:374 js/ui/extensionDownloader.js:181 msgid "%d extension will be updated on next login."
#: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386 msgid_plural "%d extensions will be updated on next login."
#: js/ui/status/network.js:913 subprojects/extensions-app/js/main.js:148 msgstr[0] "%d extension will be updated on next login."
msgid "Cancel" msgstr[1] "%d extensions will be updated on next login."
msgstr "Cancel"
#: js/extensionPrefs/ui/extension-row.ui:100
#: subprojects/extensions-tool/src/command-create.c:211
#: subprojects/extensions-tool/src/main.c:173
msgid "Description"
msgstr "Description"
#: js/extensionPrefs/ui/extension-row.ui:123
#: subprojects/extensions-tool/src/main.c:185
msgid "Version"
msgstr "Version"
#: js/extensionPrefs/ui/extension-row.ui:151
msgid "Author"
msgstr "Author"
#: js/extensionPrefs/ui/extension-row.ui:175
msgid "Website"
msgstr "Website"
#: js/extensionPrefs/ui/extension-row.ui:192
msgid "Remove…"
msgstr "Remove…"
#: js/extensionPrefs/ui/extensions-window.ui:8
msgid "Help"
msgstr "Help"
#: js/extensionPrefs/ui/extensions-window.ui:12
msgid "About Extensions"
msgstr "About Extensions"
#: js/extensionPrefs/ui/extensions-window.ui:27
msgid ""
"To find and add extensions, visit <a href=\"https://extensions.gnome.org"
"\">extensions.gnome.org</a>."
msgstr ""
"To find and add extensions, visit <a href=\"https://extensions.gnome.org"
"\">extensions.gnome.org</a>."
#: js/extensionPrefs/ui/extensions-window.ui:35
msgid "Warning"
msgstr "Warning"
#: js/extensionPrefs/ui/extensions-window.ui:46
msgid ""
"Extensions can cause system issues, including performance problems. If you "
"encounter problems with your system, it is recommended to disable all "
"extensions."
msgstr ""
"Extensions can cause system issues, including performance problems. If you "
"encounter problems with your system, it is recommended to disable all "
"extensions."
#: js/extensionPrefs/ui/extensions-window.ui:133
msgid "Manually Installed"
msgstr "Manually Installed"
#: js/extensionPrefs/ui/extensions-window.ui:157
msgid "Built-In"
msgstr "Built-In"
#: js/extensionPrefs/ui/extensions-window.ui:198
msgid "No Installed Extensions"
msgstr "No Installed Extensions"
#: js/extensionPrefs/ui/extensions-window.ui:234
msgid ""
"Were very sorry, but it was not possible to get the list of installed "
"extensions. Make sure you are logged into GNOME and try again."
msgstr ""
"Were very sorry, but it was not possible to get the list of installed "
"extensions. Make sure you are logged into GNOME and try again."
#: js/extensionPrefs/ui/extensions-window.ui:287
msgid "Log Out…"
msgstr "Log Out…"
#. Cisco LEAP #. Cisco LEAP
#: js/gdm/authPrompt.js:237 js/ui/components/networkAgent.js:204 #: js/gdm/authPrompt.js:236 js/ui/components/networkAgent.js:202
#: js/ui/components/networkAgent.js:220 js/ui/components/networkAgent.js:244 #: js/ui/components/networkAgent.js:218 js/ui/components/networkAgent.js:242
#: js/ui/components/networkAgent.js:265 js/ui/components/networkAgent.js:285 #: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:283
#: js/ui/components/networkAgent.js:295 js/ui/components/polkitAgent.js:277 #: js/ui/components/networkAgent.js:293 js/ui/components/polkitAgent.js:277
#: js/ui/shellMountOperation.js:326 #: js/ui/shellMountOperation.js:326
#| msgid "Password:"
msgid "Password" msgid "Password"
msgstr "Password" msgstr "Password"
@ -448,8 +575,9 @@ msgstr "(e.g., user or %s)"
#. TTLS and PEAP are actually much more complicated, but this complication #. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication #. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one) #. (and don't even care of which one)
#: js/gdm/loginDialog.js:917 js/ui/components/networkAgent.js:240 #: js/gdm/loginDialog.js:917 js/ui/components/networkAgent.js:238
#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281 #: js/ui/components/networkAgent.js:261 js/ui/components/networkAgent.js:279
#| msgid "Username: "
msgid "Username" msgid "Username"
msgstr "Username" msgstr "Username"
@ -630,7 +758,7 @@ msgstr "%A, %H%M"
#: js/misc/util.js:255 #: js/misc/util.js:255
#, no-c-format #, no-c-format
msgid "%B %-d, %H%M" msgid "%B %-d, %H%M"
msgstr "%-d %B, %H%M" msgstr "%d %B, %H%M"
#. Translators: this is the month name, day number, year #. Translators: this is the month name, day number, year
#. number followed by a time string in 24h format. #. number followed by a time string in 24h format.
@ -638,7 +766,7 @@ msgstr "%-d %B, %H%M"
#: js/misc/util.js:261 #: js/misc/util.js:261
#, no-c-format #, no-c-format
msgid "%B %-d %Y, %H%M" msgid "%B %-d %Y, %H%M"
msgstr "%-d %B %Y, %H%M" msgstr "%d %B %Y, %H%M"
#. Show only the time if date is on today #. Show only the time if date is on today
#. eslint-disable-line no-lonely-if #. eslint-disable-line no-lonely-if
@ -667,7 +795,7 @@ msgstr "%A, %l:%M %p"
#: js/misc/util.js:284 #: js/misc/util.js:284
#, no-c-format #, no-c-format
msgid "%B %-d, %l%M %p" msgid "%B %-d, %l%M %p"
msgstr "%-d %B, %l%M %p" msgstr "%d %B, %l%M %p"
#. Translators: this is the month name, day number, year #. Translators: this is the month name, day number, year
#. number followed by a time string in 12h format. #. number followed by a time string in 12h format.
@ -675,7 +803,7 @@ msgstr "%-d %B, %l%M %p"
#: js/misc/util.js:290 #: js/misc/util.js:290
#, no-c-format #, no-c-format
msgid "%B %-d %Y, %l%M %p" msgid "%B %-d %Y, %l%M %p"
msgstr "%-d %B %Y, %l%M %p" msgstr "%d %B %Y, %l%M %p"
#. TRANSLATORS: this is the title of the wifi captive portal login window #. TRANSLATORS: this is the title of the wifi captive portal login window
#: js/portalHelper/main.js:41 #: js/portalHelper/main.js:41
@ -700,44 +828,44 @@ msgstr "Deny Access"
msgid "Grant Access" msgid "Grant Access"
msgstr "Grant Access" msgstr "Grant Access"
#: js/ui/appDisplay.js:932 #: js/ui/appDisplay.js:906
msgid "Unnamed Folder" msgid "Unnamed Folder"
msgstr "Unnamed Folder" msgstr "Unnamed Folder"
#: js/ui/appDisplay.js:955 #: js/ui/appDisplay.js:929
msgid "Frequently used applications will appear here" msgid "Frequently used applications will appear here"
msgstr "Frequently used applications will appear here" msgstr "Frequently used applications will appear here"
#: js/ui/appDisplay.js:1090 #: js/ui/appDisplay.js:1064
msgid "Frequent" msgid "Frequent"
msgstr "Frequent" msgstr "Frequent"
#: js/ui/appDisplay.js:1097 #: js/ui/appDisplay.js:1071
msgid "All" msgid "All"
msgstr "All" msgstr "All"
#. Translators: This is the heading of a list of open windows #. Translators: This is the heading of a list of open windows
#: js/ui/appDisplay.js:2473 js/ui/panel.js:75 #: js/ui/appDisplay.js:2450 js/ui/panel.js:75
msgid "Open Windows" msgid "Open Windows"
msgstr "Open Windows" msgstr "Open Windows"
#: js/ui/appDisplay.js:2493 js/ui/panel.js:82 #: js/ui/appDisplay.js:2470 js/ui/panel.js:82
msgid "New Window" msgid "New Window"
msgstr "New Window" msgstr "New Window"
#: js/ui/appDisplay.js:2504 #: js/ui/appDisplay.js:2481
msgid "Launch using Dedicated Graphics Card" msgid "Launch using Dedicated Graphics Card"
msgstr "Launch using Dedicated Graphics Card" msgstr "Launch using Dedicated Graphics Card"
#: js/ui/appDisplay.js:2532 js/ui/dash.js:239 #: js/ui/appDisplay.js:2509 js/ui/dash.js:239
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Remove from Favourites" msgstr "Remove from Favourites"
#: js/ui/appDisplay.js:2538 #: js/ui/appDisplay.js:2515
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Add to Favourites" msgstr "Add to Favourites"
#: js/ui/appDisplay.js:2548 js/ui/panel.js:93 #: js/ui/appDisplay.js:2525 js/ui/panel.js:93
msgid "Show Details" msgid "Show Details"
msgstr "Show Details" msgstr "Show Details"
@ -767,7 +895,7 @@ msgstr "Headphones"
msgid "Headset" msgid "Headset"
msgstr "Headset" msgstr "Headset"
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:270 #: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:269
msgid "Microphone" msgid "Microphone"
msgstr "Microphone" msgstr "Microphone"
@ -885,30 +1013,30 @@ msgid "All Day"
msgstr "All Day" msgstr "All Day"
#. 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/calendar.js:868 #: js/ui/calendar.js:867
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %-d" msgid "%A, %B %-d"
msgstr "%A, %-d %B" msgstr "%A, %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/calendar.js:871 #: js/ui/calendar.js:870
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %-d, %Y" msgid "%A, %B %-d, %Y"
msgstr "%A, %-d %B, %Y" msgstr "%A, %d %B, %Y"
#: js/ui/calendar.js:1100 #: js/ui/calendar.js:1096
msgid "No Notifications" msgid "No Notifications"
msgstr "No Notifications" msgstr "No Notifications"
#: js/ui/calendar.js:1103 #: js/ui/calendar.js:1099
msgid "No Events" msgid "No Events"
msgstr "No Events" msgstr "No Events"
#: js/ui/calendar.js:1157 #: js/ui/calendar.js:1153
msgid "Do Not Disturb" msgid "Do Not Disturb"
msgstr "Do Not Disturb" msgstr "Do Not Disturb"
#: js/ui/calendar.js:1176 #: js/ui/calendar.js:1167
msgid "Clear" msgid "Clear"
msgstr "Clear" msgstr "Clear"
@ -955,39 +1083,43 @@ msgstr "The installed udisks version does not support the PIM setting"
msgid "Open with %s" msgid "Open with %s"
msgstr "Open with %s" msgstr "Open with %s"
#: js/ui/components/networkAgent.js:91 #: js/ui/components/networkAgent.js:89
msgid "" msgid ""
"Alternatively you can connect by pushing the “WPS” button on your router." "Alternatively you can connect by pushing the “WPS” button on your router."
msgstr "" msgstr ""
"Alternatively you can connect by pushing the “WPS” button on your router." "Alternatively you can connect by pushing the “WPS” button on your router."
#: js/ui/components/networkAgent.js:103 js/ui/status/network.js:223 #: js/ui/components/networkAgent.js:101 js/ui/status/network.js:223
#: js/ui/status/network.js:314 js/ui/status/network.js:916 #: js/ui/status/network.js:314 js/ui/status/network.js:916
msgid "Connect" msgid "Connect"
msgstr "Connect" msgstr "Connect"
#: js/ui/components/networkAgent.js:210 #: js/ui/components/networkAgent.js:208
#| msgid "Key: "
msgid "Key" msgid "Key"
msgstr "Key" msgstr "Key"
#: js/ui/components/networkAgent.js:248 js/ui/components/networkAgent.js:271 #: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:269
#| msgid "Private key password: "
msgid "Private key password" msgid "Private key password"
msgstr "Private key password" msgstr "Private key password"
#: js/ui/components/networkAgent.js:269 #: js/ui/components/networkAgent.js:267
#| msgid "Identity: "
msgid "Identity" msgid "Identity"
msgstr "Identity" msgstr "Identity"
#: js/ui/components/networkAgent.js:283 #: js/ui/components/networkAgent.js:281
#| msgid "Service: "
msgid "Service" msgid "Service"
msgstr "Service" msgstr "Service"
#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:340 #: js/ui/components/networkAgent.js:310 js/ui/components/networkAgent.js:338
#: js/ui/components/networkAgent.js:679 js/ui/components/networkAgent.js:700 #: js/ui/components/networkAgent.js:685 js/ui/components/networkAgent.js:706
msgid "Authentication required" msgid "Authentication required"
msgstr "Authentication required" msgstr "Authentication required"
#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:680 #: js/ui/components/networkAgent.js:311 js/ui/components/networkAgent.js:686
#, javascript-format #, javascript-format
msgid "" msgid ""
"Passwords or encryption keys are required to access the wireless network " "Passwords or encryption keys are required to access the wireless network "
@ -996,42 +1128,44 @@ msgstr ""
"Passwords or encryption keys are required to access the wireless network " "Passwords or encryption keys are required to access the wireless network "
"“%s”." "“%s”."
#: js/ui/components/networkAgent.js:317 js/ui/components/networkAgent.js:684 #: js/ui/components/networkAgent.js:315 js/ui/components/networkAgent.js:690
msgid "Wired 802.1X authentication" msgid "Wired 802.1X authentication"
msgstr "Wired 802.1X authentication" msgstr "Wired 802.1X authentication"
#: js/ui/components/networkAgent.js:319 #: js/ui/components/networkAgent.js:317
#| msgid "Network name: "
msgid "Network name" msgid "Network name"
msgstr "Network name" msgstr "Network name"
#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:688 #: js/ui/components/networkAgent.js:322 js/ui/components/networkAgent.js:694
msgid "DSL authentication" msgid "DSL authentication"
msgstr "DSL authentication" msgstr "DSL authentication"
#: js/ui/components/networkAgent.js:331 js/ui/components/networkAgent.js:693 #: js/ui/components/networkAgent.js:329 js/ui/components/networkAgent.js:699
msgid "PIN code required" msgid "PIN code required"
msgstr "PIN code required" msgstr "PIN code required"
#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:694 #: js/ui/components/networkAgent.js:330 js/ui/components/networkAgent.js:700
msgid "PIN code is needed for the mobile broadband device" msgid "PIN code is needed for the mobile broadband device"
msgstr "PIN code is needed for the mobile broadband device" msgstr "PIN code is needed for the mobile broadband device"
#: js/ui/components/networkAgent.js:333 #: js/ui/components/networkAgent.js:331
#| msgid "PIN: "
msgid "PIN" msgid "PIN"
msgstr "PIN" msgstr "PIN"
#: js/ui/components/networkAgent.js:341 js/ui/components/networkAgent.js:685 #: js/ui/components/networkAgent.js:339 js/ui/components/networkAgent.js:691
#: js/ui/components/networkAgent.js:689 js/ui/components/networkAgent.js:701 #: js/ui/components/networkAgent.js:695 js/ui/components/networkAgent.js:707
#: js/ui/components/networkAgent.js:705 #: js/ui/components/networkAgent.js:711
#, javascript-format #, javascript-format
msgid "A password is required to connect to “%s”." msgid "A password is required to connect to “%s”."
msgstr "A password is required to connect to “%s”." msgstr "A password is required to connect to “%s”."
#: js/ui/components/networkAgent.js:668 js/ui/status/network.js:1691 #: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1691
msgid "Network Manager" msgid "Network Manager"
msgstr "Network Manager" msgstr "Network Manager"
#: js/ui/components/networkAgent.js:704 #: js/ui/components/networkAgent.js:710
msgid "VPN password" msgid "VPN password"
msgstr "VPN password" msgstr "VPN password"
@ -1057,7 +1191,7 @@ msgstr "Sorry, that didnt work. Please try again."
#. Translators: this is the other person changing their old IM name to their new #. Translators: this is the other person changing their old IM name to their new
#. IM name. #. IM name.
#: js/ui/components/telepathyClient.js:823 #: js/ui/components/telepathyClient.js:787
#, javascript-format #, javascript-format
msgid "%s is now known as %s" msgid "%s is now known as %s"
msgstr "%s is now known as %s" msgstr "%s is now known as %s"
@ -1083,7 +1217,7 @@ msgstr "Dash"
#. #.
#: js/ui/dateMenu.js:75 #: js/ui/dateMenu.js:75
msgid "%B %-d %Y" msgid "%B %-d %Y"
msgstr "%-d %B %Y" msgstr "%e %B %Y"
#. Translators: This is the accessible name of the date button shown #. Translators: This is the accessible name of the date button shown
#. * below the time in the shell; it should combine the weekday and the #. * below the time in the shell; it should combine the weekday and the
@ -1101,106 +1235,106 @@ msgstr "Add world clocks…"
msgid "World Clocks" msgid "World Clocks"
msgstr "World Clocks" msgstr "World Clocks"
#: js/ui/dateMenu.js:289 #: js/ui/dateMenu.js:276
msgid "Weather" msgid "Weather"
msgstr "Weather" msgstr "Weather"
#: js/ui/dateMenu.js:418 #: js/ui/dateMenu.js:391
msgid "Select a location…" msgid "Select a location…"
msgstr "Select a location…" msgstr "Select a location…"
#: js/ui/dateMenu.js:426 #: js/ui/dateMenu.js:404
msgid "Loading…" msgid "Loading…"
msgstr "Loading…" msgstr "Loading…"
#: js/ui/dateMenu.js:436 #: js/ui/dateMenu.js:414
msgid "Go online for weather information" msgid "Go online for weather information"
msgstr "Go online for weather information" msgstr "Go online for weather information"
#: js/ui/dateMenu.js:438 #: js/ui/dateMenu.js:416
msgid "Weather information is currently unavailable" msgid "Weather information is currently unavailable"
msgstr "Weather information is currently unavailable" msgstr "Weather information is currently unavailable"
#: js/ui/endSessionDialog.js:39 #: js/ui/endSessionDialog.js:37
#, javascript-format #, javascript-format
msgctxt "title" msgctxt "title"
msgid "Log Out %s" msgid "Log Out %s"
msgstr "Log Out %s" msgstr "Log Out %s"
#: js/ui/endSessionDialog.js:40 #: js/ui/endSessionDialog.js:38
msgctxt "title" msgctxt "title"
msgid "Log Out" msgid "Log Out"
msgstr "Log Out" msgstr "Log Out"
#: js/ui/endSessionDialog.js:42 #: js/ui/endSessionDialog.js:40
#, javascript-format #, javascript-format
msgid "%s will be logged out automatically in %d second." msgid "%s will be logged out automatically in %d second."
msgid_plural "%s will be logged out automatically in %d seconds." msgid_plural "%s will be logged out automatically in %d seconds."
msgstr[0] "%s will be logged out automatically in %d second." msgstr[0] "%s will be logged out automatically in %d second."
msgstr[1] "%s will be logged out automatically in %d seconds." msgstr[1] "%s will be logged out automatically in %d seconds."
#: js/ui/endSessionDialog.js:47 #: js/ui/endSessionDialog.js:45
#, javascript-format #, javascript-format
msgid "You will be logged out automatically in %d second." msgid "You will be logged out automatically in %d second."
msgid_plural "You will be logged out automatically in %d seconds." msgid_plural "You will be logged out automatically in %d seconds."
msgstr[0] "You will be logged out automatically in %d second." msgstr[0] "You will be logged out automatically in %d second."
msgstr[1] "You will be logged out automatically in %d seconds." msgstr[1] "You will be logged out automatically in %d seconds."
#: js/ui/endSessionDialog.js:53 #: js/ui/endSessionDialog.js:51
msgctxt "button" msgctxt "button"
msgid "Log Out" msgid "Log Out"
msgstr "Log Out" msgstr "Log Out"
#: js/ui/endSessionDialog.js:58 #: js/ui/endSessionDialog.js:56
msgctxt "title" msgctxt "title"
msgid "Power Off" msgid "Power Off"
msgstr "Power Off" msgstr "Power Off"
#: js/ui/endSessionDialog.js:59 #: js/ui/endSessionDialog.js:57
msgctxt "title" msgctxt "title"
msgid "Install Updates & Power Off" msgid "Install Updates & Power Off"
msgstr "Install Updates & Power Off" msgstr "Install Updates & Power Off"
#: js/ui/endSessionDialog.js:61 #: js/ui/endSessionDialog.js:59
#, javascript-format #, javascript-format
msgid "The system will power off automatically in %d second." msgid "The system will power off automatically in %d second."
msgid_plural "The system will power off automatically in %d seconds." msgid_plural "The system will power off automatically in %d seconds."
msgstr[0] "The system will power off automatically in %d second." msgstr[0] "The system will power off automatically in %d second."
msgstr[1] "The system will power off automatically in %d seconds." msgstr[1] "The system will power off automatically in %d seconds."
#: js/ui/endSessionDialog.js:65 #: js/ui/endSessionDialog.js:63
msgctxt "checkbox" msgctxt "checkbox"
msgid "Install pending software updates" msgid "Install pending software updates"
msgstr "Install pending software updates" msgstr "Install pending software updates"
#: js/ui/endSessionDialog.js:68 js/ui/endSessionDialog.js:84 #: js/ui/endSessionDialog.js:66 js/ui/endSessionDialog.js:82
msgctxt "button" msgctxt "button"
msgid "Restart" msgid "Restart"
msgstr "Restart" msgstr "Restart"
#: js/ui/endSessionDialog.js:70 #: js/ui/endSessionDialog.js:68
msgctxt "button" msgctxt "button"
msgid "Power Off" msgid "Power Off"
msgstr "Power Off" msgstr "Power Off"
#: js/ui/endSessionDialog.js:76 #: js/ui/endSessionDialog.js:74
msgctxt "title" msgctxt "title"
msgid "Restart" msgid "Restart"
msgstr "Restart" msgstr "Restart"
#: js/ui/endSessionDialog.js:78 #: js/ui/endSessionDialog.js:76
#, javascript-format #, javascript-format
msgid "The system will restart automatically in %d second." msgid "The system will restart automatically in %d second."
msgid_plural "The system will restart automatically in %d seconds." msgid_plural "The system will restart automatically in %d seconds."
msgstr[0] "The system will restart automatically in %d second." msgstr[0] "The system will restart automatically in %d second."
msgstr[1] "The system will restart automatically in %d seconds." msgstr[1] "The system will restart automatically in %d seconds."
#: js/ui/endSessionDialog.js:91 #: js/ui/endSessionDialog.js:89
msgctxt "title" msgctxt "title"
msgid "Restart & Install Updates" msgid "Restart & Install Updates"
msgstr "Restart & Install Updates" msgstr "Restart & Install Updates"
#: js/ui/endSessionDialog.js:93 #: js/ui/endSessionDialog.js:91
#, javascript-format #, javascript-format
msgid "The system will automatically restart and install updates in %d second." msgid "The system will automatically restart and install updates in %d second."
msgid_plural "" msgid_plural ""
@ -1210,22 +1344,22 @@ msgstr[0] ""
msgstr[1] "" msgstr[1] ""
"The system will automatically restart and install updates in %d seconds." "The system will automatically restart and install updates in %d seconds."
#: js/ui/endSessionDialog.js:99 js/ui/endSessionDialog.js:118 #: js/ui/endSessionDialog.js:97 js/ui/endSessionDialog.js:116
msgctxt "button" msgctxt "button"
msgid "Restart &amp; Install" msgid "Restart &amp; Install"
msgstr "Restart &amp; Install" msgstr "Restart &amp; Install"
#: js/ui/endSessionDialog.js:100 #: js/ui/endSessionDialog.js:98
msgctxt "button" msgctxt "button"
msgid "Install &amp; Power Off" msgid "Install &amp; Power Off"
msgstr "Install &amp; Power Off" msgstr "Install &amp; Power Off"
#: js/ui/endSessionDialog.js:101 #: js/ui/endSessionDialog.js:99
msgctxt "checkbox" msgctxt "checkbox"
msgid "Power off after updates are installed" msgid "Power off after updates are installed"
msgstr "Power off after updates are installed" msgstr "Power off after updates are installed"
#: js/ui/endSessionDialog.js:108 #: js/ui/endSessionDialog.js:106
msgctxt "title" msgctxt "title"
msgid "Restart & Install Upgrade" msgid "Restart & Install Upgrade"
msgstr "Restart & Install Upgrade" msgstr "Restart & Install Upgrade"
@ -1233,7 +1367,7 @@ msgstr "Restart & Install Upgrade"
#. Translators: This is the text displayed for system upgrades in the #. Translators: This is the text displayed for system upgrades in the
#. shut down dialog. First %s gets replaced with the distro name and #. shut down dialog. First %s gets replaced with the distro name and
#. second %s with the distro version to upgrade to #. second %s with the distro version to upgrade to
#: js/ui/endSessionDialog.js:113 #: js/ui/endSessionDialog.js:111
#, javascript-format #, javascript-format
msgid "" msgid ""
"%s %s will be installed after restart. Upgrade installation can take a long " "%s %s will be installed after restart. Upgrade installation can take a long "
@ -1242,15 +1376,15 @@ msgstr ""
"%s %s will be installed after restart. Upgrade installation can take a long " "%s %s will be installed after restart. Upgrade installation can take a long "
"time: ensure that you have backed up and that the computer is plugged in." "time: ensure that you have backed up and that the computer is plugged in."
#: js/ui/endSessionDialog.js:261 #: 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 "Running on battery power: Please plug in before installing updates." msgstr "Running on battery power: Please plug in before installing updates."
#: js/ui/endSessionDialog.js:270 #: js/ui/endSessionDialog.js:268
msgid "Some applications are busy or have unsaved work" msgid "Some applications are busy or have unsaved work"
msgstr "Some applications are busy or have unsaved work" msgstr "Some applications are busy or have unsaved work"
#: js/ui/endSessionDialog.js:275 #: js/ui/endSessionDialog.js:273
msgid "Other users are logged in" msgid "Other users are logged in"
msgstr "Other users are logged in" msgstr "Other users are logged in"
@ -1266,24 +1400,24 @@ msgstr "%s (remote)"
msgid "%s (console)" msgid "%s (console)"
msgstr "%s (console)" msgstr "%s (console)"
#: js/ui/extensionDownloader.js:185 #: js/ui/extensionDownloader.js:169
msgid "Install" msgid "Install"
msgstr "Install" msgstr "Install"
#: js/ui/extensionDownloader.js:191 #: js/ui/extensionDownloader.js:175
msgid "Install Extension" msgid "Install Extension"
msgstr "Install Extension" msgstr "Install Extension"
#: js/ui/extensionDownloader.js:192 #: js/ui/extensionDownloader.js:176
#, javascript-format #, javascript-format
msgid "Download and install “%s” from extensions.gnome.org?" msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "Download and install “%s” from extensions.gnome.org?" msgstr "Download and install “%s” from extensions.gnome.org?"
#: js/ui/extensionSystem.js:233 #: js/ui/extensionSystem.js:228
msgid "Extension Updates Available" msgid "Extension Updates Available"
msgstr "Extension Updates Available" msgstr "Extension Updates Available"
#: js/ui/extensionSystem.js:234 #: js/ui/extensionSystem.js:229
msgid "Extension updates are ready to be installed." msgid "Extension updates are ready to be installed."
msgstr "Extension updates are ready to be installed." msgstr "Extension updates are ready to be installed."
@ -1430,11 +1564,11 @@ msgstr "View Source"
msgid "Web Page" msgid "Web Page"
msgstr "Web Page" msgstr "Web Page"
#: js/ui/main.js:277 #: js/ui/main.js:269
msgid "Logged in as a privileged user" msgid "Logged in as a privileged user"
msgstr "Logged in as a privileged user" msgstr "Logged in as a privileged user"
#: js/ui/main.js:278 #: js/ui/main.js:270
msgid "" msgid ""
"Running a session as a privileged user should be avoided for security " "Running a session as a privileged user should be avoided for security "
"reasons. If possible, you should log in as a normal user." "reasons. If possible, you should log in as a normal user."
@ -1442,15 +1576,15 @@ msgstr ""
"Running a session as a privileged user should be avoided for security " "Running a session as a privileged user should be avoided for security "
"reasons. If possible, you should log in as a normal user." "reasons. If possible, you should log in as a normal user."
#: js/ui/main.js:317 #: js/ui/main.js:276
msgid "Screen Lock disabled" msgid "Screen Lock disabled"
msgstr "Screen Lock disabled" msgstr "Screen Lock disabled"
#: js/ui/main.js:318 #: js/ui/main.js:277
msgid "Screen Locking requires the GNOME display manager." msgid "Screen Locking requires the GNOME display manager."
msgstr "Screen Locking requires the GNOME display manager." msgstr "Screen Locking requires the GNOME display manager."
#: js/ui/messageTray.js:1551 #: js/ui/messageTray.js:1554
msgid "System Information" msgid "System Information"
msgstr "System Information" msgstr "System Information"
@ -1477,6 +1611,7 @@ msgstr "Overview"
#. active; it should not exceed ~30 #. active; it should not exceed ~30
#. characters. #. characters.
#: js/ui/overview.js:107 #: js/ui/overview.js:107
#| msgid "Type to search…"
msgid "Type to search" msgid "Type to search"
msgstr "Type to search" msgstr "Type to search"
@ -1534,12 +1669,12 @@ msgstr "Quit"
msgid "Activities" msgid "Activities"
msgstr "Activities" msgstr "Activities"
#: js/ui/panel.js:713 #: js/ui/panel.js:707
msgctxt "System menu in the top bar" msgctxt "System menu in the top bar"
msgid "System" msgid "System"
msgstr "System" msgstr "System"
#: js/ui/panel.js:826 #: js/ui/panel.js:820
msgid "Top Bar" msgid "Top Bar"
msgstr "Top Bar" msgstr "Top Bar"
@ -1634,6 +1769,7 @@ msgstr ""
"To unlock a volume that uses keyfiles, use the <i>%s</i> utility instead." "To unlock a volume that uses keyfiles, use the <i>%s</i> utility instead."
#: js/ui/shellMountOperation.js:306 #: js/ui/shellMountOperation.js:306
#| msgid "Enter PIM Number…"
msgid "PIM Number" msgid "PIM Number"
msgstr "PIM Number" msgstr "PIM Number"
@ -1656,13 +1792,13 @@ msgid "The PIM must be a number or empty."
msgstr "The PIM must be a number or empty." msgstr "The PIM must be a number or empty."
#. Translators: %s is the Disks application #. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:465 #: js/ui/shellMountOperation.js:469
#, javascript-format #, javascript-format
msgid "Unable to start %s" msgid "Unable to start %s"
msgstr "Unable to start %s" msgstr "Unable to start %s"
#. Translators: %s is the Disks application #. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:467 #: js/ui/shellMountOperation.js:471
#, javascript-format #, javascript-format
msgid "Couldnt find the %s application" msgid "Couldnt find the %s application"
msgstr "Couldnt find the %s application" msgstr "Couldnt find the %s application"
@ -2135,11 +2271,11 @@ msgstr "Thunderbolt authorisation error"
msgid "Could not authorize the Thunderbolt device: %s" msgid "Could not authorize the Thunderbolt device: %s"
msgstr "Could not authorise the Thunderbolt device: %s" msgstr "Could not authorise the Thunderbolt device: %s"
#: js/ui/status/volume.js:151 #: js/ui/status/volume.js:150
msgid "Volume changed" msgid "Volume changed"
msgstr "Volume changed" msgstr "Volume changed"
#: js/ui/status/volume.js:222 #: js/ui/status/volume.js:221
msgid "Volume" msgid "Volume"
msgstr "Volume" msgstr "Volume"
@ -2173,26 +2309,24 @@ msgstr "Built-in Only"
#. Translators: This is a time format for a date in #. Translators: This is a time format for a date in
#. long format #. long format
#: js/ui/unlockDialog.js:371 #: js/ui/unlockDialog.js:372
#| msgctxt "calendar heading"
#| msgid "%A, %B %-d"
msgid "%A %B %-d" msgid "%A %B %-d"
msgstr "%A %-d %B" msgstr "%A %-d %B"
#: js/ui/unlockDialog.js:377 #: js/ui/unlockDialog.js:378
msgid "Swipe up to unlock" msgid "Swipe up to unlock"
msgstr "Swipe up to unlock" msgstr "Swipe up to unlock"
#: js/ui/unlockDialog.js:378 #: js/ui/unlockDialog.js:379
msgid "Click or press a key to unlock" msgid "Click or press a key to unlock"
msgstr "Click or press a key to unlock" msgstr "Click or press a key to unlock"
#: js/ui/unlockDialog.js:550 #: js/ui/unlockDialog.js:552
msgid "Unlock Window" msgid "Unlock Window"
msgstr "Unlock Window" msgstr "Unlock Window"
#: js/ui/unlockDialog.js:559
msgid "Log in as another user"
msgstr "Log in as another user"
#: js/ui/viewSelector.js:181 #: js/ui/viewSelector.js:181
msgid "Applications" msgid "Applications"
msgstr "Applications" msgstr "Applications"
@ -2308,19 +2442,19 @@ msgstr "Close"
msgid "Evolution Calendar" msgid "Evolution Calendar"
msgstr "Evolution Calendar" msgstr "Evolution Calendar"
#: src/main.c:458 subprojects/extensions-tool/src/main.c:249 #: src/main.c:460 subprojects/extensions-tool/src/main.c:249
msgid "Print version" msgid "Print version"
msgstr "Print version" msgstr "Print version"
#: src/main.c:464 #: src/main.c:466
msgid "Mode used by GDM for login screen" msgid "Mode used by GDM for login screen"
msgstr "Mode used by GDM for login screen" msgstr "Mode used by GDM for login screen"
#: src/main.c:470 #: src/main.c:472
msgid "Use a specific mode, e.g. “gdm” for login screen" msgid "Use a specific mode, e.g. “gdm” for login screen"
msgstr "Use a specific mode, e.g. “gdm” for login screen" msgstr "Use a specific mode, e.g. “gdm” for login screen"
#: src/main.c:476 #: src/main.c:478
msgid "List possible modes" msgid "List possible modes"
msgstr "List possible modes" msgstr "List possible modes"
@ -2346,140 +2480,6 @@ msgstr "Password cannot be blank"
msgid "Authentication dialog was dismissed by the user" msgid "Authentication dialog was dismissed by the user"
msgstr "Authentication dialogue was dismissed by the user" msgstr "Authentication dialogue was dismissed by the user"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:5
#: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:4
#: subprojects/extensions-app/js/main.js:182
#: subprojects/extensions-app/data/ui/extensions-window.ui:61
msgid "Extensions"
msgstr "Extensions"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:6
#: subprojects/extensions-app/js/main.js:183
msgid "Manage your GNOME Extensions"
msgstr "Manage your GNOME Extensions"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:35
msgid ""
"GNOME Extensions handles updating extensions, configuring extension "
"preferences and removing or disabling unwanted extensions."
msgstr ""
"GNOME Extensions handles updating extensions, configuring extension "
"preferences and removing or disabling unwanted extensions."
#: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:7
msgid "Configure GNOME Shell Extensions"
msgstr "Configure GNOME Shell Extensions"
#: subprojects/extensions-app/js/main.js:144
#, javascript-format
msgid "Remove “%s”?"
msgstr "Remove “%s”?"
#: subprojects/extensions-app/js/main.js:145
msgid ""
"If you remove the extension, you need to return to download it if you want "
"to enable it again"
msgstr ""
"If you remove the extension, you need to return to download it if you want "
"to enable it again"
#: subprojects/extensions-app/js/main.js:149
msgid "Remove"
msgstr "Remove"
#: subprojects/extensions-app/js/main.js:181
msgid "translator-credits"
msgstr ""
"Philip Withnall <philip@tecnocode.co.uk>\n"
"Bruce Cowan <bruce@bcowan.me.uk>\n"
"Chris Leonard <cjl@laptop.org>\n"
"David King <amigadave@amigadave.com>\n"
"Zander Brown <zbrown@gnome.org>"
#: subprojects/extensions-app/js/main.js:316
#, javascript-format
msgid "%d extension will be updated on next login."
msgid_plural "%d extensions will be updated on next login."
msgstr[0] "%d extension will be updated on next login."
msgstr[1] "%d extensions will be updated on next login."
#: subprojects/extensions-app/data/ui/extension-row.ui:100
#: subprojects/extensions-tool/src/command-create.c:211
#: subprojects/extensions-tool/src/main.c:173
msgid "Description"
msgstr "Description"
#: subprojects/extensions-app/data/ui/extension-row.ui:123
#: subprojects/extensions-tool/src/main.c:185
msgid "Version"
msgstr "Version"
#: subprojects/extensions-app/data/ui/extension-row.ui:151
msgid "Author"
msgstr "Author"
#: subprojects/extensions-app/data/ui/extension-row.ui:175
msgid "Website"
msgstr "Website"
#: subprojects/extensions-app/data/ui/extension-row.ui:192
msgid "Remove…"
msgstr "Remove…"
#: subprojects/extensions-app/data/ui/extensions-window.ui:8
msgid "Help"
msgstr "Help"
#: subprojects/extensions-app/data/ui/extensions-window.ui:12
msgid "About Extensions"
msgstr "About 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>."
msgstr ""
"To find and add extensions, visit <a href=\"https://extensions.gnome.org"
"\">extensions.gnome.org</a>."
#: subprojects/extensions-app/data/ui/extensions-window.ui:35
msgid "Warning"
msgstr "Warning"
#: subprojects/extensions-app/data/ui/extensions-window.ui:46
msgid ""
"Extensions can cause system issues, including performance problems. If you "
"encounter problems with your system, it is recommended to disable all "
"extensions."
msgstr ""
"Extensions can cause system issues, including performance problems. If you "
"encounter problems with your system, it is recommended to disable all "
"extensions."
#: subprojects/extensions-app/data/ui/extensions-window.ui:134
msgid "Manually Installed"
msgstr "Manually Installed"
#: subprojects/extensions-app/data/ui/extensions-window.ui:158
msgid "Built-In"
msgstr "Built-In"
#: subprojects/extensions-app/data/ui/extensions-window.ui:199
msgid "No Installed Extensions"
msgstr "No Installed Extensions"
#: subprojects/extensions-app/data/ui/extensions-window.ui:235
msgid ""
"Were very sorry, but it was not possible to get the list of installed "
"extensions. Make sure you are logged into GNOME and try again."
msgstr ""
"Were very sorry, but it was not possible to get the list of installed "
"extensions. Make sure you are logged into GNOME and try again."
#: subprojects/extensions-app/data/ui/extensions-window.ui:288
msgid "Log Out…"
msgstr "Log Out…"
#. Translators: a file path to an extension directory #. Translators: a file path to an extension directory
#: subprojects/extensions-tool/src/command-create.c:125 #: subprojects/extensions-tool/src/command-create.c:125
#, c-format #, c-format
@ -2627,6 +2627,7 @@ msgid "Show extensions with preferences"
msgstr "Show extensions with preferences" msgstr "Show extensions with preferences"
#: subprojects/extensions-tool/src/command-list.c:140 #: subprojects/extensions-tool/src/command-list.c:140
#| msgid "Show extensions with preferences"
msgid "Show extensions with updates" msgid "Show extensions with updates"
msgstr "Show extensions with updates" msgstr "Show extensions with updates"
@ -2817,9 +2818,6 @@ msgstr[1] "%u Inputs"
msgid "System Sounds" msgid "System Sounds"
msgstr "System Sounds" msgstr "System Sounds"
#~ msgid "Copy Error"
#~ msgstr "Copy Error"
#~ msgid "Next" #~ msgid "Next"
#~ msgstr "Next" #~ msgstr "Next"
@ -2846,6 +2844,9 @@ msgstr "System Sounds"
#~ msgstr[0] "%d new notification" #~ msgstr[0] "%d new notification"
#~ msgstr[1] "%d new notifications" #~ msgstr[1] "%d new notifications"
#~ msgid "Log in as another user"
#~ msgstr "Log in as another user"
#~| msgid "Shell Extensions" #~| msgid "Shell Extensions"
#~ msgid "org.gnome.Extensions" #~ msgid "org.gnome.Extensions"
#~ msgstr "org.gnome.Extensions" #~ msgstr "org.gnome.Extensions"

1262
po/eo.po

File diff suppressed because it is too large Load Diff

943
po/es.po

File diff suppressed because it is too large Load Diff

790
po/eu.po

File diff suppressed because it is too large Load Diff

708
po/fa.po

File diff suppressed because it is too large Load Diff

161
po/fi.po
View File

@ -25,8 +25,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell\n" "Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2020-05-15 03:04+0000\n" "POT-Creation-Date: 2020-03-31 07:15+0000\n"
"PO-Revision-Date: 2020-05-16 14:02+0300\n" "PO-Revision-Date: 2020-04-02 12:43+0300\n"
"Last-Translator: Jiri Grönroos <jiri.gronroos+l10n@iki.fi>\n" "Last-Translator: Jiri Grönroos <jiri.gronroos+l10n@iki.fi>\n"
"Language-Team: suomi <lokalisointi-lista@googlegroups.com>\n" "Language-Team: suomi <lokalisointi-lista@googlegroups.com>\n"
"Language: fi\n" "Language: fi\n"
@ -421,7 +421,7 @@ msgid "Network Login"
msgstr "Verkkokirjautuminen" msgstr "Verkkokirjautuminen"
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:36 #: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:36
#: subprojects/extensions-app/data/ui/extensions-window.ui:224 #: subprojects/extensions-app/data/ui/extensions-window.ui:223
msgid "Somethings gone wrong" msgid "Somethings gone wrong"
msgstr "Jokin meni pieleen" msgstr "Jokin meni pieleen"
@ -448,7 +448,7 @@ msgstr "Käy laajennuksen verkkosivulla"
#: js/gdm/authPrompt.js:135 js/ui/audioDeviceSelection.js:57 #: js/gdm/authPrompt.js:135 js/ui/audioDeviceSelection.js:57
#: js/ui/components/networkAgent.js:109 js/ui/components/polkitAgent.js:139 #: js/ui/components/networkAgent.js:109 js/ui/components/polkitAgent.js:139
#: js/ui/endSessionDialog.js:372 js/ui/extensionDownloader.js:181 #: js/ui/endSessionDialog.js:374 js/ui/extensionDownloader.js:181
#: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386 #: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386
#: js/ui/status/network.js:913 subprojects/extensions-app/js/main.js:148 #: js/ui/status/network.js:913 subprojects/extensions-app/js/main.js:148
msgid "Cancel" msgid "Cancel"
@ -504,74 +504,74 @@ msgid "(or swipe finger)"
msgstr "(tai pyyhkäise sormella)" msgstr "(tai pyyhkäise sormella)"
#. Translators: The name of the power-off action in search #. Translators: The name of the power-off action in search
#: js/misc/systemActions.js:93 #: js/misc/systemActions.js:89
msgctxt "search-result" msgctxt "search-result"
msgid "Power Off" msgid "Power Off"
msgstr "Sammuta" msgstr "Sammuta"
#. Translators: A list of keywords that match the power-off action, separated by semicolons #. Translators: A list of keywords that match the power-off action, separated by semicolons
#: js/misc/systemActions.js:96 #: js/misc/systemActions.js:92
msgid "power off;shutdown;reboot;restart;halt;stop" msgid "power off;shutdown;reboot;restart;halt;stop"
msgstr "" msgstr ""
"power off;shutdown;reboot;restart;halt;stop;sammuta;käynnistä uudelleen" "power off;shutdown;reboot;restart;halt;stop;sammuta;käynnistä uudelleen"
#. Translators: The name of the lock screen action in search #. Translators: The name of the lock screen action in search
#: js/misc/systemActions.js:101 #: js/misc/systemActions.js:97
msgctxt "search-result" msgctxt "search-result"
msgid "Lock Screen" msgid "Lock Screen"
msgstr "Lukitse näyttö" msgstr "Lukitse näyttö"
#. Translators: A list of keywords that match the lock screen action, separated by semicolons #. Translators: A list of keywords that match the lock screen action, separated by semicolons
#: js/misc/systemActions.js:104 #: js/misc/systemActions.js:100
msgid "lock screen" msgid "lock screen"
msgstr "lock screen" msgstr "lock screen"
#. Translators: The name of the logout action in search #. Translators: The name of the logout action in search
#: js/misc/systemActions.js:109 #: js/misc/systemActions.js:105
msgctxt "search-result" msgctxt "search-result"
msgid "Log Out" msgid "Log Out"
msgstr "Kirjaudu ulos" msgstr "Kirjaudu ulos"
#. Translators: A list of keywords that match the logout action, separated by semicolons #. Translators: A list of keywords that match the logout action, separated by semicolons
#: js/misc/systemActions.js:112 #: js/misc/systemActions.js:108
msgid "logout;log out;sign off" msgid "logout;log out;sign off"
msgstr "logout;log out;sign off;kirjaudu ulos;uloskirjautuminen;poistu" msgstr "logout;log out;sign off;kirjaudu ulos;uloskirjautuminen;poistu"
#. Translators: The name of the suspend action in search #. Translators: The name of the suspend action in search
#: js/misc/systemActions.js:117 #: js/misc/systemActions.js:113
msgctxt "search-result" msgctxt "search-result"
msgid "Suspend" msgid "Suspend"
msgstr "Valmiustila" msgstr "Valmiustila"
#. Translators: A list of keywords that match the suspend action, separated by semicolons #. Translators: A list of keywords that match the suspend action, separated by semicolons
#: js/misc/systemActions.js:120 #: js/misc/systemActions.js:116
msgid "suspend;sleep" msgid "suspend;sleep"
msgstr "suspend;sleep" msgstr "suspend;sleep"
#. Translators: The name of the switch user action in search #. Translators: The name of the switch user action in search
#: js/misc/systemActions.js:125 #: js/misc/systemActions.js:121
msgctxt "search-result" msgctxt "search-result"
msgid "Switch User" msgid "Switch User"
msgstr "Vaihda käyttäjää" msgstr "Vaihda käyttäjää"
#. Translators: A list of keywords that match the switch user action, separated by semicolons #. Translators: A list of keywords that match the switch user action, separated by semicolons
#: js/misc/systemActions.js:128 #: js/misc/systemActions.js:124
msgid "switch user" msgid "switch user"
msgstr "switch user" msgstr "switch user"
#. Translators: A list of keywords that match the lock orientation action, separated by semicolons #. Translators: A list of keywords that match the lock orientation action, separated by semicolons
#: js/misc/systemActions.js:135 #: js/misc/systemActions.js:131
msgid "lock orientation;unlock orientation;screen;rotation" msgid "lock orientation;unlock orientation;screen;rotation"
msgstr "" msgstr ""
"lock orientation;unlock orientation;screen;rotation;lukitse kierto;lukitse " "lock orientation;unlock orientation;screen;rotation;lukitse kierto;lukitse "
"suunta;suunta;kääntö" "suunta;suunta;kääntö"
#: js/misc/systemActions.js:255 #: js/misc/systemActions.js:251
msgctxt "search-result" msgctxt "search-result"
msgid "Unlock Screen Rotation" msgid "Unlock Screen Rotation"
msgstr "Vapauta näytön kierto" msgstr "Vapauta näytön kierto"
#: js/misc/systemActions.js:256 #: js/misc/systemActions.js:252
msgctxt "search-result" msgctxt "search-result"
msgid "Lock Screen Rotation" msgid "Lock Screen Rotation"
msgstr "Lukitse näytön kierto" msgstr "Lukitse näytön kierto"
@ -736,53 +736,53 @@ msgstr "Estä pääsy"
msgid "Grant Access" msgid "Grant Access"
msgstr "Salli pääsy" msgstr "Salli pääsy"
#: js/ui/appDisplay.js:939 #: js/ui/appDisplay.js:932
msgid "Unnamed Folder" msgid "Unnamed Folder"
msgstr "Nimetön kansio" msgstr "Nimetön kansio"
#: js/ui/appDisplay.js:962 #: js/ui/appDisplay.js:955
msgid "Frequently used applications will appear here" msgid "Frequently used applications will appear here"
msgstr "Usein käytetyt sovellukset ilmestyvät tänne" msgstr "Usein käytetyt sovellukset ilmestyvät tänne"
#: js/ui/appDisplay.js:1097 #: js/ui/appDisplay.js:1090
msgid "Frequent" msgid "Frequent"
msgstr "Käytetyimmät" msgstr "Käytetyimmät"
#: js/ui/appDisplay.js:1104 #: js/ui/appDisplay.js:1097
msgid "All" msgid "All"
msgstr "Kaikki" msgstr "Kaikki"
#. Translators: This is the heading of a list of open windows #. Translators: This is the heading of a list of open windows
#: js/ui/appDisplay.js:2480 js/ui/panel.js:75 #: js/ui/appDisplay.js:2473 js/ui/panel.js:75
msgid "Open Windows" msgid "Open Windows"
msgstr "Avoimet ikkunat" msgstr "Avoimet ikkunat"
#: js/ui/appDisplay.js:2500 js/ui/panel.js:82 #: js/ui/appDisplay.js:2493 js/ui/panel.js:82
msgid "New Window" msgid "New Window"
msgstr "Uusi ikkuna" msgstr "Uusi ikkuna"
#: js/ui/appDisplay.js:2511 #: js/ui/appDisplay.js:2504
msgid "Launch using Dedicated Graphics Card" msgid "Launch using Dedicated Graphics Card"
msgstr "Käynnistä erillisnäytönohjainta käyttäen" msgstr "Käynnistä erillisnäytönohjainta käyttäen"
#: js/ui/appDisplay.js:2539 js/ui/dash.js:239 #: js/ui/appDisplay.js:2532 js/ui/dash.js:239
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Poista suosikeista" msgstr "Poista suosikeista"
#: js/ui/appDisplay.js:2545 #: js/ui/appDisplay.js:2538
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Lisää suosikkeihin" msgstr "Lisää suosikkeihin"
#: js/ui/appDisplay.js:2555 js/ui/panel.js:93 #: js/ui/appDisplay.js:2548 js/ui/panel.js:93
msgid "Show Details" msgid "Show Details"
msgstr "Näytä tiedot" msgstr "Näytä tiedot"
#: js/ui/appFavorites.js:153 #: js/ui/appFavorites.js:152
#, javascript-format #, javascript-format
msgid "%s has been added to your favorites." msgid "%s has been added to your favorites."
msgstr "%s on lisätty suosikkeihin." msgstr "%s on lisätty suosikkeihin."
#: js/ui/appFavorites.js:186 #: js/ui/appFavorites.js:185
#, javascript-format #, javascript-format
msgid "%s has been removed from your favorites." msgid "%s has been removed from your favorites."
msgstr "%s on poistettu suosikeista." msgstr "%s on poistettu suosikeista."
@ -1155,74 +1155,74 @@ msgstr "Yhdistä verkkoon saadaksesi säätietoja"
msgid "Weather information is currently unavailable" msgid "Weather information is currently unavailable"
msgstr "Säätiedot eivät ole juuri nyt saatavilla" msgstr "Säätiedot eivät ole juuri nyt saatavilla"
#: js/ui/endSessionDialog.js:37 #: js/ui/endSessionDialog.js:39
#, javascript-format #, javascript-format
msgctxt "title" msgctxt "title"
msgid "Log Out %s" msgid "Log Out %s"
msgstr "Kirjaa %s ulos" msgstr "Kirjaa %s ulos"
#: js/ui/endSessionDialog.js:38 #: js/ui/endSessionDialog.js:40
msgctxt "title" msgctxt "title"
msgid "Log Out" msgid "Log Out"
msgstr "Kirjaudu ulos" msgstr "Kirjaudu ulos"
#: js/ui/endSessionDialog.js:40 #: js/ui/endSessionDialog.js:42
#, javascript-format #, javascript-format
msgid "%s will be logged out automatically in %d second." msgid "%s will be logged out automatically in %d second."
msgid_plural "%s will be logged out automatically in %d seconds." msgid_plural "%s will be logged out automatically in %d seconds."
msgstr[0] "%s - kirjaudutaan ulos automaattisesti %d sekunnin kuluttua." msgstr[0] "%s - kirjaudutaan ulos automaattisesti %d sekunnin kuluttua."
msgstr[1] "%s - kirjaudutaan ulos automaattisesti %d sekunnin kuluttua." msgstr[1] "%s - kirjaudutaan ulos automaattisesti %d sekunnin kuluttua."
#: js/ui/endSessionDialog.js:45 #: js/ui/endSessionDialog.js:47
#, javascript-format #, javascript-format
msgid "You will be logged out automatically in %d second." msgid "You will be logged out automatically in %d second."
msgid_plural "You will be logged out automatically in %d seconds." msgid_plural "You will be logged out automatically in %d seconds."
msgstr[0] "Sinut kirjataan ulos automaattisesti %d sekunnin kuluttua." msgstr[0] "Sinut kirjataan ulos automaattisesti %d sekunnin kuluttua."
msgstr[1] "Sinut kirjataan ulos automaattisesti %d sekunnin kuluttua." msgstr[1] "Sinut kirjataan ulos automaattisesti %d sekunnin kuluttua."
#: js/ui/endSessionDialog.js:51 #: js/ui/endSessionDialog.js:53
msgctxt "button" msgctxt "button"
msgid "Log Out" msgid "Log Out"
msgstr "Kirjaudu ulos" msgstr "Kirjaudu ulos"
#: js/ui/endSessionDialog.js:56 #: js/ui/endSessionDialog.js:58
msgctxt "title" msgctxt "title"
msgid "Power Off" msgid "Power Off"
msgstr "Sammuta" msgstr "Sammuta"
#: js/ui/endSessionDialog.js:57 #: js/ui/endSessionDialog.js:59
msgctxt "title" msgctxt "title"
msgid "Install Updates & Power Off" msgid "Install Updates & Power Off"
msgstr "Asenna päivitykset ja sammuta" msgstr "Asenna päivitykset ja sammuta"
#: js/ui/endSessionDialog.js:59 #: js/ui/endSessionDialog.js:61
#, javascript-format #, javascript-format
msgid "The system will power off automatically in %d second." msgid "The system will power off automatically in %d second."
msgid_plural "The system will power off automatically in %d seconds." msgid_plural "The system will power off automatically in %d seconds."
msgstr[0] "Järjestelmä sammuu automaattisesti %d sekunnin kuluttua." msgstr[0] "Järjestelmä sammuu automaattisesti %d sekunnin kuluttua."
msgstr[1] "Järjestelmä sammuu automaattisesti %d sekunnin kuluttua." msgstr[1] "Järjestelmä sammuu automaattisesti %d sekunnin kuluttua."
#: js/ui/endSessionDialog.js:63 #: js/ui/endSessionDialog.js:65
msgctxt "checkbox" msgctxt "checkbox"
msgid "Install pending software updates" msgid "Install pending software updates"
msgstr "Asenna odottavat ohjelmistopäivitykset" msgstr "Asenna odottavat ohjelmistopäivitykset"
#: js/ui/endSessionDialog.js:66 js/ui/endSessionDialog.js:82 #: js/ui/endSessionDialog.js:68 js/ui/endSessionDialog.js:84
msgctxt "button" msgctxt "button"
msgid "Restart" msgid "Restart"
msgstr "Käynnistä uudelleen" msgstr "Käynnistä uudelleen"
#: js/ui/endSessionDialog.js:68 #: js/ui/endSessionDialog.js:70
msgctxt "button" msgctxt "button"
msgid "Power Off" msgid "Power Off"
msgstr "Sammuta" msgstr "Sammuta"
#: js/ui/endSessionDialog.js:74 #: js/ui/endSessionDialog.js:76
msgctxt "title" msgctxt "title"
msgid "Restart" msgid "Restart"
msgstr "Käynnistä uudelleen" msgstr "Käynnistä uudelleen"
#: js/ui/endSessionDialog.js:76 #: js/ui/endSessionDialog.js:78
#, javascript-format #, javascript-format
msgid "The system will restart automatically in %d second." msgid "The system will restart automatically in %d second."
msgid_plural "The system will restart automatically in %d seconds." msgid_plural "The system will restart automatically in %d seconds."
@ -1231,12 +1231,12 @@ msgstr[0] ""
msgstr[1] "" msgstr[1] ""
"Järjestelmä käynnistyy automaattisesti uudelleen %d sekunnin kuluttua." "Järjestelmä käynnistyy automaattisesti uudelleen %d sekunnin kuluttua."
#: js/ui/endSessionDialog.js:89 #: js/ui/endSessionDialog.js:91
msgctxt "title" msgctxt "title"
msgid "Restart & Install Updates" msgid "Restart & Install Updates"
msgstr "Käynnistä uudelleen ja asenna päivitykset" msgstr "Käynnistä uudelleen ja asenna päivitykset"
#: js/ui/endSessionDialog.js:91 #: js/ui/endSessionDialog.js:93
#, javascript-format #, javascript-format
msgid "The system will automatically restart and install updates in %d second." msgid "The system will automatically restart and install updates in %d second."
msgid_plural "" msgid_plural ""
@ -1248,22 +1248,22 @@ msgstr[1] ""
"Järjestelmä käynnistyy automaattisesti uudelleen ja asentaa päivitykset %d " "Järjestelmä käynnistyy automaattisesti uudelleen ja asentaa päivitykset %d "
"sekunnin kuluttua." "sekunnin kuluttua."
#: js/ui/endSessionDialog.js:97 js/ui/endSessionDialog.js:116 #: js/ui/endSessionDialog.js:99 js/ui/endSessionDialog.js:118
msgctxt "button" msgctxt "button"
msgid "Restart &amp; Install" msgid "Restart &amp; Install"
msgstr "Käynnistä uudelleen ja asenna" msgstr "Käynnistä uudelleen ja asenna"
#: js/ui/endSessionDialog.js:98 #: js/ui/endSessionDialog.js:100
msgctxt "button" msgctxt "button"
msgid "Install &amp; Power Off" msgid "Install &amp; Power Off"
msgstr "Asenna ja sammuta" msgstr "Asenna ja sammuta"
#: js/ui/endSessionDialog.js:99 #: js/ui/endSessionDialog.js:101
msgctxt "checkbox" msgctxt "checkbox"
msgid "Power off after updates are installed" msgid "Power off after updates are installed"
msgstr "Sammuta päivitysten asennuksen jälkeen" msgstr "Sammuta päivitysten asennuksen jälkeen"
#: js/ui/endSessionDialog.js:106 #: js/ui/endSessionDialog.js:108
msgctxt "title" msgctxt "title"
msgid "Restart & Install Upgrade" msgid "Restart & Install Upgrade"
msgstr "Käynnistä uudelleen ja asenna päivitys" msgstr "Käynnistä uudelleen ja asenna päivitys"
@ -1271,7 +1271,7 @@ msgstr "Käynnistä uudelleen ja asenna päivitys"
#. Translators: This is the text displayed for system upgrades in the #. Translators: This is the text displayed for system upgrades in the
#. shut down dialog. First %s gets replaced with the distro name and #. shut down dialog. First %s gets replaced with the distro name and
#. second %s with the distro version to upgrade to #. second %s with the distro version to upgrade to
#: js/ui/endSessionDialog.js:111 #: js/ui/endSessionDialog.js:113
#, javascript-format #, javascript-format
msgid "" msgid ""
"%s %s will be installed after restart. Upgrade installation can take a long " "%s %s will be installed after restart. Upgrade installation can take a long "
@ -1281,27 +1281,27 @@ msgstr ""
"voi kestää kauan: varmista varmuuskopioidesi ajantasaisuus ja toimivuus. " "voi kestää kauan: varmista varmuuskopioidesi ajantasaisuus ja toimivuus. "
"Kiinnitä kone myös verkkovirtaan." "Kiinnitä kone myös verkkovirtaan."
#: js/ui/endSessionDialog.js:259 #: js/ui/endSessionDialog.js:261
msgid "Running on battery power: Please plug in before installing updates." msgid "Running on battery power: Please plug in before installing updates."
msgstr "" msgstr ""
"Laite käy akkuvirralla: kiinnitä verkkovirtaan ennen päivitysten asennusta." "Laite käy akkuvirralla: kiinnitä verkkovirtaan ennen päivitysten asennusta."
#: js/ui/endSessionDialog.js:268 #: js/ui/endSessionDialog.js:270
msgid "Some applications are busy or have unsaved work" msgid "Some applications are busy or have unsaved work"
msgstr "Jotkin sovellukset ovat kiireisiä tai sisältävät tallentamatonta työtä" msgstr "Jotkin sovellukset ovat kiireisiä tai sisältävät tallentamatonta työtä"
#: js/ui/endSessionDialog.js:273 #: js/ui/endSessionDialog.js:275
msgid "Other users are logged in" msgid "Other users are logged in"
msgstr "Muita käyttäjiä on kirjautuneena" msgstr "Muita käyttäjiä on kirjautuneena"
#. Translators: Remote here refers to a remote session, like a ssh login #. Translators: Remote here refers to a remote session, like a ssh login
#: js/ui/endSessionDialog.js:586 #: js/ui/endSessionDialog.js:588
#, javascript-format #, javascript-format
msgid "%s (remote)" msgid "%s (remote)"
msgstr "%s (etä)" msgstr "%s (etä)"
#. Translators: Console here refers to a tty like a VT console #. Translators: Console here refers to a tty like a VT console
#: js/ui/endSessionDialog.js:589 #: js/ui/endSessionDialog.js:591
#, javascript-format #, javascript-format
msgid "%s (console)" msgid "%s (console)"
msgstr "%s (konsoli)" msgstr "%s (konsoli)"
@ -1319,11 +1319,11 @@ msgstr "Asenna laajennus"
msgid "Download and install “%s” from extensions.gnome.org?" msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "Ladataanko ja asennetaanko ”%s” sivustolta extensions.gnome.org?" msgstr "Ladataanko ja asennetaanko ”%s” sivustolta extensions.gnome.org?"
#: js/ui/extensionSystem.js:252 #: js/ui/extensionSystem.js:233
msgid "Extension Updates Available" msgid "Extension Updates Available"
msgstr "Laajennusten päivityksiä saatavilla" msgstr "Laajennusten päivityksiä saatavilla"
#: js/ui/extensionSystem.js:253 #: js/ui/extensionSystem.js:234
msgid "Extension updates are ready to be installed." msgid "Extension updates are ready to be installed."
msgstr "Laajennusten päivitykset ovat valmiina asennettavaksi." msgstr "Laajennusten päivitykset ovat valmiina asennettavaksi."
@ -1472,11 +1472,11 @@ msgstr "Näytä lähde"
msgid "Web Page" msgid "Web Page"
msgstr "Verkkosivusto" msgstr "Verkkosivusto"
#: js/ui/main.js:279 #: js/ui/main.js:277
msgid "Logged in as a privileged user" msgid "Logged in as a privileged user"
msgstr "Kirjautuneena etuoikeutettuna käyttäjänä" msgstr "Kirjautuneena etuoikeutettuna käyttäjänä"
#: js/ui/main.js:280 #: js/ui/main.js:278
msgid "" msgid ""
"Running a session as a privileged user should be avoided for security " "Running a session as a privileged user should be avoided for security "
"reasons. If possible, you should log in as a normal user." "reasons. If possible, you should log in as a normal user."
@ -1484,23 +1484,23 @@ msgstr ""
"Istunnon suorittamista etuoikeutettuna käyttäjänä tulisi välttää " "Istunnon suorittamista etuoikeutettuna käyttäjänä tulisi välttää "
"tietoturvasyistä. Jos mahdollista, kirjaudu tavallisena käyttäjänä." "tietoturvasyistä. Jos mahdollista, kirjaudu tavallisena käyttäjänä."
#: js/ui/main.js:319 #: js/ui/main.js:317
msgid "Screen Lock disabled" msgid "Screen Lock disabled"
msgstr "Näytön lukitus pois käytöstä" msgstr "Näytön lukitus pois käytöstä"
#: js/ui/main.js:320 #: js/ui/main.js:318
msgid "Screen Locking requires the GNOME display manager." msgid "Screen Locking requires the GNOME display manager."
msgstr "Näytön lukitus vaatii Gnomen kirjautumishallinnan." msgstr "Näytön lukitus vaatii Gnomen kirjautumishallinnan."
#: js/ui/messageTray.js:1548 #: js/ui/messageTray.js:1551
msgid "System Information" msgid "System Information"
msgstr "Järjestelmän tiedot" msgstr "Järjestelmän tiedot"
#: js/ui/mpris.js:204 #: js/ui/mpris.js:199
msgid "Unknown artist" msgid "Unknown artist"
msgstr "Tuntematon esittäjä" msgstr "Tuntematon esittäjä"
#: js/ui/mpris.js:214 #: js/ui/mpris.js:209
msgid "Unknown title" msgid "Unknown title"
msgstr "Tuntematon kappale" msgstr "Tuntematon kappale"
@ -1574,16 +1574,16 @@ msgstr "Lopeta"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". #. in your language, you can use the word for "Overview".
#: js/ui/panel.js:437 #: js/ui/panel.js:434
msgid "Activities" msgid "Activities"
msgstr "Toiminnot" msgstr "Toiminnot"
#: js/ui/panel.js:716 #: js/ui/panel.js:713
msgctxt "System menu in the top bar" msgctxt "System menu in the top bar"
msgid "System" msgid "System"
msgstr "Järjestelmä" msgstr "Järjestelmä"
#: js/ui/panel.js:829 #: js/ui/panel.js:826
msgid "Top Bar" msgid "Top Bar"
msgstr "Yläpalkki" msgstr "Yläpalkki"
@ -1614,11 +1614,11 @@ msgstr "Gnomen täytyy lukita näyttö"
#. #.
#. XXX: another option is to kick the user into the gdm login #. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs #. screen, where we're not affected by grabs
#: js/ui/screenShield.js:244 js/ui/screenShield.js:601 #: js/ui/screenShield.js:244 js/ui/screenShield.js:598
msgid "Unable to lock" msgid "Unable to lock"
msgstr "Lukitus epäonnistui" msgstr "Lukitus epäonnistui"
#: js/ui/screenShield.js:245 js/ui/screenShield.js:602 #: js/ui/screenShield.js:245 js/ui/screenShield.js:599
msgid "Lock was blocked by an application" msgid "Lock was blocked by an application"
msgstr "Lukitus estettiin sovelluksen toimesta" msgstr "Lukitus estettiin sovelluksen toimesta"
@ -2266,7 +2266,7 @@ msgstr "Palauta asetukset"
msgid "Keep Changes" msgid "Keep Changes"
msgstr "Säilytä muutokset" msgstr "Säilytä muutokset"
#: js/ui/windowManager.js:86 #: js/ui/windowManager.js:85
#, javascript-format #, javascript-format
msgid "Settings changes will revert in %d second" msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds" msgid_plural "Settings changes will revert in %d seconds"
@ -2275,7 +2275,7 @@ msgstr[1] "Asetusmuutokset palautetaan %d sekunnissa"
#. Translators: This represents the size of a window. The first number is #. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height. #. * the width of the window and the second is the height.
#: js/ui/windowManager.js:546 #: js/ui/windowManager.js:544
#, javascript-format #, javascript-format
msgid "%d × %d" msgid "%d × %d"
msgstr "%d × %d" msgstr "%d × %d"
@ -2368,12 +2368,12 @@ msgstr "Käytä tiettyä tilaa (esim. “gdm”) kirjautumisnäkymää varten"
msgid "List possible modes" msgid "List possible modes"
msgstr "Listaa mahdolliset tilat" msgstr "Listaa mahdolliset tilat"
#: src/shell-app.c:286 #: src/shell-app.c:279
msgctxt "program" msgctxt "program"
msgid "Unknown" msgid "Unknown"
msgstr "Tuntematon" msgstr "Tuntematon"
#: src/shell-app.c:537 #: src/shell-app.c:530
#, c-format #, c-format
msgid "Failed to launch “%s”" msgid "Failed to launch “%s”"
msgstr "Sovelluksen “%s” käynnistäminen epäonnistui" msgstr "Sovelluksen “%s” käynnistäminen epäonnistui"
@ -2407,9 +2407,6 @@ msgid ""
"GNOME Extensions handles updating extensions, configuring extension " "GNOME Extensions handles updating extensions, configuring extension "
"preferences and removing or disabling unwanted extensions." "preferences and removing or disabling unwanted extensions."
msgstr "" msgstr ""
"Gnomen laajennussovellus Laajennukset käsittelee laajennusten päivitykset, "
"niiden asetukset ja sen avulla voi poistaa laajennuksia käytöstä tai "
"kokonaan järjestelmästä."
#: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:7 #: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:7
msgid "Configure GNOME Shell Extensions" msgid "Configure GNOME Shell Extensions"
@ -2496,19 +2493,19 @@ msgstr ""
"Jos kohtaat ongelmia järjestelmän kanssa, on suositeltavaa poistaa kaikki " "Jos kohtaat ongelmia järjestelmän kanssa, on suositeltavaa poistaa kaikki "
"laajennukset käytöstä." "laajennukset käytöstä."
#: subprojects/extensions-app/data/ui/extensions-window.ui:135 #: subprojects/extensions-app/data/ui/extensions-window.ui:134
msgid "Manually Installed" msgid "Manually Installed"
msgstr "Manuaalisesti asennettu" msgstr "Manuaalisesti asennettu"
#: subprojects/extensions-app/data/ui/extensions-window.ui:159 #: subprojects/extensions-app/data/ui/extensions-window.ui:158
msgid "Built-In" msgid "Built-In"
msgstr "Sisäänrakennettu" msgstr "Sisäänrakennettu"
#: subprojects/extensions-app/data/ui/extensions-window.ui:200 #: subprojects/extensions-app/data/ui/extensions-window.ui:199
msgid "No Installed Extensions" msgid "No Installed Extensions"
msgstr "Ei asennettuja laajennuksia" msgstr "Ei asennettuja laajennuksia"
#: subprojects/extensions-app/data/ui/extensions-window.ui:236 #: subprojects/extensions-app/data/ui/extensions-window.ui:235
msgid "" msgid ""
"Were very sorry, but it was not possible to get the list of installed " "Were very sorry, but it was not possible to get the list of installed "
"extensions. Make sure you are logged into GNOME and try again." "extensions. Make sure you are logged into GNOME and try again."
@ -2516,11 +2513,7 @@ msgstr ""
"Valitettavasti asennettujen laajennusten listaa ei voitu muodostaa. Varmista " "Valitettavasti asennettujen laajennusten listaa ei voitu muodostaa. Varmista "
"että olet kirjautunut Gnomeen ja yritä uudelleen." "että olet kirjautunut Gnomeen ja yritä uudelleen."
#: subprojects/extensions-app/data/ui/extensions-window.ui:273 #: subprojects/extensions-app/data/ui/extensions-window.ui:288
msgid "Extension Updates Ready"
msgstr "Laajennuspäivitykset valmiina"
#: subprojects/extensions-app/data/ui/extensions-window.ui:289
msgid "Log Out…" msgid "Log Out…"
msgstr "Kirjaudu ulos…" msgstr "Kirjaudu ulos…"

466
po/fr.po
View File

@ -21,16 +21,16 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell master fr\n" "Project-Id-Version: gnome-shell master fr\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2020-05-11 14:00+0000\n" "POT-Creation-Date: 2020-03-19 14:34+0000\n"
"PO-Revision-Date: 2020-05-12 15:16+0200\n" "PO-Revision-Date: 2020-03-19 21:59+0100\n"
"Last-Translator: Charles Monzat <charles.monzat@free.fr>\n" "Last-Translator: Guillaume Bernard <associations@guillaume-bernard.fr>\n"
"Language-Team: French <gnomefr@traduc.org>\n" "Language-Team: GNOME French Team <gnomefr@traduc.org>\n"
"Language: fr\n" "Language: fr_FR\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Generator: Gtranslator 3.36.0\n" "X-Generator: Poedit 2.3\n"
#: data/50-gnome-shell-system.xml:6 #: data/50-gnome-shell-system.xml:6
msgid "System" msgid "System"
@ -415,12 +415,80 @@ msgstr ""
msgid "Network Login" msgid "Network Login"
msgstr "Identification réseau" msgstr "Identification réseau"
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:36 #: js/extensionPrefs/data/metainfo/org.gnome.Extensions.metainfo.xml.in:5
#: subprojects/extensions-app/data/ui/extensions-window.ui:224 #: js/extensionPrefs/data/org.gnome.Extensions.desktop.in.in:4
#: js/extensionPrefs/js/main.js:242
#: js/extensionPrefs/data/ui/extensions-window.ui:61
msgid "Extensions"
msgstr "Extensions"
#: js/extensionPrefs/data/metainfo/org.gnome.Extensions.metainfo.xml.in:6
#: js/extensionPrefs/js/main.js:243
msgid "Manage your GNOME Extensions"
msgstr "Gérer vos extensions GNOME"
#: js/extensionPrefs/data/metainfo/org.gnome.Extensions.metainfo.xml.in:35
msgid ""
"GNOME Extensions handles updating extensions, configuring extension "
"preferences and removing or disabling unwanted extensions."
msgstr ""
"Extensions de GNOME gère la mise à jour des extensions, la configuration des "
"préférences des extensions et la suppression ou la désactivation des "
"extensions non désirées."
#: js/extensionPrefs/data/org.gnome.Extensions.desktop.in.in:7
msgid "Configure GNOME Shell Extensions"
msgstr "Configurer les extensions Shell de GNOME"
#: js/extensionPrefs/js/main.js:164
#, javascript-format
msgid "Remove “%s”?"
msgstr "Enlever « %s » ?"
#: js/extensionPrefs/js/main.js:165
msgid ""
"If you remove the extension, you need to return to download it if you want "
"to enable it again"
msgstr ""
"Si vous enlevez cette extension, vous devrez recommencer son téléchargement "
"si vous souhaitez la réactiver plus tard"
#: js/extensionPrefs/js/main.js:168 js/gdm/authPrompt.js:135
#: js/ui/audioDeviceSelection.js:57 js/ui/components/networkAgent.js:109
#: js/ui/components/polkitAgent.js:139 js/ui/endSessionDialog.js:374
#: js/ui/extensionDownloader.js:177 js/ui/shellMountOperation.js:376
#: js/ui/shellMountOperation.js:386 js/ui/status/network.js:913
msgid "Cancel"
msgstr "Annuler"
#: js/extensionPrefs/js/main.js:169
msgid "Remove"
msgstr "Enlever"
#: js/extensionPrefs/js/main.js:241
msgid "translator-credits"
msgstr ""
"Mathieu Bridon <bochecha@fedoraproject.org>\n"
"Pablo Martin-Gomez <pablo.martin-gomez@laposte.net>\n"
"Bruno Brouard <annoa.b@gmail.com>\n"
"Cyril Arnaud <cyril dot arnaud at gmail dot com>\n"
"Luc Guillemin <luc.guillemin@gmail.com>\n"
"Luc Pionchon <pionchon.luc@gmail.com>\n"
"Pierre Henry <pierrehenry73@yahoo.fr>\n"
"Alexandre Franke <alexandre.franke@gmail.com>\n"
"Mathieu Stumpf <psychoslave@culture-libre.org>\n"
"Alain Lojewski <allomervan@gmail.com>\n"
"Erwan Georget <egeorget@opmbx.org>\n"
"Julien Humbert <julroy67@gmail.com>\n"
"Claude Paroz <claude@2xlibre.net>\n"
"Charles Monzat <charles.monzat@free.fr>"
#: js/extensionPrefs/js/main.js:285
#: js/extensionPrefs/data/ui/extensions-window.ui:223
msgid "Somethings gone wrong" msgid "Somethings gone wrong"
msgstr "Quelque chose sest mal passé" msgstr "Quelque chose sest mal passé"
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:48 #: js/extensionPrefs/js/main.js:292
msgid "" msgid ""
"Were very sorry, but theres been a problem: the settings for this " "Were very sorry, but theres been a problem: the settings for this "
"extension cant be displayed. We recommend that you report the issue to the " "extension cant be displayed. We recommend that you report the issue to the "
@ -430,25 +498,106 @@ msgstr ""
"extension ne peuvent être affichés. Nous vous recommandons de signaler ce " "extension ne peuvent être affichés. Nous vous recommandons de signaler ce "
"problème aux auteurs de lextension." "problème aux auteurs de lextension."
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:82 #: js/extensionPrefs/js/main.js:299
msgid "Technical Details" msgid "Technical Details"
msgstr "Détails techniques" msgstr "Détails techniques"
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:165 #: js/extensionPrefs/js/main.js:334
msgid "Copy Error"
msgstr "Copier lerreur"
#: js/extensionPrefs/js/main.js:361
msgid "Homepage" msgid "Homepage"
msgstr "Site Web" msgstr "Site Web"
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:166 #: js/extensionPrefs/js/main.js:362
msgid "Visit extension homepage" msgid "Visit extension homepage"
msgstr "Visiter le site Web de lextension" msgstr "Visiter le site Web de lextension"
#: js/gdm/authPrompt.js:135 js/ui/audioDeviceSelection.js:57 #: js/extensionPrefs/js/main.js:479
#: js/ui/components/networkAgent.js:109 js/ui/components/polkitAgent.js:139 #, javascript-format
#: js/ui/endSessionDialog.js:372 js/ui/extensionDownloader.js:181 msgid "%d extension will be updated on next login."
#: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386 msgid_plural "%d extensions will be updated on next login."
#: js/ui/status/network.js:913 subprojects/extensions-app/js/main.js:148 msgstr[0] "%d extension sera mise à jour à la prochaine connexion."
msgid "Cancel" msgstr[1] "%d extensions seront mises à jour à la prochaine connexion."
msgstr "Annuler"
#: js/extensionPrefs/data/ui/extension-row.ui:100
#: subprojects/extensions-tool/src/command-create.c:211
#: subprojects/extensions-tool/src/main.c:173
msgid "Description"
msgstr "Description"
#: js/extensionPrefs/data/ui/extension-row.ui:123
#: subprojects/extensions-tool/src/main.c:185
msgid "Version"
msgstr "Version"
#: js/extensionPrefs/data/ui/extension-row.ui:151
msgid "Author"
msgstr "Auteur"
#: js/extensionPrefs/data/ui/extension-row.ui:175
msgid "Website"
msgstr "Site Web"
#: js/extensionPrefs/data/ui/extension-row.ui:192
msgid "Remove…"
msgstr "Enlever…"
#: js/extensionPrefs/data/ui/extensions-window.ui:8
msgid "Help"
msgstr "Aide"
#: js/extensionPrefs/data/ui/extensions-window.ui:12
msgid "About Extensions"
msgstr "À propos des extensions"
#: js/extensionPrefs/data/ui/extensions-window.ui:27
msgid ""
"To find and add extensions, visit <a href=\"https://extensions.gnome.org"
"\">extensions.gnome.org</a>."
msgstr ""
"Pour trouver et ajouter des extensions, visitez <a href=\"https://extensions."
"gnome.org\">extensions.gnome.org</a>."
#: js/extensionPrefs/data/ui/extensions-window.ui:35
msgid "Warning"
msgstr "Avertissement"
#: js/extensionPrefs/data/ui/extensions-window.ui:46
msgid ""
"Extensions can cause system issues, including performance problems. If you "
"encounter problems with your system, it is recommended to disable all "
"extensions."
msgstr ""
"Les extensions peuvent poser des problèmes au système, y compris au niveau "
"des performances. Si vous pensez être dans ce cas, il est recommandé de "
"désactiver toutes les extensions."
#: js/extensionPrefs/data/ui/extensions-window.ui:134
msgid "Manually Installed"
msgstr "Installée manuellement"
#: js/extensionPrefs/data/ui/extensions-window.ui:158
msgid "Built-In"
msgstr "Intégrée"
#: js/extensionPrefs/data/ui/extensions-window.ui:199
msgid "No Installed Extensions"
msgstr "Aucune extension installée"
#: js/extensionPrefs/data/ui/extensions-window.ui:235
msgid ""
"Were very sorry, but it was not possible to get the list of installed "
"extensions. Make sure you are logged into GNOME and try again."
msgstr ""
"Nous sommes désolés, mais il nest pas possible dobtenir la liste des "
"extensions installées. Vérifiez que vous êtes bien connecté à GNOME et "
"essayez encore une fois."
#: js/extensionPrefs/data/ui/extensions-window.ui:288
msgid "Log Out…"
msgstr "Fermer la session…"
#. Cisco LEAP #. Cisco LEAP
#: js/gdm/authPrompt.js:237 js/ui/components/networkAgent.js:204 #: js/gdm/authPrompt.js:237 js/ui/components/networkAgent.js:204
@ -500,71 +649,71 @@ msgid "(or swipe finger)"
msgstr "(ou faites glisser le doigt)" msgstr "(ou faites glisser le doigt)"
#. Translators: The name of the power-off action in search #. Translators: The name of the power-off action in search
#: js/misc/systemActions.js:93 #: js/misc/systemActions.js:89
msgctxt "search-result" msgctxt "search-result"
msgid "Power Off" msgid "Power Off"
msgstr "Éteindre" msgstr "Éteindre"
#. Translators: A list of keywords that match the power-off action, separated by semicolons #. Translators: A list of keywords that match the power-off action, separated by semicolons
#: js/misc/systemActions.js:96 #: js/misc/systemActions.js:92
msgid "power off;shutdown;reboot;restart;halt;stop" msgid "power off;shutdown;reboot;restart;halt;stop"
msgstr "éteindre;fermer;débrancher;redémarrer;rallumer;reboot;arrêter;stop" msgstr "éteindre;fermer;débrancher;redémarrer;rallumer;reboot;arrêter;stop"
#. Translators: The name of the lock screen action in search #. Translators: The name of the lock screen action in search
#: js/misc/systemActions.js:101 #: js/misc/systemActions.js:97
msgctxt "search-result" msgctxt "search-result"
msgid "Lock Screen" msgid "Lock Screen"
msgstr "Verrouillage de lécran" msgstr "Verrouillage de lécran"
#. Translators: A list of keywords that match the lock screen action, separated by semicolons #. Translators: A list of keywords that match the lock screen action, separated by semicolons
#: js/misc/systemActions.js:104 #: js/misc/systemActions.js:100
msgid "lock screen" msgid "lock screen"
msgstr "verrouillage;écran;" msgstr "verrouillage;écran;"
#. Translators: The name of the logout action in search #. Translators: The name of the logout action in search
#: js/misc/systemActions.js:109 #: js/misc/systemActions.js:105
msgctxt "search-result" msgctxt "search-result"
msgid "Log Out" msgid "Log Out"
msgstr "Fermer la session" msgstr "Fermer la session"
#. Translators: A list of keywords that match the logout action, separated by semicolons #. Translators: A list of keywords that match the logout action, separated by semicolons
#: js/misc/systemActions.js:112 #: js/misc/systemActions.js:108
msgid "logout;log out;sign off" msgid "logout;log out;sign off"
msgstr "fermer;session;déconnecter;" msgstr "fermer;session;déconnecter;"
#. Translators: The name of the suspend action in search #. Translators: The name of the suspend action in search
#: js/misc/systemActions.js:117 #: js/misc/systemActions.js:113
msgctxt "search-result" msgctxt "search-result"
msgid "Suspend" msgid "Suspend"
msgstr "Mettre en veille" msgstr "Mettre en veille"
#. Translators: A list of keywords that match the suspend action, separated by semicolons #. Translators: A list of keywords that match the suspend action, separated by semicolons
#: js/misc/systemActions.js:120 #: js/misc/systemActions.js:116
msgid "suspend;sleep" msgid "suspend;sleep"
msgstr "mettre en veille;sommeil;" msgstr "mettre en veille;sommeil;"
#. Translators: The name of the switch user action in search #. Translators: The name of the switch user action in search
#: js/misc/systemActions.js:125 #: js/misc/systemActions.js:121
msgctxt "search-result" msgctxt "search-result"
msgid "Switch User" msgid "Switch User"
msgstr "Changer dutilisateur" msgstr "Changer dutilisateur"
#. Translators: A list of keywords that match the switch user action, separated by semicolons #. Translators: A list of keywords that match the switch user action, separated by semicolons
#: js/misc/systemActions.js:128 #: js/misc/systemActions.js:124
msgid "switch user" msgid "switch user"
msgstr "changer;utilisateur;" msgstr "changer;utilisateur;"
#. Translators: A list of keywords that match the lock orientation action, separated by semicolons #. Translators: A list of keywords that match the lock orientation action, separated by semicolons
#: js/misc/systemActions.js:135 #: js/misc/systemActions.js:131
msgid "lock orientation;unlock orientation;screen;rotation" msgid "lock orientation;unlock orientation;screen;rotation"
msgstr "verrouillage;déverrouillage;orientation;écran;rotation" msgstr "verrouillage;déverrouillage;orientation;écran;rotation"
#: js/misc/systemActions.js:255 #: js/misc/systemActions.js:251
msgctxt "search-result" msgctxt "search-result"
msgid "Unlock Screen Rotation" msgid "Unlock Screen Rotation"
msgstr "Déverrouiller la rotation de lécran" msgstr "Déverrouiller la rotation de lécran"
#: js/misc/systemActions.js:256 #: js/misc/systemActions.js:252
msgctxt "search-result" msgctxt "search-result"
msgid "Lock Screen Rotation" msgid "Lock Screen Rotation"
msgstr "Verrouiller la rotation de lécran" msgstr "Verrouiller la rotation de lécran"
@ -730,53 +879,53 @@ msgstr "Refuser laccès"
msgid "Grant Access" msgid "Grant Access"
msgstr "Accorder laccès" msgstr "Accorder laccès"
#: js/ui/appDisplay.js:939 #: js/ui/appDisplay.js:898
msgid "Unnamed Folder" msgid "Unnamed Folder"
msgstr "Dossier sans nom" msgstr "Dossier sans nom"
#: js/ui/appDisplay.js:962 #: js/ui/appDisplay.js:921
msgid "Frequently used applications will appear here" msgid "Frequently used applications will appear here"
msgstr "Les applications fréquemment utilisées apparaîtront ici" msgstr "Les applications fréquemment utilisées apparaîtront ici"
#: js/ui/appDisplay.js:1097 #: js/ui/appDisplay.js:1056
msgid "Frequent" msgid "Frequent"
msgstr "Fréquemment utilisées" msgstr "Fréquemment utilisées"
#: js/ui/appDisplay.js:1104 #: js/ui/appDisplay.js:1063
msgid "All" msgid "All"
msgstr "Toutes" msgstr "Toutes"
#. Translators: This is the heading of a list of open windows #. Translators: This is the heading of a list of open windows
#: js/ui/appDisplay.js:2480 js/ui/panel.js:75 #: js/ui/appDisplay.js:2446 js/ui/panel.js:75
msgid "Open Windows" msgid "Open Windows"
msgstr "Fenêtres ouvertes" msgstr "Fenêtres ouvertes"
#: js/ui/appDisplay.js:2500 js/ui/panel.js:82 #: js/ui/appDisplay.js:2466 js/ui/panel.js:82
msgid "New Window" msgid "New Window"
msgstr "Nouvelle fenêtre" msgstr "Nouvelle fenêtre"
#: js/ui/appDisplay.js:2511 #: js/ui/appDisplay.js:2477
msgid "Launch using Dedicated Graphics Card" msgid "Launch using Dedicated Graphics Card"
msgstr "Démarrer en utilisant la carte graphique dédiée" msgstr "Démarrer en utilisant la carte graphique dédiée"
#: js/ui/appDisplay.js:2539 js/ui/dash.js:239 #: js/ui/appDisplay.js:2505 js/ui/dash.js:239
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Enlever des favoris" msgstr "Enlever des favoris"
#: js/ui/appDisplay.js:2545 #: js/ui/appDisplay.js:2511
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Ajouter aux favoris" msgstr "Ajouter aux favoris"
#: js/ui/appDisplay.js:2555 js/ui/panel.js:93 #: js/ui/appDisplay.js:2521 js/ui/panel.js:93
msgid "Show Details" msgid "Show Details"
msgstr "Afficher les détails" msgstr "Afficher les détails"
#: js/ui/appFavorites.js:153 #: js/ui/appFavorites.js:152
#, javascript-format #, javascript-format
msgid "%s has been added to your favorites." msgid "%s has been added to your favorites."
msgstr "%s a été ajouté à vos favoris." msgstr "%s a été ajouté à vos favoris."
#: js/ui/appFavorites.js:186 #: js/ui/appFavorites.js:185
#, javascript-format #, javascript-format
msgid "%s has been removed from your favorites." msgid "%s has been removed from your favorites."
msgstr "%s a été supprimé de vos favoris." msgstr "%s a été supprimé de vos favoris."
@ -797,7 +946,7 @@ msgstr "Casque audio"
msgid "Headset" msgid "Headset"
msgstr "Micro-casque" msgstr "Micro-casque"
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:270 #: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:269
msgid "Microphone" msgid "Microphone"
msgstr "Microphone" msgstr "Microphone"
@ -953,7 +1102,7 @@ msgstr "Aucun évènement"
msgid "Do Not Disturb" msgid "Do Not Disturb"
msgstr "Ne pas déranger" msgstr "Ne pas déranger"
#: js/ui/calendar.js:1176 #: js/ui/calendar.js:1171
msgid "Clear" msgid "Clear"
msgstr "Effacer" msgstr "Effacer"
@ -1103,7 +1252,7 @@ msgstr "Échec de lauthentification. Essayez à nouveau."
#. Translators: this is the other person changing their old IM name to their new #. Translators: this is the other person changing their old IM name to their new
#. IM name. #. IM name.
#: js/ui/components/telepathyClient.js:823 #: js/ui/components/telepathyClient.js:787
#, javascript-format #, javascript-format
msgid "%s is now known as %s" msgid "%s is now known as %s"
msgstr "%s est maintenant connu sous le nom de %s" msgstr "%s est maintenant connu sous le nom de %s"
@ -1159,23 +1308,23 @@ msgstr "Ajouter des horloges locales…"
msgid "World Clocks" msgid "World Clocks"
msgstr "Horloges locales" msgstr "Horloges locales"
#: js/ui/dateMenu.js:289 #: js/ui/dateMenu.js:279
msgid "Weather" msgid "Weather"
msgstr "Météo" msgstr "Météo"
#: js/ui/dateMenu.js:418 #: js/ui/dateMenu.js:394
msgid "Select a location…" msgid "Select a location…"
msgstr "Choisir un emplacement…" msgstr "Choisir un emplacement…"
#: js/ui/dateMenu.js:426 #: js/ui/dateMenu.js:407
msgid "Loading…" msgid "Loading…"
msgstr "Chargement…" msgstr "Chargement…"
#: js/ui/dateMenu.js:436 #: js/ui/dateMenu.js:417
msgid "Go online for weather information" msgid "Go online for weather information"
msgstr "Chercher les informations météorologiques en ligne" msgstr "Chercher les informations météorologiques en ligne"
#: js/ui/dateMenu.js:438 #: js/ui/dateMenu.js:419
msgid "Weather information is currently unavailable" msgid "Weather information is currently unavailable"
msgstr "Les informations météorologiques ne sont pas disponibles actuellement" msgstr "Les informations météorologiques ne sont pas disponibles actuellement"
@ -1315,35 +1464,35 @@ msgid "Other users are logged in"
msgstr "Dautres utilisateurs sont connectés" msgstr "Dautres utilisateurs sont connectés"
#. Translators: Remote here refers to a remote session, like a ssh login #. Translators: Remote here refers to a remote session, like a ssh login
#: js/ui/endSessionDialog.js:586 #: js/ui/endSessionDialog.js:588
#, javascript-format #, javascript-format
msgid "%s (remote)" msgid "%s (remote)"
msgstr "%s (distant)" msgstr "%s (distant)"
#. Translators: Console here refers to a tty like a VT console #. Translators: Console here refers to a tty like a VT console
#: js/ui/endSessionDialog.js:589 #: js/ui/endSessionDialog.js:591
#, javascript-format #, javascript-format
msgid "%s (console)" msgid "%s (console)"
msgstr "%s (console)" msgstr "%s (console)"
#: js/ui/extensionDownloader.js:185 #: js/ui/extensionDownloader.js:181
msgid "Install" msgid "Install"
msgstr "Installer" msgstr "Installer"
#: js/ui/extensionDownloader.js:191 #: js/ui/extensionDownloader.js:187
msgid "Install Extension" msgid "Install Extension"
msgstr "Installer lextension" msgstr "Installer lextension"
#: js/ui/extensionDownloader.js:192 #: js/ui/extensionDownloader.js:188
#, javascript-format #, javascript-format
msgid "Download and install “%s” from extensions.gnome.org?" msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "Télécharger et installer « %s » à partir de extensions.gnome.org ?" msgstr "Télécharger et installer « %s » à partir de extensions.gnome.org ?"
#: js/ui/extensionSystem.js:252 #: js/ui/extensionSystem.js:228
msgid "Extension Updates Available" msgid "Extension Updates Available"
msgstr "Mises à jour dextensions disponibles" msgstr "Mises à jour dextensions disponibles"
#: js/ui/extensionSystem.js:253 #: js/ui/extensionSystem.js:229
msgid "Extension updates are ready to be installed." msgid "Extension updates are ready to be installed."
msgstr "Des mises à jour dextensions sont prêtes à être installées." msgstr "Des mises à jour dextensions sont prêtes à être installées."
@ -1492,11 +1641,11 @@ msgstr "Afficher la source"
msgid "Web Page" msgid "Web Page"
msgstr "Page Web" msgstr "Page Web"
#: js/ui/main.js:279 #: js/ui/main.js:274
msgid "Logged in as a privileged user" msgid "Logged in as a privileged user"
msgstr "Connecté en tant quutilisateur privilégié" msgstr "Connecté en tant quutilisateur privilégié"
#: js/ui/main.js:280 #: js/ui/main.js:275
msgid "" msgid ""
"Running a session as a privileged user should be avoided for security " "Running a session as a privileged user should be avoided for security "
"reasons. If possible, you should log in as a normal user." "reasons. If possible, you should log in as a normal user."
@ -1505,16 +1654,16 @@ msgstr ""
"des raisons de sécurité. Si possible, connectez-vous comme utilisateur " "des raisons de sécurité. Si possible, connectez-vous comme utilisateur "
"normal." "normal."
#: js/ui/main.js:319 #: js/ui/main.js:281
msgid "Screen Lock disabled" msgid "Screen Lock disabled"
msgstr "Verrouillage décran désactivé" msgstr "Verrouillage décran désactivé"
#: js/ui/main.js:320 #: js/ui/main.js:282
msgid "Screen Locking requires the GNOME display manager." msgid "Screen Locking requires the GNOME display manager."
msgstr "" msgstr ""
"Le verrouillage de lécran nécessite le gestionnaire daffichage GNOME." "Le verrouillage de lécran nécessite le gestionnaire daffichage GNOME."
#: js/ui/messageTray.js:1548 #: js/ui/messageTray.js:1554
msgid "System Information" msgid "System Information"
msgstr "Informations du système" msgstr "Informations du système"
@ -1594,16 +1743,16 @@ msgstr "Quitter"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". #. in your language, you can use the word for "Overview".
#: js/ui/panel.js:437 #: js/ui/panel.js:434
msgid "Activities" msgid "Activities"
msgstr "Activités" msgstr "Activités"
#: js/ui/panel.js:716 #: js/ui/panel.js:713
msgctxt "System menu in the top bar" msgctxt "System menu in the top bar"
msgid "System" msgid "System"
msgstr "Système" msgstr "Système"
#: js/ui/panel.js:829 #: js/ui/panel.js:826
msgid "Top Bar" msgid "Top Bar"
msgstr "Barre supérieure" msgstr "Barre supérieure"
@ -1634,11 +1783,11 @@ msgstr "GNOME a besoin de verrouiller lécran"
#. #.
#. XXX: another option is to kick the user into the gdm login #. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs #. screen, where we're not affected by grabs
#: js/ui/screenShield.js:244 js/ui/screenShield.js:601 #: js/ui/screenShield.js:244 js/ui/screenShield.js:598
msgid "Unable to lock" msgid "Unable to lock"
msgstr "Impossible de verrouiller" msgstr "Impossible de verrouiller"
#: js/ui/screenShield.js:245 js/ui/screenShield.js:602 #: js/ui/screenShield.js:245 js/ui/screenShield.js:599
msgid "Lock was blocked by an application" msgid "Lock was blocked by an application"
msgstr "Le verrouillage a été bloqué par une application" msgstr "Le verrouillage a été bloqué par une application"
@ -1721,13 +1870,13 @@ msgid "The PIM must be a number or empty."
msgstr "Le numéro PIM doit être un nombre ou être vide." msgstr "Le numéro PIM doit être un nombre ou être vide."
#. Translators: %s is the Disks application #. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:465 #: js/ui/shellMountOperation.js:469
#, javascript-format #, javascript-format
msgid "Unable to start %s" msgid "Unable to start %s"
msgstr "Impossible de démarrer %s" msgstr "Impossible de démarrer %s"
#. Translators: %s is the Disks application #. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:467 #: js/ui/shellMountOperation.js:471
#, javascript-format #, javascript-format
msgid "Couldnt find the %s application" msgid "Couldnt find the %s application"
msgstr "Impossible de trouver lapplication %s" msgstr "Impossible de trouver lapplication %s"
@ -2203,11 +2352,11 @@ msgstr "Erreur dautorisation Thunderbolt"
msgid "Could not authorize the Thunderbolt device: %s" msgid "Could not authorize the Thunderbolt device: %s"
msgstr "Impossible dautoriser le périphérique Thunderbolt : %s" msgstr "Impossible dautoriser le périphérique Thunderbolt : %s"
#: js/ui/status/volume.js:151 #: js/ui/status/volume.js:150
msgid "Volume changed" msgid "Volume changed"
msgstr "Volume modifié" msgstr "Volume modifié"
#: js/ui/status/volume.js:222 #: js/ui/status/volume.js:221
msgid "Volume" msgid "Volume"
msgstr "Volume" msgstr "Volume"
@ -2241,23 +2390,23 @@ msgstr "Intégré seulement"
#. Translators: This is a time format for a date in #. Translators: This is a time format for a date in
#. long format #. long format
#: js/ui/unlockDialog.js:371 #: js/ui/unlockDialog.js:370
msgid "%A %B %-d" msgid "%A %B %-d"
msgstr "%A %-d %B" msgstr "%A %-d %B"
#: js/ui/unlockDialog.js:377 #: js/ui/unlockDialog.js:376
msgid "Swipe up to unlock" msgid "Swipe up to unlock"
msgstr "Faire glisser vers le haut pour déverrouiller" msgstr "Faire glisser vers le haut pour déverrouiller"
#: js/ui/unlockDialog.js:378 #: js/ui/unlockDialog.js:377
msgid "Click or press a key to unlock" msgid "Click or press a key to unlock"
msgstr "Cliquer ou appuyer sur une touche pour déverrouiller" msgstr "Cliquer ou appuyer sur une touche pour déverrouiller"
#: js/ui/unlockDialog.js:550 #: js/ui/unlockDialog.js:549
msgid "Unlock Window" msgid "Unlock Window"
msgstr "Fenêtre de déverrouillage" msgstr "Fenêtre de déverrouillage"
#: js/ui/unlockDialog.js:559 #: js/ui/unlockDialog.js:558
msgid "Log in as another user" msgid "Log in as another user"
msgstr "Se connecter en tant quautre utilisateur" msgstr "Se connecter en tant quautre utilisateur"
@ -2290,7 +2439,7 @@ msgstr "Restaurer les paramètres"
msgid "Keep Changes" msgid "Keep Changes"
msgstr "Conserver les modifications" msgstr "Conserver les modifications"
#: js/ui/windowManager.js:86 #: js/ui/windowManager.js:85
#, javascript-format #, javascript-format
msgid "Settings changes will revert in %d second" msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds" msgid_plural "Settings changes will revert in %d seconds"
@ -2299,7 +2448,7 @@ msgstr[1] "Les paramètres seront restaurés dans %d secondes"
#. Translators: This represents the size of a window. The first number is #. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height. #. * the width of the window and the second is the height.
#: js/ui/windowManager.js:546 #: js/ui/windowManager.js:544
#, javascript-format #, javascript-format
msgid "%d × %d" msgid "%d × %d"
msgstr "%d × %d" msgstr "%d × %d"
@ -2393,12 +2542,12 @@ msgstr ""
msgid "List possible modes" msgid "List possible modes"
msgstr "Lister les modes possibles" msgstr "Lister les modes possibles"
#: src/shell-app.c:286 #: src/shell-app.c:279
msgctxt "program" msgctxt "program"
msgid "Unknown" msgid "Unknown"
msgstr "Inconnu" msgstr "Inconnu"
#: src/shell-app.c:537 #: src/shell-app.c:530
#, c-format #, c-format
msgid "Failed to launch “%s”" msgid "Failed to launch “%s”"
msgstr "Impossible de lancer « %s »" msgstr "Impossible de lancer « %s »"
@ -2415,156 +2564,6 @@ msgstr "Le mot de passe ne peut pas être vide"
msgid "Authentication dialog was dismissed by the user" msgid "Authentication dialog was dismissed by the user"
msgstr "La fenêtre dauthentification a été écartée par lutilisateur" msgstr "La fenêtre dauthentification a été écartée par lutilisateur"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:5
#: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:4
#: subprojects/extensions-app/js/main.js:182
#: subprojects/extensions-app/data/ui/extensions-window.ui:61
msgid "Extensions"
msgstr "Extensions"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:6
#: subprojects/extensions-app/js/main.js:183
msgid "Manage your GNOME Extensions"
msgstr "Gérer vos extensions GNOME"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:35
msgid ""
"GNOME Extensions handles updating extensions, configuring extension "
"preferences and removing or disabling unwanted extensions."
msgstr ""
"Extensions de GNOME gère la mise à jour des extensions, la configuration des "
"préférences des extensions et la suppression ou la désactivation des "
"extensions non désirées."
#: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:7
msgid "Configure GNOME Shell Extensions"
msgstr "Configurer les extensions Shell de GNOME"
#: subprojects/extensions-app/js/main.js:144
#, javascript-format
msgid "Remove “%s”?"
msgstr "Enlever « %s » ?"
#: subprojects/extensions-app/js/main.js:145
msgid ""
"If you remove the extension, you need to return to download it if you want "
"to enable it again"
msgstr ""
"Si vous enlevez cette extension, vous devrez recommencer son téléchargement "
"si vous souhaitez la réactiver plus tard"
#: subprojects/extensions-app/js/main.js:149
msgid "Remove"
msgstr "Enlever"
#: subprojects/extensions-app/js/main.js:181
msgid "translator-credits"
msgstr ""
"Mathieu Bridon <bochecha@fedoraproject.org>\n"
"Pablo Martin-Gomez <pablo.martin-gomez@laposte.net>\n"
"Bruno Brouard <annoa.b@gmail.com>\n"
"Cyril Arnaud <cyril dot arnaud at gmail dot com>\n"
"Luc Guillemin <luc.guillemin@gmail.com>\n"
"Luc Pionchon <pionchon.luc@gmail.com>\n"
"Pierre Henry <pierrehenry73@yahoo.fr>\n"
"Alexandre Franke <alexandre.franke@gmail.com>\n"
"Mathieu Stumpf <psychoslave@culture-libre.org>\n"
"Alain Lojewski <allomervan@gmail.com>\n"
"Erwan Georget <egeorget@opmbx.org>\n"
"Julien Humbert <julroy67@gmail.com>\n"
"Claude Paroz <claude@2xlibre.net>\n"
"Charles Monzat <charles.monzat@free.fr>"
#: subprojects/extensions-app/js/main.js:316
#, javascript-format
msgid "%d extension will be updated on next login."
msgid_plural "%d extensions will be updated on next login."
msgstr[0] "%d extension sera mise à jour à la prochaine connexion."
msgstr[1] "%d extensions seront mises à jour à la prochaine connexion."
#: subprojects/extensions-app/data/ui/extension-row.ui:100
#: subprojects/extensions-tool/src/command-create.c:211
#: subprojects/extensions-tool/src/main.c:173
msgid "Description"
msgstr "Description"
#: subprojects/extensions-app/data/ui/extension-row.ui:123
#: subprojects/extensions-tool/src/main.c:185
msgid "Version"
msgstr "Version"
#: subprojects/extensions-app/data/ui/extension-row.ui:151
msgid "Author"
msgstr "Auteur"
#: subprojects/extensions-app/data/ui/extension-row.ui:175
msgid "Website"
msgstr "Site Web"
#: subprojects/extensions-app/data/ui/extension-row.ui:192
msgid "Remove…"
msgstr "Enlever…"
#: subprojects/extensions-app/data/ui/extensions-window.ui:8
msgid "Help"
msgstr "Aide"
#: subprojects/extensions-app/data/ui/extensions-window.ui:12
msgid "About Extensions"
msgstr "À propos des 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>."
msgstr ""
"Pour trouver et ajouter des extensions, visitez <a href=\"https://extensions."
"gnome.org\">extensions.gnome.org</a>."
#: subprojects/extensions-app/data/ui/extensions-window.ui:35
msgid "Warning"
msgstr "Avertissement"
#: subprojects/extensions-app/data/ui/extensions-window.ui:46
msgid ""
"Extensions can cause system issues, including performance problems. If you "
"encounter problems with your system, it is recommended to disable all "
"extensions."
msgstr ""
"Les extensions peuvent poser des problèmes au système, y compris au niveau "
"des performances. Si vous pensez être dans ce cas, il est recommandé de "
"désactiver toutes les extensions."
#: subprojects/extensions-app/data/ui/extensions-window.ui:135
msgid "Manually Installed"
msgstr "Installée manuellement"
#: subprojects/extensions-app/data/ui/extensions-window.ui:159
msgid "Built-In"
msgstr "Intégrée"
#: subprojects/extensions-app/data/ui/extensions-window.ui:200
msgid "No Installed Extensions"
msgstr "Aucune extension installée"
#: subprojects/extensions-app/data/ui/extensions-window.ui:236
msgid ""
"Were very sorry, but it was not possible to get the list of installed "
"extensions. Make sure you are logged into GNOME and try again."
msgstr ""
"Nous sommes désolés, mais il nest pas possible dobtenir la liste des "
"extensions installées. Vérifiez que vous êtes bien connecté à GNOME et "
"essayez encore une fois."
#: subprojects/extensions-app/data/ui/extensions-window.ui:273
#| msgid "Extension Updates Available"
msgid "Extension Updates Ready"
msgstr "Mises à jour dextensions prêtes"
#: subprojects/extensions-app/data/ui/extensions-window.ui:289
msgid "Log Out…"
msgstr "Fermer la session…"
#. Translators: a file path to an extension directory #. Translators: a file path to an extension directory
#: subprojects/extensions-tool/src/command-create.c:125 #: subprojects/extensions-tool/src/command-create.c:125
#, c-format #, c-format
@ -2903,9 +2902,6 @@ msgstr[1] "%u entrées"
msgid "System Sounds" msgid "System Sounds"
msgstr "Sons système" msgstr "Sons système"
#~ msgid "Copy Error"
#~ msgstr "Copier lerreur"
#~| msgid "Username: " #~| msgid "Username: "
#~ msgid "Username…" #~ msgid "Username…"
#~ msgstr "Nom dutilisateur…" #~ msgstr "Nom dutilisateur…"

607
po/fur.po

File diff suppressed because it is too large Load Diff

437
po/id.po
View File

@ -11,8 +11,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell master\n" "Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2020-05-11 14:00+0000\n" "POT-Creation-Date: 2020-03-19 14:34+0000\n"
"PO-Revision-Date: 2020-05-14 16:29+0700\n" "PO-Revision-Date: 2020-03-20 14:13+0700\n"
"Last-Translator: Kukuh Syafaat <kukuhsyafaat@gnome.org>\n" "Last-Translator: Kukuh Syafaat <kukuhsyafaat@gnome.org>\n"
"Language-Team: Indonesian <gnome-l10n-id@googlegroups.com>\n" "Language-Team: Indonesian <gnome-l10n-id@googlegroups.com>\n"
"Language: id\n" "Language: id\n"
@ -20,7 +20,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n" "Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Poedit 2.3.1\n" "X-Generator: Poedit 2.3\n"
"X-DamnedLies-Scope: partial\n" "X-DamnedLies-Scope: partial\n"
"X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-SourceCharset: UTF-8\n"
@ -396,12 +396,70 @@ msgstr ""
msgid "Network Login" msgid "Network Login"
msgstr "Log Masuk Jaringan" msgstr "Log Masuk Jaringan"
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:36 #: js/extensionPrefs/data/metainfo/org.gnome.Extensions.metainfo.xml.in:5
#: subprojects/extensions-app/data/ui/extensions-window.ui:224 #: js/extensionPrefs/data/org.gnome.Extensions.desktop.in.in:4
#: js/extensionPrefs/js/main.js:242
#: js/extensionPrefs/data/ui/extensions-window.ui:61
msgid "Extensions"
msgstr "Ekstensi"
#: js/extensionPrefs/data/metainfo/org.gnome.Extensions.metainfo.xml.in:6
#: js/extensionPrefs/js/main.js:243
msgid "Manage your GNOME Extensions"
msgstr "Kelola Ekstensi GNOME Anda"
#: js/extensionPrefs/data/metainfo/org.gnome.Extensions.metainfo.xml.in:35
msgid ""
"GNOME Extensions handles updating extensions, configuring extension "
"preferences and removing or disabling unwanted extensions."
msgstr ""
"Ekstensi GNOME menangani pemutakhiran ekstensi, mengkonfigurasi preferensi "
"ekstensi, dan menghapus atau menonaktifkan ekstensi yang tidak diinginkan."
#: js/extensionPrefs/data/org.gnome.Extensions.desktop.in.in:7
msgid "Configure GNOME Shell Extensions"
msgstr "Konfigurasi Ekstensi GNOME Shell"
#: js/extensionPrefs/js/main.js:164
#, javascript-format
msgid "Remove “%s”?"
msgstr "Hapus \"%s\"?"
#: js/extensionPrefs/js/main.js:165
msgid ""
"If you remove the extension, you need to return to download it if you want "
"to enable it again"
msgstr ""
"Jika Anda menghapus ekstensi, Anda harus kembali untuk mengunduhnya jika "
"Anda ingin mengaktifkannya lagi"
#: js/extensionPrefs/js/main.js:168 js/gdm/authPrompt.js:135
#: js/ui/audioDeviceSelection.js:57 js/ui/components/networkAgent.js:109
#: js/ui/components/polkitAgent.js:139 js/ui/endSessionDialog.js:374
#: js/ui/extensionDownloader.js:177 js/ui/shellMountOperation.js:376
#: js/ui/shellMountOperation.js:386 js/ui/status/network.js:913
msgid "Cancel"
msgstr "Batal"
#: js/extensionPrefs/js/main.js:169
msgid "Remove"
msgstr "Hapus"
#: js/extensionPrefs/js/main.js:241
msgid "translator-credits"
msgstr ""
"Andika Triwidada <andika@gmail.com>, 2010-2014, 2017.\n"
"Dirgita <dirgitadevina@yahoo.co.id>, 2011, 2012, 2014.\n"
"Wibiharto <wibinem@yahoo.com>, 2011.\n"
"Kukuh Syafaat <kukuhsyafaat@gnome.org>, 2017-2020.\n"
"Sucipto <sucipto@pm.me>, 2020."
#: js/extensionPrefs/js/main.js:285
#: js/extensionPrefs/data/ui/extensions-window.ui:223
msgid "Somethings gone wrong" msgid "Somethings gone wrong"
msgstr "Ada yang tidak beres" msgstr "Ada yang tidak beres"
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:48 #: js/extensionPrefs/js/main.js:292
msgid "" msgid ""
"Were very sorry, but theres been a problem: the settings for this " "Were very sorry, but theres been a problem: the settings for this "
"extension cant be displayed. We recommend that you report the issue to the " "extension cant be displayed. We recommend that you report the issue to the "
@ -411,25 +469,105 @@ msgstr ""
"tidak dapat ditampilkan. Kami menyarankan Anda melaporkan masalah ini kepada " "tidak dapat ditampilkan. Kami menyarankan Anda melaporkan masalah ini kepada "
"penulis ekstensi." "penulis ekstensi."
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:82 #: js/extensionPrefs/js/main.js:299
msgid "Technical Details" msgid "Technical Details"
msgstr "Detail Teknis" msgstr "Detail Teknis"
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:165 #: js/extensionPrefs/js/main.js:334
msgid "Copy Error"
msgstr "Salin Galat"
#: js/extensionPrefs/js/main.js:361
msgid "Homepage" msgid "Homepage"
msgstr "Halaman Web" msgstr "Halaman Web"
#: js/dbusServices/extensions/ui/extension-prefs-dialog.ui:166 #: js/extensionPrefs/js/main.js:362
msgid "Visit extension homepage" msgid "Visit extension homepage"
msgstr "Kunjungi halaman web ekstensi" msgstr "Kunjungi halaman web ekstensi"
#: js/gdm/authPrompt.js:135 js/ui/audioDeviceSelection.js:57 #: js/extensionPrefs/js/main.js:479
#: js/ui/components/networkAgent.js:109 js/ui/components/polkitAgent.js:139 #, javascript-format
#: js/ui/endSessionDialog.js:372 js/ui/extensionDownloader.js:181 msgid "%d extension will be updated on next login."
#: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386 msgid_plural "%d extensions will be updated on next login."
#: js/ui/status/network.js:913 subprojects/extensions-app/js/main.js:148 msgstr[0] "%d ekstensi akan diperbarui pada log masuk berikutnya."
msgid "Cancel" msgstr[1] "%d ekstensi akan diperbarui pada log masuk berikutnya."
msgstr "Batal"
#: js/extensionPrefs/data/ui/extension-row.ui:100
#: subprojects/extensions-tool/src/command-create.c:211
#: subprojects/extensions-tool/src/main.c:173
msgid "Description"
msgstr "Deskripsi"
#: js/extensionPrefs/data/ui/extension-row.ui:123
#: subprojects/extensions-tool/src/main.c:185
msgid "Version"
msgstr "Versi"
#: js/extensionPrefs/data/ui/extension-row.ui:151
msgid "Author"
msgstr "Penulis"
#: js/extensionPrefs/data/ui/extension-row.ui:175
msgid "Website"
msgstr "Situs Web"
#: js/extensionPrefs/data/ui/extension-row.ui:192
msgid "Remove…"
msgstr "Hapus…"
#: js/extensionPrefs/data/ui/extensions-window.ui:8
msgid "Help"
msgstr "Bantuan"
#: js/extensionPrefs/data/ui/extensions-window.ui:12
msgid "About Extensions"
msgstr "Tentang Ekstensi"
#: js/extensionPrefs/data/ui/extensions-window.ui:27
msgid ""
"To find and add extensions, visit <a href=\"https://extensions.gnome.org"
"\">extensions.gnome.org</a>."
msgstr ""
"Untuk menemukan dan menambahkan ekstensi, kunjungi <a href=\"https://"
"extensions.gnome.org\">extensions.gnome.org</a>."
#: js/extensionPrefs/data/ui/extensions-window.ui:35
msgid "Warning"
msgstr "Peringatan"
#: js/extensionPrefs/data/ui/extensions-window.ui:46
msgid ""
"Extensions can cause system issues, including performance problems. If you "
"encounter problems with your system, it is recommended to disable all "
"extensions."
msgstr ""
"Ekstensi dapat menyebabkan masalah sistem, termasuk masalah kinerja. Jika "
"Anda mengalami masalah dengan sistem Anda, disarankan untuk menonaktifkan "
"semua ekstensi."
#: js/extensionPrefs/data/ui/extensions-window.ui:134
msgid "Manually Installed"
msgstr "Dipasang Secara Manual"
#: js/extensionPrefs/data/ui/extensions-window.ui:158
msgid "Built-In"
msgstr "Bawaan"
#: js/extensionPrefs/data/ui/extensions-window.ui:199
msgid "No Installed Extensions"
msgstr "Tidak Ada Ekstensi Terpasang"
#: js/extensionPrefs/data/ui/extensions-window.ui:235
msgid ""
"Were very sorry, but it was not possible to get the list of installed "
"extensions. Make sure you are logged into GNOME and try again."
msgstr ""
"Kami sangat menyesal, tetapi tidak mungkin mendapatkan daftar ekstensi yang "
"dipasang. Pastikan Anda masuk ke GNOME dan coba lagi."
#: js/extensionPrefs/data/ui/extensions-window.ui:288
msgid "Log Out…"
msgstr "Keluar…"
#. Cisco LEAP #. Cisco LEAP
#: js/gdm/authPrompt.js:237 js/ui/components/networkAgent.js:204 #: js/gdm/authPrompt.js:237 js/ui/components/networkAgent.js:204
@ -481,71 +619,71 @@ msgid "(or swipe finger)"
msgstr "(atau gesekkan jari)" msgstr "(atau gesekkan jari)"
#. Translators: The name of the power-off action in search #. Translators: The name of the power-off action in search
#: js/misc/systemActions.js:93 #: js/misc/systemActions.js:89
msgctxt "search-result" msgctxt "search-result"
msgid "Power Off" msgid "Power Off"
msgstr "Matikan" msgstr "Matikan"
#. Translators: A list of keywords that match the power-off action, separated by semicolons #. Translators: A list of keywords that match the power-off action, separated by semicolons
#: js/misc/systemActions.js:96 #: js/misc/systemActions.js:92
msgid "power off;shutdown;reboot;restart;halt;stop" msgid "power off;shutdown;reboot;restart;halt;stop"
msgstr "matikan;nyalakan ulang;berhenti" msgstr "matikan;nyalakan ulang;berhenti"
#. Translators: The name of the lock screen action in search #. Translators: The name of the lock screen action in search
#: js/misc/systemActions.js:101 #: js/misc/systemActions.js:97
msgctxt "search-result" msgctxt "search-result"
msgid "Lock Screen" msgid "Lock Screen"
msgstr "Kunci Layar" msgstr "Kunci Layar"
#. Translators: A list of keywords that match the lock screen action, separated by semicolons #. Translators: A list of keywords that match the lock screen action, separated by semicolons
#: js/misc/systemActions.js:104 #: js/misc/systemActions.js:100
msgid "lock screen" msgid "lock screen"
msgstr "kunci layar" msgstr "kunci layar"
#. Translators: The name of the logout action in search #. Translators: The name of the logout action in search
#: js/misc/systemActions.js:109 #: js/misc/systemActions.js:105
msgctxt "search-result" msgctxt "search-result"
msgid "Log Out" msgid "Log Out"
msgstr "Keluar" msgstr "Keluar"
#. Translators: A list of keywords that match the logout action, separated by semicolons #. Translators: A list of keywords that match the logout action, separated by semicolons
#: js/misc/systemActions.js:112 #: js/misc/systemActions.js:108
msgid "logout;log out;sign off" msgid "logout;log out;sign off"
msgstr "keluar;logout;log out;sign off" msgstr "keluar;logout;log out;sign off"
#. Translators: The name of the suspend action in search #. Translators: The name of the suspend action in search
#: js/misc/systemActions.js:117 #: js/misc/systemActions.js:113
msgctxt "search-result" msgctxt "search-result"
msgid "Suspend" msgid "Suspend"
msgstr "Suspensi" msgstr "Suspensi"
#. Translators: A list of keywords that match the suspend action, separated by semicolons #. Translators: A list of keywords that match the suspend action, separated by semicolons
#: js/misc/systemActions.js:120 #: js/misc/systemActions.js:116
msgid "suspend;sleep" msgid "suspend;sleep"
msgstr "suspensi;tidur" msgstr "suspensi;tidur"
#. Translators: The name of the switch user action in search #. Translators: The name of the switch user action in search
#: js/misc/systemActions.js:125 #: js/misc/systemActions.js:121
msgctxt "search-result" msgctxt "search-result"
msgid "Switch User" msgid "Switch User"
msgstr "Ganti Pengguna" msgstr "Ganti Pengguna"
#. Translators: A list of keywords that match the switch user action, separated by semicolons #. Translators: A list of keywords that match the switch user action, separated by semicolons
#: js/misc/systemActions.js:128 #: js/misc/systemActions.js:124
msgid "switch user" msgid "switch user"
msgstr "ganti pengguna" msgstr "ganti pengguna"
#. Translators: A list of keywords that match the lock orientation action, separated by semicolons #. Translators: A list of keywords that match the lock orientation action, separated by semicolons
#: js/misc/systemActions.js:135 #: js/misc/systemActions.js:131
msgid "lock orientation;unlock orientation;screen;rotation" msgid "lock orientation;unlock orientation;screen;rotation"
msgstr "kunci orientasi;buka kunci orientasi;layar;rotasi" msgstr "kunci orientasi;buka kunci orientasi;layar;rotasi"
#: js/misc/systemActions.js:255 #: js/misc/systemActions.js:251
msgctxt "search-result" msgctxt "search-result"
msgid "Unlock Screen Rotation" msgid "Unlock Screen Rotation"
msgstr "Buka Kunci Rotasi Layar" msgstr "Buka Kunci Rotasi Layar"
#: js/misc/systemActions.js:256 #: js/misc/systemActions.js:252
msgctxt "search-result" msgctxt "search-result"
msgid "Lock Screen Rotation" msgid "Lock Screen Rotation"
msgstr "Kunci Rotasi Layar" msgstr "Kunci Rotasi Layar"
@ -711,53 +849,53 @@ msgstr "Tolak Akses"
msgid "Grant Access" msgid "Grant Access"
msgstr "Beri Akses" msgstr "Beri Akses"
#: js/ui/appDisplay.js:939 #: js/ui/appDisplay.js:898
msgid "Unnamed Folder" msgid "Unnamed Folder"
msgstr "Folder Tanpa Nama" msgstr "Folder Tanpa Nama"
#: js/ui/appDisplay.js:962 #: js/ui/appDisplay.js:921
msgid "Frequently used applications will appear here" msgid "Frequently used applications will appear here"
msgstr "Aplikasi yang sering dipakai akan muncul di sini" msgstr "Aplikasi yang sering dipakai akan muncul di sini"
#: js/ui/appDisplay.js:1097 #: js/ui/appDisplay.js:1056
msgid "Frequent" msgid "Frequent"
msgstr "Sering" msgstr "Sering"
#: js/ui/appDisplay.js:1104 #: js/ui/appDisplay.js:1063
msgid "All" msgid "All"
msgstr "Semua" msgstr "Semua"
#. Translators: This is the heading of a list of open windows #. Translators: This is the heading of a list of open windows
#: js/ui/appDisplay.js:2480 js/ui/panel.js:75 #: js/ui/appDisplay.js:2446 js/ui/panel.js:75
msgid "Open Windows" msgid "Open Windows"
msgstr "Buka Jendela" msgstr "Buka Jendela"
#: js/ui/appDisplay.js:2500 js/ui/panel.js:82 #: js/ui/appDisplay.js:2466 js/ui/panel.js:82
msgid "New Window" msgid "New Window"
msgstr "Jendela Baru" msgstr "Jendela Baru"
#: js/ui/appDisplay.js:2511 #: js/ui/appDisplay.js:2477
msgid "Launch using Dedicated Graphics Card" msgid "Launch using Dedicated Graphics Card"
msgstr "Luncurkan menggunakan Kartu Grafis Terdedikasi" msgstr "Luncurkan menggunakan Kartu Grafis Terdedikasi"
#: js/ui/appDisplay.js:2539 js/ui/dash.js:239 #: js/ui/appDisplay.js:2505 js/ui/dash.js:239
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Hapus dari Favorit" msgstr "Hapus dari Favorit"
#: js/ui/appDisplay.js:2545 #: js/ui/appDisplay.js:2511
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Tambah ke Favorit" msgstr "Tambah ke Favorit"
#: js/ui/appDisplay.js:2555 js/ui/panel.js:93 #: js/ui/appDisplay.js:2521 js/ui/panel.js:93
msgid "Show Details" msgid "Show Details"
msgstr "Tampilkan Rincian" msgstr "Tampilkan Rincian"
#: js/ui/appFavorites.js:153 #: js/ui/appFavorites.js:152
#, javascript-format #, javascript-format
msgid "%s has been added to your favorites." msgid "%s has been added to your favorites."
msgstr "%s telah ditambahkan ke favorit Anda." msgstr "%s telah ditambahkan ke favorit Anda."
#: js/ui/appFavorites.js:186 #: js/ui/appFavorites.js:185
#, javascript-format #, javascript-format
msgid "%s has been removed from your favorites." msgid "%s has been removed from your favorites."
msgstr "%s telah dihapus dari favorit Anda." msgstr "%s telah dihapus dari favorit Anda."
@ -778,7 +916,7 @@ msgstr "Headphone"
msgid "Headset" msgid "Headset"
msgstr "Headset" msgstr "Headset"
#: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:270 #: js/ui/audioDeviceSelection.js:68 js/ui/status/volume.js:269
msgid "Microphone" msgid "Microphone"
msgstr "Mikrofon" msgstr "Mikrofon"
@ -919,7 +1057,7 @@ msgstr "Tak Ada Kejadian"
msgid "Do Not Disturb" msgid "Do Not Disturb"
msgstr "Jangan Ganggu" msgstr "Jangan Ganggu"
#: js/ui/calendar.js:1176 #: js/ui/calendar.js:1171
msgid "Clear" msgid "Clear"
msgstr "Bersihkan" msgstr "Bersihkan"
@ -1069,7 +1207,7 @@ msgstr "Maaf, tidak berhasil. Silakan coba lagi."
#. Translators: this is the other person changing their old IM name to their new #. Translators: this is the other person changing their old IM name to their new
#. IM name. #. IM name.
#: js/ui/components/telepathyClient.js:823 #: js/ui/components/telepathyClient.js:787
#, javascript-format #, javascript-format
msgid "%s is now known as %s" msgid "%s is now known as %s"
msgstr "%s sekarang dikenal sebagai %s" msgstr "%s sekarang dikenal sebagai %s"
@ -1113,23 +1251,23 @@ msgstr "Tambah jam dunia…"
msgid "World Clocks" msgid "World Clocks"
msgstr "Jam Dunia" msgstr "Jam Dunia"
#: js/ui/dateMenu.js:289 #: js/ui/dateMenu.js:279
msgid "Weather" msgid "Weather"
msgstr "Cuaca" msgstr "Cuaca"
#: js/ui/dateMenu.js:418 #: js/ui/dateMenu.js:394
msgid "Select a location…" msgid "Select a location…"
msgstr "Pilih lokasi…" msgstr "Pilih lokasi…"
#: js/ui/dateMenu.js:426 #: js/ui/dateMenu.js:407
msgid "Loading…" msgid "Loading…"
msgstr "Memuat…" msgstr "Memuat…"
#: js/ui/dateMenu.js:436 #: js/ui/dateMenu.js:417
msgid "Go online for weather information" msgid "Go online for weather information"
msgstr "Pergi daring untuk informasi cuaca" msgstr "Pergi daring untuk informasi cuaca"
#: js/ui/dateMenu.js:438 #: js/ui/dateMenu.js:419
msgid "Weather information is currently unavailable" msgid "Weather information is currently unavailable"
msgstr "Informasi cuaca saat ini tidak tersedia" msgstr "Informasi cuaca saat ini tidak tersedia"
@ -1271,35 +1409,35 @@ msgid "Other users are logged in"
msgstr "Pengguna lain sedang log masuk" msgstr "Pengguna lain sedang log masuk"
#. Translators: Remote here refers to a remote session, like a ssh login #. Translators: Remote here refers to a remote session, like a ssh login
#: js/ui/endSessionDialog.js:586 #: js/ui/endSessionDialog.js:588
#, javascript-format #, javascript-format
msgid "%s (remote)" msgid "%s (remote)"
msgstr "%s (jarak jauh)" msgstr "%s (jarak jauh)"
#. Translators: Console here refers to a tty like a VT console #. Translators: Console here refers to a tty like a VT console
#: js/ui/endSessionDialog.js:589 #: js/ui/endSessionDialog.js:591
#, javascript-format #, javascript-format
msgid "%s (console)" msgid "%s (console)"
msgstr "%s (konsol)" msgstr "%s (konsol)"
#: js/ui/extensionDownloader.js:185 #: js/ui/extensionDownloader.js:181
msgid "Install" msgid "Install"
msgstr "Pasang" msgstr "Pasang"
#: js/ui/extensionDownloader.js:191 #: js/ui/extensionDownloader.js:187
msgid "Install Extension" msgid "Install Extension"
msgstr "Pasang Ekstensi" msgstr "Pasang Ekstensi"
#: js/ui/extensionDownloader.js:192 #: js/ui/extensionDownloader.js:188
#, javascript-format #, javascript-format
msgid "Download and install “%s” from extensions.gnome.org?" msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "Unduh dan pasang \"%s\" dari extensions.gnome.org?" msgstr "Unduh dan pasang \"%s\" dari extensions.gnome.org?"
#: js/ui/extensionSystem.js:252 #: js/ui/extensionSystem.js:228
msgid "Extension Updates Available" msgid "Extension Updates Available"
msgstr "Pemutakhiran Ekstensi Tersedia" msgstr "Pemutakhiran Ekstensi Tersedia"
#: js/ui/extensionSystem.js:253 #: js/ui/extensionSystem.js:229
msgid "Extension updates are ready to be installed." msgid "Extension updates are ready to be installed."
msgstr "Pemutakhiran ekstensi siap dipasang." msgstr "Pemutakhiran ekstensi siap dipasang."
@ -1446,11 +1584,11 @@ msgstr "Tilik Sumber"
msgid "Web Page" msgid "Web Page"
msgstr "Halaman Web" msgstr "Halaman Web"
#: js/ui/main.js:279 #: js/ui/main.js:274
msgid "Logged in as a privileged user" msgid "Logged in as a privileged user"
msgstr "Masuk sebagai pengguna istimewa" msgstr "Masuk sebagai pengguna istimewa"
#: js/ui/main.js:280 #: js/ui/main.js:275
msgid "" msgid ""
"Running a session as a privileged user should be avoided for security " "Running a session as a privileged user should be avoided for security "
"reasons. If possible, you should log in as a normal user." "reasons. If possible, you should log in as a normal user."
@ -1458,15 +1596,15 @@ msgstr ""
"Menjalankan sesi sebagai pengguna istimewa harus dihindari untuk alasan " "Menjalankan sesi sebagai pengguna istimewa harus dihindari untuk alasan "
"keamanan. Jika memungkinkan, Anda harus masuk sebagai pengguna biasa." "keamanan. Jika memungkinkan, Anda harus masuk sebagai pengguna biasa."
#: js/ui/main.js:319 #: js/ui/main.js:281
msgid "Screen Lock disabled" msgid "Screen Lock disabled"
msgstr "Kunci Layar dinonaktifkan" msgstr "Kunci Layar dinonaktifkan"
#: js/ui/main.js:320 #: js/ui/main.js:282
msgid "Screen Locking requires the GNOME display manager." msgid "Screen Locking requires the GNOME display manager."
msgstr "Penguncian Layar memerlukan manajer tampilan GNOME." msgstr "Penguncian Layar memerlukan manajer tampilan GNOME."
#: js/ui/messageTray.js:1548 #: js/ui/messageTray.js:1554
msgid "System Information" msgid "System Information"
msgstr "Informasi Sistem" msgstr "Informasi Sistem"
@ -1546,16 +1684,16 @@ msgstr "Keluar"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". #. in your language, you can use the word for "Overview".
#: js/ui/panel.js:437 #: js/ui/panel.js:434
msgid "Activities" msgid "Activities"
msgstr "Aktivitas" msgstr "Aktivitas"
#: js/ui/panel.js:716 #: js/ui/panel.js:713
msgctxt "System menu in the top bar" msgctxt "System menu in the top bar"
msgid "System" msgid "System"
msgstr "Sistem" msgstr "Sistem"
#: js/ui/panel.js:829 #: js/ui/panel.js:826
msgid "Top Bar" msgid "Top Bar"
msgstr "Bar Atas" msgstr "Bar Atas"
@ -1586,11 +1724,11 @@ msgstr "GNOME perlu mengunci layar"
#. #.
#. XXX: another option is to kick the user into the gdm login #. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs #. screen, where we're not affected by grabs
#: js/ui/screenShield.js:244 js/ui/screenShield.js:601 #: js/ui/screenShield.js:244 js/ui/screenShield.js:598
msgid "Unable to lock" msgid "Unable to lock"
msgstr "Tak bisa mengunci" msgstr "Tak bisa mengunci"
#: js/ui/screenShield.js:245 js/ui/screenShield.js:602 #: js/ui/screenShield.js:245 js/ui/screenShield.js:599
msgid "Lock was blocked by an application" msgid "Lock was blocked by an application"
msgstr "Kunci diblokir oleh suatu aplikasi" msgstr "Kunci diblokir oleh suatu aplikasi"
@ -1673,13 +1811,13 @@ msgid "The PIM must be a number or empty."
msgstr "PIM harus berupa angka atau kosong." msgstr "PIM harus berupa angka atau kosong."
#. Translators: %s is the Disks application #. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:465 #: js/ui/shellMountOperation.js:469
#, javascript-format #, javascript-format
msgid "Unable to start %s" msgid "Unable to start %s"
msgstr "Tak bisa memulai %s" msgstr "Tak bisa memulai %s"
#. Translators: %s is the Disks application #. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:467 #: js/ui/shellMountOperation.js:471
#, javascript-format #, javascript-format
msgid "Couldnt find the %s application" msgid "Couldnt find the %s application"
msgstr "Tak bisa menemukan aplikasi %s" msgstr "Tak bisa menemukan aplikasi %s"
@ -2152,11 +2290,11 @@ msgstr "Autorisasi Thunderbolt galat"
msgid "Could not authorize the Thunderbolt device: %s" msgid "Could not authorize the Thunderbolt device: %s"
msgstr "Tidak dapat mengautorisasi perangkat Thunderbolt: %s" msgstr "Tidak dapat mengautorisasi perangkat Thunderbolt: %s"
#: js/ui/status/volume.js:151 #: js/ui/status/volume.js:150
msgid "Volume changed" msgid "Volume changed"
msgstr "Volume diubah" msgstr "Volume diubah"
#: js/ui/status/volume.js:222 #: js/ui/status/volume.js:221
msgid "Volume" msgid "Volume"
msgstr "Volume" msgstr "Volume"
@ -2196,23 +2334,23 @@ msgstr "Hanya Bawaan"
# %d: 1 # %d: 1
#. Translators: This is a time format for a date in #. Translators: This is a time format for a date in
#. long format #. long format
#: js/ui/unlockDialog.js:371 #: js/ui/unlockDialog.js:370
msgid "%A %B %-d" msgid "%A %B %-d"
msgstr "%A, %d %B" msgstr "%A, %d %B"
#: js/ui/unlockDialog.js:377 #: js/ui/unlockDialog.js:376
msgid "Swipe up to unlock" msgid "Swipe up to unlock"
msgstr "Gesek ke atas untuk membuka kunci" msgstr "Gesek ke atas untuk membuka kunci"
#: js/ui/unlockDialog.js:378 #: js/ui/unlockDialog.js:377
msgid "Click or press a key to unlock" msgid "Click or press a key to unlock"
msgstr "Klik atau tekan tombol untuk membuka kunci" msgstr "Klik atau tekan tombol untuk membuka kunci"
#: js/ui/unlockDialog.js:550 #: js/ui/unlockDialog.js:549
msgid "Unlock Window" msgid "Unlock Window"
msgstr "Buka Kunci Jendela" msgstr "Buka Kunci Jendela"
#: js/ui/unlockDialog.js:559 #: js/ui/unlockDialog.js:558
msgid "Log in as another user" msgid "Log in as another user"
msgstr "Masuk sebagai pengguna lain" msgstr "Masuk sebagai pengguna lain"
@ -2245,7 +2383,7 @@ msgstr "Balikkan Tatanan"
msgid "Keep Changes" msgid "Keep Changes"
msgstr "Simpan Perubahan" msgstr "Simpan Perubahan"
#: js/ui/windowManager.js:86 #: js/ui/windowManager.js:85
#, javascript-format #, javascript-format
msgid "Settings changes will revert in %d second" msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds" msgid_plural "Settings changes will revert in %d seconds"
@ -2254,7 +2392,7 @@ msgstr[1] "Perubahan tatanan akan dikembalikan dalam %d detik"
#. Translators: This represents the size of a window. The first number is #. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height. #. * the width of the window and the second is the height.
#: js/ui/windowManager.js:546 #: js/ui/windowManager.js:544
#, javascript-format #, javascript-format
msgid "%d × %d" msgid "%d × %d"
msgstr "%d × %d" msgstr "%d × %d"
@ -2347,12 +2485,12 @@ msgstr "Menggunakan mode tertentu, mis. \"gdm\" untuk layar masuk"
msgid "List possible modes" msgid "List possible modes"
msgstr "Menampilkan mode yang mungkin" msgstr "Menampilkan mode yang mungkin"
#: src/shell-app.c:286 #: src/shell-app.c:279
msgctxt "program" msgctxt "program"
msgid "Unknown" msgid "Unknown"
msgstr "Tak dikenal" msgstr "Tak dikenal"
#: src/shell-app.c:537 #: src/shell-app.c:530
#, c-format #, c-format
msgid "Failed to launch “%s”" msgid "Failed to launch “%s”"
msgstr "Gagal meluncurkan \"%s\"" msgstr "Gagal meluncurkan \"%s\""
@ -2369,144 +2507,6 @@ msgstr "Kata sandi tidak boleh kosong"
msgid "Authentication dialog was dismissed by the user" msgid "Authentication dialog was dismissed by the user"
msgstr "Dialog autentikasi ditolak oleh pengguna" msgstr "Dialog autentikasi ditolak oleh pengguna"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:5
#: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:4
#: subprojects/extensions-app/js/main.js:182
#: subprojects/extensions-app/data/ui/extensions-window.ui:61
msgid "Extensions"
msgstr "Ekstensi"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:6
#: subprojects/extensions-app/js/main.js:183
msgid "Manage your GNOME Extensions"
msgstr "Kelola Ekstensi GNOME Anda"
#: subprojects/extensions-app/data/metainfo/org.gnome.Extensions.metainfo.xml.in:35
msgid ""
"GNOME Extensions handles updating extensions, configuring extension "
"preferences and removing or disabling unwanted extensions."
msgstr ""
"Ekstensi GNOME menangani pemutakhiran ekstensi, mengkonfigurasi preferensi "
"ekstensi, dan menghapus atau menonaktifkan ekstensi yang tidak diinginkan."
#: subprojects/extensions-app/data/org.gnome.Extensions.desktop.in.in:7
msgid "Configure GNOME Shell Extensions"
msgstr "Konfigurasi Ekstensi GNOME Shell"
#: subprojects/extensions-app/js/main.js:144
#, javascript-format
msgid "Remove “%s”?"
msgstr "Hapus \"%s\"?"
#: subprojects/extensions-app/js/main.js:145
msgid ""
"If you remove the extension, you need to return to download it if you want "
"to enable it again"
msgstr ""
"Jika Anda menghapus ekstensi, Anda harus kembali untuk mengunduhnya jika "
"Anda ingin mengaktifkannya lagi"
#: subprojects/extensions-app/js/main.js:149
msgid "Remove"
msgstr "Hapus"
#: subprojects/extensions-app/js/main.js:181
msgid "translator-credits"
msgstr ""
"Andika Triwidada <andika@gmail.com>, 2010-2014, 2017.\n"
"Dirgita <dirgitadevina@yahoo.co.id>, 2011, 2012, 2014.\n"
"Wibiharto <wibinem@yahoo.com>, 2011.\n"
"Kukuh Syafaat <kukuhsyafaat@gnome.org>, 2017-2020.\n"
"Sucipto <sucipto@pm.me>, 2020."
#: subprojects/extensions-app/js/main.js:316
#, javascript-format
msgid "%d extension will be updated on next login."
msgid_plural "%d extensions will be updated on next login."
msgstr[0] "%d ekstensi akan diperbarui pada log masuk berikutnya."
msgstr[1] "%d ekstensi akan diperbarui pada log masuk berikutnya."
#: subprojects/extensions-app/data/ui/extension-row.ui:100
#: subprojects/extensions-tool/src/command-create.c:211
#: subprojects/extensions-tool/src/main.c:173
msgid "Description"
msgstr "Deskripsi"
#: subprojects/extensions-app/data/ui/extension-row.ui:123
#: subprojects/extensions-tool/src/main.c:185
msgid "Version"
msgstr "Versi"
#: subprojects/extensions-app/data/ui/extension-row.ui:151
msgid "Author"
msgstr "Penulis"
#: subprojects/extensions-app/data/ui/extension-row.ui:175
msgid "Website"
msgstr "Situs Web"
#: subprojects/extensions-app/data/ui/extension-row.ui:192
msgid "Remove…"
msgstr "Hapus…"
#: subprojects/extensions-app/data/ui/extensions-window.ui:8
msgid "Help"
msgstr "Bantuan"
#: subprojects/extensions-app/data/ui/extensions-window.ui:12
msgid "About Extensions"
msgstr "Tentang Ekstensi"
#: 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>."
msgstr ""
"Untuk menemukan dan menambahkan ekstensi, kunjungi <a href=\"https://"
"extensions.gnome.org\">extensions.gnome.org</a>."
#: subprojects/extensions-app/data/ui/extensions-window.ui:35
msgid "Warning"
msgstr "Peringatan"
#: subprojects/extensions-app/data/ui/extensions-window.ui:46
msgid ""
"Extensions can cause system issues, including performance problems. If you "
"encounter problems with your system, it is recommended to disable all "
"extensions."
msgstr ""
"Ekstensi dapat menyebabkan masalah sistem, termasuk masalah kinerja. Jika "
"Anda mengalami masalah dengan sistem Anda, disarankan untuk menonaktifkan "
"semua ekstensi."
#: subprojects/extensions-app/data/ui/extensions-window.ui:135
msgid "Manually Installed"
msgstr "Dipasang Secara Manual"
#: subprojects/extensions-app/data/ui/extensions-window.ui:159
msgid "Built-In"
msgstr "Bawaan"
#: subprojects/extensions-app/data/ui/extensions-window.ui:200
msgid "No Installed Extensions"
msgstr "Tidak Ada Ekstensi Terpasang"
#: subprojects/extensions-app/data/ui/extensions-window.ui:236
msgid ""
"Were very sorry, but it was not possible to get the list of installed "
"extensions. Make sure you are logged into GNOME and try again."
msgstr ""
"Kami sangat menyesal, tetapi tidak mungkin mendapatkan daftar ekstensi yang "
"dipasang. Pastikan Anda masuk ke GNOME dan coba lagi."
#: subprojects/extensions-app/data/ui/extensions-window.ui:273
msgid "Extension Updates Ready"
msgstr "Pemutakhiran Ekstensi Siap"
#: subprojects/extensions-app/data/ui/extensions-window.ui:289
msgid "Log Out…"
msgstr "Keluar…"
#. Translators: a file path to an extension directory #. Translators: a file path to an extension directory
#: subprojects/extensions-tool/src/command-create.c:125 #: subprojects/extensions-tool/src/command-create.c:125
#, c-format #, c-format
@ -2844,9 +2844,6 @@ msgstr[1] "%u Masukan"
msgid "System Sounds" msgid "System Sounds"
msgstr "Suara Sistem" msgstr "Suara Sistem"
#~ msgid "Copy Error"
#~ msgstr "Salin Galat"
#~ msgid "Username…" #~ msgid "Username…"
#~ msgstr "Nama pengguna…" #~ msgstr "Nama pengguna…"

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