Compare commits
275 Commits
3.31.91
...
wip/mcrha/
Author | SHA1 | Date | |
---|---|---|---|
![]() |
bd4aac8f49 | ||
![]() |
785dd5c5f7 | ||
![]() |
71e469a59c | ||
![]() |
6d4b9d29b8 | ||
![]() |
33f5bb39cd | ||
![]() |
a1c3900630 | ||
![]() |
cdaf164c01 | ||
![]() |
2bd80579ed | ||
![]() |
54039c3552 | ||
![]() |
b197a1affb | ||
![]() |
51655be6a3 | ||
![]() |
9697c209c0 | ||
![]() |
6ecb0a4546 | ||
![]() |
30861d4800 | ||
![]() |
a23391ea28 | ||
![]() |
58e0b80cac | ||
![]() |
41dd744b74 | ||
![]() |
bdf66d7b62 | ||
![]() |
4258ae3ec2 | ||
![]() |
9b379c49ba | ||
![]() |
7e70dd8453 | ||
![]() |
2e209a82f9 | ||
![]() |
ab0ecc469f | ||
![]() |
7d75ddf635 | ||
![]() |
271e43a1ed | ||
![]() |
2702a82896 | ||
![]() |
8ad33d8752 | ||
![]() |
d84bbb8770 | ||
![]() |
c0c2edf2e1 | ||
![]() |
de0c3251dd | ||
![]() |
0afd600ea4 | ||
![]() |
598407b14a | ||
![]() |
d9bfa16f05 | ||
![]() |
03117d65b2 | ||
![]() |
5520bb3890 | ||
![]() |
4e6b2eb72a | ||
![]() |
2e5295b3a9 | ||
![]() |
3121c9aa29 | ||
![]() |
1ebbd7c768 | ||
![]() |
8572bb97c7 | ||
![]() |
d5ebd8c816 | ||
![]() |
ed999ce926 | ||
![]() |
50b7739076 | ||
![]() |
94995e9c1e | ||
![]() |
fb04dafb0b | ||
![]() |
d57234bec9 | ||
![]() |
38da54fb02 | ||
![]() |
bbd3275dad | ||
![]() |
3a3f9aa008 | ||
![]() |
3c54e863e6 | ||
![]() |
a63ba61194 | ||
![]() |
ab9710ee7b | ||
![]() |
43cef45229 | ||
![]() |
8db4f3c67f | ||
![]() |
594a070029 | ||
![]() |
c2e04e3cfa | ||
![]() |
293f50e8e5 | ||
![]() |
df7fea3407 | ||
![]() |
563412698a | ||
![]() |
2b30146c6c | ||
![]() |
0f531d8c44 | ||
![]() |
218c87994b | ||
![]() |
f74c07b9ac | ||
![]() |
59edea4bb4 | ||
![]() |
4d4d5a0b16 | ||
![]() |
03c4930883 | ||
![]() |
9593e20425 | ||
![]() |
2b1d6e607f | ||
![]() |
1dff32e48a | ||
![]() |
1e3a174de9 | ||
![]() |
7bb84dae80 | ||
![]() |
44fcb9e9af | ||
![]() |
2d30e310bc | ||
![]() |
be2d630348 | ||
![]() |
bea6045aae | ||
![]() |
ad491e7922 | ||
![]() |
fedb8e706a | ||
![]() |
1be933bc49 | ||
![]() |
526bb72f3d | ||
![]() |
49c95cff6c | ||
![]() |
56a361650c | ||
![]() |
d4763b157d | ||
![]() |
d2dc072ba9 | ||
![]() |
ffaca00594 | ||
![]() |
9090b7dc3d | ||
![]() |
a540fe4130 | ||
![]() |
5be61bbb68 | ||
![]() |
8e51fee5c1 | ||
![]() |
9d6fcfdc85 | ||
![]() |
5f5a3b78a5 | ||
![]() |
4e5ca6d376 | ||
![]() |
2fab75f448 | ||
![]() |
22883f2fa2 | ||
![]() |
5d9f80bc73 | ||
![]() |
f7d117488b | ||
![]() |
244a329ee7 | ||
![]() |
044572cb60 | ||
![]() |
746875258d | ||
![]() |
4892a87dfe | ||
![]() |
8b9c8ddb1e | ||
![]() |
eb9000576c | ||
![]() |
862aaf341e | ||
![]() |
a5c75ff58b | ||
![]() |
4541fb9819 | ||
![]() |
9f8edd980c | ||
![]() |
e5b9043435 | ||
![]() |
c0012c2ea4 | ||
![]() |
b77e4975f0 | ||
![]() |
e83f2344f6 | ||
![]() |
de6512be1a | ||
![]() |
0b72ff1896 | ||
![]() |
fea0192772 | ||
![]() |
f81ac498fb | ||
![]() |
5357e0a18c | ||
![]() |
d7632bbd3d | ||
![]() |
1b5e91e4b3 | ||
![]() |
727195c767 | ||
![]() |
9158f55360 | ||
![]() |
8146e9d527 | ||
![]() |
4247251020 | ||
![]() |
7eee0e0ed6 | ||
![]() |
4f0851ca77 | ||
![]() |
911ae49767 | ||
![]() |
5af81d4057 | ||
![]() |
c435889baa | ||
![]() |
49f79d9d5d | ||
![]() |
1767cd0f6c | ||
![]() |
3e0915521a | ||
![]() |
a298943fac | ||
![]() |
df9ddf96a5 | ||
![]() |
4fa5d701d5 | ||
![]() |
b05683d586 | ||
![]() |
2f3f3fbcdb | ||
![]() |
611605a67f | ||
![]() |
0427a782be | ||
![]() |
32baff5906 | ||
![]() |
0089143d06 | ||
![]() |
05e55cee23 | ||
![]() |
31e7f0340f | ||
![]() |
6e317a54fd | ||
![]() |
9c1f62c38c | ||
![]() |
1341d5557f | ||
![]() |
b7d79a5f06 | ||
![]() |
62233a4db4 | ||
![]() |
4a7e2ddff5 | ||
![]() |
fb737ebde0 | ||
![]() |
bf77cb44e7 | ||
![]() |
c72e2bb4a9 | ||
![]() |
68c182b1df | ||
![]() |
348d303794 | ||
![]() |
ede0fd8660 | ||
![]() |
187c2193e8 | ||
![]() |
706bdd8059 | ||
![]() |
436861edc8 | ||
![]() |
9729a2e772 | ||
![]() |
6b924c00c5 | ||
![]() |
b90f4d29a4 | ||
![]() |
47915f8c11 | ||
![]() |
5dfdeaa4ea | ||
![]() |
98a2a81f2a | ||
![]() |
c4850027bc | ||
![]() |
d4202e7f38 | ||
![]() |
4f65283f31 | ||
![]() |
d86d3bbe54 | ||
![]() |
6f794738e8 | ||
![]() |
ef7a93bb07 | ||
![]() |
5197a992a6 | ||
![]() |
49d8540f6d | ||
![]() |
6e1a1f1a57 | ||
![]() |
c73428247c | ||
![]() |
fc2caf5794 | ||
![]() |
b117826ada | ||
![]() |
26b44b48ab | ||
![]() |
6349f0feb1 | ||
![]() |
2ae17cfb50 | ||
![]() |
4785093a5c | ||
![]() |
859aef78c4 | ||
![]() |
20730a5465 | ||
![]() |
fc5f687afc | ||
![]() |
53e56f2395 | ||
![]() |
da314aff79 | ||
![]() |
fe89f7c5ac | ||
![]() |
8b3be5e063 | ||
![]() |
58dc538510 | ||
![]() |
6cbef9355d | ||
![]() |
22eac5c508 | ||
![]() |
a2860e9c73 | ||
![]() |
1c5258ab68 | ||
![]() |
8641eaa538 | ||
![]() |
88436383c0 | ||
![]() |
affdcdcb0e | ||
![]() |
06174be777 | ||
![]() |
fde8401124 | ||
![]() |
70ac33d58c | ||
![]() |
5a897407d9 | ||
![]() |
1b3c26364b | ||
![]() |
ae07aa7864 | ||
![]() |
fb80831269 | ||
![]() |
561cecf383 | ||
![]() |
60ccdc2deb | ||
![]() |
d7d996b1d3 | ||
![]() |
32b8bc39ac | ||
![]() |
9dc99ad611 | ||
![]() |
628cb4d553 | ||
![]() |
ad80bce78d | ||
![]() |
1c9d821aa2 | ||
![]() |
510b060947 | ||
![]() |
26e33ff093 | ||
![]() |
5f2bd70690 | ||
![]() |
6dfa550663 | ||
![]() |
252e2420ad | ||
![]() |
572d54981e | ||
![]() |
61471f9fb4 | ||
![]() |
4d0a742d64 | ||
![]() |
5f4e0e5ff8 | ||
![]() |
a4c159ecad | ||
![]() |
b1f893e998 | ||
![]() |
789dc165af | ||
![]() |
115eda9650 | ||
![]() |
d027e35cef | ||
![]() |
b3e178af9d | ||
![]() |
559ec8750a | ||
![]() |
02c3980b83 | ||
![]() |
6f027ee7dc | ||
![]() |
6d6c2e5b99 | ||
![]() |
4a4f752459 | ||
![]() |
8f1fff1374 | ||
![]() |
deead2af97 | ||
![]() |
9e881ab637 | ||
![]() |
b6ec02cef2 | ||
![]() |
26e3ccda49 | ||
![]() |
2bda79cb3a | ||
![]() |
19c60ff5c5 | ||
![]() |
e3c5c9a2e7 | ||
![]() |
2c17c186b8 | ||
![]() |
ef1697d00d | ||
![]() |
40e7638a4b | ||
![]() |
aaf69b2898 | ||
![]() |
0464361ca5 | ||
![]() |
420697693b | ||
![]() |
37f53a42da | ||
![]() |
5617ffc79c | ||
![]() |
ca4d86e9e5 | ||
![]() |
0141fef561 | ||
![]() |
5d4a804c90 | ||
![]() |
6bc3300e5a | ||
![]() |
15f69bdc3b | ||
![]() |
0bcf76970a | ||
![]() |
03c4628cad | ||
![]() |
9f4ae9618a | ||
![]() |
3590af15bb | ||
![]() |
c5de7fd20e | ||
![]() |
7127fb1fa1 | ||
![]() |
7cf11abefc | ||
![]() |
d78b416e1a | ||
![]() |
f5144ec899 | ||
![]() |
08d1ebe7ee | ||
![]() |
a665801e9f | ||
![]() |
112e3b110b | ||
![]() |
94a674c008 | ||
![]() |
72be8eeb31 | ||
![]() |
ad8690bb2e | ||
![]() |
76cb08a72a | ||
![]() |
2d4989e937 | ||
![]() |
f248b91f82 | ||
![]() |
d671eb1969 | ||
![]() |
70f4906ca5 | ||
![]() |
ffb9aa1ace | ||
![]() |
823fd855cf | ||
![]() |
f5ee225362 | ||
![]() |
ff1ea4b1c9 | ||
![]() |
779b5afa51 | ||
![]() |
6d870f6ae4 | ||
![]() |
d3926cbca9 | ||
![]() |
a308804679 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -80,3 +80,4 @@ tests/run-test.sh
|
||||
*~
|
||||
*.patch
|
||||
*.sw?
|
||||
.vscode
|
||||
|
@@ -1,32 +1,88 @@
|
||||
stages:
|
||||
- review
|
||||
- source_check
|
||||
- build
|
||||
- test
|
||||
|
||||
variables:
|
||||
JS_LOG: "js-report.txt"
|
||||
POT_LOG: "pot-update.txt"
|
||||
|
||||
.only_default: &only_default
|
||||
only:
|
||||
- branches
|
||||
- tags
|
||||
- merge_requests
|
||||
|
||||
check_commit_log:
|
||||
image: registry.fedoraproject.org/fedora:latest
|
||||
image: registry.gitlab.gnome.org/gnome/mutter/master:v2
|
||||
stage: review
|
||||
before_script:
|
||||
- dnf install -y git
|
||||
variables:
|
||||
GIT_DEPTH: "100"
|
||||
script:
|
||||
- ./.gitlab-ci/check-commit-log.sh
|
||||
only:
|
||||
- merge_requests
|
||||
|
||||
js_check:
|
||||
image: registry.fedoraproject.org/fedora:latest
|
||||
image: registry.gitlab.gnome.org/gnome/gnome-shell/extension-ci:v1
|
||||
stage: source_check
|
||||
before_script:
|
||||
- dnf install -y findutils mozjs60-devel
|
||||
script:
|
||||
- find js -name '*.js' -exec js60 -c -s '{}' ';' 2>&1 | tee $JS_LOG
|
||||
- (! grep -q . $JS_LOG)
|
||||
<<: *only_default
|
||||
only:
|
||||
changes:
|
||||
- js/**/*
|
||||
artifacts:
|
||||
paths:
|
||||
- ${JS_LOG}
|
||||
when: on_failure
|
||||
only:
|
||||
- merge_requests
|
||||
- /^.*$/
|
||||
|
||||
build:
|
||||
image: registry.gitlab.gnome.org/gnome/mutter/master:v2
|
||||
stage: build
|
||||
before_script:
|
||||
- .gitlab-ci/checkout-mutter.sh
|
||||
- meson mutter mutter/build --prefix=/usr -Dtests=false
|
||||
- ninja -C mutter/build install
|
||||
script:
|
||||
- meson . build -Dbuiltype=debugoptimized
|
||||
- ninja -C build
|
||||
- ninja -C build install
|
||||
<<: *only_default
|
||||
artifacts:
|
||||
expire_in: 1 day
|
||||
paths:
|
||||
- mutter
|
||||
- build
|
||||
|
||||
test:
|
||||
image: registry.gitlab.gnome.org/gnome/mutter/master:v2
|
||||
stage: test
|
||||
before_script:
|
||||
- ninja -C mutter/build install
|
||||
script:
|
||||
- xvfb-run meson test -C build --no-rebuild
|
||||
<<: *only_default
|
||||
artifacts:
|
||||
expire_in: 1 day
|
||||
paths:
|
||||
- build/meson-logs/testlog.txt
|
||||
when: on_failure
|
||||
|
||||
test-pot:
|
||||
image: registry.gitlab.gnome.org/gnome/mutter/master:v2
|
||||
stage: test
|
||||
before_script:
|
||||
- ninja -C mutter/build install
|
||||
script:
|
||||
# Check that pot files are generated correctly:
|
||||
# https://savannah.gnu.org/bugs/?50920#comment5
|
||||
- ninja -C build gnome-shell-pot 2>&1 | awk '
|
||||
BEGIN { start=0; }
|
||||
start==1 { print $0; }
|
||||
/gnome-shell-pot/ { start=1; }
|
||||
' | tee $POT_LOG
|
||||
- (! grep -q . $POT_LOG)
|
||||
<<: *only_default
|
||||
|
18
.gitlab-ci/Dockerfile.extension-ci
Normal file
18
.gitlab-ci/Dockerfile.extension-ci
Normal file
@@ -0,0 +1,18 @@
|
||||
FROM registry.fedoraproject.org/fedora:latest
|
||||
|
||||
RUN dnf -y update && dnf -y upgrade && \
|
||||
dnf install -y 'dnf-command(copr)' && \
|
||||
|
||||
# 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
|
@@ -11,9 +11,21 @@ branch_point=$(git merge-base HEAD FETCH_HEAD)
|
||||
|
||||
commits=$(git log --format='format:%H' $branch_point..$CI_COMMIT_SHA)
|
||||
|
||||
test -z "$commits" && { echo Commit range empty; exit 1; }
|
||||
if [ -z "$commits" ]; then
|
||||
echo Commit range empty
|
||||
exit 1
|
||||
fi
|
||||
|
||||
function commit_message_has_url() {
|
||||
commit=$1
|
||||
commit_message=$(git show -s --format='format:%b' $commit)
|
||||
echo "$commit_message" | grep -qe "\($CI_MERGE_REQUEST_PROJECT_URL/\(issues\|merge_requests\)/[0-9]\+\|https://bugzilla.gnome.org/show_bug.cgi?id=[0-9]\+\)"
|
||||
return $?
|
||||
}
|
||||
|
||||
for commit in $commits; do
|
||||
git show -s --format='format:%b' $commit | grep -qe "\($CI_MERGE_REQUEST_PROJECT_URL/\(issues\|merge_requests\)/[0-9]\+\|https://bugzilla.gnome.org/show_bug.cgi?id=[0-9]\+\)" ||
|
||||
{ echo "Missing merge request or issue URL on commit $(echo $commit | cut -c -8)"; exit 1; }
|
||||
if ! commit_message_has_url $commit; then
|
||||
echo "Missing merge request or issue URL on commit $(echo $commit | cut -c -8)"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
35
.gitlab-ci/checkout-mutter.sh
Executable file
35
.gitlab-ci/checkout-mutter.sh
Executable file
@@ -0,0 +1,35 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
shell_branch=$(git describe --contains --all HEAD)
|
||||
mutter_target=
|
||||
|
||||
git clone https://gitlab.gnome.org/GNOME/mutter.git
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo Checkout failed
|
||||
exit 1
|
||||
fi
|
||||
|
||||
cd mutter
|
||||
|
||||
if [ "$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" ]; then
|
||||
merge_request_remote=${CI_MERGE_REQUEST_SOURCE_PROJECT_URL//gnome-shell/mutter}
|
||||
merge_request_branch=$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME
|
||||
|
||||
echo Looking for $merge_request_branch on remote ...
|
||||
if git fetch -q $merge_request_remote $merge_request_branch 2>/dev/null; then
|
||||
mutter_target=FETCH_HEAD
|
||||
else
|
||||
mutter_target=origin/$CI_MERGE_REQUEST_TARGET_BRANCH_NAME
|
||||
echo Using $mutter_target instead
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z "$mutter_target" ]; then
|
||||
mutter_target=$(git branch -r -l origin/$shell_branch)
|
||||
mutter_target=${mutter_target:-$(git branch -r -l ${shell_branch#remotes/})}
|
||||
mutter_target=${mutter_target:-origin/master}
|
||||
echo Using $mutter_target instead
|
||||
fi
|
||||
|
||||
git checkout -q $mutter_target
|
101
NEWS
101
NEWS
@@ -1,3 +1,104 @@
|
||||
3.33.1
|
||||
======
|
||||
* Refine the app menu [Florian; #968]
|
||||
* Refine window preview style [Feichtmeier; !461]
|
||||
* Only emit ::style-changed on actual changes [Carlos; #1153]
|
||||
* Disable emoji on-screen keyboard support on X11 [Florian; #1172]
|
||||
* Fix tablet button mapping overlay [Carlos; #1220]
|
||||
* Don't crash for world clock locations with no timezone [Florian; #1062]
|
||||
* Don't leak old on-screen keyboard layout groups [Carlos; mutter#556]
|
||||
* Fix ellipsization in dialog subtitles/bodies [Marco; !531]
|
||||
* Fix glitch of fullscreen window in workspace switch animation [Jonas D.; !322]
|
||||
* Fix distortion of some image contents [Florian; !525]
|
||||
* Allow dragging unfocused tiled/maximized windows from top bar [Dylan; #679290]
|
||||
* Handle network interface name changes [Fabrice; !534]
|
||||
* Avoid unnecessary style changes when computing :first/:last-child
|
||||
[Florian; !529]
|
||||
* Misc. bug fixes and cleanups [Florian, Marco, Robert, Georges, Carlos, Simon,
|
||||
Jonas D.; !487, !441, !502, !503, !504, !506, #822, !551, !512, !509, !511,
|
||||
#1054, !524, #1065, !331, !540]
|
||||
|
||||
Contributors:
|
||||
Fabrice Bellet, Jonas Dreßler, Feichtmeier, Carlos Garnacho, Robert Mader,
|
||||
Dylan McCall, Simon McVittie, Florian Müllner, Georges Basile Stavracas Neto,
|
||||
Marco Trevisan (Treviño)
|
||||
|
||||
Translators:
|
||||
Daniel Mustieles [es], Kukuh Syafaat [id], Fabio Tomat [fur],
|
||||
Carmen Bianca BAKKER [eo], Dingzhong Chen [zh_CN], Tim Sabsch [de]
|
||||
|
||||
3.32.1
|
||||
======
|
||||
* Fix avatar scaling on login screen [Florian; #1024]
|
||||
* Fix distortion of desktop zoom [Florian; #646]
|
||||
* Fix mouse cursor visibility when using desktop zoom [Florian, Marco; #1020]
|
||||
* Fix screen dimming after wake-up on lock screen [Xiaoguang; #900]
|
||||
* Fix Alt+Esc switcher [Florian; #1064]
|
||||
* Respect struts for popover placement [Andrea; #1102]
|
||||
* Fix app icons updates after theme changes [Florian; #1117]
|
||||
* Fix desktop zoom after resolution changes [Marco; #1120]
|
||||
* Implement stick-to-finger workspace switch overview gestures [Florian; #516]
|
||||
* Make World Clocks offsets relative to local time [Florian; #1157]
|
||||
* Fix top app icon disappearing from dash [Florian; #1053]
|
||||
* Update switch style to match new Adwaita [Jakub; !496]
|
||||
* Ensure CSS units are pixel-aligned when scaling is used [Carlos; #91]
|
||||
* Misc. bug fixes and cleanups [Florian, Jakub, Robert, Alex, Carlos, Phil,
|
||||
Marco, Benjamin, AsciiWolf, Ray, verdre; !444, #1016, #1018, !449, #1036,
|
||||
!455, #1094, !440, #1023, #624, #1017, !476, !473, !480, #1130, !485, !481,
|
||||
!490, !489, #1151, !435, #1160, !482, #1150, #1166, !384]
|
||||
|
||||
Contributors:
|
||||
AsciiWolf, Andrea Azzarone, Benjamin Berg, Carlos Garnacho, Victor Ibragimov,
|
||||
Robert Mader, Alex Monday, Florian Müllner, Jakub Steiner, Ray Strode,
|
||||
Marco Trevisan (Treviño), verdre, Xiaoguang Wang, Phil Wyett
|
||||
|
||||
Translators:
|
||||
Victor Ibragimov [tg, af, et, ja], Bruce Cowan [en_GB], Piotr Drąg [tg],
|
||||
Charles Monzat [fr], Khaled Hosny [ar], Goran Vidović [hr],
|
||||
Cheng-Chia Tseng [zh_TW], Carmen Bianca BAKKER [eo], Daniel Mustieles [es],
|
||||
Dušan Kazik [sk]
|
||||
|
||||
3.32.0
|
||||
======
|
||||
* Fix sizing issues in on-screen-keyboard emoji panel [Carlos; !439]
|
||||
* Fix test linker failure on Debian/Ubuntu [Iain; !442]
|
||||
* Avoid assertion when sizing fallback app icons from CSS [Florian; #1027]
|
||||
* Fix mis-sized menu arrows after texture cache changes [Florian; !452]
|
||||
|
||||
Contributors:
|
||||
Carlos Garnacho, Iain Lane, Florian Müllner
|
||||
|
||||
Translators:
|
||||
Gábor Kelemen [hu], Victor Ibragimov [tg], Ryuta Fujii [ja], Piotr Drąg [af,
|
||||
tg], Mart Raudsepp [et]
|
||||
|
||||
3.31.92
|
||||
=======
|
||||
* Fix visual glitch in submenus [Alex; #987]
|
||||
* Support fractional scaling [Jonas, Marco; #765011, !5]
|
||||
* Only consider visible children for :first-child/:last-child [Florian; !312]
|
||||
* Hide trailing separator in search results [verdre; !311]
|
||||
* Remember choice in inhibit-shortcuts dialogue [Olivier; !382]
|
||||
* Don't toggle on-screen keyboard on every focus change [Carlos; !397]
|
||||
* Fix legacy tray icons not responding to events on wayland [Florian; #191]
|
||||
* Fix generating French OSK layout [Florian; #997]
|
||||
* Use borderless round user images [Florian; #811]
|
||||
* Misc. bug fixes and cleanups [Andrea, Robert, Florian, Marco, Niels,
|
||||
Benjamin; !414, !417, !420, #996, !408, !422, !425, #1006, !427, !315,
|
||||
#989, !430, !431, !432, #1015, !429, !423, !419, !434]
|
||||
|
||||
Contributors:
|
||||
Jonas Ådahl, Alan, Andrea Azzarone, Benjamin Berg, Olivier Fourdan,
|
||||
Carlos Garnacho, Niels De Graef, Robert Mader, Alex Monday, Florian Müllner,
|
||||
Marco Trevisan (Treviño), verdre
|
||||
|
||||
Translators:
|
||||
Carmen Bianca BAKKER [eo], Asier Sarasua Garmendia [eu], Stas Solovey [ru],
|
||||
Changwoo Ryu [ko], Julien Humbert [fr], Milo Casagrande [it],
|
||||
Марко Костић [sr], Ask Hjorth Larsen [da], Kukuh Syafaat [id],
|
||||
Daniel Șerbănescu [ro], Bernd Homuth [de], Trần Ngọc Quân [vi],
|
||||
Nathan Follens [nl], Rūdolfs Mazurs [lv], Aurimas Černius [lt]
|
||||
|
||||
3.31.91
|
||||
=======
|
||||
* Don't close on-screen-keyboard's language menu on hover [Florian; #171]
|
||||
|
40
README.mdwn
Normal file
40
README.mdwn
Normal file
@@ -0,0 +1,40 @@
|
||||
cldr2json
|
||||
=========
|
||||
|
||||
This script converts Unicode CLDR android keyboard layouts to JSON usable by
|
||||
GNOME Shell.
|
||||
|
||||
CLDR keyboard layouts can be found at
|
||||
<http://www.unicode.org/Public/cldr/latest/keyboards.zip>
|
||||
|
||||
|
||||
Usage
|
||||
=====
|
||||
|
||||
./cldr2json <input file or directory> <output directory>
|
||||
|
||||
example:
|
||||
|
||||
./cldr2json cldr/keyboards/android/ json_layouts/
|
||||
|
||||
|
||||
Keyboard layout mapping
|
||||
=======================
|
||||
|
||||
Unicode CLDR layout identifiers are language codes, while XKB layout
|
||||
identifiers are... something else. The mapping between the two currently uses
|
||||
heuristic based on the layout descriptions, in this order:
|
||||
|
||||
- if the CLDR layout description matches an XKB layout description, chose its
|
||||
XKB identifier
|
||||
- if one word of the CLDR layout description matches an XKB layout
|
||||
description, chose its XKB identifier
|
||||
- if the CLDR layout description matches one word of an XKB layout description,
|
||||
chose its XKB identifier
|
||||
|
||||
That doesn't always work. For instance it fails for "en" language, that should
|
||||
match "us" XKB identifier. For such cases, there is a mapping in
|
||||
LOCALE_TO_XKB_OVERRIDES at the top of the script. If you discover a weird
|
||||
mapping of if you get a "failed to find XKB mapping for <locale>" warning then
|
||||
please consider adding an override there.
|
||||
|
208
cldr2json.py
Executable file
208
cldr2json.py
Executable file
@@ -0,0 +1,208 @@
|
||||
#!/usr/bin/python3
|
||||
#
|
||||
# Copyright 2015 Daiki Ueno <dueno@src.gnome.org>
|
||||
# 2016 Parag Nemade <pnemade@redhat.com>
|
||||
# 2017 Alan <alan@boum.org>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Lesser 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
|
||||
# Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with this program; if not, see
|
||||
# <http://www.gnu.org/licenses/>.
|
||||
|
||||
import glob
|
||||
import json
|
||||
import locale
|
||||
import logging
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
import xml.etree.ElementTree
|
||||
|
||||
import gi
|
||||
gi.require_version('GnomeDesktop', '3.0') # NOQA: E402
|
||||
from gi.repository import GnomeDesktop
|
||||
|
||||
ESCAPE_PATTERN = re.compile(r'\\u\{([0-9A-Fa-f]+?)\}')
|
||||
ISO_PATTERN = re.compile(r'[A-E]([0-9]+)')
|
||||
|
||||
LOCALE_TO_XKB_OVERRIDES = {
|
||||
'af': 'za',
|
||||
'en': 'us',
|
||||
'en-GB': 'uk',
|
||||
'es-US': 'latam',
|
||||
'fr-CA': 'ca',
|
||||
'hi': 'in+bolnagri',
|
||||
'ky': 'kg',
|
||||
'nl-BE': 'be',
|
||||
'zu': None
|
||||
}
|
||||
|
||||
|
||||
def parse_single_key(value):
|
||||
def unescape(m):
|
||||
return chr(int(m.group(1), 16))
|
||||
value = ESCAPE_PATTERN.sub(unescape, value)
|
||||
return value
|
||||
|
||||
|
||||
def parse_rows(keymap):
|
||||
unsorted_rows = {}
|
||||
for _map in keymap.iter('map'):
|
||||
value = _map.get('to')
|
||||
key = [parse_single_key(value)]
|
||||
iso = _map.get('iso')
|
||||
if not ISO_PATTERN.match(iso):
|
||||
sys.stderr.write('invalid ISO key name: %s\n' % iso)
|
||||
continue
|
||||
if not iso[0] in unsorted_rows:
|
||||
unsorted_rows[iso[0]] = []
|
||||
unsorted_rows[iso[0]].append((int(iso[1:]), key))
|
||||
# add subkeys
|
||||
longPress = _map.get('longPress')
|
||||
if longPress:
|
||||
for value in longPress.split(' '):
|
||||
subkey = parse_single_key(value)
|
||||
key.append(subkey)
|
||||
|
||||
rows = []
|
||||
for k, v in sorted(list(unsorted_rows.items()),
|
||||
key=lambda x: x[0],
|
||||
reverse=True):
|
||||
row = []
|
||||
for key in sorted(v, key=lambda x: x):
|
||||
row.append(key[1])
|
||||
rows.append(row)
|
||||
|
||||
return rows
|
||||
|
||||
|
||||
def convert_xml(tree):
|
||||
root = {}
|
||||
for xml_keyboard in tree.iter("keyboard"):
|
||||
locale_full = xml_keyboard.get("locale")
|
||||
locale, sep, end = locale_full.partition("-t-")
|
||||
root["locale"] = locale
|
||||
for xml_name in tree.iter("name"):
|
||||
name = xml_name.get("value")
|
||||
root["name"] = name
|
||||
root["levels"] = []
|
||||
# parse levels
|
||||
for index, keymap in enumerate(tree.iter('keyMap')):
|
||||
# FIXME: heuristics here
|
||||
modifiers = keymap.get('modifiers')
|
||||
if not modifiers:
|
||||
mode = 'default'
|
||||
modifiers = ''
|
||||
elif 'shift' in modifiers.split(' '):
|
||||
mode = 'latched'
|
||||
modifiers = 'shift'
|
||||
else:
|
||||
mode = 'locked'
|
||||
level = {}
|
||||
level["level"] = modifiers
|
||||
level["mode"] = mode
|
||||
level["rows"] = parse_rows(keymap)
|
||||
root["levels"].append(level)
|
||||
return root
|
||||
|
||||
|
||||
def locale_to_xkb(locale, name):
|
||||
if locale in sorted(LOCALE_TO_XKB_OVERRIDES.keys()):
|
||||
xkb = LOCALE_TO_XKB_OVERRIDES[locale]
|
||||
logging.debug("override for %s → %s",
|
||||
locale, xkb)
|
||||
if xkb:
|
||||
return xkb
|
||||
else:
|
||||
raise KeyError("layout %s explicitely disabled in overrides"
|
||||
% locale)
|
||||
xkb_names = sorted(name_to_xkb.keys())
|
||||
if name in xkb_names:
|
||||
return name_to_xkb[name]
|
||||
else:
|
||||
logging.debug("name %s failed" % name)
|
||||
for sub_name in name.split(' '):
|
||||
if sub_name in xkb_names:
|
||||
xkb = name_to_xkb[sub_name]
|
||||
logging.debug("dumb mapping failed but match with locale word: "
|
||||
"%s (%s) → %s (%s)",
|
||||
locale, name, xkb, sub_name)
|
||||
return xkb
|
||||
else:
|
||||
logging.debug("sub_name failed")
|
||||
for xkb_name in xkb_names:
|
||||
for xkb_sub_name in xkb_name.split(' '):
|
||||
if xkb_sub_name.strip('()') == name:
|
||||
xkb = name_to_xkb[xkb_name]
|
||||
logging.debug("dumb mapping failed but match with xkb word: "
|
||||
"%s (%s) → %s (%s)",
|
||||
locale, name, xkb, xkb_name)
|
||||
return xkb
|
||||
raise KeyError("failed to find XKB mapping for %s" % locale)
|
||||
|
||||
|
||||
def convert_file(source_file, destination_path):
|
||||
logging.info("Parsing %s", source_file)
|
||||
|
||||
itree = xml.etree.ElementTree.ElementTree()
|
||||
itree.parse(source_file)
|
||||
|
||||
root = convert_xml(itree)
|
||||
|
||||
try:
|
||||
xkb_name = locale_to_xkb(root["locale"], root["name"])
|
||||
except KeyError as e:
|
||||
logging.warn(e)
|
||||
return False
|
||||
destination_file = os.path.join(destination_path, xkb_name + ".json")
|
||||
|
||||
with open(destination_file, 'w', encoding="utf-8") as dest_fd:
|
||||
json.dump(root, dest_fd, ensure_ascii=False, indent=2, sort_keys=True)
|
||||
|
||||
logging.debug("written %s", destination_file)
|
||||
|
||||
|
||||
def load_xkb_mappings():
|
||||
xkb = GnomeDesktop.XkbInfo()
|
||||
layouts = xkb.get_all_layouts()
|
||||
name_to_xkb = {}
|
||||
|
||||
for layout in layouts:
|
||||
name = xkb.get_layout_info(layout).display_name
|
||||
name_to_xkb[name] = layout
|
||||
|
||||
return name_to_xkb
|
||||
|
||||
|
||||
locale.setlocale(locale.LC_ALL, "C")
|
||||
name_to_xkb = load_xkb_mappings()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
if "DEBUG" in os.environ:
|
||||
logging.basicConfig(level=logging.DEBUG)
|
||||
|
||||
if len(sys.argv) < 2:
|
||||
print("supply a CLDR keyboard file")
|
||||
sys.exit(1)
|
||||
|
||||
if len(sys.argv) < 3:
|
||||
print("supply an output directory")
|
||||
sys.exit(1)
|
||||
|
||||
source = sys.argv[1]
|
||||
destination = sys.argv[2]
|
||||
if os.path.isfile(source):
|
||||
convert_file(source, destination)
|
||||
elif os.path.isdir(source):
|
||||
for path in glob.glob(source + "/*-t-k0-android.xml"):
|
||||
convert_file(path, destination)
|
@@ -9,9 +9,6 @@
|
||||
<method name="ShowOSD">
|
||||
<arg type="a{sv}" direction="in" name="params"/>
|
||||
</method>
|
||||
<method name="ShowMonitorLabels">
|
||||
<arg type="a{uv}" direction="in" name="params"/>
|
||||
</method>
|
||||
<method name="ShowMonitorLabels2">
|
||||
<arg type="a{sv}" direction="in" name="params"/>
|
||||
</method>
|
||||
@@ -34,6 +31,10 @@
|
||||
<arg type="u" direction="in" name="action"/>
|
||||
<arg type="b" direction="out" name="success"/>
|
||||
</method>
|
||||
<method name="UngrabAccelerators">
|
||||
<arg type="au" direction="in" name="action"/>
|
||||
<arg type="b" direction="out" name="success"/>
|
||||
</method>
|
||||
<signal name="AcceleratorActivated">
|
||||
<arg name="action" type="u"/>
|
||||
<arg name="parameters" type="a{sv}"/>
|
||||
|
@@ -6,6 +6,7 @@
|
||||
<file>be.json</file>
|
||||
<file>bg.json</file>
|
||||
<file>by.json</file>
|
||||
<file>ca.json</file>
|
||||
<file>cz.json</file>
|
||||
<file>de.json</file>
|
||||
<file>dk.json</file>
|
||||
|
@@ -21,10 +21,8 @@
|
||||
<file>noise-texture.png</file>
|
||||
<file>pad-osd.css</file>
|
||||
<file>process-working.svg</file>
|
||||
<file>toggle-off-us.svg</file>
|
||||
<file>toggle-off-intl.svg</file>
|
||||
<file>toggle-off-hc.svg</file>
|
||||
<file>toggle-on-us.svg</file>
|
||||
<file>toggle-on-intl.svg</file>
|
||||
<file>toggle-on-hc.svg</file>
|
||||
</gresource>
|
||||
|
599
data/osk-layouts/ca.json
Normal file
599
data/osk-layouts/ca.json
Normal file
@@ -0,0 +1,599 @@
|
||||
{
|
||||
"levels": [
|
||||
{
|
||||
"level": "",
|
||||
"mode": "default",
|
||||
"rows": [
|
||||
[
|
||||
[
|
||||
"q"
|
||||
],
|
||||
[
|
||||
"w"
|
||||
],
|
||||
[
|
||||
"e",
|
||||
"é",
|
||||
"è",
|
||||
"ê",
|
||||
"ë",
|
||||
"%",
|
||||
"ę",
|
||||
"ė",
|
||||
"ē"
|
||||
],
|
||||
[
|
||||
"r"
|
||||
],
|
||||
[
|
||||
"t"
|
||||
],
|
||||
[
|
||||
"y",
|
||||
"%",
|
||||
"ÿ"
|
||||
],
|
||||
[
|
||||
"u",
|
||||
"ù",
|
||||
"û",
|
||||
"%",
|
||||
"ü",
|
||||
"ú",
|
||||
"ū"
|
||||
],
|
||||
[
|
||||
"i",
|
||||
"î",
|
||||
"%",
|
||||
"ï",
|
||||
"ì",
|
||||
"í",
|
||||
"į",
|
||||
"ī"
|
||||
],
|
||||
[
|
||||
"o",
|
||||
"ô",
|
||||
"œ",
|
||||
"%",
|
||||
"ö",
|
||||
"ò",
|
||||
"ó",
|
||||
"õ",
|
||||
"ø",
|
||||
"ō",
|
||||
"º"
|
||||
],
|
||||
[
|
||||
"p"
|
||||
]
|
||||
],
|
||||
[
|
||||
[
|
||||
"a",
|
||||
"à",
|
||||
"â",
|
||||
"%",
|
||||
"æ",
|
||||
"á",
|
||||
"ä",
|
||||
"ã",
|
||||
"å",
|
||||
"ā",
|
||||
"ª"
|
||||
],
|
||||
[
|
||||
"s"
|
||||
],
|
||||
[
|
||||
"d"
|
||||
],
|
||||
[
|
||||
"f"
|
||||
],
|
||||
[
|
||||
"g"
|
||||
],
|
||||
[
|
||||
"h"
|
||||
],
|
||||
[
|
||||
"j"
|
||||
],
|
||||
[
|
||||
"k"
|
||||
],
|
||||
[
|
||||
"l"
|
||||
]
|
||||
],
|
||||
[
|
||||
[
|
||||
"z"
|
||||
],
|
||||
[
|
||||
"x"
|
||||
],
|
||||
[
|
||||
"c",
|
||||
"ç",
|
||||
"ć",
|
||||
"č"
|
||||
],
|
||||
[
|
||||
"v"
|
||||
],
|
||||
[
|
||||
"b"
|
||||
],
|
||||
[
|
||||
"n"
|
||||
],
|
||||
[
|
||||
"m"
|
||||
]
|
||||
],
|
||||
[
|
||||
[
|
||||
","
|
||||
],
|
||||
[
|
||||
" "
|
||||
],
|
||||
[
|
||||
".",
|
||||
"#",
|
||||
"!",
|
||||
",",
|
||||
"?",
|
||||
"-",
|
||||
":",
|
||||
"'",
|
||||
"@"
|
||||
]
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"level": "shift",
|
||||
"mode": "latched",
|
||||
"rows": [
|
||||
[
|
||||
[
|
||||
"Q"
|
||||
],
|
||||
[
|
||||
"W"
|
||||
],
|
||||
[
|
||||
"E",
|
||||
"É",
|
||||
"È",
|
||||
"Ê",
|
||||
"Ë",
|
||||
"%",
|
||||
"Ę",
|
||||
"Ė",
|
||||
"Ē"
|
||||
],
|
||||
[
|
||||
"R"
|
||||
],
|
||||
[
|
||||
"T"
|
||||
],
|
||||
[
|
||||
"Y",
|
||||
"%",
|
||||
"Ÿ"
|
||||
],
|
||||
[
|
||||
"U",
|
||||
"Ù",
|
||||
"Û",
|
||||
"%",
|
||||
"Ü",
|
||||
"Ú",
|
||||
"Ū"
|
||||
],
|
||||
[
|
||||
"I",
|
||||
"Î",
|
||||
"%",
|
||||
"Ï",
|
||||
"Ì",
|
||||
"Í",
|
||||
"Į",
|
||||
"Ī"
|
||||
],
|
||||
[
|
||||
"O",
|
||||
"Ô",
|
||||
"Œ",
|
||||
"%",
|
||||
"Ö",
|
||||
"Ò",
|
||||
"Ó",
|
||||
"Õ",
|
||||
"Ø",
|
||||
"Ō",
|
||||
"º"
|
||||
],
|
||||
[
|
||||
"P"
|
||||
]
|
||||
],
|
||||
[
|
||||
[
|
||||
"A",
|
||||
"À",
|
||||
"Â",
|
||||
"%",
|
||||
"Æ",
|
||||
"Á",
|
||||
"Ä",
|
||||
"Ã",
|
||||
"Å",
|
||||
"Ā",
|
||||
"ª"
|
||||
],
|
||||
[
|
||||
"S"
|
||||
],
|
||||
[
|
||||
"D"
|
||||
],
|
||||
[
|
||||
"F"
|
||||
],
|
||||
[
|
||||
"G"
|
||||
],
|
||||
[
|
||||
"H"
|
||||
],
|
||||
[
|
||||
"J"
|
||||
],
|
||||
[
|
||||
"K"
|
||||
],
|
||||
[
|
||||
"L"
|
||||
]
|
||||
],
|
||||
[
|
||||
[
|
||||
"Z"
|
||||
],
|
||||
[
|
||||
"X"
|
||||
],
|
||||
[
|
||||
"C",
|
||||
"Ç",
|
||||
"Ć",
|
||||
"Č"
|
||||
],
|
||||
[
|
||||
"V"
|
||||
],
|
||||
[
|
||||
"B"
|
||||
],
|
||||
[
|
||||
"N"
|
||||
],
|
||||
[
|
||||
"M"
|
||||
]
|
||||
],
|
||||
[
|
||||
[
|
||||
","
|
||||
],
|
||||
[
|
||||
" "
|
||||
],
|
||||
[
|
||||
".",
|
||||
"#",
|
||||
"!",
|
||||
",",
|
||||
"?",
|
||||
"-",
|
||||
":",
|
||||
"'",
|
||||
"@"
|
||||
]
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"level": "opt",
|
||||
"mode": "locked",
|
||||
"rows": [
|
||||
[
|
||||
[
|
||||
"1",
|
||||
"¹",
|
||||
"½",
|
||||
"⅓",
|
||||
"¼",
|
||||
"⅛"
|
||||
],
|
||||
[
|
||||
"2",
|
||||
"²",
|
||||
"⅔"
|
||||
],
|
||||
[
|
||||
"3",
|
||||
"³",
|
||||
"¾",
|
||||
"⅜"
|
||||
],
|
||||
[
|
||||
"4",
|
||||
"⁴"
|
||||
],
|
||||
[
|
||||
"5",
|
||||
"⅝"
|
||||
],
|
||||
[
|
||||
"6"
|
||||
],
|
||||
[
|
||||
"7",
|
||||
"⅞"
|
||||
],
|
||||
[
|
||||
"8"
|
||||
],
|
||||
[
|
||||
"9"
|
||||
],
|
||||
[
|
||||
"0",
|
||||
"ⁿ",
|
||||
"∅"
|
||||
]
|
||||
],
|
||||
[
|
||||
[
|
||||
"@"
|
||||
],
|
||||
[
|
||||
"#"
|
||||
],
|
||||
[
|
||||
"$",
|
||||
"¢",
|
||||
"£",
|
||||
"€",
|
||||
"¥",
|
||||
"₱"
|
||||
],
|
||||
[
|
||||
"%",
|
||||
"‰"
|
||||
],
|
||||
[
|
||||
"&"
|
||||
],
|
||||
[
|
||||
"-",
|
||||
"_",
|
||||
"–",
|
||||
"—",
|
||||
"·"
|
||||
],
|
||||
[
|
||||
"+",
|
||||
"±"
|
||||
],
|
||||
[
|
||||
"(",
|
||||
"<",
|
||||
"{",
|
||||
"["
|
||||
],
|
||||
[
|
||||
")",
|
||||
">",
|
||||
"}",
|
||||
"]"
|
||||
]
|
||||
],
|
||||
[
|
||||
[
|
||||
"*",
|
||||
"†",
|
||||
"‡",
|
||||
"★"
|
||||
],
|
||||
[
|
||||
"\"",
|
||||
"“",
|
||||
"”",
|
||||
"«",
|
||||
"»"
|
||||
],
|
||||
[
|
||||
"'",
|
||||
"‘",
|
||||
"’",
|
||||
"‹",
|
||||
"›"
|
||||
],
|
||||
[
|
||||
":"
|
||||
],
|
||||
[
|
||||
";"
|
||||
],
|
||||
[
|
||||
"!",
|
||||
"¡"
|
||||
],
|
||||
[
|
||||
"?",
|
||||
"¿"
|
||||
]
|
||||
],
|
||||
[
|
||||
[
|
||||
"_"
|
||||
],
|
||||
[
|
||||
"/"
|
||||
],
|
||||
[
|
||||
" "
|
||||
],
|
||||
[
|
||||
","
|
||||
],
|
||||
[
|
||||
".",
|
||||
"…"
|
||||
]
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"level": "opt+shift",
|
||||
"mode": "locked",
|
||||
"rows": [
|
||||
[
|
||||
[
|
||||
"~"
|
||||
],
|
||||
[
|
||||
"`"
|
||||
],
|
||||
[
|
||||
"|"
|
||||
],
|
||||
[
|
||||
"•",
|
||||
"♪",
|
||||
"♥",
|
||||
"♠",
|
||||
"♦",
|
||||
"♣"
|
||||
],
|
||||
[
|
||||
"√"
|
||||
],
|
||||
[
|
||||
"Π",
|
||||
"π"
|
||||
],
|
||||
[
|
||||
"÷"
|
||||
],
|
||||
[
|
||||
"×"
|
||||
],
|
||||
[
|
||||
"¶",
|
||||
"§"
|
||||
],
|
||||
[
|
||||
"∆"
|
||||
]
|
||||
],
|
||||
[
|
||||
[
|
||||
"£"
|
||||
],
|
||||
[
|
||||
"¢"
|
||||
],
|
||||
[
|
||||
"€"
|
||||
],
|
||||
[
|
||||
"¥"
|
||||
],
|
||||
[
|
||||
"^",
|
||||
"↑",
|
||||
"↓",
|
||||
"←",
|
||||
"→"
|
||||
],
|
||||
[
|
||||
"°",
|
||||
"′",
|
||||
"″"
|
||||
],
|
||||
[
|
||||
"=",
|
||||
"≠",
|
||||
"≈",
|
||||
"∞"
|
||||
],
|
||||
[
|
||||
"{"
|
||||
],
|
||||
[
|
||||
"}"
|
||||
]
|
||||
],
|
||||
[
|
||||
[
|
||||
"\\"
|
||||
],
|
||||
[
|
||||
"©"
|
||||
],
|
||||
[
|
||||
"®"
|
||||
],
|
||||
[
|
||||
"™"
|
||||
],
|
||||
[
|
||||
"℅"
|
||||
],
|
||||
[
|
||||
"["
|
||||
],
|
||||
[
|
||||
"]"
|
||||
]
|
||||
],
|
||||
[
|
||||
[
|
||||
"<",
|
||||
"‹",
|
||||
"≤",
|
||||
"«"
|
||||
],
|
||||
[
|
||||
">",
|
||||
"›",
|
||||
"≥",
|
||||
"»"
|
||||
],
|
||||
[
|
||||
" "
|
||||
],
|
||||
[
|
||||
","
|
||||
],
|
||||
[
|
||||
".",
|
||||
"…"
|
||||
]
|
||||
]
|
||||
]
|
||||
}
|
||||
],
|
||||
"locale": "fr-CA",
|
||||
"name": "French Canada"
|
||||
}
|
@@ -6,10 +6,20 @@
|
||||
"rows": [
|
||||
[
|
||||
[
|
||||
"q"
|
||||
"a",
|
||||
"à",
|
||||
"â",
|
||||
"%",
|
||||
"æ",
|
||||
"á",
|
||||
"ä",
|
||||
"ã",
|
||||
"å",
|
||||
"ā",
|
||||
"ª"
|
||||
],
|
||||
[
|
||||
"w"
|
||||
"z"
|
||||
],
|
||||
[
|
||||
"e",
|
||||
@@ -71,17 +81,7 @@
|
||||
],
|
||||
[
|
||||
[
|
||||
"a",
|
||||
"à",
|
||||
"â",
|
||||
"%",
|
||||
"æ",
|
||||
"á",
|
||||
"ä",
|
||||
"ã",
|
||||
"å",
|
||||
"ā",
|
||||
"ª"
|
||||
"q"
|
||||
],
|
||||
[
|
||||
"s"
|
||||
@@ -106,11 +106,14 @@
|
||||
],
|
||||
[
|
||||
"l"
|
||||
],
|
||||
[
|
||||
"m"
|
||||
]
|
||||
],
|
||||
[
|
||||
[
|
||||
"z"
|
||||
"w"
|
||||
],
|
||||
[
|
||||
"x"
|
||||
@@ -131,7 +134,11 @@
|
||||
"n"
|
||||
],
|
||||
[
|
||||
"m"
|
||||
"'",
|
||||
"‘",
|
||||
"’",
|
||||
"‹",
|
||||
"›"
|
||||
]
|
||||
],
|
||||
[
|
||||
@@ -161,10 +168,20 @@
|
||||
"rows": [
|
||||
[
|
||||
[
|
||||
"Q"
|
||||
"A",
|
||||
"À",
|
||||
"Â",
|
||||
"%",
|
||||
"Æ",
|
||||
"Á",
|
||||
"Ä",
|
||||
"Ã",
|
||||
"Å",
|
||||
"Ā",
|
||||
"ª"
|
||||
],
|
||||
[
|
||||
"W"
|
||||
"Z"
|
||||
],
|
||||
[
|
||||
"E",
|
||||
@@ -226,17 +243,7 @@
|
||||
],
|
||||
[
|
||||
[
|
||||
"A",
|
||||
"À",
|
||||
"Â",
|
||||
"%",
|
||||
"Æ",
|
||||
"Á",
|
||||
"Ä",
|
||||
"Ã",
|
||||
"Å",
|
||||
"Ā",
|
||||
"ª"
|
||||
"Q"
|
||||
],
|
||||
[
|
||||
"S"
|
||||
@@ -261,11 +268,14 @@
|
||||
],
|
||||
[
|
||||
"L"
|
||||
],
|
||||
[
|
||||
"M"
|
||||
]
|
||||
],
|
||||
[
|
||||
[
|
||||
"Z"
|
||||
"W"
|
||||
],
|
||||
[
|
||||
"X"
|
||||
@@ -286,7 +296,11 @@
|
||||
"N"
|
||||
],
|
||||
[
|
||||
"M"
|
||||
"'",
|
||||
"‘",
|
||||
"’",
|
||||
"‹",
|
||||
"›"
|
||||
]
|
||||
],
|
||||
[
|
||||
@@ -369,10 +383,10 @@
|
||||
"#"
|
||||
],
|
||||
[
|
||||
"$",
|
||||
"€",
|
||||
"¢",
|
||||
"£",
|
||||
"€",
|
||||
"$",
|
||||
"¥",
|
||||
"₱"
|
||||
],
|
||||
@@ -511,13 +525,14 @@
|
||||
"£"
|
||||
],
|
||||
[
|
||||
"¥"
|
||||
],
|
||||
[
|
||||
"$",
|
||||
"¢"
|
||||
],
|
||||
[
|
||||
"€"
|
||||
],
|
||||
[
|
||||
"¥"
|
||||
"¢"
|
||||
],
|
||||
[
|
||||
"^",
|
||||
@@ -594,6 +609,6 @@
|
||||
]
|
||||
}
|
||||
],
|
||||
"locale": "fr-CA",
|
||||
"name": "French Canada"
|
||||
"locale": "fr",
|
||||
"name": "French"
|
||||
}
|
@@ -16,7 +16,7 @@ $link_visited_color: if($variant == 'light', darken($selected_bg_color, 20%), li
|
||||
$top_hilight: $borders_edge;
|
||||
|
||||
$warning_color: #f57900;
|
||||
$error_color: #cc0000;
|
||||
$error_color: #ff8080;
|
||||
$success_color: if($variant == 'light', #33d17a, darken(#33d17a, 10%));
|
||||
$destructive_color: if($variant == 'light', #e01b24, darken(#e01b24, 10%));
|
||||
|
||||
|
@@ -157,18 +157,13 @@ StScrollBar {
|
||||
|
||||
/* Switches */
|
||||
.toggle-switch {
|
||||
width: 65px;
|
||||
width: 46px;
|
||||
height: 22px;
|
||||
background-size: contain;
|
||||
background-image: url("resource:///org/gnome/shell/theme/toggle-off-intl.svg");
|
||||
&:checked { background-image: url("resource:///org/gnome/shell/theme/toggle-on-intl.svg"); }
|
||||
}
|
||||
|
||||
@each $v in us, intl {
|
||||
.toggle-switch-#{$v} {
|
||||
background-image: url("resource:///org/gnome/shell/theme/toggle-off-#{$v}.svg");
|
||||
&:checked { background-image: url("resource:///org/gnome/shell/theme/toggle-on-#{$v}.svg"); }
|
||||
}
|
||||
}
|
||||
|
||||
/* links */
|
||||
.shell-link {
|
||||
color: $link_color;
|
||||
@@ -267,8 +262,7 @@ StScrollBar {
|
||||
}
|
||||
|
||||
.end-session-dialog-logout-icon {
|
||||
//border: 2px solid #8b8b8b;
|
||||
border-radius: 5px;
|
||||
border-radius: 99px;
|
||||
width: 48px;
|
||||
height: 48px;
|
||||
background-size: contain;
|
||||
@@ -393,7 +387,7 @@ StScrollBar {
|
||||
|
||||
.prompt-dialog-error-label {
|
||||
font-size: 10pt;
|
||||
color: $error_color;
|
||||
color: $warning_color;
|
||||
padding-bottom: 8px;
|
||||
}
|
||||
|
||||
@@ -428,7 +422,7 @@ StScrollBar {
|
||||
}
|
||||
|
||||
.polkit-dialog-user-icon {
|
||||
border-radius: 5px;
|
||||
border-radius: 99px;
|
||||
background-size: contain;
|
||||
width: 48px;
|
||||
height: 48px;
|
||||
@@ -508,6 +502,7 @@ StScrollBar {
|
||||
|
||||
.popup-menu-arrow { } //defined globally in the TOP BAR
|
||||
.popup-sub-menu {
|
||||
padding-bottom: 1px;
|
||||
background-color: darken($bg_color,2%);
|
||||
box-shadow: inset 0 -1px 0px lighten($borders_color,5%);
|
||||
}
|
||||
@@ -1031,6 +1026,11 @@ StScrollBar {
|
||||
-st-icon-style: symbolic;
|
||||
}
|
||||
|
||||
.message-icon-bin > .fallback-window-icon {
|
||||
width: 1.09em;
|
||||
height: 1.09em;
|
||||
}
|
||||
|
||||
.message-secondary-bin {
|
||||
padding: 0 0.82em;;
|
||||
}
|
||||
@@ -1137,32 +1137,36 @@ StScrollBar {
|
||||
|
||||
.ripple-box:rtl { border-radius: 0 0 0 52px; } // just a simple change to the border radius position
|
||||
|
||||
// Rubberband for select-area screenshots
|
||||
.select-area-rubberband {
|
||||
background-color: transparentize($selected_bg_color,0.7);
|
||||
border: 1px solid $selected_bg_color;
|
||||
}
|
||||
|
||||
// not really top bar only
|
||||
.popup-menu-arrow { width: 16px; height: 16px; }
|
||||
.popup-menu-arrow { icon-size: 1.09em; }
|
||||
.popup-menu-icon { icon-size: 1.09em; }
|
||||
|
||||
//close buttons
|
||||
|
||||
.window-close {
|
||||
background-color: white;
|
||||
background-color: $selected_bg_color;
|
||||
color: white;
|
||||
border-radius: 24px;
|
||||
border: 4px solid $selected_bg_color;
|
||||
box-shadow: inset 0 -4px 0 0 transparentize($selected_bg_color, 0.5);
|
||||
color: $selected_bg_color;
|
||||
border: 2px solid $selected_bg_color;
|
||||
height: 24px;
|
||||
width: 24px;
|
||||
-shell-close-overlap: 14px;
|
||||
-shell-close-overlap: 11px;
|
||||
box-shadow: -1px 1px 5px 0px transparentize(black, 0.5);
|
||||
|
||||
&:hover {
|
||||
background-color: $selected_bg_color;
|
||||
border-color: white;
|
||||
color: white;
|
||||
background-color: lighten($selected_bg_color, 5%);
|
||||
border-color: lighten($selected_bg_color, 5%);
|
||||
}
|
||||
|
||||
&:active {
|
||||
background-color: mix(white, $selected_bg_color, 75%);
|
||||
border-color: $selected_bg_color;
|
||||
color: $selected_bg_color;
|
||||
background-color: darken($selected_bg_color, 5%);
|
||||
border-color: darken($selected_bg_color, 5%);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1227,13 +1231,14 @@ StScrollBar {
|
||||
}
|
||||
|
||||
.window-clone-border {
|
||||
border: 4px solid $selected_bg_color;
|
||||
border-radius: 4px;
|
||||
$_bg: transparentize(white, 0.65);
|
||||
border: 5px solid $_bg;
|
||||
border-radius: 6px;
|
||||
// For window decorations with round corners we can't match
|
||||
// the exact shape when the window is scaled. So apply a shadow
|
||||
// to fix that case
|
||||
box-shadow: inset 0px 0px 0px 1px $selected_bg_color;
|
||||
}
|
||||
box-shadow: inset 0 0 0 1px $_bg;
|
||||
}
|
||||
.window-caption {
|
||||
spacing: 25px;
|
||||
color: $selected_fg_color;
|
||||
@@ -1284,6 +1289,8 @@ StScrollBar {
|
||||
|
||||
.search-section-separator { height: 2px; background-color: rgba(255, 255, 255, 0.2); }
|
||||
|
||||
.search-section:last-child .search-section-separator { background-color: transparent; }
|
||||
|
||||
.list-search-result-content { spacing: 30px; }
|
||||
.list-search-result-title { color: darken($osd_fg_color,5%); spacing: 12px; }
|
||||
.list-search-result-description { color: transparentize(darken($osd_fg_color,15%), 0.5); }
|
||||
@@ -1446,13 +1453,13 @@ StScrollBar {
|
||||
height: 12px;
|
||||
background-color: transparent;
|
||||
border: 2px solid rgba(255, 255, 255, 0.4);
|
||||
border-radius:12px;
|
||||
border-radius: 12px;
|
||||
}
|
||||
|
||||
&:hover .page-indicator-icon { border-color: white; }
|
||||
&:active .page-indicator-icon { border: none; margin: 2px; background-color:#fff; }
|
||||
&:active .page-indicator-icon { border: none; margin: 2px; background-color: white; }
|
||||
&:checked .page-indicator-icon,
|
||||
&:checked:active { background-color: #fff;}
|
||||
&:checked:active .page-indicator-icon { background-color: white;}
|
||||
}
|
||||
|
||||
.no-frequent-applications-label { @extend %status_text; }
|
||||
@@ -1754,13 +1761,11 @@ StScrollBar {
|
||||
|
||||
/* Auth Dialogs & Screen Shield */
|
||||
|
||||
.framed-user-icon {
|
||||
.user-icon {
|
||||
background-size: contain;
|
||||
border: 2px solid $osd_fg_color;
|
||||
color: $osd_fg_color;
|
||||
border-radius: 3px;
|
||||
border-radius: 99px;
|
||||
&:hover {
|
||||
border-color: lighten($osd_fg_color,30%);
|
||||
color: lighten($osd_fg_color,30%);
|
||||
}
|
||||
}
|
||||
|
@@ -10,124 +10,62 @@
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="65"
|
||||
width="46"
|
||||
height="22"
|
||||
id="svg2857"
|
||||
viewBox="0 0 46 22"
|
||||
version="1.1"
|
||||
inkscape:version="0.48.5 r10040"
|
||||
sodipodi:docname="toggle-off-us.svg">
|
||||
id="svg2751"
|
||||
inkscape:version="0.92.4 5da689c313, 2019-01-14"
|
||||
sodipodi:docname="toggle-off-intl.svg">
|
||||
<defs
|
||||
id="defs2859">
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 526.18109 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="744.09448 : 526.18109 : 1"
|
||||
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
|
||||
id="perspective2865" />
|
||||
<inkscape:perspective
|
||||
id="perspective2843"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
id="defs2745">
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient76469-7-7-4"
|
||||
id="linearGradient38024"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.0215462,0,0,1.0322581,717.22867,428.68472)"
|
||||
x1="6"
|
||||
y1="102.95528"
|
||||
x2="6"
|
||||
y2="84.505203" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient76469-7-7-4">
|
||||
id="linearGradient3329">
|
||||
<stop
|
||||
style="stop-color:#2e3232;stop-opacity:1"
|
||||
style="stop-color:#39393a;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop76471-7-1-5" />
|
||||
id="stop3325" />
|
||||
<stop
|
||||
style="stop-color:#3e4545;stop-opacity:1"
|
||||
style="stop-color:#302f30;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop76473-9-0-0" />
|
||||
</linearGradient>
|
||||
<inkscape:path-effect
|
||||
effect="spiro"
|
||||
id="path-effect77541-4"
|
||||
is_visible="true" />
|
||||
<inkscape:path-effect
|
||||
effect="spiro"
|
||||
id="path-effect77541-4-0"
|
||||
is_visible="true" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient37802-8"
|
||||
id="linearGradient12311-3-1-0-5-4"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.5918367,0,0,0.85714285,-256.56122,59.071426)"
|
||||
x1="610.13782"
|
||||
y1="501.43866"
|
||||
x2="610.13782"
|
||||
y2="492.52756" />
|
||||
<linearGradient
|
||||
id="linearGradient37802-8"
|
||||
inkscape:collect="always">
|
||||
<stop
|
||||
id="stop37804-1"
|
||||
offset="0"
|
||||
style="stop-color:#2c2c2c;stop-opacity:1" />
|
||||
<stop
|
||||
id="stop37806-8"
|
||||
offset="1"
|
||||
style="stop-color:#16191a;stop-opacity:1" />
|
||||
id="stop3327" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
y2="492.52756"
|
||||
x2="610.13782"
|
||||
y1="501.43866"
|
||||
x1="610.13782"
|
||||
gradientTransform="matrix(1.5918367,0,0,0.85714285,-900.56122,-423.92857)"
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3329"
|
||||
id="linearGradient3331"
|
||||
x1="53"
|
||||
y1="294.42917"
|
||||
x2="53"
|
||||
y2="309.80417"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient13602"
|
||||
xlink:href="#linearGradient37802-8"
|
||||
inkscape:collect="always" />
|
||||
gradientTransform="translate(-42.760724)" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#000000"
|
||||
pagecolor="#535353"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="1"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="1"
|
||||
inkscape:cx="-5.0602834"
|
||||
inkscape:cy="16.473273"
|
||||
inkscape:cx="-19.436775"
|
||||
inkscape:cy="-13.499723"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="g37994"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:window-width="2560"
|
||||
inkscape:window-height="1375"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-maximized="1"
|
||||
units="px"
|
||||
inkscape:pagecheckerboard="true"
|
||||
borderlayer="true"
|
||||
inkscape:showpageshadow="false"
|
||||
inkscape:snap-nodes="false"
|
||||
inkscape:snap-bbox="true"
|
||||
showborder="false">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid12954"
|
||||
empspacing="5"
|
||||
visible="true"
|
||||
enabled="true"
|
||||
snapvisiblegridlinesonly="true" />
|
||||
id="grid3298" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata2862">
|
||||
id="metadata2748">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
@@ -142,68 +80,24 @@
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(-444.64286,-781.36218)">
|
||||
<g
|
||||
transform="matrix(0.6526046,0,0,0.80554422,99.592644,-636.32172)"
|
||||
id="g37994">
|
||||
<g
|
||||
id="g37996"
|
||||
transform="translate(-115,1277)">
|
||||
<rect
|
||||
style="color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964000000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0.19591837"
|
||||
id="rect13475"
|
||||
width="98"
|
||||
height="25"
|
||||
x="644.5"
|
||||
y="484.61118"
|
||||
rx="4.7429576"
|
||||
ry="3.8424656" />
|
||||
<rect
|
||||
ry="3.8424656"
|
||||
rx="4.7429576"
|
||||
y="483.5"
|
||||
x="644.5"
|
||||
height="25"
|
||||
width="98"
|
||||
id="rect38000"
|
||||
style="color:#000000;fill:url(#linearGradient12311-3-1-0-5-4);fill-opacity:1;fill-rule:nonzero;stroke:#16191a;stroke-width:1.37920942;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
|
||||
</g>
|
||||
<g
|
||||
transform="translate(-49.946213,-1.890275)"
|
||||
id="g38002">
|
||||
<g
|
||||
transform="translate(-115,1247)"
|
||||
style="display:inline"
|
||||
id="g38004">
|
||||
<rect
|
||||
ry="3.7972314"
|
||||
rx="4.6871223"
|
||||
y="515.5"
|
||||
x="694.53046"
|
||||
height="25"
|
||||
width="45.969578"
|
||||
id="rect38006"
|
||||
style="color:#000000;fill:url(#linearGradient38024);fill-opacity:1;fill-rule:nonzero;stroke:#1f2020;stroke-width:1.37920964;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
style="opacity:0.1;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||
d="m 699.09675,516.7365 36.86904,0"
|
||||
id="path38016"
|
||||
inkscape:path-effect="#path-effect77541-4"
|
||||
inkscape:original-d="m 699.09675,516.7365 36.86904,0"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="color:#000000;fill:none;stroke:#ffffff;stroke-width:2.15627193;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
|
||||
id="path13479"
|
||||
sodipodi:cx="16.4375"
|
||||
sodipodi:cy="10.8125"
|
||||
sodipodi:rx="4.3125"
|
||||
sodipodi:ry="4.3125"
|
||||
d="m 20.75,10.8125 a 4.3125,4.3125 0 1 1 -8.625,0 4.3125,4.3125 0 1 1 8.625,0 z"
|
||||
transform="matrix(1.4212691,0,0,1.1514287,577.38488,1761.1138)" />
|
||||
</g>
|
||||
transform="translate(0,-291.17916)">
|
||||
<rect
|
||||
style="opacity:1;vector-effect:none;fill:#323233;fill-opacity:1;stroke:#272728;stroke-width:1.08532763;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
|
||||
id="rect3296"
|
||||
width="44.446434"
|
||||
height="20.910645"
|
||||
x="0.625"
|
||||
y="291.71494"
|
||||
rx="10.455324"
|
||||
ry="10.073335" />
|
||||
<rect
|
||||
ry="10.455322"
|
||||
rx="10.455322"
|
||||
y="291.71494"
|
||||
x="0.5428465"
|
||||
height="20.910645"
|
||||
width="21.142862"
|
||||
id="rect3300"
|
||||
style="opacity:1;vector-effect:none;fill:url(#linearGradient3331);fill-opacity:1;stroke:#151515;stroke-width:1.08532763;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal" />
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 7.5 KiB After Width: | Height: | Size: 3.3 KiB |
@@ -1,255 +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:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="65"
|
||||
height="22"
|
||||
id="svg2857"
|
||||
version="1.1"
|
||||
inkscape:version="0.48.5 r10040"
|
||||
sodipodi:docname="toggle-on-intl.svg">
|
||||
<defs
|
||||
id="defs2859">
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 526.18109 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="744.09448 : 526.18109 : 1"
|
||||
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
|
||||
id="perspective2865" />
|
||||
<inkscape:perspective
|
||||
id="perspective2843"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient76469-7-7-4"
|
||||
id="linearGradient38024"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.0215462,0,0,1.0322581,717.22867,428.68472)"
|
||||
x1="6"
|
||||
y1="102.95528"
|
||||
x2="6"
|
||||
y2="84.505203" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient76469-7-7-4">
|
||||
<stop
|
||||
style="stop-color:#2e3232;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop76471-7-1-5" />
|
||||
<stop
|
||||
style="stop-color:#3e4545;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop76473-9-0-0" />
|
||||
</linearGradient>
|
||||
<inkscape:path-effect
|
||||
effect="spiro"
|
||||
id="path-effect77541-4"
|
||||
is_visible="true" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient37802"
|
||||
id="linearGradient12311-3-1-0-5"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.5918367,0,0,0.85714285,-256.56122,59.071426)"
|
||||
x1="610.13782"
|
||||
y1="501.43866"
|
||||
x2="610.13782"
|
||||
y2="492.52756" />
|
||||
<linearGradient
|
||||
id="linearGradient37802"
|
||||
inkscape:collect="always">
|
||||
<stop
|
||||
id="stop37804"
|
||||
offset="0"
|
||||
style="stop-color:#2c2c2c;stop-opacity:1" />
|
||||
<stop
|
||||
id="stop37806"
|
||||
offset="1"
|
||||
style="stop-color:#16191a;stop-opacity:1" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient76469-7-7-4-3"
|
||||
id="linearGradient77680"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1,0,0,1.0322581,717.71949,428.68472)"
|
||||
x1="6"
|
||||
y1="102.95528"
|
||||
x2="6"
|
||||
y2="84.505203" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient76469-7-7-4-3">
|
||||
<stop
|
||||
style="stop-color:#2e3232;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop76471-7-1-5-7" />
|
||||
<stop
|
||||
style="stop-color:#3e4545;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop76473-9-0-0-9" />
|
||||
</linearGradient>
|
||||
<inkscape:path-effect
|
||||
effect="spiro"
|
||||
id="path-effect77541-4-0"
|
||||
is_visible="true" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient37802-8"
|
||||
id="linearGradient12311-3-1-0-5-4"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.5918367,0,0,0.85714285,-256.56122,59.071426)"
|
||||
x1="610.13782"
|
||||
y1="501.43866"
|
||||
x2="610.13782"
|
||||
y2="492.52756" />
|
||||
<linearGradient
|
||||
id="linearGradient37802-8"
|
||||
inkscape:collect="always">
|
||||
<stop
|
||||
id="stop37804-1"
|
||||
offset="0"
|
||||
style="stop-color:#2c2c2c;stop-opacity:1" />
|
||||
<stop
|
||||
id="stop37806-8"
|
||||
offset="1"
|
||||
style="stop-color:#16191a;stop-opacity:1" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
y2="492.52756"
|
||||
x2="610.13782"
|
||||
y1="501.43866"
|
||||
x1="610.13782"
|
||||
gradientTransform="matrix(1.5918367,0,0,0.85714285,-900.56122,-423.92857)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient13602"
|
||||
xlink:href="#linearGradient37802-8"
|
||||
inkscape:collect="always" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#000000"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="1"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="1"
|
||||
inkscape:cx="16.760995"
|
||||
inkscape:cy="21.955673"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="g37994"
|
||||
showgrid="false"
|
||||
inkscape:window-width="2560"
|
||||
inkscape:window-height="1375"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-maximized="1"
|
||||
borderlayer="true"
|
||||
inkscape:showpageshadow="false"
|
||||
inkscape:snap-nodes="false"
|
||||
inkscape:snap-bbox="true"
|
||||
showborder="false">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid12954"
|
||||
empspacing="5"
|
||||
visible="true"
|
||||
enabled="true"
|
||||
snapvisiblegridlinesonly="true" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata2862">
|
||||
<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(-444.64286,-781.36218)">
|
||||
<g
|
||||
transform="matrix(0.6526046,0,0,0.80554422,99.592644,-636.32172)"
|
||||
id="g37994">
|
||||
<g
|
||||
id="g37996"
|
||||
transform="translate(-115,1277)">
|
||||
<rect
|
||||
style="color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964000000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0.19591837"
|
||||
id="rect13475"
|
||||
width="98"
|
||||
height="25"
|
||||
x="644.5"
|
||||
y="484.61118"
|
||||
rx="4.7429576"
|
||||
ry="3.8424656" />
|
||||
<rect
|
||||
ry="3.8424656"
|
||||
rx="4.7429576"
|
||||
y="483.5"
|
||||
x="644.5"
|
||||
height="25"
|
||||
width="98"
|
||||
id="rect38000"
|
||||
style="color:#000000;fill:url(#linearGradient12311-3-1-0-5-4);fill-opacity:1;fill-rule:nonzero;stroke:#16191a;stroke-width:1.37920942;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
|
||||
</g>
|
||||
<g
|
||||
transform="translate(-49.946213,-1.890275)"
|
||||
id="g38002">
|
||||
<g
|
||||
transform="translate(-115,1247)"
|
||||
style="display:inline"
|
||||
id="g38004">
|
||||
<rect
|
||||
ry="3.7972314"
|
||||
rx="4.6871223"
|
||||
y="515.5"
|
||||
x="694.53046"
|
||||
height="25"
|
||||
width="45.969578"
|
||||
id="rect38006"
|
||||
style="color:#000000;fill:url(#linearGradient38024);fill-opacity:1;fill-rule:nonzero;stroke:#1f2020;stroke-width:1.37920964;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
style="opacity:0.1;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||
d="m 699.09675,516.7365 36.86904,0"
|
||||
id="path38016"
|
||||
inkscape:path-effect="#path-effect77541-4"
|
||||
inkscape:original-d="m 699.09675,516.7365 36.86904,0"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:13.79166794px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Cantarell;-inkscape-font-specification:Cantarell Bold"
|
||||
x="520.29974"
|
||||
y="1997.0011"
|
||||
id="text75614"
|
||||
sodipodi:linespacing="125%"
|
||||
transform="scale(1.1236771,0.88993537)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan75616"
|
||||
x="520.29974"
|
||||
y="1997.0011">OFF</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 8.8 KiB |
@@ -10,117 +10,69 @@
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="65"
|
||||
width="46"
|
||||
height="22"
|
||||
id="svg2857"
|
||||
viewBox="0 0 46 22"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r13725"
|
||||
id="svg2751"
|
||||
inkscape:version="0.92.4 5da689c313, 2019-01-14"
|
||||
sodipodi:docname="toggle-on-intl.svg">
|
||||
<defs
|
||||
id="defs2859">
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 526.18109 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="744.09448 : 526.18109 : 1"
|
||||
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
|
||||
id="perspective2865" />
|
||||
<inkscape:perspective
|
||||
id="perspective2843"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
id="defs2745">
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient77461"
|
||||
id="linearGradient77551"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.3066667,0,0,1,-841.64667,-483)"
|
||||
x1="1164.7644"
|
||||
y1="962.93695"
|
||||
x2="1164.7644"
|
||||
y2="970.51404" />
|
||||
<linearGradient
|
||||
id="linearGradient77461"
|
||||
inkscape:collect="always">
|
||||
id="linearGradient3329">
|
||||
<stop
|
||||
id="stop77463"
|
||||
style="stop-color:#39393a;stop-opacity:1;"
|
||||
offset="0"
|
||||
style="stop-color:#182f4c;stop-opacity:1" />
|
||||
id="stop3325" />
|
||||
<stop
|
||||
id="stop77465"
|
||||
style="stop-color:#302f30;stop-opacity:1"
|
||||
offset="1"
|
||||
style="stop-color:#205b9a;stop-opacity:1" />
|
||||
id="stop3327" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient76469-7-7-4"
|
||||
id="linearGradient38024"
|
||||
xlink:href="#linearGradient3329"
|
||||
id="linearGradient3331"
|
||||
x1="53"
|
||||
y1="294.42917"
|
||||
x2="53"
|
||||
y2="309.80417"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.0215462,0,0,1.0322581,717.22867,428.68472)"
|
||||
x1="6"
|
||||
y1="102.95528"
|
||||
x2="6"
|
||||
y2="84.505203" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient76469-7-7-4">
|
||||
<stop
|
||||
style="stop-color:#2e3232;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop76471-7-1-5" />
|
||||
<stop
|
||||
style="stop-color:#3e4545;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop76473-9-0-0" />
|
||||
</linearGradient>
|
||||
<inkscape:path-effect
|
||||
effect="spiro"
|
||||
id="path-effect77541-4"
|
||||
is_visible="true" />
|
||||
gradientTransform="translate(-19)" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#000000"
|
||||
pagecolor="#535353"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="1"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="1"
|
||||
inkscape:cx="37.410841"
|
||||
inkscape:cy="16.009314"
|
||||
inkscape:cx="13.588971"
|
||||
inkscape:cy="14.124546"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="g37994"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:window-width="2560"
|
||||
inkscape:window-height="1376"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-maximized="1"
|
||||
units="px"
|
||||
inkscape:pagecheckerboard="true"
|
||||
borderlayer="true"
|
||||
inkscape:showpageshadow="false"
|
||||
inkscape:snap-nodes="false"
|
||||
inkscape:snap-bbox="true"
|
||||
showborder="false">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid12954"
|
||||
empspacing="5"
|
||||
visible="true"
|
||||
enabled="true"
|
||||
snapvisiblegridlinesonly="true" />
|
||||
id="grid3298" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata2862">
|
||||
id="metadata2748">
|
||||
<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></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
@@ -128,65 +80,24 @@
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(-444.64286,-781.36218)">
|
||||
<g
|
||||
transform="matrix(0.6526046,0,0,0.80554422,99.592644,-636.32172)"
|
||||
id="g37994">
|
||||
<g
|
||||
id="g37996"
|
||||
transform="translate(-115,1277)">
|
||||
<rect
|
||||
style="color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964000000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0.19591837"
|
||||
id="rect13475"
|
||||
width="98"
|
||||
height="25"
|
||||
x="644.5"
|
||||
y="484.61118"
|
||||
rx="4.7429576"
|
||||
ry="3.8424656" />
|
||||
<rect
|
||||
ry="3.8424656"
|
||||
rx="4.7429576"
|
||||
y="483.5"
|
||||
x="644.5"
|
||||
height="25"
|
||||
width="98"
|
||||
id="rect38000"
|
||||
style="color:#000000;fill:url(#linearGradient77551);fill-opacity:1;fill-rule:nonzero;stroke:#182f4c;stroke-width:1.37920964;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
|
||||
</g>
|
||||
<g
|
||||
transform="translate(2.0625,-2)"
|
||||
id="g38002">
|
||||
<g
|
||||
transform="translate(-115,1247)"
|
||||
style="display:inline"
|
||||
id="g38004">
|
||||
<rect
|
||||
ry="3.7972314"
|
||||
rx="4.6871223"
|
||||
y="515.5"
|
||||
x="694.53046"
|
||||
height="25"
|
||||
width="45.969578"
|
||||
id="rect38006"
|
||||
style="color:#000000;fill:url(#linearGradient38024);fill-opacity:1;fill-rule:nonzero;stroke:#1f2020;stroke-width:1.37920964;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
style="opacity:0.1;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||
d="m 699.09675,516.7365 36.86904,0"
|
||||
id="path38016"
|
||||
inkscape:path-effect="#path-effect77541-4"
|
||||
inkscape:original-d="m 699.09675,516.7365 36.86904,0"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
<rect
|
||||
style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
|
||||
id="rect13678"
|
||||
width="3.0646207"
|
||||
height="12.414008"
|
||||
x="554.77728"
|
||||
y="1767.3566" />
|
||||
</g>
|
||||
transform="translate(0,-291.17916)">
|
||||
<rect
|
||||
style="opacity:1;vector-effect:none;fill:#15539e;fill-opacity:1;stroke:#030e1b;stroke-width:1.08532763;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
|
||||
id="rect3296"
|
||||
width="44.446434"
|
||||
height="20.910645"
|
||||
x="0.625"
|
||||
y="291.71494"
|
||||
rx="10.455324"
|
||||
ry="10.073335" />
|
||||
<rect
|
||||
ry="10.455322"
|
||||
rx="10.455322"
|
||||
y="291.71494"
|
||||
x="24.30357"
|
||||
height="20.910645"
|
||||
width="21.142862"
|
||||
id="rect3300"
|
||||
style="opacity:1;vector-effect:none;fill:url(#linearGradient3331);fill-opacity:1;stroke:#030e1b;stroke-width:1.08532763;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal" />
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 6.8 KiB After Width: | Height: | Size: 3.3 KiB |
@@ -1,207 +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:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="65"
|
||||
height="22"
|
||||
id="svg2857"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="toggle-on-us.svg">
|
||||
<defs
|
||||
id="defs2859">
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 526.18109 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="744.09448 : 526.18109 : 1"
|
||||
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
|
||||
id="perspective2865" />
|
||||
<inkscape:perspective
|
||||
id="perspective2843"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient76469-7-7-4"
|
||||
id="linearGradient38024"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.0215462,0,0,1.0322581,717.22867,428.68472)"
|
||||
x1="6"
|
||||
y1="102.95528"
|
||||
x2="6"
|
||||
y2="84.505203" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient76469-7-7-4">
|
||||
<stop
|
||||
style="stop-color:#2e3232;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop76471-7-1-5" />
|
||||
<stop
|
||||
style="stop-color:#3e4545;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop76473-9-0-0" />
|
||||
</linearGradient>
|
||||
<inkscape:path-effect
|
||||
effect="spiro"
|
||||
id="path-effect77541-4"
|
||||
is_visible="true" />
|
||||
<linearGradient
|
||||
id="linearGradient77461-1"
|
||||
inkscape:collect="always">
|
||||
<stop
|
||||
id="stop77463-1"
|
||||
offset="0"
|
||||
style="stop-color:#182f4c;stop-opacity:1" />
|
||||
<stop
|
||||
id="stop77465-4"
|
||||
offset="1"
|
||||
style="stop-color:#205b9a;stop-opacity:1" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient77461-1"
|
||||
id="linearGradient77551-6-5"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.8527367,0,0,0.80554422,-969.41608,-778.00299)"
|
||||
x1="1164.7644"
|
||||
y1="962.93695"
|
||||
x2="1164.7644"
|
||||
y2="970.51404" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient77461-1"
|
||||
id="linearGradient11198"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.3066667,0,0,1,-1066.3709,794.25325)"
|
||||
x1="1322.5831"
|
||||
y1="-312.51855"
|
||||
x2="1322.5831"
|
||||
y2="-306.53461" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#000000"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="1"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="1"
|
||||
inkscape:cx="-26.798898"
|
||||
inkscape:cy="5.3753009"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="g37994"
|
||||
showgrid="false"
|
||||
inkscape:window-width="2560"
|
||||
inkscape:window-height="1376"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-maximized="1"
|
||||
borderlayer="true"
|
||||
inkscape:showpageshadow="false"
|
||||
inkscape:snap-nodes="false"
|
||||
inkscape:snap-bbox="true"
|
||||
showborder="false">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid12954"
|
||||
empspacing="5"
|
||||
visible="true"
|
||||
enabled="true"
|
||||
snapvisiblegridlinesonly="true" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata2862">
|
||||
<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 />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(-444.64286,-781.36218)">
|
||||
<g
|
||||
transform="matrix(0.6526046,0,0,0.80554422,99.592644,-636.32172)"
|
||||
id="g37994">
|
||||
<g
|
||||
id="g37996"
|
||||
transform="translate(-115,1277)">
|
||||
<rect
|
||||
style="color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964000000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0.19591837"
|
||||
id="rect13475"
|
||||
width="98"
|
||||
height="25"
|
||||
x="644.5"
|
||||
y="484.61118"
|
||||
rx="4.7429576"
|
||||
ry="3.8424656" />
|
||||
<rect
|
||||
ry="3.8424656"
|
||||
rx="4.7429576"
|
||||
y="483.5"
|
||||
x="644.5"
|
||||
height="25"
|
||||
width="98"
|
||||
id="rect38000"
|
||||
style="color:#000000;fill:url(#linearGradient11198);fill-opacity:1;fill-rule:nonzero;stroke:#182f4c;stroke-width:1.37920964;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;clip-rule:nonzero;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;filter-blend-mode:normal;filter-gaussianBlur-deviation:0;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto" />
|
||||
</g>
|
||||
<g
|
||||
transform="translate(2.0625,-2)"
|
||||
id="g38002">
|
||||
<g
|
||||
transform="translate(-115,1247)"
|
||||
style="display:inline"
|
||||
id="g38004">
|
||||
<rect
|
||||
ry="3.7972314"
|
||||
rx="4.6871223"
|
||||
y="515.5"
|
||||
x="694.53046"
|
||||
height="25"
|
||||
width="45.969578"
|
||||
id="rect38006"
|
||||
style="color:#000000;fill:url(#linearGradient38024);fill-opacity:1;fill-rule:nonzero;stroke:#1f2020;stroke-width:1.37920964;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
style="opacity:0.1;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||
d="m 699.09675,516.7365 36.86904,0"
|
||||
id="path38016"
|
||||
inkscape:path-effect="#path-effect77541-4"
|
||||
inkscape:original-d="m 699.09675,516.7365 36.86904,0"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
<text
|
||||
transform="scale(1.1000946,0.90901274)"
|
||||
sodipodi:linespacing="125%"
|
||||
id="text38018"
|
||||
y="1955.5205"
|
||||
x="495.94223"
|
||||
style="font-size:13.29953671px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Cantarell;-inkscape-font-specification:Cantarell Bold"
|
||||
xml:space="preserve"><tspan
|
||||
y="1955.5205"
|
||||
x="495.94223"
|
||||
id="tspan38020"
|
||||
sodipodi:role="line">ON</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 7.7 KiB |
@@ -40,6 +40,7 @@ do
|
||||
done
|
||||
|
||||
cat >>$TMP_GRESOURCE_FILE <<EOF
|
||||
<file>emoji.json</file>
|
||||
</gresource>
|
||||
</gresources>
|
||||
EOF
|
||||
|
@@ -551,9 +551,9 @@ class ExtensionRow extends Gtk.ListBoxRow {
|
||||
|
||||
let button = new Gtk.Button({ valign: Gtk.Align.CENTER,
|
||||
no_show_all: true });
|
||||
button.add(new Gtk.Image({ icon_name: 'emblem-system-symbolic',
|
||||
icon_size: Gtk.IconSize.BUTTON,
|
||||
visible: true }));
|
||||
button.set_image(new Gtk.Image({ icon_name: 'emblem-system-symbolic',
|
||||
icon_size: Gtk.IconSize.BUTTON,
|
||||
visible: true }));
|
||||
button.get_style_context().add_class('circular');
|
||||
hbox.add(button);
|
||||
|
||||
|
@@ -325,7 +325,7 @@ var SessionMenuButton = class {
|
||||
this._button.remove_style_pseudo_class('active');
|
||||
});
|
||||
|
||||
this._manager = new PopupMenu.PopupMenuManager({ actor: this._button },
|
||||
this._manager = new PopupMenu.PopupMenuManager(this._button,
|
||||
{ actionMode: Shell.ActionMode.NONE });
|
||||
this._manager.addMenu(this._menu);
|
||||
|
||||
@@ -481,6 +481,9 @@ var LoginDialog = GObject.registerClass({
|
||||
this._logoBin = new St.Widget({ style_class: 'login-dialog-logo-bin',
|
||||
x_align: Clutter.ActorAlign.CENTER,
|
||||
y_align: Clutter.ActorAlign.END });
|
||||
this._logoBin.connect('resource-scale-changed', () => {
|
||||
this._updateLogoTexture(this._textureCache, this._logoFile);
|
||||
});
|
||||
this.add_child(this._logoBin);
|
||||
this._updateLogo();
|
||||
|
||||
@@ -649,7 +652,7 @@ var LoginDialog = GObject.registerClass({
|
||||
bannerAllocation.x2 = Math.floor(centerX - centerGap / 2);
|
||||
bannerAllocation.x1 = Math.floor(bannerAllocation.x2 - wideBannerWidth);
|
||||
|
||||
// figure out how tall it would like to be and try to accomodate
|
||||
// figure out how tall it would like to be and try to accommodate
|
||||
// but don't let it get too close to the logo
|
||||
let [wideMinHeight, wideBannerHeight] = this._bannerView.get_preferred_height(wideBannerWidth);
|
||||
|
||||
@@ -778,11 +781,12 @@ var LoginDialog = GObject.registerClass({
|
||||
return;
|
||||
|
||||
this._logoBin.destroy_all_children();
|
||||
if (this._logoFile) {
|
||||
if (this._logoFile && this._logoBin.resource_scale > 0) {
|
||||
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
||||
this._logoBin.add_child(this._textureCache.load_file_async(this._logoFile,
|
||||
-1, _LOGO_ICON_HEIGHT,
|
||||
scaleFactor));
|
||||
scaleFactor,
|
||||
this._logoBin.resource_scale));
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -1,8 +1,10 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
const { Clutter, GObject, IBus } = imports.gi;
|
||||
const { Clutter, GLib, GObject, IBus } = imports.gi;
|
||||
|
||||
const Keyboard = imports.ui.status.keyboard;
|
||||
|
||||
var HIDE_PANEL_TIME = 50;
|
||||
|
||||
var InputMethod = GObject.registerClass(
|
||||
class InputMethod extends Clutter.InputMethod {
|
||||
_init() {
|
||||
@@ -13,6 +15,7 @@ class InputMethod extends Clutter.InputMethod {
|
||||
this._preeditStr = '';
|
||||
this._preeditPos = 0;
|
||||
this._preeditVisible = false;
|
||||
this._hidePanelId = 0;
|
||||
this._ibus = IBus.Bus.new_async();
|
||||
this._ibus.connect('connected', this._onConnected.bind(this));
|
||||
this._ibus.connect('disconnected', this._clear.bind(this));
|
||||
@@ -136,6 +139,11 @@ class InputMethod extends Clutter.InputMethod {
|
||||
this._updateCapabilities();
|
||||
this._emitRequestSurrounding();
|
||||
}
|
||||
|
||||
if (this._hidePanelId) {
|
||||
GLib.source_remove(this._hidePanelId);
|
||||
this._hidePanelId = 0;
|
||||
}
|
||||
}
|
||||
|
||||
vfunc_focus_out() {
|
||||
@@ -150,6 +158,12 @@ class InputMethod extends Clutter.InputMethod {
|
||||
this.set_preedit_text(null, 0);
|
||||
this._preeditStr = null;
|
||||
}
|
||||
|
||||
this._hidePanelId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, HIDE_PANEL_TIME, () => {
|
||||
this.set_input_panel_state(Clutter.InputPanelState.OFF);
|
||||
this._hidePanelId = 0;
|
||||
return GLib.SOURCE_REMOVE;
|
||||
});
|
||||
}
|
||||
|
||||
vfunc_reset() {
|
||||
|
@@ -42,8 +42,6 @@ var IntrospectService = class {
|
||||
}
|
||||
|
||||
_isStandaloneApp(app) {
|
||||
let windows = app.get_windows();
|
||||
|
||||
return app.get_windows().some(w => w.transient_for == null);
|
||||
}
|
||||
|
||||
@@ -55,6 +53,11 @@ var IntrospectService = class {
|
||||
return APP_WHITELIST.includes(sender);
|
||||
}
|
||||
|
||||
_getSandboxedAppId(app) {
|
||||
let ids = app.get_windows().map(w => w.get_sandboxed_app_id());
|
||||
return ids.find(id => id != null);
|
||||
}
|
||||
|
||||
_syncRunningApplications() {
|
||||
let tracker = Shell.WindowTracker.get_default();
|
||||
let apps = this._appSystem.get_running();
|
||||
@@ -76,6 +79,10 @@ var IntrospectService = class {
|
||||
newActiveApplication = app.get_id();
|
||||
}
|
||||
|
||||
let sandboxedAppId = this._getSandboxedAppId(app);
|
||||
if (sandboxedAppId)
|
||||
appInfo['sandboxed-app-id'] = new GLib.Variant('s', sandboxedAppId);
|
||||
|
||||
newRunningApplications[app.get_id()] = appInfo;
|
||||
}
|
||||
|
||||
@@ -137,6 +144,7 @@ var IntrospectService = class {
|
||||
let frameRect = window.get_frame_rect();
|
||||
let title = window.get_title();
|
||||
let wmClass = window.get_wm_class();
|
||||
let sandboxedAppId = window.get_sandboxed_app_id();
|
||||
|
||||
windowsList[windowId] = {
|
||||
'app-id': GLib.Variant.new('s', app.get_id()),
|
||||
@@ -153,6 +161,10 @@ var IntrospectService = class {
|
||||
|
||||
if (wmClass != null)
|
||||
windowsList[windowId]['wm-class'] = GLib.Variant.new('s', wmClass);
|
||||
|
||||
if (sandboxedAppId != null)
|
||||
windowsList[windowId]['sandboxed-app-id'] =
|
||||
GLib.Variant.new('s', sandboxedAppId);
|
||||
}
|
||||
}
|
||||
invocation.return_value(new GLib.Variant('(a{ta{sv}})', [windowsList]));
|
||||
|
@@ -88,42 +88,42 @@ const SystemActions = GObject.registerClass({
|
||||
name: C_("search-result", "Power Off"),
|
||||
iconName: 'system-shutdown-symbolic',
|
||||
// Translators: A list of keywords that match the power-off action, separated by semicolons
|
||||
keywords: _("power off;shutdown;reboot;restart").split(';'),
|
||||
keywords: _("power off;shutdown;reboot;restart").split(/[; ]/),
|
||||
available: false });
|
||||
this._actions.set(LOCK_SCREEN_ACTION_ID,
|
||||
{ // Translators: The name of the lock screen action in search
|
||||
name: C_("search-result", "Lock Screen"),
|
||||
iconName: 'system-lock-screen-symbolic',
|
||||
// Translators: A list of keywords that match the lock screen action, separated by semicolons
|
||||
keywords: _("lock screen").split(';'),
|
||||
keywords: _("lock screen").split(/[; ]/),
|
||||
available: false });
|
||||
this._actions.set(LOGOUT_ACTION_ID,
|
||||
{ // Translators: The name of the logout action in search
|
||||
name: C_("search-result", "Log Out"),
|
||||
iconName: 'application-exit-symbolic',
|
||||
// Translators: A list of keywords that match the logout action, separated by semicolons
|
||||
keywords: _("logout;sign off").split(';'),
|
||||
keywords: _("logout;log out;sign off").split(/[; ]/),
|
||||
available: false });
|
||||
this._actions.set(SUSPEND_ACTION_ID,
|
||||
{ // Translators: The name of the suspend action in search
|
||||
name: C_("search-result", "Suspend"),
|
||||
iconName: 'media-playback-pause-symbolic',
|
||||
// Translators: A list of keywords that match the suspend action, separated by semicolons
|
||||
keywords: _("suspend;sleep").split(';'),
|
||||
keywords: _("suspend;sleep").split(/[; ]/),
|
||||
available: false });
|
||||
this._actions.set(SWITCH_USER_ACTION_ID,
|
||||
{ // Translators: The name of the switch user action in search
|
||||
name: C_("search-result", "Switch User"),
|
||||
iconName: 'system-switch-user-symbolic',
|
||||
// Translators: A list of keywords that match the switch user action, separated by semicolons
|
||||
keywords: _("switch user").split(';'),
|
||||
keywords: _("switch user").split(/[; ]/),
|
||||
available: false });
|
||||
this._actions.set(LOCK_ORIENTATION_ACTION_ID,
|
||||
{ // Translators: The name of the lock orientation action in search
|
||||
name: C_("search-result", "Lock Orientation"),
|
||||
iconName: '',
|
||||
// Translators: A list of keywords that match the lock orientation action, separated by semicolons
|
||||
keywords: _("lock orientation;screen;rotation").split(';'),
|
||||
keywords: _("lock orientation;screen;rotation").split(/[; ]/),
|
||||
available: false });
|
||||
|
||||
this._loginScreenSettings = new Gio.Settings({ schema_id: LOGIN_SCREEN_SCHEMA });
|
||||
@@ -262,7 +262,7 @@ const SystemActions = GObject.registerClass({
|
||||
let results = [];
|
||||
|
||||
for (let [key, {available, keywords}] of this._actions)
|
||||
if (available && terms.every(t => keywords.some(k => (k.indexOf(t) >= 0))))
|
||||
if (available && terms.every(t => keywords.some(k => k.startsWith(t))))
|
||||
results.push(key);
|
||||
|
||||
return results;
|
||||
|
@@ -366,7 +366,7 @@ class CloseButton extends St.Button {
|
||||
}
|
||||
|
||||
_computeBoxPointerOffset() {
|
||||
if (!this._boxPointer || !this._boxPointer.actor.get_stage())
|
||||
if (!this._boxPointer || !this._boxPointer.get_stage())
|
||||
return 0;
|
||||
|
||||
let side = this._boxPointer.arrowSide;
|
||||
|
@@ -30,6 +30,14 @@ var WeatherClient = class {
|
||||
return;
|
||||
}
|
||||
|
||||
if (this._permStore.g_name_owner == null) {
|
||||
// Failed to auto-start, likely because xdg-desktop-portal
|
||||
// isn't installed; don't restrict access to location service
|
||||
this._weatherAuthorized = true;
|
||||
this._updateAutoLocation();
|
||||
return;
|
||||
}
|
||||
|
||||
this._permStore.LookupRemote('gnome', 'geolocation', (res, error) => {
|
||||
if (error)
|
||||
log('Error looking up permission: ' + error.message);
|
||||
|
@@ -10,7 +10,7 @@ const Scripting = imports.ui.scripting;
|
||||
// someone should be able to get an idea of how well the shell is performing
|
||||
// on a particular system.
|
||||
|
||||
let METRICS = {
|
||||
var METRICS = {
|
||||
overviewLatencyFirst:
|
||||
{ description: "Time to first frame after triggering overview, first time",
|
||||
units: "us" },
|
||||
|
@@ -1,8 +1,8 @@
|
||||
const { Clutter, Gio, Gtk, Shell } = imports.gi;
|
||||
const { Clutter, Gio, Shell } = imports.gi;
|
||||
const Main = imports.ui.main;
|
||||
const Scripting = imports.ui.scripting;
|
||||
|
||||
let METRICS = {
|
||||
var METRICS = {
|
||||
timeToDesktop:
|
||||
{ description: "Time from starting graphical.target to desktop showing",
|
||||
units: "us" },
|
||||
@@ -104,7 +104,10 @@ function *run() {
|
||||
yield Scripting.waitLeisure();
|
||||
Scripting.scriptEvent('desktopShown');
|
||||
|
||||
Gtk.Settings.get_default().gtk_enable_animations = false;
|
||||
let interfaceSettings = new Gio.Settings({
|
||||
schema_id: 'org.gnome.desktop.interface'
|
||||
});
|
||||
interfaceSettings.set_boolean('enable-animations', false);
|
||||
|
||||
Scripting.scriptEvent('overviewShowStart');
|
||||
Main.overview.show();
|
||||
@@ -200,7 +203,7 @@ function *run() {
|
||||
|
||||
yield Scripting.sleep(1000);
|
||||
|
||||
Gtk.Settings.get_default().gtk_enable_animations = true;
|
||||
interfaceSettings.set_boolean('enable-animations', true);
|
||||
}
|
||||
|
||||
let overviewShowStart;
|
||||
|
@@ -474,12 +474,10 @@ var CyclerList = GObject.registerClass({
|
||||
}
|
||||
});
|
||||
|
||||
var CyclerPopup = GObject.registerClass(
|
||||
class CyclerPopup extends SwitcherPopup.SwitcherPopup {
|
||||
var CyclerPopup = GObject.registerClass({
|
||||
GTypeFlags: GObject.TypeFlags.ABSTRACT
|
||||
}, class CyclerPopup extends SwitcherPopup.SwitcherPopup {
|
||||
_init() {
|
||||
if (new.target === CyclerPopup)
|
||||
throw new TypeError('Cannot instantiate abstract class ' + new.target.name);
|
||||
|
||||
super._init();
|
||||
|
||||
this._items = this._getWindows();
|
||||
@@ -619,9 +617,8 @@ class WindowSwitcherPopup extends SwitcherPopup.SwitcherPopup {
|
||||
var WindowCyclerPopup = GObject.registerClass(
|
||||
class WindowCyclerPopup extends CyclerPopup {
|
||||
_init() {
|
||||
super._init();
|
||||
|
||||
this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell.window-switcher' });
|
||||
super._init();
|
||||
}
|
||||
|
||||
_getWindows() {
|
||||
|
@@ -12,7 +12,16 @@ var SPINNER_ANIMATION_DELAY = 1.0;
|
||||
var Animation = class {
|
||||
constructor(file, width, height, speed) {
|
||||
this.actor = new St.Bin();
|
||||
this.actor.set_size(width, height);
|
||||
this.actor.connect('destroy', this._onDestroy.bind(this));
|
||||
this.actor.connect('notify::size', this._syncAnimationSize.bind(this));
|
||||
this.actor.connect('resource-scale-changed',
|
||||
this._loadFile.bind(this, file, width, height));
|
||||
|
||||
let themeContext = St.ThemeContext.get_for_stage(global.stage);
|
||||
this._scaleChangedId = themeContext.connect('notify::scale-factor',
|
||||
this._loadFile.bind(this, file, width, height));
|
||||
|
||||
this._speed = speed;
|
||||
|
||||
this._isLoaded = false;
|
||||
@@ -20,10 +29,7 @@ var Animation = class {
|
||||
this._timeoutId = 0;
|
||||
this._frame = 0;
|
||||
|
||||
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
||||
this._animations = St.TextureCache.get_default().load_sliced_image (file, width, height, scaleFactor,
|
||||
this._animationsLoaded.bind(this));
|
||||
this.actor.set_child(this._animations);
|
||||
this._loadFile(file, width, height);
|
||||
}
|
||||
|
||||
play() {
|
||||
@@ -47,6 +53,23 @@ var Animation = class {
|
||||
this._isPlaying = false;
|
||||
}
|
||||
|
||||
_loadFile(file, width, height) {
|
||||
let [validResourceScale, resourceScale] = this.actor.get_resource_scale();
|
||||
|
||||
this._isLoaded = false;
|
||||
this.actor.destroy_all_children();
|
||||
|
||||
if (!validResourceScale)
|
||||
return;
|
||||
|
||||
let texture_cache = St.TextureCache.get_default();
|
||||
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
||||
this._animations = texture_cache.load_sliced_image(file, width, height,
|
||||
scaleFactor, resourceScale,
|
||||
this._animationsLoaded.bind(this));
|
||||
this.actor.set_child(this._animations);
|
||||
}
|
||||
|
||||
_showFrame(frame) {
|
||||
let oldFrameActor = this._animations.get_child_at_index(this._frame);
|
||||
if (oldFrameActor)
|
||||
@@ -64,15 +87,32 @@ var Animation = class {
|
||||
return GLib.SOURCE_CONTINUE;
|
||||
}
|
||||
|
||||
_syncAnimationSize() {
|
||||
if (!this._isLoaded)
|
||||
return;
|
||||
|
||||
let [width, height] = this.actor.get_size();
|
||||
|
||||
for (let i = 0; i < this._animations.get_n_children(); ++i)
|
||||
this._animations.get_child_at_index(i).set_size(width, height);
|
||||
}
|
||||
|
||||
_animationsLoaded() {
|
||||
this._isLoaded = this._animations.get_n_children() > 0;
|
||||
|
||||
this._syncAnimationSize();
|
||||
|
||||
if (this._isPlaying)
|
||||
this.play();
|
||||
}
|
||||
|
||||
_onDestroy() {
|
||||
this.stop();
|
||||
|
||||
let themeContext = St.ThemeContext.get_for_stage(global.stage);
|
||||
if (this._scaleChangedId)
|
||||
themeContext.disconnect(this._scaleChangedId);
|
||||
this._scaleChangedId = 0;
|
||||
}
|
||||
};
|
||||
|
||||
|
@@ -98,8 +98,8 @@ function clamp(value, min, max) {
|
||||
|
||||
class BaseAppView {
|
||||
constructor(params, gridParams) {
|
||||
if (new.target === BaseAppView)
|
||||
throw new TypeError('Cannot instantiate abstract class ' + new.target.name);
|
||||
if (this.constructor === BaseAppView)
|
||||
throw new TypeError(`Cannot instantiate abstract class ${this.constructor.name}`);
|
||||
|
||||
gridParams = Params.parse(gridParams, { xAlign: St.Align.MIDDLE,
|
||||
columnLimit: MAX_COLUMNS,
|
||||
@@ -414,7 +414,7 @@ var AllView = class AllView extends BaseAppView {
|
||||
this._refilterApps();
|
||||
}
|
||||
|
||||
// Overriden from BaseAppView
|
||||
// Overridden from BaseAppView
|
||||
animate(animationDirection, onComplete) {
|
||||
this._scrollView.reactive = false;
|
||||
let completionFunc = () => {
|
||||
@@ -1017,7 +1017,7 @@ var FolderView = class FolderView extends BaseAppView {
|
||||
Util.ensureActorVisibleInScrollView(this.actor, actor);
|
||||
}
|
||||
|
||||
// Overriden from BaseAppView
|
||||
// Overridden from BaseAppView
|
||||
animate(animationDirection) {
|
||||
this._grid.animatePulse(animationDirection);
|
||||
}
|
||||
@@ -1081,7 +1081,7 @@ var FolderView = class FolderView extends BaseAppView {
|
||||
|
||||
let contentBox = this.actor.get_theme_node().get_content_box(pageBox);
|
||||
// We only can show icons inside the collection view boxPointer
|
||||
// so we have to substract the required padding etc of the boxpointer
|
||||
// so we have to subtract the required padding etc of the boxpointer
|
||||
return [(contentBox.x2 - contentBox.x1) - 2 * this._offsetForEachSide, (contentBox.y2 - contentBox.y1) - 2 * this._offsetForEachSide];
|
||||
}
|
||||
|
||||
@@ -1301,16 +1301,16 @@ var AppFolderPopup = class AppFolderPopup {
|
||||
x_expand: true,
|
||||
x_align: St.Align.START });
|
||||
|
||||
this._boxPointer.actor.style_class = 'app-folder-popup';
|
||||
this.actor.add_actor(this._boxPointer.actor);
|
||||
this._boxPointer.style_class = 'app-folder-popup';
|
||||
this.actor.add_actor(this._boxPointer);
|
||||
this._boxPointer.bin.set_child(this._view.actor);
|
||||
|
||||
this.closeButton = Util.makeCloseButton(this._boxPointer);
|
||||
this.closeButton.connect('clicked', this.popdown.bind(this));
|
||||
this.actor.add_actor(this.closeButton);
|
||||
|
||||
this._boxPointer.actor.bind_property('opacity', this.closeButton, 'opacity',
|
||||
GObject.BindingFlags.SYNC_CREATE);
|
||||
this._boxPointer.bind_property('opacity', this.closeButton, 'opacity',
|
||||
GObject.BindingFlags.SYNC_CREATE);
|
||||
|
||||
global.focus_manager.add_group(this.actor);
|
||||
|
||||
@@ -1479,7 +1479,7 @@ var AppIcon = class AppIcon {
|
||||
this.actor.connect('popup-menu', this._onKeyboardPopupMenu.bind(this));
|
||||
|
||||
this._menu = null;
|
||||
this._menuManager = new PopupMenu.PopupMenuManager(this);
|
||||
this._menuManager = new PopupMenu.PopupMenuManager(this.actor);
|
||||
|
||||
if (isDraggable) {
|
||||
this._draggable = DND.makeDraggable(this.actor);
|
||||
@@ -1707,25 +1707,20 @@ var AppIconMenu = class AppIconMenu extends PopupMenu.PopupMenu {
|
||||
w => !w.skip_taskbar
|
||||
);
|
||||
|
||||
// Display the app windows menu items and the separator between windows
|
||||
// of the current desktop and other windows.
|
||||
let workspaceManager = global.workspace_manager;
|
||||
let activeWorkspace = workspaceManager.get_active_workspace();
|
||||
let separatorShown = windows.length > 0 && windows[0].get_workspace() != activeWorkspace;
|
||||
if (windows.length > 0)
|
||||
this.addMenuItem(
|
||||
/* Translators: This is the heading of a list of open windows */
|
||||
new PopupMenu.PopupSeparatorMenuItem(_("Open Windows"))
|
||||
);
|
||||
|
||||
for (let i = 0; i < windows.length; i++) {
|
||||
let window = windows[i];
|
||||
if (!separatorShown && window.get_workspace() != activeWorkspace) {
|
||||
this._appendSeparator();
|
||||
separatorShown = true;
|
||||
}
|
||||
windows.forEach(window => {
|
||||
let title = window.title ? window.title
|
||||
: this._source.app.get_name();
|
||||
let item = this._appendMenuItem(title);
|
||||
item.connect('activate', () => {
|
||||
this.emit('activate-window', window);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
if (!this._source.app.is_window_backed()) {
|
||||
this._appendSeparator();
|
||||
|
@@ -14,39 +14,47 @@ const RENAMED_DESKTOP_IDS = {
|
||||
'epiphany.desktop': 'org.gnome.Epiphany.desktop',
|
||||
'evolution.desktop': 'org.gnome.Evolution.desktop',
|
||||
'file-roller.desktop': 'org.gnome.FileRoller.desktop',
|
||||
'five-or-more.desktop': 'org.gnome.five-or-more.desktop',
|
||||
'four-in-a-row.desktop': 'org.gnome.Four-in-a-row.desktop',
|
||||
'gcalctool.desktop': 'org.gnome.Calculator.desktop',
|
||||
'geary.desktop': 'org.gnome.Geary.desktop',
|
||||
'gedit.desktop': 'org.gnome.gedit.desktop',
|
||||
'glchess.desktop': 'gnome-chess.desktop',
|
||||
'glines.desktop': 'five-or-more.desktop',
|
||||
'gnect.desktop': 'four-in-a-row.desktop',
|
||||
'glchess.desktop': 'org.gnome.Chess.desktop',
|
||||
'glines.desktop': 'org.gnome.five-or-more.desktop',
|
||||
'gnect.desktop': 'org.gnome.Four-in-a-row.desktop',
|
||||
'gnibbles.desktop': 'org.gnome.Nibbles.desktop',
|
||||
'gnobots2.desktop': 'gnome-robots.desktop',
|
||||
'gnobots2.desktop': 'org.gnome.Robots.desktop',
|
||||
'gnome-boxes.desktop': 'org.gnome.Boxes.desktop',
|
||||
'gnome-calculator.desktop': 'org.gnome.Calculator.desktop',
|
||||
'gnome-chess.desktop': 'org.gnome.Chess.desktop',
|
||||
'gnome-clocks.desktop': 'org.gnome.clocks.desktop',
|
||||
'gnome-contacts.desktop': 'org.gnome.Contacts.desktop',
|
||||
'gnome-documents.desktop': 'org.gnome.Documents.desktop',
|
||||
'gnome-font-viewer.desktop': 'org.gnome.font-viewer.desktop',
|
||||
'gnome-klotski.desktop': 'org.gnome.Klotski.desktop',
|
||||
'gnome-nibbles.desktop': 'org.gnome.Nibbles.desktop',
|
||||
'gnome-mahjongg.desktop': 'org.gnome.Mahjongg.desktop',
|
||||
'gnome-mines.desktop': 'org.gnome.Mines.desktop',
|
||||
'gnome-music.desktop': 'org.gnome.Music.desktop',
|
||||
'gnome-photos.desktop': 'org.gnome.Photos.desktop',
|
||||
'gnome-robots.desktop': 'org.gnome.Robots.desktop',
|
||||
'gnome-screenshot.desktop': 'org.gnome.Screenshot.desktop',
|
||||
'gnome-software.desktop': 'org.gnome.Software.desktop',
|
||||
'gnome-terminal.desktop': 'org.gnome.Terminal.desktop',
|
||||
'gnome-tetravex.desktop': 'org.gnome.Tetravex.desktop',
|
||||
'gnome-tweaks.desktop': 'org.gnome.tweaks.desktop',
|
||||
'gnome-weather.desktop': 'org.gnome.Weather.desktop',
|
||||
'gnomine.desktop': 'gnome-mines.desktop',
|
||||
'gnotravex.desktop': 'gnome-tetravex.desktop',
|
||||
'gnotski.desktop': 'gnome-klotski.desktop',
|
||||
'gtali.desktop': 'tali.desktop',
|
||||
'gnomine.desktop': 'org.gnome.Mines.desktop',
|
||||
'gnotravex.desktop': 'org.gnome.Tetravex.desktop',
|
||||
'gnotski.desktop': 'org.gnome.Klotski.desktop',
|
||||
'gtali.desktop': 'org.gnome.Tali.desktop',
|
||||
'iagno.desktop': 'org.gnome.Reversi.desktop',
|
||||
'nautilus.desktop': 'org.gnome.Nautilus.desktop',
|
||||
'org.gnome.gnome-2048.desktop': 'org.gnome.TwentyFortyEight.desktop',
|
||||
'org.gnome.taquin.desktop': 'org.gnome.Taquin.desktop',
|
||||
'org.gnome.Weather.Application.desktop': 'org.gnome.Weather.desktop',
|
||||
'polari.desktop': 'org.gnome.Polari.desktop',
|
||||
'tali.desktop': 'org.gnome.Tali.desktop',
|
||||
'totem.desktop': 'org.gnome.Totem.desktop',
|
||||
'evince.desktop': 'org.gnome.Evince.desktop',
|
||||
};
|
||||
|
@@ -746,10 +746,8 @@ var BackgroundManager = class BackgroundManager {
|
||||
|
||||
this._container.add_child(backgroundActor);
|
||||
|
||||
let monitor = this._layoutManager.monitors[this._monitorIndex];
|
||||
|
||||
backgroundActor.set_size(monitor.width, monitor.height);
|
||||
if (this._controlPosition) {
|
||||
let monitor = this._layoutManager.monitors[this._monitorIndex];
|
||||
backgroundActor.set_position(monitor.x, monitor.y);
|
||||
backgroundActor.lower_bottom();
|
||||
}
|
||||
|
@@ -25,7 +25,7 @@ var BackgroundMenu = class BackgroundMenu extends PopupMenu.PopupMenu {
|
||||
function addBackgroundMenu(actor, layoutManager) {
|
||||
actor.reactive = true;
|
||||
actor._backgroundMenu = new BackgroundMenu(layoutManager);
|
||||
actor._backgroundManager = new PopupMenu.PopupMenuManager({ actor: actor });
|
||||
actor._backgroundManager = new PopupMenu.PopupMenuManager(actor);
|
||||
actor._backgroundManager.addMenu(actor._backgroundMenu);
|
||||
|
||||
function openMenu(x, y) {
|
||||
|
@@ -121,7 +121,8 @@ var BarLevel = class {
|
||||
cr.lineTo(x, (height - barLevelHeight) / 2);
|
||||
cr.lineTo(x, (height + barLevelHeight) / 2);
|
||||
cr.lineTo(barLevelBorderRadius + barLevelBorderWidth, (height + barLevelHeight) / 2);
|
||||
Clutter.cairo_set_source_color(cr, barLevelActiveColor);
|
||||
if (this._value > 0)
|
||||
Clutter.cairo_set_source_color(cr, barLevelActiveColor);
|
||||
cr.fillPreserve();
|
||||
Clutter.cairo_set_source_color(cr, barLevelActiveBorderColor);
|
||||
cr.setLineWidth(barLevelBorderWidth);
|
||||
@@ -143,17 +144,19 @@ var BarLevel = class {
|
||||
}
|
||||
|
||||
/* end progress bar arc */
|
||||
if (this._value <= this._overdriveStart)
|
||||
Clutter.cairo_set_source_color(cr, barLevelActiveColor);
|
||||
else
|
||||
Clutter.cairo_set_source_color(cr, barLevelOverdriveColor);
|
||||
cr.arc(endX, height / 2, barLevelBorderRadius, TAU * 3 / 4, TAU * 1 / 4);
|
||||
cr.lineTo(Math.floor(endX), (height + barLevelHeight) / 2);
|
||||
cr.lineTo(Math.floor(endX), (height - barLevelHeight) / 2);
|
||||
cr.lineTo(endX, (height - barLevelHeight) / 2);
|
||||
cr.fillPreserve();
|
||||
cr.setLineWidth(barLevelBorderWidth);
|
||||
cr.stroke();
|
||||
if (this._value > 0) {
|
||||
if (this._value <= this._overdriveStart)
|
||||
Clutter.cairo_set_source_color(cr, barLevelActiveColor);
|
||||
else
|
||||
Clutter.cairo_set_source_color(cr, barLevelOverdriveColor);
|
||||
cr.arc(endX, height / 2, barLevelBorderRadius, TAU * 3 / 4, TAU * 1 / 4);
|
||||
cr.lineTo(Math.floor(endX), (height + barLevelHeight) / 2);
|
||||
cr.lineTo(Math.floor(endX), (height - barLevelHeight) / 2);
|
||||
cr.lineTo(endX, (height - barLevelHeight) / 2);
|
||||
cr.fillPreserve();
|
||||
cr.setLineWidth(barLevelBorderWidth);
|
||||
cr.stroke();
|
||||
}
|
||||
|
||||
/* draw overdrive separator */
|
||||
if (overdriveActive) {
|
||||
|
@@ -24,7 +24,7 @@ var POPUP_ANIMATION_TIME = 0.15;
|
||||
* placed. The arrow position may be controlled via
|
||||
* setArrowOrigin(). The arrow side might be temporarily flipped
|
||||
* depending on the box size and source position to keep the box
|
||||
* totally inside the monitor if possible.
|
||||
* totally inside the monitor workarea if possible.
|
||||
*
|
||||
*/
|
||||
var BoxPointer = GObject.registerClass({
|
||||
@@ -33,8 +33,6 @@ var BoxPointer = GObject.registerClass({
|
||||
_init(arrowSide, binProperties) {
|
||||
super._init();
|
||||
|
||||
this.actor = this;
|
||||
|
||||
this.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS);
|
||||
|
||||
this._arrowSide = arrowSide;
|
||||
@@ -47,10 +45,6 @@ var BoxPointer = GObject.registerClass({
|
||||
this._border.connect('repaint', this._drawBorder.bind(this));
|
||||
this.add_actor(this._border);
|
||||
this.bin.raise(this._border);
|
||||
this._xOffset = 0;
|
||||
this._yOffset = 0;
|
||||
this._xPosition = 0;
|
||||
this._yPosition = 0;
|
||||
this._sourceAlignment = 0.5;
|
||||
this._capturedEventId = 0;
|
||||
this._muteInput();
|
||||
@@ -118,23 +112,23 @@ var BoxPointer = GObject.registerClass({
|
||||
if (animate & PopupAnimation.SLIDE) {
|
||||
switch (this._arrowSide) {
|
||||
case St.Side.TOP:
|
||||
this.yOffset = -rise;
|
||||
this.translation_y = -rise;
|
||||
break;
|
||||
case St.Side.BOTTOM:
|
||||
this.yOffset = rise;
|
||||
this.translation_y = rise;
|
||||
break;
|
||||
case St.Side.LEFT:
|
||||
this.xOffset = -rise;
|
||||
this.translation_x = -rise;
|
||||
break;
|
||||
case St.Side.RIGHT:
|
||||
this.xOffset = rise;
|
||||
this.translation_x = rise;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Tweener.addTween(this, { opacity: 255,
|
||||
xOffset: 0,
|
||||
yOffset: 0,
|
||||
translation_x: 0,
|
||||
translation_y: 0,
|
||||
transition: 'linear',
|
||||
onComplete: () => {
|
||||
this._unmuteInput();
|
||||
@@ -148,8 +142,8 @@ var BoxPointer = GObject.registerClass({
|
||||
if (!this.visible)
|
||||
return;
|
||||
|
||||
let xOffset = 0;
|
||||
let yOffset = 0;
|
||||
let translationX = 0;
|
||||
let translationY = 0;
|
||||
let themeNode = this.get_theme_node();
|
||||
let rise = themeNode.get_length('-arrow-rise');
|
||||
let fade = (animate & PopupAnimation.FADE);
|
||||
@@ -158,16 +152,16 @@ var BoxPointer = GObject.registerClass({
|
||||
if (animate & PopupAnimation.SLIDE) {
|
||||
switch (this._arrowSide) {
|
||||
case St.Side.TOP:
|
||||
yOffset = rise;
|
||||
translationY = rise;
|
||||
break;
|
||||
case St.Side.BOTTOM:
|
||||
yOffset = -rise;
|
||||
translationY = -rise;
|
||||
break;
|
||||
case St.Side.LEFT:
|
||||
xOffset = rise;
|
||||
translationX = rise;
|
||||
break;
|
||||
case St.Side.RIGHT:
|
||||
xOffset = -rise;
|
||||
translationX = -rise;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -176,15 +170,15 @@ var BoxPointer = GObject.registerClass({
|
||||
|
||||
Tweener.removeTweens(this);
|
||||
Tweener.addTween(this, { opacity: fade ? 0 : 255,
|
||||
xOffset: xOffset,
|
||||
yOffset: yOffset,
|
||||
translation_x: translationX,
|
||||
translation_y: translationY,
|
||||
transition: 'linear',
|
||||
time: animationTime,
|
||||
onComplete: () => {
|
||||
this.hide();
|
||||
this.opacity = 0;
|
||||
this.xOffset = 0;
|
||||
this.yOffset = 0;
|
||||
this.translation_x = 0;
|
||||
this.translation_y = 0;
|
||||
if (onComplete)
|
||||
onComplete();
|
||||
}
|
||||
@@ -477,11 +471,15 @@ var BoxPointer = GObject.registerClass({
|
||||
_reposition() {
|
||||
let sourceActor = this._sourceActor;
|
||||
let alignment = this._arrowAlignment;
|
||||
let monitorIndex = Main.layoutManager.findIndexForActor(sourceActor);
|
||||
|
||||
this._sourceAllocation = Shell.util_get_transformed_allocation(sourceActor);
|
||||
this._workArea = Main.layoutManager.getWorkAreaForMonitor(monitorIndex);
|
||||
|
||||
// Position correctly relative to the sourceActor
|
||||
let sourceNode = sourceActor.get_theme_node();
|
||||
let sourceContentBox = sourceNode.get_content_box(sourceActor.get_allocation_box());
|
||||
let sourceAllocation = Shell.util_get_transformed_allocation(sourceActor);
|
||||
let sourceAllocation = this._sourceAllocation;
|
||||
let sourceCenterX = sourceAllocation.x1 + sourceContentBox.x1 + (sourceContentBox.x2 - sourceContentBox.x1) * this._sourceAlignment;
|
||||
let sourceCenterY = sourceAllocation.y1 + sourceContentBox.y1 + (sourceContentBox.y2 - sourceContentBox.y1) * this._sourceAlignment;
|
||||
let [minWidth, minHeight, natWidth, natHeight] = this.get_preferred_size();
|
||||
@@ -489,7 +487,7 @@ var BoxPointer = GObject.registerClass({
|
||||
// We also want to keep it onscreen, and separated from the
|
||||
// edge by the same distance as the main part of the box is
|
||||
// separated from its sourceActor
|
||||
let monitor = Main.layoutManager.findMonitorForActor(sourceActor);
|
||||
let workarea = this._workArea;
|
||||
let themeNode = this.get_theme_node();
|
||||
let borderWidth = themeNode.get_length('-arrow-border-width');
|
||||
let arrowBase = themeNode.get_length('-arrow-base');
|
||||
@@ -539,8 +537,8 @@ var BoxPointer = GObject.registerClass({
|
||||
case St.Side.BOTTOM:
|
||||
resX = sourceCenterX - (halfMargin + (natWidth - margin) * alignment);
|
||||
|
||||
resX = Math.max(resX, monitor.x + padding);
|
||||
resX = Math.min(resX, monitor.x + monitor.width - (padding + natWidth));
|
||||
resX = Math.max(resX, workarea.x + padding);
|
||||
resX = Math.min(resX, workarea.x + workarea.width - (padding + natWidth));
|
||||
|
||||
arrowOrigin = sourceCenterX - resX;
|
||||
if (arrowOrigin <= (x1 + (borderRadius + halfBase))) {
|
||||
@@ -558,8 +556,8 @@ var BoxPointer = GObject.registerClass({
|
||||
case St.Side.RIGHT:
|
||||
resY = sourceCenterY - (halfMargin + (natHeight - margin) * alignment);
|
||||
|
||||
resY = Math.max(resY, monitor.y + padding);
|
||||
resY = Math.min(resY, monitor.y + monitor.height - (padding + natHeight));
|
||||
resY = Math.max(resY, workarea.y + padding);
|
||||
resY = Math.min(resY, workarea.y + workarea.height - (padding + natHeight));
|
||||
|
||||
arrowOrigin = sourceCenterY - resY;
|
||||
if (arrowOrigin <= (y1 + (borderRadius + halfBase))) {
|
||||
@@ -583,9 +581,9 @@ var BoxPointer = GObject.registerClass({
|
||||
parent = parent.get_parent();
|
||||
}
|
||||
|
||||
this._xPosition = Math.floor(x);
|
||||
this._yPosition = Math.floor(y);
|
||||
this._shiftActor();
|
||||
// Actually set the position
|
||||
this.x = Math.floor(x);
|
||||
this.y = Math.floor(y);
|
||||
}
|
||||
|
||||
// @origin: Coordinate specifying middle of the arrow, along
|
||||
@@ -608,44 +606,30 @@ var BoxPointer = GObject.registerClass({
|
||||
}
|
||||
}
|
||||
|
||||
_shiftActor() {
|
||||
// Since the position of the BoxPointer depends on the allocated size
|
||||
// of the BoxPointer and the position of the source actor, trying
|
||||
// to position the BoxPointer via the x/y properties will result in
|
||||
// allocation loops and warnings. Instead we do the positioning via
|
||||
// the anchor point, which is independent of allocation, and leave
|
||||
// x == y == 0.
|
||||
this.set_anchor_point(-(this._xPosition + this._xOffset),
|
||||
-(this._yPosition + this._yOffset));
|
||||
}
|
||||
|
||||
_calculateArrowSide(arrowSide) {
|
||||
let sourceAllocation = Shell.util_get_transformed_allocation(this._sourceActor);
|
||||
let sourceAllocation = this._sourceAllocation;
|
||||
let [minWidth, minHeight, boxWidth, boxHeight] = this.get_preferred_size();
|
||||
let monitorActor = this.sourceActor;
|
||||
if (!monitorActor)
|
||||
monitorActor = this;
|
||||
let monitor = Main.layoutManager.findMonitorForActor(monitorActor);
|
||||
let workarea = this._workArea;
|
||||
|
||||
switch (arrowSide) {
|
||||
case St.Side.TOP:
|
||||
if (sourceAllocation.y2 + boxHeight > monitor.y + monitor.height &&
|
||||
boxHeight < sourceAllocation.y1 - monitor.y)
|
||||
if (sourceAllocation.y2 + boxHeight > workarea.y + workarea.height &&
|
||||
boxHeight < sourceAllocation.y1 - workarea.y)
|
||||
return St.Side.BOTTOM;
|
||||
break;
|
||||
case St.Side.BOTTOM:
|
||||
if (sourceAllocation.y1 - boxHeight < monitor.y &&
|
||||
boxHeight < monitor.y + monitor.height - sourceAllocation.y2)
|
||||
if (sourceAllocation.y1 - boxHeight < workarea.y &&
|
||||
boxHeight < workarea.y + workarea.height - sourceAllocation.y2)
|
||||
return St.Side.TOP;
|
||||
break;
|
||||
case St.Side.LEFT:
|
||||
if (sourceAllocation.x2 + boxWidth > monitor.x + monitor.width &&
|
||||
boxWidth < sourceAllocation.x1 - monitor.x)
|
||||
if (sourceAllocation.x2 + boxWidth > workarea.x + workarea.width &&
|
||||
boxWidth < sourceAllocation.x1 - workarea.x)
|
||||
return St.Side.RIGHT;
|
||||
break;
|
||||
case St.Side.RIGHT:
|
||||
if (sourceAllocation.x1 - boxWidth < monitor.x &&
|
||||
boxWidth < monitor.x + monitor.width - sourceAllocation.x2)
|
||||
if (sourceAllocation.x1 - boxWidth < workarea.x &&
|
||||
boxWidth < workarea.x + workarea.width - sourceAllocation.x2)
|
||||
return St.Side.LEFT;
|
||||
break;
|
||||
}
|
||||
@@ -667,24 +651,6 @@ var BoxPointer = GObject.registerClass({
|
||||
}
|
||||
}
|
||||
|
||||
set xOffset(offset) {
|
||||
this._xOffset = offset;
|
||||
this._shiftActor();
|
||||
}
|
||||
|
||||
get xOffset() {
|
||||
return this._xOffset;
|
||||
}
|
||||
|
||||
set yOffset(offset) {
|
||||
this._yOffset = offset;
|
||||
this._shiftActor();
|
||||
}
|
||||
|
||||
get yOffset() {
|
||||
return this._yOffset;
|
||||
}
|
||||
|
||||
updateArrowSide(side) {
|
||||
this._arrowSide = side;
|
||||
this._border.queue_repaint();
|
||||
|
@@ -93,10 +93,10 @@ var AutomountManager = class {
|
||||
if (!this._session.SessionIsActive)
|
||||
return;
|
||||
|
||||
let sound = global.display.get_sound();
|
||||
sound.play_from_theme('device-removed-media',
|
||||
_("External drive disconnected"),
|
||||
null);
|
||||
let player = global.display.get_sound_player();
|
||||
player.play_from_theme('device-removed-media',
|
||||
_("External drive disconnected"),
|
||||
null);
|
||||
}
|
||||
|
||||
_onDriveEjectButton(monitor, drive) {
|
||||
|
@@ -23,20 +23,8 @@ var KeyringDialog = class extends ModalDialog.ModalDialog {
|
||||
this._content = new Dialog.MessageDialogContent({ icon });
|
||||
this.contentLayout.add(this._content);
|
||||
|
||||
// FIXME: Why does this break now?
|
||||
/*
|
||||
this.prompt.bind_property('message', this._content, 'title', GObject.BindingFlags.SYNC_CREATE);
|
||||
this.prompt.bind_property('description', this._content, 'body', GObject.BindingFlags.SYNC_CREATE);
|
||||
*/
|
||||
this.prompt.connect('notify::message', () => {
|
||||
this._content.title = this.prompt.message;
|
||||
});
|
||||
this._content.title = this.prompt.message;
|
||||
|
||||
this.prompt.connect('notify::description', () => {
|
||||
this._content.body = this.prompt.description;
|
||||
});
|
||||
this._content.body = this.prompt.description;
|
||||
|
||||
this._workSpinner = null;
|
||||
this._controlTable = null;
|
||||
|
@@ -401,7 +401,7 @@ var ChatSource = class extends MessageTray.Source {
|
||||
if (this._client.is_handling_channel(this._channel)) {
|
||||
// We are handling the channel, try to pass it to Empathy or Polari
|
||||
// (depending on the channel type)
|
||||
// We don't check if either app is availble - mission control will
|
||||
// We don't check if either app is available - mission control will
|
||||
// fallback to something else if activation fails
|
||||
|
||||
let target;
|
||||
|
@@ -94,7 +94,9 @@ var CtrlAltTabManager = class CtrlAltTabManager {
|
||||
if (app)
|
||||
icon = app.create_icon_texture(POPUP_APPICON_SIZE);
|
||||
else
|
||||
icon = textureCache.bind_cairo_surface_property(windows[i], 'icon');
|
||||
icon = textureCache.bind_cairo_surface_property(windows[i],
|
||||
'icon',
|
||||
POPUP_APPICON_SIZE);
|
||||
}
|
||||
|
||||
items.push({ name: windows[i].title,
|
||||
|
@@ -584,22 +584,18 @@ var Dash = class Dash {
|
||||
let firstButton = iconChildren[0].child;
|
||||
let firstIcon = firstButton._delegate.icon;
|
||||
|
||||
let minHeight, natHeight;
|
||||
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
||||
|
||||
// Enforce the current icon size during the size request
|
||||
// Enforce valid spacings during the size request
|
||||
firstIcon.icon.ensure_style();
|
||||
let [, currentHeight] = firstIcon.icon.get_size();
|
||||
firstIcon.icon.set_height(this.iconSize * scaleFactor);
|
||||
[minHeight, natHeight] = firstButton.get_preferred_height(-1);
|
||||
firstIcon.icon.set_height(currentHeight);
|
||||
let [, iconHeight] = firstIcon.icon.get_preferred_height(-1);
|
||||
let [, buttonHeight] = firstButton.get_preferred_height(-1);
|
||||
|
||||
// Subtract icon padding and box spacing from the available height
|
||||
availHeight -= iconChildren.length * (natHeight - this.iconSize * scaleFactor) +
|
||||
availHeight -= iconChildren.length * (buttonHeight - iconHeight) +
|
||||
(iconChildren.length - 1) * spacing;
|
||||
|
||||
let availSize = availHeight / iconChildren.length;
|
||||
|
||||
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
||||
let iconSizes = baseIconSizes.map(s => s * scaleFactor);
|
||||
|
||||
let newIconSize = baseIconSizes[0];
|
||||
@@ -903,7 +899,7 @@ var Dash = class Dash {
|
||||
favPos++;
|
||||
}
|
||||
|
||||
// No drag placeholder means we don't wan't to favorite the app
|
||||
// No drag placeholder means we don't want to favorite the app
|
||||
// and we are dragging it to its original position
|
||||
if (!this._dragPlaceholder)
|
||||
return true;
|
||||
|
@@ -118,7 +118,7 @@ var WorldClocksSection = class WorldClocksSection {
|
||||
if (!clocks[i].location)
|
||||
continue;
|
||||
let l = world.deserialize(clocks[i].location);
|
||||
if (l)
|
||||
if (l && l.get_timezone() != null)
|
||||
this._locations.push({ location: l });
|
||||
}
|
||||
|
||||
@@ -136,11 +136,12 @@ var WorldClocksSection = class WorldClocksSection {
|
||||
layout.attach(header, 0, 0, 2, 1);
|
||||
this.actor.label_actor = header;
|
||||
|
||||
let localOffset = GLib.DateTime.new_now_local().get_utc_offset();
|
||||
|
||||
for (let i = 0; i < this._locations.length; i++) {
|
||||
let l = this._locations[i].location;
|
||||
|
||||
let name = l.get_level() == GWeather.LocationLevel.NAMED_TIMEZONE ? l.get_name()
|
||||
: l.get_city_name();
|
||||
let name = l.get_city_name() || l.get_name();
|
||||
let label = new St.Label({ style_class: 'world-clocks-city',
|
||||
text: name,
|
||||
x_align: Clutter.ActorAlign.START,
|
||||
@@ -149,7 +150,8 @@ var WorldClocksSection = class WorldClocksSection {
|
||||
|
||||
let time = new St.Label({ style_class: 'world-clocks-time' });
|
||||
|
||||
let offset = l.get_timezone().get_offset() / 60.;
|
||||
let otherOffset = this._getTimeAtLocation(l).get_utc_offset();
|
||||
let offset = (otherOffset - localOffset) / GLib.TIME_SPAN_HOUR;
|
||||
let fmt = (Math.trunc(offset) == offset) ? '%s%.0f' : '%s%.1f';
|
||||
let prefix = (offset >= 0) ? '+' : '-';
|
||||
let tz = new St.Label({ style_class: 'world-clocks-timezone',
|
||||
@@ -182,11 +184,15 @@ var WorldClocksSection = class WorldClocksSection {
|
||||
}
|
||||
}
|
||||
|
||||
_getTimeAtLocation(location) {
|
||||
let tz = GLib.TimeZone.new(location.get_timezone().get_tzid());
|
||||
return GLib.DateTime.new_now(tz);
|
||||
}
|
||||
|
||||
_updateLabels() {
|
||||
for (let i = 0; i < this._locations.length; i++) {
|
||||
let l = this._locations[i];
|
||||
let tz = GLib.TimeZone.new(l.location.get_timezone().get_tzid());
|
||||
let now = GLib.DateTime.new_now(tz);
|
||||
let now = this._getTimeAtLocation(l.location);
|
||||
l.actor.text = Util.formatTime(now, { timeOnly: true });
|
||||
}
|
||||
}
|
||||
@@ -379,6 +385,7 @@ class IndicatorPad extends St.Widget {
|
||||
_init(actor) {
|
||||
this._source = actor;
|
||||
this._source.connect('notify::visible', () => { this.queue_relayout(); });
|
||||
this._source.connect('notify::size', () => { this.queue_relayout(); });
|
||||
super._init();
|
||||
}
|
||||
|
||||
@@ -469,10 +476,9 @@ class DateMenuButton extends PanelMenu.Button {
|
||||
box.add_actor(this._clockDisplay);
|
||||
box.add_actor(this._indicator.actor);
|
||||
|
||||
this.actor.label_actor = this._clockDisplay;
|
||||
this.actor.add_actor(box);
|
||||
this.actor.add_style_class_name ('clock-display');
|
||||
|
||||
this.label_actor = this._clockDisplay;
|
||||
this.add_actor(box);
|
||||
this.add_style_class_name ('clock-display');
|
||||
|
||||
let layout = new FreezableBinLayout();
|
||||
let bin = new St.Widget({ layout_manager: layout });
|
||||
|
@@ -175,10 +175,10 @@ var MessageDialogContent = GObject.registerClass({
|
||||
this[`_${prop}`].add_style_class_name(`message-dialog-${prop}`);
|
||||
});
|
||||
|
||||
let textProps = { ellipsize_mode: Pango.EllipsizeMode.NONE,
|
||||
let textProps = { ellipsize: Pango.EllipsizeMode.NONE,
|
||||
line_wrap: true };
|
||||
Object.assign(this._subtitle.clutter_text, textProps);
|
||||
Object.assign(this._body.clutter_text, textProps);
|
||||
this._subtitle.clutter_text.set(textProps);
|
||||
this._body.clutter_text.set(textProps);
|
||||
|
||||
if (!params.hasOwnProperty('style_class'))
|
||||
params.style_class = 'message-dialog-main-layout';
|
||||
|
16
js/ui/dnd.js
16
js/ui/dnd.js
@@ -125,6 +125,16 @@ var _Draggable = class _Draggable {
|
||||
}
|
||||
|
||||
_onTouchEvent(actor, event) {
|
||||
// We only handle touch events here on wayland. On X11
|
||||
// we do get emulated pointer events, which already works
|
||||
// for single-touch cases. Besides, the X11 passive touch grab
|
||||
// set up by Mutter will make us see first the touch events
|
||||
// and later the pointer events, so it will look like two
|
||||
// unrelated series of events, we want to avoid double handling
|
||||
// in these cases.
|
||||
if (!Meta.is_wayland_compositor())
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
|
||||
if (event.type() != Clutter.EventType.TOUCH_BEGIN ||
|
||||
!global.display.is_pointer_emulating_sequence(event.get_event_sequence()))
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
@@ -296,6 +306,9 @@ var _Draggable = class _Draggable {
|
||||
* for the draggable.
|
||||
*/
|
||||
startDrag(stageX, stageY, time, sequence, device) {
|
||||
if (currentDraggable)
|
||||
return;
|
||||
|
||||
if (device == undefined) {
|
||||
let event = Clutter.get_current_event();
|
||||
|
||||
@@ -437,7 +450,8 @@ var _Draggable = class _Draggable {
|
||||
let [stageX, stageY] = event.get_coords();
|
||||
|
||||
// See if the user has moved the mouse enough to trigger a drag
|
||||
let threshold = St.Settings.get().drag_threshold;
|
||||
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
||||
let threshold = St.Settings.get().drag_threshold * scaleFactor;
|
||||
if (!currentDraggable &&
|
||||
(Math.abs(stageX - this._dragStartX) > threshold ||
|
||||
Math.abs(stageY - this._dragStartY) > threshold)) {
|
||||
|
@@ -96,6 +96,15 @@ function init() {
|
||||
Clutter.Actor.prototype.toString = function() {
|
||||
return St.describe_actor(this);
|
||||
};
|
||||
// Deprecation warning for former JS classes turned into an actor subclass
|
||||
Object.defineProperty(Clutter.Actor.prototype, 'actor', {
|
||||
get() {
|
||||
let klass = this.constructor.name;
|
||||
let { stack } = new Error();
|
||||
log(`Usage of object.actor is deprecated for ${klass}\n${stack}`);
|
||||
return this;
|
||||
}
|
||||
});
|
||||
|
||||
let origToString = Object.prototype.toString;
|
||||
Object.prototype.toString = function() {
|
||||
|
@@ -272,7 +272,7 @@ var CandidatePopup = class CandidatePopup {
|
||||
|
||||
_setDummyCursorGeometry(x, y, w, h) {
|
||||
Main.layoutManager.setDummyCursorGeometry(x, y, w, h);
|
||||
if (this._boxPointer.actor.visible)
|
||||
if (this._boxPointer.visible)
|
||||
this._boxPointer.setPosition(Main.layoutManager.dummyCursor, 0);
|
||||
}
|
||||
|
||||
@@ -285,7 +285,7 @@ var CandidatePopup = class CandidatePopup {
|
||||
if (isVisible) {
|
||||
this._boxPointer.setPosition(Main.layoutManager.dummyCursor, 0);
|
||||
this._boxPointer.open(BoxPointer.PopupAnimation.NONE);
|
||||
this._boxPointer.actor.raise_top();
|
||||
this._boxPointer.raise_top();
|
||||
} else {
|
||||
this._boxPointer.close(BoxPointer.PopupAnimation.NONE);
|
||||
}
|
||||
|
@@ -43,8 +43,6 @@ class BaseIcon extends St.Bin {
|
||||
x_fill: true,
|
||||
y_fill: true });
|
||||
|
||||
this.actor = this;
|
||||
|
||||
this.connect('destroy', this._onDestroy.bind(this));
|
||||
|
||||
this._box = new St.BoxLayout({ vertical: true });
|
||||
@@ -104,6 +102,7 @@ class BaseIcon extends St.Bin {
|
||||
}
|
||||
|
||||
vfunc_style_changed() {
|
||||
super.vfunc_style_changed();
|
||||
let node = this.get_theme_node();
|
||||
|
||||
let size;
|
||||
@@ -187,8 +186,6 @@ var IconGrid = GObject.registerClass({
|
||||
super._init({ style_class: 'icon-grid',
|
||||
y_align: Clutter.ActorAlign.START });
|
||||
|
||||
this.actor = this;
|
||||
|
||||
params = Params.parse(params, { rowLimit: null,
|
||||
columnLimit: null,
|
||||
minRows: 1,
|
||||
@@ -843,7 +840,7 @@ var PaginatedIconGrid = GObject.registerClass({
|
||||
}
|
||||
}
|
||||
|
||||
// Overriden from IconGrid
|
||||
// Overridden from IconGrid
|
||||
_getChildrenToAnimate() {
|
||||
let children = this._getVisibleChildren();
|
||||
let firstIndex = this._childrenPerPage * this.currentPage;
|
||||
|
@@ -1,11 +1,16 @@
|
||||
const { Clutter, Gio, GObject, Gtk, Meta, Shell } = imports.gi;
|
||||
const { Clutter, Gio, GLib, GObject, Gtk, Meta, Shell } = imports.gi;
|
||||
|
||||
const Dialog = imports.ui.dialog;
|
||||
const ModalDialog = imports.ui.modalDialog;
|
||||
const PermissionStore = imports.misc.permissionStore;
|
||||
|
||||
const WAYLAND_KEYBINDINGS_SCHEMA = 'org.gnome.mutter.wayland.keybindings';
|
||||
|
||||
const APP_WHITELIST = ['gnome-control-center.desktop'];
|
||||
const APP_PERMISSIONS_TABLE = 'gnome';
|
||||
const APP_PERMISSIONS_ID = 'shortcuts-inhibitor';
|
||||
const GRANTED = 'GRANTED';
|
||||
const DENIED = 'DENIED';
|
||||
|
||||
var DialogResponse = Meta.InhibitShortcutsDialogResponse;
|
||||
|
||||
@@ -43,6 +48,29 @@ var InhibitShortcutsDialog = GObject.registerClass({
|
||||
Gtk.accelerator_parse(accel));
|
||||
}
|
||||
|
||||
_shouldUsePermStore() {
|
||||
return this._app && !this._app.is_window_backed();
|
||||
}
|
||||
|
||||
_saveToPermissionStore(grant) {
|
||||
if (!this._shouldUsePermStore() || this._permStore == null)
|
||||
return;
|
||||
|
||||
let permissions = {};
|
||||
permissions[this._app.get_id()] = [grant];
|
||||
let data = GLib.Variant.new('av', {});
|
||||
|
||||
this._permStore.SetRemote(APP_PERMISSIONS_TABLE,
|
||||
true,
|
||||
APP_PERMISSIONS_ID,
|
||||
permissions,
|
||||
data,
|
||||
(result, error) => {
|
||||
if (error != null)
|
||||
log(error.message);
|
||||
});
|
||||
}
|
||||
|
||||
_buildLayout() {
|
||||
let name = this._app ? this._app.get_name() : this._window.title;
|
||||
|
||||
@@ -64,12 +92,14 @@ var InhibitShortcutsDialog = GObject.registerClass({
|
||||
|
||||
this._dialog.addButton({ label: _("Deny"),
|
||||
action: () => {
|
||||
this._saveToPermissionStore(DENIED);
|
||||
this._emitResponse(DialogResponse.DENY);
|
||||
},
|
||||
key: Clutter.KEY_Escape });
|
||||
|
||||
this._dialog.addButton({ label: _("Allow"),
|
||||
action: () => {
|
||||
this._saveToPermissionStore(GRANTED);
|
||||
this._emitResponse(DialogResponse.ALLOW);
|
||||
},
|
||||
default: true });
|
||||
@@ -81,10 +111,43 @@ var InhibitShortcutsDialog = GObject.registerClass({
|
||||
}
|
||||
|
||||
vfunc_show() {
|
||||
if (this._app && APP_WHITELIST.indexOf(this._app.get_id()) != -1)
|
||||
if (this._app && APP_WHITELIST.indexOf(this._app.get_id()) != -1) {
|
||||
this._emitResponse(DialogResponse.ALLOW);
|
||||
else
|
||||
return;
|
||||
}
|
||||
|
||||
if (!this._shouldUsePermStore()) {
|
||||
this._dialog.open();
|
||||
return;
|
||||
}
|
||||
|
||||
/* Check with the permission store */
|
||||
let appId = this._app.get_id();
|
||||
this._permStore = new PermissionStore.PermissionStore((proxy, error) => {
|
||||
if (error) {
|
||||
log(error.message);
|
||||
this._dialog.open();
|
||||
return;
|
||||
}
|
||||
|
||||
this._permStore.LookupRemote(APP_PERMISSIONS_TABLE,
|
||||
APP_PERMISSIONS_ID,
|
||||
(res, error) => {
|
||||
if (error) {
|
||||
this._dialog.open();
|
||||
log(error.message);
|
||||
return;
|
||||
}
|
||||
|
||||
let [permissions, data] = res;
|
||||
if (permissions[appId] === undefined) // Not found
|
||||
this._dialog.open();
|
||||
else if (permissions[appId] == GRANTED)
|
||||
this._emitResponse(DialogResponse.ALLOW);
|
||||
else
|
||||
this._emitResponse(DialogResponse.DENY);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
vfunc_hide() {
|
||||
|
@@ -73,12 +73,9 @@ class AspectContainer extends St.Widget {
|
||||
box.x1 += Math.floor(diff / 2);
|
||||
box.x2 -= Math.ceil(diff / 2);
|
||||
} else {
|
||||
/* Restrict vertically */
|
||||
/* Restrict vertically, align to bottom */
|
||||
let height = box.get_width() / this._ratio;
|
||||
let diff = box.get_height() - height;
|
||||
|
||||
box.y1 += Math.floor(diff / 2);
|
||||
box.y2 -= Math.floor(diff / 2);
|
||||
box.y1 = box.y2 - Math.floor(height);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -285,11 +282,11 @@ var Key = class Key {
|
||||
y_fill: true,
|
||||
x_align: St.Align.START });
|
||||
this._boxPointer.hide();
|
||||
Main.layoutManager.addChrome(this._boxPointer.actor);
|
||||
Main.layoutManager.addChrome(this._boxPointer);
|
||||
this._boxPointer.setPosition(this.keyButton, 0.5);
|
||||
|
||||
// Adds style to existing keyboard style to avoid repetition
|
||||
this._boxPointer.actor.add_style_class_name('keyboard-subkeys');
|
||||
this._boxPointer.add_style_class_name('keyboard-subkeys');
|
||||
this._getExtendedKeys();
|
||||
this.keyButton._extended_keys = this._extended_keyboard;
|
||||
}
|
||||
@@ -884,7 +881,7 @@ var EmojiSelection = class EmojiSelection {
|
||||
this._pageIndicator.setReactive(false);
|
||||
|
||||
let bottomRow = this._createBottomRow();
|
||||
this.actor.add(bottomRow, { x_fill: true, y_fill: false });
|
||||
this.actor.add(bottomRow, { expand: true, x_fill: false, y_fill: false });
|
||||
|
||||
this._emojiPager.setCurrentPage(0);
|
||||
}
|
||||
@@ -973,7 +970,16 @@ var EmojiSelection = class EmojiSelection {
|
||||
row.appendKey(key.actor);
|
||||
row.layoutButtons();
|
||||
|
||||
return row;
|
||||
let actor = new AspectContainer({ layout_manager: new Clutter.BinLayout(),
|
||||
x_expand: true, y_expand: true });
|
||||
actor.add_child(row);
|
||||
/* Regular keyboard layouts are 11.5×4 grids, optimize for that
|
||||
* at the moment. Ideally this should be as wide as the current
|
||||
* keymap.
|
||||
*/
|
||||
actor.setRatio(11.5, 1);
|
||||
|
||||
return actor;
|
||||
}
|
||||
};
|
||||
Signals.addSignalMethods(EmojiSelection.prototype);
|
||||
@@ -1043,7 +1049,7 @@ var Keyboard = class Keyboard {
|
||||
this._a11yApplicationsSettings.connect('changed', this._syncEnabled.bind(this));
|
||||
this._lastDeviceId = null;
|
||||
this._suggestions = null;
|
||||
this._emojiKeyVisible = true;
|
||||
this._emojiKeyVisible = Meta.is_wayland_compositor();
|
||||
|
||||
this._focusTracker = new FocusTracker();
|
||||
this._focusTracker.connect('position-changed', this._onFocusPositionChanged.bind(this));
|
||||
@@ -1138,6 +1144,7 @@ var Keyboard = class Keyboard {
|
||||
this._keyboardController.disconnect(this._keypadVisibleId);
|
||||
if (this._focusNotifyId)
|
||||
global.stage.disconnect(this._focusNotifyId);
|
||||
this._clearShowIdle();
|
||||
this._keyboard = null;
|
||||
this.actor.destroy();
|
||||
this.actor = null;
|
||||
@@ -1156,7 +1163,7 @@ var Keyboard = class Keyboard {
|
||||
this._keyboardController = new KeyboardController();
|
||||
|
||||
this._groups = {};
|
||||
this._current_page = null;
|
||||
this._currentPage = null;
|
||||
|
||||
this._suggestions = new Suggestions();
|
||||
this.actor.add(this._suggestions.actor,
|
||||
@@ -1196,10 +1203,12 @@ var Keyboard = class Keyboard {
|
||||
this._keyboardNotifyId = this._keyboardController.connect('active-group', this._onGroupChanged.bind(this));
|
||||
this._keyboardGroupsChangedId = this._keyboardController.connect('groups-changed', this._onKeyboardGroupsChanged.bind(this));
|
||||
this._keyboardStateId = this._keyboardController.connect('panel-state', this._onKeyboardStateChanged.bind(this));
|
||||
this._emojiKeyVisibleId = this._keyboardController.connect('emoji-visible', this._onEmojiKeyVisible.bind(this));
|
||||
this._keypadVisibleId = this._keyboardController.connect('keypad-visible', this._onKeypadVisible.bind(this));
|
||||
this._focusNotifyId = global.stage.connect('notify::key-focus', this._onKeyFocusChanged.bind(this));
|
||||
|
||||
if (Meta.is_wayland_compositor())
|
||||
this._emojiKeyVisibleId = this._keyboardController.connect('emoji-visible', this._onEmojiKeyVisible.bind(this));
|
||||
|
||||
this._relayout();
|
||||
}
|
||||
|
||||
@@ -1221,6 +1230,7 @@ var Keyboard = class Keyboard {
|
||||
if (!this._showIdleId) {
|
||||
this._showIdleId = GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => {
|
||||
this.show(Main.layoutManager.focusIndex);
|
||||
this._showIdleId = 0;
|
||||
return GLib.SOURCE_REMOVE;
|
||||
});
|
||||
GLib.Source.set_name_by_id(this._showIdleId, '[gnome-shell] this.show');
|
||||
@@ -1347,7 +1357,7 @@ var Keyboard = class Keyboard {
|
||||
} else if (switchToLevel == 1) {
|
||||
extraButton.connect('long-press', () => {
|
||||
this._latched = true;
|
||||
this._setCurrentLevelLatched(this._current_page, this._latched);
|
||||
this._setCurrentLevelLatched(this._currentPage, this._latched);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1374,8 +1384,8 @@ var Keyboard = class Keyboard {
|
||||
}
|
||||
|
||||
_updateCurrentPageVisible() {
|
||||
if (this._current_page)
|
||||
this._current_page.visible = !this._emojiActive && !this._keypadVisible;
|
||||
if (this._currentPage)
|
||||
this._currentPage.visible = !this._emojiActive && !this._keypadVisible;
|
||||
}
|
||||
|
||||
_setEmojiActive(active) {
|
||||
@@ -1434,7 +1444,7 @@ var Keyboard = class Keyboard {
|
||||
|
||||
_getGridSlots() {
|
||||
let numOfHorizSlots = 0, numOfVertSlots;
|
||||
let rows = this._current_page.get_children();
|
||||
let rows = this._currentPage.get_children();
|
||||
numOfVertSlots = rows.length;
|
||||
|
||||
for (let i = 0; i < rows.length; ++i) {
|
||||
@@ -1464,7 +1474,12 @@ var Keyboard = class Keyboard {
|
||||
}
|
||||
|
||||
_onKeyboardGroupsChanged(keyboard) {
|
||||
this._groups = [];
|
||||
let nonGroupActors = [this._emojiSelection.actor, this._keypad.actor];
|
||||
this._aspectContainer.get_children().filter(c => !nonGroupActors.includes(c)).forEach(c => {
|
||||
c.destroy();
|
||||
});
|
||||
|
||||
this._groups = {};
|
||||
this._onGroupChanged();
|
||||
}
|
||||
|
||||
@@ -1506,13 +1521,24 @@ var Keyboard = class Keyboard {
|
||||
_setActiveLayer(activeLevel) {
|
||||
let activeGroupName = this._keyboardController.getCurrentGroup();
|
||||
let layers = this._groups[activeGroupName];
|
||||
let currentPage = layers[activeLevel];
|
||||
|
||||
if (this._current_page != null) {
|
||||
this._setCurrentLevelLatched(this._current_page, false);
|
||||
this._current_page.hide();
|
||||
if (this._currentPage == currentPage) {
|
||||
this._updateCurrentPageVisible();
|
||||
return;
|
||||
}
|
||||
|
||||
this._current_page = layers[activeLevel];
|
||||
if (this._currentPage != null) {
|
||||
this._setCurrentLevelLatched(this._currentPage, false);
|
||||
this._currentPage.disconnect(this._currentPage._destroyID);
|
||||
this._currentPage.hide();
|
||||
delete this._currentPage._destroyID;
|
||||
}
|
||||
|
||||
this._currentPage = currentPage;
|
||||
this._currentPage._destroyID = this._currentPage.connect('destroy', () => {
|
||||
this._currentPage = null;
|
||||
});
|
||||
this._updateCurrentPageVisible();
|
||||
}
|
||||
|
||||
@@ -1600,18 +1626,6 @@ var Keyboard = class Keyboard {
|
||||
this.setCursorLocation(null);
|
||||
}
|
||||
|
||||
_hideSubkeys() {
|
||||
if (this._subkeysBoxPointer) {
|
||||
this._subkeysBoxPointer.hide(BoxPointer.PopupAnimation.FULL);
|
||||
this._subkeysBoxPointer = null;
|
||||
}
|
||||
if (this._capturedEventId) {
|
||||
this.actor.disconnect(this._capturedEventId);
|
||||
this._capturedEventId = 0;
|
||||
}
|
||||
this._capturedPress = false;
|
||||
}
|
||||
|
||||
resetSuggestions() {
|
||||
if (this._suggestions)
|
||||
this._suggestions.clear();
|
||||
|
@@ -146,12 +146,13 @@ var MonitorConstraint = GObject.registerClass({
|
||||
});
|
||||
|
||||
var Monitor = class Monitor {
|
||||
constructor(index, geometry) {
|
||||
constructor(index, geometry, geometry_scale) {
|
||||
this.index = index;
|
||||
this.x = geometry.x;
|
||||
this.y = geometry.y;
|
||||
this.width = geometry.width;
|
||||
this.height = geometry.height;
|
||||
this.geometry_scale = geometry_scale;
|
||||
}
|
||||
|
||||
get inFullscreen() {
|
||||
@@ -159,6 +160,19 @@ var Monitor = class Monitor {
|
||||
}
|
||||
};
|
||||
|
||||
const UiActor = GObject.registerClass(
|
||||
class UiActor extends St.Widget {
|
||||
vfunc_get_preferred_width (forHeight) {
|
||||
let width = global.stage.width;
|
||||
return [width, width];
|
||||
}
|
||||
|
||||
vfunc_get_preferred_height (forWidth) {
|
||||
let height = global.stage.height;
|
||||
return [height, height];
|
||||
}
|
||||
});
|
||||
|
||||
const defaultParams = {
|
||||
trackFullscreen: false,
|
||||
affectsStruts: false,
|
||||
@@ -199,17 +213,20 @@ var LayoutManager = GObject.registerClass({
|
||||
global.stage.no_clear_hint = true;
|
||||
|
||||
// Set up stage hierarchy to group all UI actors under one container.
|
||||
this.uiGroup = new St.Widget({ name: 'uiGroup' });
|
||||
this.uiGroup = new UiActor({ name: 'uiGroup' });
|
||||
this.uiGroup.set_flags(Clutter.ActorFlags.NO_LAYOUT);
|
||||
this.uiGroup.add_constraint(new Clutter.BindConstraint({
|
||||
source: global.stage,
|
||||
coordinate: Clutter.BindCoordinate.ALL,
|
||||
}));
|
||||
|
||||
global.stage.add_child(this.uiGroup);
|
||||
|
||||
global.stage.remove_actor(global.window_group);
|
||||
this.uiGroup.add_actor(global.window_group);
|
||||
|
||||
global.stage.add_child(this.uiGroup);
|
||||
// Using addChrome() to add actors to uiGroup will position actors
|
||||
// underneath the top_window_group.
|
||||
// To insert actors at the top of uiGroup, we use addTopChrome() or
|
||||
// add the actor directly using uiGroup.add_actor().
|
||||
global.stage.remove_actor(global.top_window_group);
|
||||
this.uiGroup.add_actor(global.top_window_group);
|
||||
|
||||
this.overviewGroup = new St.Widget({ name: 'overviewGroup',
|
||||
visible: false,
|
||||
@@ -221,7 +238,7 @@ var LayoutManager = GObject.registerClass({
|
||||
clip_to_allocation: true,
|
||||
layout_manager: new Clutter.BinLayout(),
|
||||
});
|
||||
this.addChrome(this.screenShieldGroup);
|
||||
this.addTopChrome(this.screenShieldGroup);
|
||||
|
||||
this.panelBox = new St.BoxLayout({ name: 'panelBox',
|
||||
vertical: true });
|
||||
@@ -237,17 +254,14 @@ var LayoutManager = GObject.registerClass({
|
||||
this.keyboardBox = new St.BoxLayout({ name: 'keyboardBox',
|
||||
reactive: true,
|
||||
track_hover: true });
|
||||
this.addChrome(this.keyboardBox);
|
||||
this.addTopChrome(this.keyboardBox);
|
||||
this._keyboardHeightNotifyId = 0;
|
||||
|
||||
// A dummy actor that tracks the mouse or text cursor, based on the
|
||||
// position and size set in setDummyCursorGeometry.
|
||||
this.dummyCursor = new St.Widget({ width: 0, height: 0, visible: false });
|
||||
this.dummyCursor = new St.Widget({ width: 0, height: 0, opacity: 0 });
|
||||
this.uiGroup.add_actor(this.dummyCursor);
|
||||
|
||||
global.stage.remove_actor(global.top_window_group);
|
||||
this.uiGroup.add_actor(global.top_window_group);
|
||||
|
||||
let feedbackGroup = Meta.get_feedback_group_for_display(global.display);
|
||||
global.stage.remove_actor(feedbackGroup);
|
||||
this.uiGroup.add_actor(feedbackGroup);
|
||||
@@ -318,7 +332,9 @@ var LayoutManager = GObject.registerClass({
|
||||
this.monitors = [];
|
||||
let nMonitors = display.get_n_monitors();
|
||||
for (let i = 0; i < nMonitors; i++)
|
||||
this.monitors.push(new Monitor(i, display.get_monitor_geometry(i)));
|
||||
this.monitors.push(new Monitor(i,
|
||||
display.get_monitor_geometry(i),
|
||||
display.get_monitor_scale(i)));
|
||||
|
||||
if (nMonitors == 0) {
|
||||
this.primaryIndex = this.bottomIndex = -1;
|
||||
@@ -790,6 +806,16 @@ var LayoutManager = GObject.registerClass({
|
||||
this._trackActor(actor, params);
|
||||
}
|
||||
|
||||
// addTopChrome:
|
||||
// @actor: an actor to add to the chrome
|
||||
// @params: (optional) additional params
|
||||
//
|
||||
// Like addChrome(), but adds @actor above all windows, including popups.
|
||||
addTopChrome(actor, params) {
|
||||
this.uiGroup.add_actor(actor);
|
||||
this._trackActor(actor, params);
|
||||
}
|
||||
|
||||
// trackChrome:
|
||||
// @actor: a descendant of the chrome to begin tracking
|
||||
// @params: parameters describing how to track @actor
|
||||
|
@@ -382,6 +382,7 @@ var ObjInspector = class ObjInspector {
|
||||
}
|
||||
|
||||
button = new St.Button({ style_class: 'window-close' });
|
||||
button.add_actor(new St.Icon({ icon_name: 'window-close-symbolic' }));
|
||||
button.connect('clicked', this.close.bind(this));
|
||||
hbox.add(button);
|
||||
if (typeof(obj) == typeof({})) {
|
||||
|
@@ -1,6 +1,6 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
|
||||
const { Atspi, Clutter, Cogl, GDesktopEnums,
|
||||
const { Atspi, Clutter, GDesktopEnums,
|
||||
Gio, GLib, GObject, Meta, Shell, St } = imports.gi;
|
||||
const Mainloop = imports.mainloop;
|
||||
const Signals = imports.signals;
|
||||
@@ -18,9 +18,6 @@ var NO_CHANGE = 0.0;
|
||||
var POINTER_REST_TIME = 1000; // milliseconds
|
||||
|
||||
// Settings
|
||||
const APPLICATIONS_SCHEMA = 'org.gnome.desktop.a11y.applications';
|
||||
const SHOW_KEY = 'screen-magnifier-enabled';
|
||||
|
||||
const MAGNIFIER_SCHEMA = 'org.gnome.desktop.a11y.magnifier';
|
||||
const SCREEN_POSITION_KEY = 'screen-position';
|
||||
const MAG_FACTOR_KEY = 'mag-factor';
|
||||
@@ -56,22 +53,19 @@ var MouseSpriteContent = GObject.registerClass({
|
||||
|
||||
vfunc_get_preferred_size() {
|
||||
if (!this._texture)
|
||||
return [0, 0];
|
||||
return [false, 0, 0];
|
||||
|
||||
return [this._texture.get_width(), this._texture.get_height()];
|
||||
return [true, this._texture.get_width(), this._texture.get_height()];
|
||||
}
|
||||
|
||||
vfunc_paint_content(actor, node) {
|
||||
if (!this._texture)
|
||||
return;
|
||||
|
||||
let color = new Cogl.Color();
|
||||
color.init_from_4ub(0, 0, 0, 0);
|
||||
|
||||
let color = Clutter.Color.get_static(Clutter.StaticColor.WHITE);
|
||||
let [minFilter, magFilter] = actor.get_content_scaling_filters();
|
||||
let textureNode = new Clutter.TextureNode(this._texture,
|
||||
color,
|
||||
Clutter.ScalingFilter.NEAREST,
|
||||
Clutter.ScalingFilter.NEAREST);
|
||||
color, minFilter, magFilter);
|
||||
textureNode.set_name('MouseSpriteContent');
|
||||
node.add_child(textureNode);
|
||||
|
||||
@@ -86,8 +80,14 @@ var MouseSpriteContent = GObject.registerClass({
|
||||
if (this._texture == coglTexture)
|
||||
return;
|
||||
|
||||
let oldTexture = this._texture;
|
||||
this._texture = coglTexture;
|
||||
this.invalidate();
|
||||
|
||||
if (!oldTexture || !coglTexture ||
|
||||
oldTexture.get_width() != coglTexture.get_width() ||
|
||||
oldTexture.get_height() != coglTexture.get_height())
|
||||
this.invalidate_size();
|
||||
}
|
||||
});
|
||||
|
||||
@@ -102,7 +102,6 @@ var Magnifier = class Magnifier {
|
||||
|
||||
this._mouseSprite = new Clutter.Actor({ request_mode: Clutter.RequestMode.CONTENT_SIZE });
|
||||
this._mouseSprite.content = new MouseSpriteContent();
|
||||
this._updateSpriteTexture();
|
||||
|
||||
this._cursorRoot = new Clutter.Actor();
|
||||
this._cursorRoot.add_actor(this._mouseSprite);
|
||||
@@ -115,14 +114,16 @@ var Magnifier = class Magnifier {
|
||||
|
||||
let aZoomRegion = new ZoomRegion(this, this._cursorRoot);
|
||||
this._zoomRegions.push(aZoomRegion);
|
||||
let showAtLaunch = this._settingsInit(aZoomRegion);
|
||||
this._settingsInit(aZoomRegion);
|
||||
aZoomRegion.scrollContentsTo(this.xMouse, this.yMouse);
|
||||
|
||||
cursorTracker.connect('cursor-changed', this._updateMouseSprite.bind(this));
|
||||
St.Settings.get().connect('notify::magnifier-active', () => {
|
||||
this.setActive(St.Settings.get().magnifier_active);
|
||||
});
|
||||
|
||||
// Export to dbus.
|
||||
magDBusService = new MagnifierDBus.ShellMagnifier();
|
||||
this.setActive(showAtLaunch);
|
||||
this.setActive(St.Settings.get().magnifier_active);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -155,9 +156,15 @@ var Magnifier = class Magnifier {
|
||||
|
||||
if (isActive != activate) {
|
||||
if (activate) {
|
||||
this._updateMouseSprite();
|
||||
this._cursorSpriteChangedId =
|
||||
this._cursorTracker.connect('cursor-changed',
|
||||
this._updateMouseSprite.bind(this));
|
||||
Meta.disable_unredirect_for_display(global.display);
|
||||
this.startTrackingMouse();
|
||||
} else {
|
||||
this._cursorTracker.disconnect(this._cursorSpriteChangedId);
|
||||
this._mouseSprite.content.texture = null;
|
||||
Meta.enable_unredirect_for_display(global.display);
|
||||
this.stopTrackingMouse();
|
||||
}
|
||||
@@ -495,13 +502,8 @@ var Magnifier = class Magnifier {
|
||||
}
|
||||
|
||||
_settingsInit(zoomRegion) {
|
||||
this._appSettings = new Gio.Settings({ schema_id: APPLICATIONS_SCHEMA });
|
||||
this._settings = new Gio.Settings({ schema_id: MAGNIFIER_SCHEMA });
|
||||
|
||||
this._appSettings.connect('changed::' + SHOW_KEY, () => {
|
||||
this.setActive(this._appSettings.get_boolean(SHOW_KEY));
|
||||
});
|
||||
|
||||
this._settings.connect('changed::' + SCREEN_POSITION_KEY,
|
||||
this._updateScreenPosition.bind(this));
|
||||
this._settings.connect('changed::' + MAG_FACTOR_KEY,
|
||||
@@ -608,8 +610,6 @@ var Magnifier = class Magnifier {
|
||||
let showCrosshairs = this._settings.get_boolean(SHOW_CROSS_HAIRS_KEY);
|
||||
this.addCrosshairs();
|
||||
this.setCrosshairsVisible(showCrosshairs);
|
||||
|
||||
return this._appSettings.get_boolean(SHOW_KEY);
|
||||
}
|
||||
|
||||
_updateScreenPosition() {
|
||||
@@ -756,13 +756,41 @@ var ZoomRegion = class ZoomRegion {
|
||||
|
||||
this._pointerIdleMonitor = Meta.IdleMonitor.get_for_device(Meta.VIRTUAL_CORE_POINTER_ID);
|
||||
this._scrollContentsTimerId = 0;
|
||||
}
|
||||
|
||||
Main.layoutManager.connect('monitors-changed',
|
||||
this._monitorsChanged.bind(this));
|
||||
this._focusCaretTracker.connect('caret-moved',
|
||||
this._updateCaret.bind(this));
|
||||
this._focusCaretTracker.connect('focus-changed',
|
||||
this._updateFocus.bind(this));
|
||||
_connectSignals() {
|
||||
if (this._signalConnections)
|
||||
return;
|
||||
|
||||
this._signalConnections = [];
|
||||
let id = Main.layoutManager.connect('monitors-changed',
|
||||
this._monitorsChanged.bind(this));
|
||||
this._signalConnections.push([Main.layoutManager, id]);
|
||||
|
||||
id = this._focusCaretTracker.connect('caret-moved', this._updateCaret.bind(this));
|
||||
this._signalConnections.push([this._focusCaretTracker, id]);
|
||||
|
||||
id = this._focusCaretTracker.connect('focus-changed', this._updateFocus.bind(this));
|
||||
this._signalConnections.push([this._focusCaretTracker, id]);
|
||||
}
|
||||
|
||||
_disconnectSignals() {
|
||||
for (let [obj, id] of this._signalConnections)
|
||||
obj.disconnect(id);
|
||||
|
||||
delete this._signalConnections;
|
||||
}
|
||||
|
||||
_updateScreenPosition() {
|
||||
if (this._screenPosition == GDesktopEnums.MagnifierScreenPosition.NONE)
|
||||
this._setViewPort({
|
||||
x: this._viewPortX,
|
||||
y: this._viewPortY,
|
||||
width: this._viewPortWidth,
|
||||
height: this._viewPortHeight
|
||||
});
|
||||
else
|
||||
this.setScreenPosition(this._screenPosition);
|
||||
}
|
||||
|
||||
_updateFocus(caller, event) {
|
||||
@@ -810,10 +838,13 @@ var ZoomRegion = class ZoomRegion {
|
||||
this._createActors();
|
||||
if (this._isMouseOverRegion())
|
||||
this._magnifier.hideSystemCursor();
|
||||
this._updateScreenPosition();
|
||||
this._updateMagViewGeometry();
|
||||
this._updateCloneGeometry();
|
||||
this._updateMousePosition();
|
||||
this._connectSignals();
|
||||
} else {
|
||||
this._disconnectSignals();
|
||||
this._destroyActors();
|
||||
}
|
||||
|
||||
@@ -1241,7 +1272,7 @@ var ZoomRegion = class ZoomRegion {
|
||||
|
||||
/**
|
||||
* getContrast:
|
||||
* Retreive the contrast of the magnified view.
|
||||
* Retrieve the contrast of the magnified view.
|
||||
* @return Object containing the contrast for the red, green,
|
||||
* and blue channels.
|
||||
*/
|
||||
@@ -1563,18 +1594,8 @@ var ZoomRegion = class ZoomRegion {
|
||||
}
|
||||
|
||||
_monitorsChanged() {
|
||||
if (!this.isActive())
|
||||
return;
|
||||
|
||||
this._background.set_size(global.screen_width, global.screen_height);
|
||||
|
||||
if (this._screenPosition == GDesktopEnums.MagnifierScreenPosition.NONE)
|
||||
this._setViewPort({ x: this._viewPortX,
|
||||
y: this._viewPortY,
|
||||
width: this._viewPortWidth,
|
||||
height: this._viewPortHeight });
|
||||
else
|
||||
this.setScreenPosition(this._screenPosition);
|
||||
this._updateScreenPosition();
|
||||
}
|
||||
};
|
||||
|
||||
|
@@ -211,13 +211,6 @@ function _initializeUI() {
|
||||
|
||||
_startDate = new Date();
|
||||
|
||||
let perfModuleName = GLib.getenv("SHELL_PERF_MODULE");
|
||||
if (perfModuleName) {
|
||||
let perfOutput = GLib.getenv("SHELL_PERF_OUTPUT");
|
||||
let module = eval('imports.perf.' + perfModuleName + ';');
|
||||
Scripting.runPerfScript(module, perfOutput);
|
||||
}
|
||||
|
||||
ExtensionDownloader.init();
|
||||
ExtensionSystem.init();
|
||||
|
||||
@@ -239,6 +232,13 @@ function _initializeUI() {
|
||||
Shell.Global.log_structured('GNOME Shell started at ' + _startDate,
|
||||
['MESSAGE_ID=' + GNOMESHELL_STARTED_MESSAGE_ID]);
|
||||
}
|
||||
|
||||
let perfModuleName = GLib.getenv("SHELL_PERF_MODULE");
|
||||
if (perfModuleName) {
|
||||
let perfOutput = GLib.getenv("SHELL_PERF_OUTPUT");
|
||||
let module = eval('imports.perf.' + perfModuleName + ';');
|
||||
Scripting.runPerfScript(module, perfOutput);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -636,7 +636,7 @@ function _queueBeforeRedraw(workId) {
|
||||
* initialization as well, under the assumption that new actors
|
||||
* will need it.
|
||||
*
|
||||
* Returns: A string work identifer
|
||||
* Returns: A string work identifier
|
||||
*/
|
||||
function initializeDeferredWork(actor, callback, props) {
|
||||
// Turn into a string so we can use as an object property
|
||||
|
@@ -584,7 +584,6 @@ class SourceActor extends St.Widget {
|
||||
this._source = source;
|
||||
this._size = size;
|
||||
|
||||
this.actor = this;
|
||||
this.connect('destroy', () => {
|
||||
this._source.disconnect(this._iconUpdatedId);
|
||||
this._actorDestroyed = true;
|
||||
@@ -708,6 +707,12 @@ var Source = class Source {
|
||||
return this._policy;
|
||||
}
|
||||
|
||||
set policy(policy) {
|
||||
if (this._policy)
|
||||
this._policy.destroy();
|
||||
this._policy = policy;
|
||||
}
|
||||
|
||||
get count() {
|
||||
return this.notifications.length;
|
||||
}
|
||||
|
@@ -224,10 +224,10 @@ var ModalDialog = class {
|
||||
// can be dismissed by a close call.
|
||||
//
|
||||
// The main point of this method is to give some indication to the user
|
||||
// that the dialog reponse has been acknowledged but will take a few
|
||||
// that the dialog response has been acknowledged but will take a few
|
||||
// moments before being processed.
|
||||
// e.g., if a user clicked "Log Out" then the dialog should go away
|
||||
// imediately, but the lightbox should remain until the logout is
|
||||
// immediately, but the lightbox should remain until the logout is
|
||||
// complete.
|
||||
_fadeOutDialog(timestamp) {
|
||||
if (this.state == State.CLOSED || this.state == State.CLOSING)
|
||||
|
@@ -95,28 +95,6 @@ var OsdMonitorLabeler = class {
|
||||
|
||||
this._reset();
|
||||
|
||||
for (let id in params) {
|
||||
let monitor = this._monitorManager.get_monitor_for_output(id);
|
||||
if (monitor == -1)
|
||||
continue;
|
||||
this._monitorLabels.get(monitor).push(params[id].deep_unpack());
|
||||
}
|
||||
|
||||
// In mirrored display setups, more than one physical outputs
|
||||
// might be showing the same logical monitor. In that case, we
|
||||
// join each output's labels on the same OSD widget.
|
||||
for (let [monitor, labels] of this._monitorLabels.entries()) {
|
||||
labels.sort();
|
||||
this._osdLabels.push(new OsdMonitorLabel(monitor, labels.join(' ')));
|
||||
}
|
||||
}
|
||||
|
||||
show2(client, params) {
|
||||
if (!this._trackClient(client))
|
||||
return;
|
||||
|
||||
this._reset();
|
||||
|
||||
for (let connector in params) {
|
||||
let monitor = this._monitorManager.get_monitor_for_connector(connector);
|
||||
if (monitor == -1)
|
||||
|
@@ -369,17 +369,15 @@ class DashSpacer extends St.Widget {
|
||||
}
|
||||
|
||||
vfunc_get_preferred_width(forHeight) {
|
||||
let box = this.get_allocation_box();
|
||||
let minWidth = super.vfunc_get_preferred_width(forHeight)[0];
|
||||
let natWidth = box.x2 - box.x1;
|
||||
return [minWidth, natWidth];
|
||||
if (this._bindConstraint)
|
||||
return this._bindConstraint.source.get_preferred_width(forHeight);
|
||||
return super.vfunc_get_preferred_width(forHeight);
|
||||
}
|
||||
|
||||
vfunc_get_preferred_height(forWidth) {
|
||||
let box = this.get_allocation_box();
|
||||
let minHeight = super.vfunc_get_preferred_height(forWidth)[0];
|
||||
let natHeight = box.y2 - box.y1;
|
||||
return [minHeight, natHeight];
|
||||
if (this._bindConstraint)
|
||||
return this._bindConstraint.source.get_preferred_height(forWidth);
|
||||
return super.vfunc_get_preferred_height(forWidth);
|
||||
}
|
||||
});
|
||||
|
||||
|
@@ -374,12 +374,12 @@ var PadDiagram = GObject.registerClass({
|
||||
svgData += this._cssString();
|
||||
svgData += this._wrappingSvgFooter();
|
||||
|
||||
let handle = new Rsvg.Handle();
|
||||
handle.set_base_uri(GLib.path_get_dirname(this._imagePath));
|
||||
handle.write(svgData);
|
||||
handle.close();
|
||||
let istream = new Gio.MemoryInputStream();
|
||||
istream.add_bytes(new GLib.Bytes(svgData));
|
||||
|
||||
return handle;
|
||||
return Rsvg.Handle.new_from_stream_sync(istream,
|
||||
Gio.File.new_for_path(this._imagePath),
|
||||
0, null);
|
||||
}
|
||||
|
||||
_updateDiagramScale() {
|
||||
|
118
js/ui/panel.js
118
js/ui/panel.js
@@ -1,6 +1,6 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
|
||||
const { Atk, Clutter, Gio, GLib, GObject, Gtk, Meta, Shell, St } = imports.gi;
|
||||
const { Atk, Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi;
|
||||
const Cairo = imports.cairo;
|
||||
const Mainloop = imports.mainloop;
|
||||
|
||||
@@ -75,6 +75,9 @@ class AppMenu extends PopupMenu.PopupMenu {
|
||||
|
||||
this._windowsChangedId = 0;
|
||||
|
||||
/* Translators: This is the heading of a list of open windows */
|
||||
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem(_("Open Windows")));
|
||||
|
||||
this._windowSection = new PopupMenu.PopupMenuSection();
|
||||
this.addMenuItem(this._windowSection);
|
||||
|
||||
@@ -105,14 +108,21 @@ class AppMenu extends PopupMenu.PopupMenu {
|
||||
});
|
||||
});
|
||||
|
||||
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||
|
||||
this.addAction(_("Quit"), () => {
|
||||
this._app.request_quit();
|
||||
});
|
||||
|
||||
this._appSystem.connect('installed-changed', () => {
|
||||
let sw = this._appSystem.lookup_app('org.gnome.Software.desktop');
|
||||
this._detailsItem.actor.visible = (sw != null);
|
||||
this._updateDetailsVisibility();
|
||||
});
|
||||
this._updateDetailsVisibility();
|
||||
}
|
||||
|
||||
_updateDetailsVisibility() {
|
||||
let sw = this._appSystem.lookup_app('org.gnome.Software.desktop');
|
||||
this._detailsItem.visible = (sw != null);
|
||||
}
|
||||
|
||||
isEmpty() {
|
||||
@@ -150,7 +160,7 @@ class AppMenu extends PopupMenu.PopupMenu {
|
||||
});
|
||||
});
|
||||
|
||||
this._newWindowItem.actor.visible =
|
||||
this._newWindowItem.visible =
|
||||
app && app.can_open_new_window() && !actions.includes('new-window');
|
||||
}
|
||||
|
||||
@@ -167,13 +177,6 @@ class AppMenu extends PopupMenu.PopupMenu {
|
||||
Main.activateWindow(window, event.get_time());
|
||||
});
|
||||
});
|
||||
|
||||
// Add separator between windows of the current desktop and other windows.
|
||||
let workspaceManager = global.workspace_manager;
|
||||
let activeWorkspace = workspaceManager.get_active_workspace();
|
||||
let pos = windows.findIndex(w => w.get_workspace() != activeWorkspace);
|
||||
if (pos >= 0)
|
||||
this._windowSection.addMenuItem(new PopupMenu.PopupSeparatorMenuItem(), pos);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -191,21 +194,20 @@ var AppMenuButton = GObject.registerClass({
|
||||
_init(panel) {
|
||||
super._init(0.0, null, true);
|
||||
|
||||
this.actor.accessible_role = Atk.Role.MENU;
|
||||
this.accessible_role = Atk.Role.MENU;
|
||||
|
||||
this._startingApps = [];
|
||||
|
||||
this._menuManager = panel.menuManager;
|
||||
this._gtkSettings = Gtk.Settings.get_default();
|
||||
this._targetApp = null;
|
||||
this._busyNotifyId = 0;
|
||||
|
||||
let bin = new St.Bin({ name: 'appMenu' });
|
||||
bin.connect('style-changed', this._onStyleChanged.bind(this));
|
||||
this.actor.add_actor(bin);
|
||||
this.add_actor(bin);
|
||||
|
||||
this.actor.bind_property("reactive", this.actor, "can-focus", 0);
|
||||
this.actor.reactive = false;
|
||||
this.bind_property("reactive", this, "can-focus", 0);
|
||||
this.reactive = false;
|
||||
|
||||
this._container = new St.BoxLayout({ style_class: 'panel-status-menu-box' });
|
||||
bin.set_child(this._container);
|
||||
@@ -261,10 +263,10 @@ var AppMenuButton = GObject.registerClass({
|
||||
return;
|
||||
|
||||
this._visible = true;
|
||||
this.actor.reactive = true;
|
||||
this.reactive = true;
|
||||
this.show();
|
||||
Tweener.removeTweens(this.actor);
|
||||
Tweener.addTween(this.actor,
|
||||
Tweener.removeTweens(this);
|
||||
Tweener.addTween(this,
|
||||
{ opacity: 255,
|
||||
time: Overview.ANIMATION_TIME,
|
||||
transition: 'easeOutQuad' });
|
||||
@@ -275,9 +277,9 @@ var AppMenuButton = GObject.registerClass({
|
||||
return;
|
||||
|
||||
this._visible = false;
|
||||
this.actor.reactive = false;
|
||||
Tweener.removeTweens(this.actor);
|
||||
Tweener.addTween(this.actor,
|
||||
this.reactive = false;
|
||||
Tweener.removeTweens(this);
|
||||
Tweener.addTween(this,
|
||||
{ opacity: 0,
|
||||
time: Overview.ANIMATION_TIME,
|
||||
transition: 'easeOutQuad',
|
||||
@@ -400,7 +402,7 @@ var AppMenuButton = GObject.registerClass({
|
||||
if (this._targetApp) {
|
||||
this._busyNotifyId = this._targetApp.connect('notify::busy', this._sync.bind(this));
|
||||
this._label.set_text(this._targetApp.get_name());
|
||||
this.actor.set_accessible_name(this._targetApp.get_name());
|
||||
this.set_accessible_name(this._targetApp.get_name());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -418,7 +420,7 @@ var AppMenuButton = GObject.registerClass({
|
||||
else
|
||||
this.stopAnimation();
|
||||
|
||||
this.actor.reactive = (visible && !isBusy);
|
||||
this.reactive = (visible && !isBusy);
|
||||
|
||||
this._syncIcon();
|
||||
this.menu.setApp(this._targetApp);
|
||||
@@ -457,28 +459,28 @@ var ActivitiesButton = GObject.registerClass(
|
||||
class ActivitiesButton extends PanelMenu.Button {
|
||||
_init() {
|
||||
super._init(0.0, null, true);
|
||||
this.actor.accessible_role = Atk.Role.TOGGLE_BUTTON;
|
||||
this.accessible_role = Atk.Role.TOGGLE_BUTTON;
|
||||
|
||||
this.actor.name = 'panelActivities';
|
||||
this.name = 'panelActivities';
|
||||
|
||||
/* Translators: If there is no suitable word for "Activities"
|
||||
in your language, you can use the word for "Overview". */
|
||||
this._label = new St.Label({ text: _("Activities"),
|
||||
y_align: Clutter.ActorAlign.CENTER });
|
||||
this.actor.add_actor(this._label);
|
||||
this.add_actor(this._label);
|
||||
|
||||
this.actor.label_actor = this._label;
|
||||
this.label_actor = this._label;
|
||||
|
||||
this.actor.connect('captured-event', this._onCapturedEvent.bind(this));
|
||||
this.actor.connect_after('key-release-event', this._onKeyRelease.bind(this));
|
||||
this.connect('captured-event', this._onCapturedEvent.bind(this));
|
||||
this.connect_after('key-release-event', this._onKeyRelease.bind(this));
|
||||
|
||||
Main.overview.connect('showing', () => {
|
||||
this.actor.add_style_pseudo_class('overview');
|
||||
this.actor.add_accessible_state (Atk.StateType.CHECKED);
|
||||
this.add_style_pseudo_class('overview');
|
||||
this.add_accessible_state (Atk.StateType.CHECKED);
|
||||
});
|
||||
Main.overview.connect('hiding', () => {
|
||||
this.actor.remove_style_pseudo_class('overview');
|
||||
this.actor.remove_accessible_state (Atk.StateType.CHECKED);
|
||||
this.remove_style_pseudo_class('overview');
|
||||
this.remove_accessible_state (Atk.StateType.CHECKED);
|
||||
});
|
||||
|
||||
this._xdndTimeOut = 0;
|
||||
@@ -531,7 +533,7 @@ class ActivitiesButton extends PanelMenu.Button {
|
||||
let [x, y, mask] = global.get_pointer();
|
||||
let pickedActor = global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, x, y);
|
||||
|
||||
if (pickedActor == this.actor && Main.overview.shouldToggleByCornerOrButton())
|
||||
if (pickedActor == this && Main.overview.shouldToggleByCornerOrButton())
|
||||
Main.overview.toggle();
|
||||
|
||||
Mainloop.source_remove(this._xdndTimeOut);
|
||||
@@ -729,7 +731,7 @@ class AggregateLayout extends Clutter.BoxLayout {
|
||||
let child = this._sizeChildren[i];
|
||||
let [childMin, childNat] = child.get_preferred_width(forHeight);
|
||||
minWidth = Math.max(minWidth, childMin);
|
||||
natWidth = Math.max(minWidth, childNat);
|
||||
natWidth = Math.max(natWidth, childNat);
|
||||
}
|
||||
return [minWidth, natWidth];
|
||||
}
|
||||
@@ -745,7 +747,7 @@ class AggregateMenu extends PanelMenu.Button {
|
||||
this.menu.box.set_layout_manager(menuLayout);
|
||||
|
||||
this._indicators = new St.BoxLayout({ style_class: 'panel-status-indicators-box' });
|
||||
this.actor.add_child(this._indicators);
|
||||
this.add_child(this._indicators);
|
||||
|
||||
if (Config.HAVE_NETWORKMANAGER) {
|
||||
this._network = new imports.ui.status.network.NMApplet();
|
||||
@@ -804,6 +806,7 @@ class AggregateMenu extends PanelMenu.Button {
|
||||
menuLayout.addSizeChild(this._location.menu.actor);
|
||||
menuLayout.addSizeChild(this._rfkill.menu.actor);
|
||||
menuLayout.addSizeChild(this._power.menu.actor);
|
||||
menuLayout.addSizeChild(this._system.buttonGroup);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -822,9 +825,6 @@ class Panel extends St.Widget {
|
||||
super._init({ name: 'panel',
|
||||
reactive: true });
|
||||
|
||||
// For compatibility with extensions that still use the
|
||||
// this.actor field
|
||||
this.actor = this;
|
||||
this.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS);
|
||||
|
||||
this._sessionStyle = null;
|
||||
@@ -877,7 +877,7 @@ class Panel extends St.Widget {
|
||||
}
|
||||
|
||||
vfunc_allocate(box, flags) {
|
||||
super.vfunc_allocate(box, flags);
|
||||
this.set_allocation(box, flags);
|
||||
|
||||
let allocWidth = box.x2 - box.x1;
|
||||
let allocHeight = box.y2 - box.y1;
|
||||
@@ -971,22 +971,11 @@ class Panel extends St.Widget {
|
||||
if (isPress && button != 1)
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
|
||||
let focusWindow = global.display.focus_window;
|
||||
if (!focusWindow)
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
|
||||
let dragWindow = focusWindow.is_attached_dialog() ? focusWindow.get_transient_for()
|
||||
: focusWindow;
|
||||
if (!dragWindow)
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
|
||||
let rect = dragWindow.get_frame_rect();
|
||||
let [stageX, stageY] = event.get_coords();
|
||||
|
||||
let allowDrag = dragWindow.maximized_vertically &&
|
||||
stageX > rect.x && stageX < rect.x + rect.width;
|
||||
let dragWindow = this._getDraggableWindowForPosition(stageX);
|
||||
|
||||
if (!allowDrag)
|
||||
if (!dragWindow)
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
|
||||
global.display.begin_grab_op(dragWindow,
|
||||
@@ -1016,7 +1005,7 @@ class Panel extends St.Widget {
|
||||
return; // menu not supported by current session mode
|
||||
|
||||
let menu = indicator.menu;
|
||||
if (!indicator.actor.reactive)
|
||||
if (!indicator.reactive)
|
||||
return;
|
||||
|
||||
menu.toggle();
|
||||
@@ -1038,7 +1027,7 @@ class Panel extends St.Widget {
|
||||
return;
|
||||
|
||||
let menu = indicator.menu;
|
||||
if (!indicator.actor.reactive)
|
||||
if (!indicator.reactive)
|
||||
return;
|
||||
|
||||
menu.close();
|
||||
@@ -1196,4 +1185,21 @@ class Panel extends St.Widget {
|
||||
Main.messageTray.bannerBlocked = isOpen;
|
||||
});
|
||||
}
|
||||
|
||||
_getDraggableWindowForPosition(stageX) {
|
||||
let workspaceManager = global.workspace_manager;
|
||||
let workspace = workspaceManager.get_active_workspace()
|
||||
let allWindowsByStacking = global.display.sort_windows_by_stacking(
|
||||
workspace.list_windows()
|
||||
).reverse();
|
||||
|
||||
return allWindowsByStacking.find(metaWindow => {
|
||||
let rect = metaWindow.get_frame_rect();
|
||||
return metaWindow.is_on_primary_monitor() &&
|
||||
metaWindow.showing_on_its_workspace() &&
|
||||
metaWindow.get_window_type() != Meta.WindowType.DESKTOP &&
|
||||
metaWindow.maximized_vertically &&
|
||||
stageX > rect.x && stageX < rect.x + rect.width
|
||||
});
|
||||
}
|
||||
});
|
||||
|
@@ -14,12 +14,11 @@ class ButtonBox extends St.Widget {
|
||||
|
||||
super._init(params);
|
||||
|
||||
this.actor = this;
|
||||
this._delegate = this;
|
||||
|
||||
this.container = new St.Bin({ y_fill: true,
|
||||
x_fill: true,
|
||||
child: this.actor });
|
||||
child: this });
|
||||
|
||||
this.connect('style-changed', this._onStyleChanged.bind(this));
|
||||
this.connect('destroy', this._onDestroy.bind(this));
|
||||
@@ -105,9 +104,9 @@ var Button = GObject.registerClass({
|
||||
this.connect('notify::visible', this._onVisibilityChanged.bind(this));
|
||||
|
||||
if (dontCreateMenu)
|
||||
this.menu = new PopupMenu.PopupDummyMenu(this.actor);
|
||||
this.menu = new PopupMenu.PopupDummyMenu(this);
|
||||
else
|
||||
this.setMenu(new PopupMenu.PopupMenu(this.actor, menuAlignment, St.Side.TOP, 0));
|
||||
this.setMenu(new PopupMenu.PopupMenu(this, menuAlignment, St.Side.TOP, 0));
|
||||
}
|
||||
|
||||
setSensitive(sensitive) {
|
||||
@@ -145,7 +144,7 @@ var Button = GObject.registerClass({
|
||||
if (!this.menu)
|
||||
return;
|
||||
|
||||
if (!this.actor.visible)
|
||||
if (!this.visible)
|
||||
this.menu.close();
|
||||
}
|
||||
|
||||
@@ -155,10 +154,10 @@ var Button = GObject.registerClass({
|
||||
|
||||
let symbol = event.get_key_symbol();
|
||||
if (symbol == Clutter.KEY_Left || symbol == Clutter.KEY_Right) {
|
||||
let group = global.focus_manager.get_group(this.actor);
|
||||
let group = global.focus_manager.get_group(this);
|
||||
if (group) {
|
||||
let direction = (symbol == Clutter.KEY_Left) ? St.DirectionType.LEFT : St.DirectionType.RIGHT;
|
||||
group.navigate_focus(this.actor, direction, false);
|
||||
group.navigate_focus(this, direction, false);
|
||||
return Clutter.EVENT_STOP;
|
||||
}
|
||||
}
|
||||
@@ -167,9 +166,9 @@ var Button = GObject.registerClass({
|
||||
|
||||
_onOpenStateChanged(menu, open) {
|
||||
if (open)
|
||||
this.actor.add_style_pseudo_class('active');
|
||||
this.add_style_pseudo_class('active');
|
||||
else
|
||||
this.actor.remove_style_pseudo_class('active');
|
||||
this.remove_style_pseudo_class('active');
|
||||
|
||||
// Setting the max-height won't do any good if the minimum height of the
|
||||
// menu is higher then the screen; it's useful if part of the menu is
|
||||
|
@@ -51,49 +51,64 @@ function arrowIcon(side) {
|
||||
return arrow;
|
||||
}
|
||||
|
||||
var PopupBaseMenuItem = class {
|
||||
constructor(params) {
|
||||
var PopupBaseMenuItem = GObject.registerClass({
|
||||
Properties: {
|
||||
'active': GObject.ParamSpec.boolean('active', 'active', 'active',
|
||||
GObject.ParamFlags.READWRITE,
|
||||
GObject.TYPE_BOOLEAN,
|
||||
false),
|
||||
'sensitive': GObject.ParamSpec.boolean('sensitive', 'sensitive', 'sensitive',
|
||||
GObject.ParamFlags.READWRITE,
|
||||
GObject.TYPE_BOOLEAN,
|
||||
true),
|
||||
},
|
||||
Signals: {
|
||||
'activate': { param_types: [Clutter.Event.$gtype] },
|
||||
}
|
||||
}, class PopupBaseMenuItem extends St.BoxLayout {
|
||||
_init(params) {
|
||||
params = Params.parse (params, { reactive: true,
|
||||
activate: true,
|
||||
hover: true,
|
||||
style_class: null,
|
||||
can_focus: true
|
||||
});
|
||||
|
||||
this.actor = new St.BoxLayout({ style_class: 'popup-menu-item',
|
||||
reactive: params.reactive,
|
||||
track_hover: params.reactive,
|
||||
can_focus: params.can_focus,
|
||||
accessible_role: Atk.Role.MENU_ITEM });
|
||||
this.actor._delegate = this;
|
||||
super._init({ style_class: 'popup-menu-item',
|
||||
reactive: params.reactive,
|
||||
track_hover: params.reactive,
|
||||
can_focus: params.can_focus,
|
||||
accessible_role: Atk.Role.MENU_ITEM });
|
||||
this._delegate = this;
|
||||
|
||||
this._ornament = Ornament.NONE;
|
||||
this._ornamentLabel = new St.Label({ style_class: 'popup-menu-ornament' });
|
||||
this.actor.add(this._ornamentLabel);
|
||||
this.add(this._ornamentLabel);
|
||||
|
||||
this._parent = null;
|
||||
this.active = false;
|
||||
this._active = false;
|
||||
this._activatable = params.reactive && params.activate;
|
||||
this._sensitive = true;
|
||||
|
||||
if (!this._activatable)
|
||||
this.actor.add_style_class_name('popup-inactive-menu-item');
|
||||
this.add_style_class_name('popup-inactive-menu-item');
|
||||
|
||||
if (params.style_class)
|
||||
this.actor.add_style_class_name(params.style_class);
|
||||
this.add_style_class_name(params.style_class);
|
||||
|
||||
if (this._activatable) {
|
||||
this.actor.connect('button-press-event', this._onButtonPressEvent.bind(this));
|
||||
this.actor.connect('button-release-event', this._onButtonReleaseEvent.bind(this));
|
||||
this.actor.connect('touch-event', this._onTouchEvent.bind(this));
|
||||
this.actor.connect('key-press-event', this._onKeyPressEvent.bind(this));
|
||||
this.connect('button-press-event', this._onButtonPressEvent.bind(this));
|
||||
this.connect('button-release-event', this._onButtonReleaseEvent.bind(this));
|
||||
this.connect('touch-event', this._onTouchEvent.bind(this));
|
||||
this.connect('key-press-event', this._onKeyPressEvent.bind(this));
|
||||
}
|
||||
if (params.reactive && params.hover)
|
||||
this.actor.connect('notify::hover', this._onHoverChanged.bind(this));
|
||||
this.bind_property('hover', this, 'active', GObject.BindingFlags.SYNC_CREATE);
|
||||
}
|
||||
|
||||
this.actor.connect('key-focus-in', this._onKeyFocusIn.bind(this));
|
||||
this.actor.connect('key-focus-out', this._onKeyFocusOut.bind(this));
|
||||
this.actor.connect('destroy', this._onDestroy.bind(this));
|
||||
get actor() {
|
||||
/* This is kept for compatibility with current implementation, and we
|
||||
don't want to warn here yet since PopupMenu depends on this */
|
||||
return this;
|
||||
}
|
||||
|
||||
_getTopMenu() {
|
||||
@@ -109,24 +124,24 @@ var PopupBaseMenuItem = class {
|
||||
|
||||
_onButtonPressEvent(actor, event) {
|
||||
// This is the CSS active state
|
||||
this.actor.add_style_pseudo_class ('active');
|
||||
this.add_style_pseudo_class('active');
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
}
|
||||
|
||||
_onButtonReleaseEvent(actor, event) {
|
||||
this.actor.remove_style_pseudo_class ('active');
|
||||
this.remove_style_pseudo_class('active');
|
||||
this.activate(event);
|
||||
return Clutter.EVENT_STOP;
|
||||
}
|
||||
|
||||
_onTouchEvent(actor, event) {
|
||||
if (event.type() == Clutter.EventType.TOUCH_END) {
|
||||
this.actor.remove_style_pseudo_class ('active');
|
||||
this.remove_style_pseudo_class('active');
|
||||
this.activate(event);
|
||||
return Clutter.EVENT_STOP;
|
||||
} else if (event.type() == Clutter.EventType.TOUCH_BEGIN) {
|
||||
// This is the CSS active state
|
||||
this.actor.add_style_pseudo_class ('active');
|
||||
this.add_style_pseudo_class('active');
|
||||
}
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
}
|
||||
@@ -151,54 +166,56 @@ var PopupBaseMenuItem = class {
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
}
|
||||
|
||||
_onKeyFocusIn(actor) {
|
||||
this.setActive(true);
|
||||
vfunc_key_focus_in() {
|
||||
super.vfunc_key_focus_in();
|
||||
this.active = true;
|
||||
}
|
||||
|
||||
_onKeyFocusOut(actor) {
|
||||
this.setActive(false);
|
||||
}
|
||||
|
||||
_onHoverChanged(actor) {
|
||||
this.setActive(actor.hover);
|
||||
vfunc_key_focus_out() {
|
||||
super.vfunc_key_focus_out();
|
||||
this.active = false;
|
||||
}
|
||||
|
||||
activate(event) {
|
||||
this.emit('activate', event);
|
||||
}
|
||||
|
||||
setActive(active) {
|
||||
get active() {
|
||||
return this._active;
|
||||
}
|
||||
|
||||
set active(active) {
|
||||
let activeChanged = active != this.active;
|
||||
if (activeChanged) {
|
||||
this.active = active;
|
||||
this._active = active;
|
||||
if (active) {
|
||||
this.actor.add_style_class_name('selected');
|
||||
if (this.actor.can_focus)
|
||||
this.actor.grab_key_focus();
|
||||
this.add_style_class_name('selected');
|
||||
if (this.can_focus)
|
||||
this.grab_key_focus();
|
||||
} else {
|
||||
this.actor.remove_style_class_name('selected');
|
||||
this.remove_style_class_name('selected');
|
||||
// Remove the CSS active state if the user press the button and
|
||||
// while holding moves to another menu item, so we don't paint all items.
|
||||
// The correct behaviour would be to set the new item with the CSS
|
||||
// active state as well, but button-press-event is not trigered,
|
||||
// so we should track it in our own, which would involve some work
|
||||
// in the container
|
||||
this.actor.remove_style_pseudo_class ('active');
|
||||
this.remove_style_pseudo_class('active');
|
||||
}
|
||||
this.emit('active-changed', active);
|
||||
this.notify('active');
|
||||
}
|
||||
}
|
||||
|
||||
syncSensitive() {
|
||||
let sensitive = this.getSensitive();
|
||||
this.actor.reactive = sensitive;
|
||||
this.actor.can_focus = sensitive;
|
||||
this.emit('sensitive-changed');
|
||||
let sensitive = this.sensitive;
|
||||
this.reactive = sensitive;
|
||||
this.can_focus = sensitive;
|
||||
this.notify('sensitive');
|
||||
return sensitive;
|
||||
}
|
||||
|
||||
getSensitive() {
|
||||
let parentSensitive = this._parent ? this._parent.getSensitive() : true;
|
||||
let parentSensitive = this._parent ? this._parent.sensitive : true;
|
||||
return this._activatable && this._sensitive && parentSensitive;
|
||||
}
|
||||
|
||||
@@ -210,12 +227,12 @@ var PopupBaseMenuItem = class {
|
||||
this.syncSensitive();
|
||||
}
|
||||
|
||||
destroy() {
|
||||
this.actor.destroy();
|
||||
get sensitive() {
|
||||
return this.getSensitive();
|
||||
}
|
||||
|
||||
_onDestroy() {
|
||||
this.emit('destroy');
|
||||
set sensitive(sensitive) {
|
||||
this.setSensitive(sensitive);
|
||||
}
|
||||
|
||||
setOrnament(ornament) {
|
||||
@@ -226,36 +243,38 @@ var PopupBaseMenuItem = class {
|
||||
|
||||
if (ornament == Ornament.DOT) {
|
||||
this._ornamentLabel.text = '\u2022';
|
||||
this.actor.add_accessible_state(Atk.StateType.CHECKED);
|
||||
this.add_accessible_state(Atk.StateType.CHECKED);
|
||||
} else if (ornament == Ornament.CHECK) {
|
||||
this._ornamentLabel.text = '\u2713';
|
||||
this.actor.add_accessible_state(Atk.StateType.CHECKED);
|
||||
this.add_accessible_state(Atk.StateType.CHECKED);
|
||||
} else if (ornament == Ornament.NONE) {
|
||||
this._ornamentLabel.text = '';
|
||||
this.actor.remove_accessible_state(Atk.StateType.CHECKED);
|
||||
this.remove_accessible_state(Atk.StateType.CHECKED);
|
||||
}
|
||||
}
|
||||
};
|
||||
Signals.addSignalMethods(PopupBaseMenuItem.prototype);
|
||||
});
|
||||
|
||||
var PopupMenuItem = class extends PopupBaseMenuItem {
|
||||
constructor(text, params) {
|
||||
super(params);
|
||||
var PopupMenuItem = GObject.registerClass(
|
||||
class PopupMenuItem extends PopupBaseMenuItem {
|
||||
_init(text, params) {
|
||||
super._init(params);
|
||||
|
||||
this.label = new St.Label({ text: text });
|
||||
this.actor.add_child(this.label);
|
||||
this.actor.label_actor = this.label
|
||||
this.add_child(this.label);
|
||||
this.label_actor = this.label
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
var PopupSeparatorMenuItem = class extends PopupBaseMenuItem {
|
||||
constructor(text) {
|
||||
super({ reactive: false,
|
||||
can_focus: false});
|
||||
|
||||
var PopupSeparatorMenuItem = GObject.registerClass(
|
||||
class PopupSeparatorMenuItem extends PopupBaseMenuItem {
|
||||
_init(text) {
|
||||
super._init({ reactive: false,
|
||||
can_focus: false });
|
||||
|
||||
this.label = new St.Label({ text: text || '' });
|
||||
this.actor.add(this.label);
|
||||
this.actor.label_actor = this.label;
|
||||
this.add(this.label);
|
||||
this.label_actor = this.label;
|
||||
|
||||
this.label.connect('notify::text',
|
||||
this._syncVisibility.bind(this));
|
||||
@@ -264,81 +283,78 @@ var PopupSeparatorMenuItem = class extends PopupBaseMenuItem {
|
||||
this._separator = new St.Widget({ style_class: 'popup-separator-menu-item',
|
||||
y_expand: true,
|
||||
y_align: Clutter.ActorAlign.CENTER });
|
||||
this.actor.add(this._separator, { expand: true });
|
||||
this.add(this._separator, { expand: true });
|
||||
}
|
||||
|
||||
_syncVisibility() {
|
||||
this.label.visible = this.label.text != '';
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
var Switch = class {
|
||||
constructor(state) {
|
||||
this.actor = new St.Bin({ style_class: 'toggle-switch',
|
||||
accessible_role: Atk.Role.CHECK_BOX,
|
||||
can_focus: true });
|
||||
// Translators: this MUST be either "toggle-switch-us"
|
||||
// (for toggle switches containing the English words
|
||||
// "ON" and "OFF") or "toggle-switch-intl" (for toggle
|
||||
// switches containing "◯" and "|"). Other values will
|
||||
// simply result in invisible toggle switches.
|
||||
this.actor.add_style_class_name(_("toggle-switch-us"));
|
||||
var Switch = GObject.registerClass(
|
||||
class Switch extends St.Bin {
|
||||
_init(state) {
|
||||
super._init({ style_class: 'toggle-switch',
|
||||
accessible_role: Atk.Role.CHECK_BOX,
|
||||
can_focus: true });
|
||||
this.setToggleState(state);
|
||||
}
|
||||
|
||||
setToggleState(state) {
|
||||
if (state)
|
||||
this.actor.add_style_pseudo_class('checked');
|
||||
this.add_style_pseudo_class('checked');
|
||||
else
|
||||
this.actor.remove_style_pseudo_class('checked');
|
||||
this.remove_style_pseudo_class('checked');
|
||||
this.state = state;
|
||||
}
|
||||
|
||||
toggle() {
|
||||
this.setToggleState(!this.state);
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
var PopupSwitchMenuItem = class extends PopupBaseMenuItem {
|
||||
constructor(text, active, params) {
|
||||
super(params);
|
||||
var PopupSwitchMenuItem = GObject.registerClass({
|
||||
Signals: { 'toggled': { param_types: [GObject.TYPE_BOOLEAN] }, },
|
||||
},
|
||||
class PopupSwitchMenuItem extends PopupBaseMenuItem {
|
||||
_init(text, active, params) {
|
||||
super._init(params);
|
||||
|
||||
this.label = new St.Label({ text: text });
|
||||
this._switch = new Switch(active);
|
||||
|
||||
this.actor.accessible_role = Atk.Role.CHECK_MENU_ITEM;
|
||||
this.accessible_role = Atk.Role.CHECK_MENU_ITEM;
|
||||
this.checkAccessibleState();
|
||||
this.actor.label_actor = this.label;
|
||||
this.label_actor = this.label;
|
||||
|
||||
this.actor.add_child(this.label);
|
||||
this.add_child(this.label);
|
||||
|
||||
this._statusBin = new St.Bin({ x_align: St.Align.END });
|
||||
this.actor.add(this._statusBin, { expand: true, x_align: St.Align.END });
|
||||
this.add(this._statusBin, { expand: true, x_align: St.Align.END });
|
||||
|
||||
this._statusLabel = new St.Label({ text: '',
|
||||
style_class: 'popup-status-menu-item'
|
||||
});
|
||||
this._statusBin.child = this._switch.actor;
|
||||
this._statusBin.child = this._switch;
|
||||
}
|
||||
|
||||
setStatus(text) {
|
||||
if (text != null) {
|
||||
this._statusLabel.text = text;
|
||||
this._statusBin.child = this._statusLabel;
|
||||
this.actor.reactive = false;
|
||||
this.actor.accessible_role = Atk.Role.MENU_ITEM;
|
||||
this.reactive = false;
|
||||
this.accessible_role = Atk.Role.MENU_ITEM;
|
||||
} else {
|
||||
this._statusBin.child = this._switch.actor;
|
||||
this.actor.reactive = true;
|
||||
this.actor.accessible_role = Atk.Role.CHECK_MENU_ITEM;
|
||||
this._statusBin.child = this._switch;
|
||||
this.reactive = true;
|
||||
this.accessible_role = Atk.Role.CHECK_MENU_ITEM;
|
||||
}
|
||||
this.checkAccessibleState();
|
||||
}
|
||||
|
||||
activate(event) {
|
||||
if (this._switch.actor.mapped) {
|
||||
if (this._switch.mapped)
|
||||
this.toggle();
|
||||
}
|
||||
|
||||
// we allow pressing space to toggle the switch
|
||||
// without closing the menu
|
||||
@@ -365,29 +381,30 @@ var PopupSwitchMenuItem = class extends PopupBaseMenuItem {
|
||||
}
|
||||
|
||||
checkAccessibleState() {
|
||||
switch (this.actor.accessible_role) {
|
||||
switch (this.accessible_role) {
|
||||
case Atk.Role.CHECK_MENU_ITEM:
|
||||
if (this._switch.state)
|
||||
this.actor.add_accessible_state (Atk.StateType.CHECKED);
|
||||
this.add_accessible_state(Atk.StateType.CHECKED);
|
||||
else
|
||||
this.actor.remove_accessible_state (Atk.StateType.CHECKED);
|
||||
this.remove_accessible_state(Atk.StateType.CHECKED);
|
||||
break;
|
||||
default:
|
||||
this.actor.remove_accessible_state (Atk.StateType.CHECKED);
|
||||
this.remove_accessible_state(Atk.StateType.CHECKED);
|
||||
}
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
var PopupImageMenuItem = class extends PopupBaseMenuItem {
|
||||
constructor(text, icon, params) {
|
||||
super(params);
|
||||
var PopupImageMenuItem = GObject.registerClass(
|
||||
class PopupImageMenuItem extends PopupBaseMenuItem {
|
||||
_init(text, icon, params) {
|
||||
super._init(params);
|
||||
|
||||
this._icon = new St.Icon({ style_class: 'popup-menu-icon',
|
||||
x_align: Clutter.ActorAlign.END });
|
||||
this.actor.add_child(this._icon);
|
||||
this.add_child(this._icon);
|
||||
this.label = new St.Label({ text: text });
|
||||
this.actor.add_child(this.label);
|
||||
this.actor.label_actor = this.label;
|
||||
this.add_child(this.label);
|
||||
this.label_actor = this.label;
|
||||
|
||||
this.setIcon(icon);
|
||||
}
|
||||
@@ -399,12 +416,12 @@ var PopupImageMenuItem = class extends PopupBaseMenuItem {
|
||||
else
|
||||
this._icon.icon_name = icon;
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
var PopupMenuBase = class {
|
||||
constructor(sourceActor, styleClass) {
|
||||
if (new.target === PopupMenuBase)
|
||||
throw new TypeError('Cannot instantiate abstract class ' + new.target.name);
|
||||
if (this.constructor === PopupMenuBase)
|
||||
throw new TypeError(`Cannot instantiate abstract class ${this.constructor.name}`);
|
||||
|
||||
this.sourceActor = sourceActor;
|
||||
this._parent = null;
|
||||
@@ -443,13 +460,21 @@ var PopupMenuBase = class {
|
||||
}
|
||||
|
||||
getSensitive() {
|
||||
let parentSensitive = this._parent ? this._parent.getSensitive() : true;
|
||||
let parentSensitive = this._parent ? this._parent.sensitive : true;
|
||||
return this._sensitive && parentSensitive;
|
||||
}
|
||||
|
||||
setSensitive(sensitive) {
|
||||
this._sensitive = sensitive;
|
||||
this.emit('sensitive-changed');
|
||||
this.emit('notify::sensitive');
|
||||
}
|
||||
|
||||
get sensitive() {
|
||||
return this.getSensitive();
|
||||
}
|
||||
|
||||
set sensitive(sensitive) {
|
||||
this.setSensitive(sensitive);
|
||||
}
|
||||
|
||||
_sessionUpdated() {
|
||||
@@ -485,7 +510,7 @@ var PopupMenuBase = class {
|
||||
app.activate();
|
||||
});
|
||||
|
||||
menuItem.actor.visible = Main.sessionMode.allowSettings;
|
||||
menuItem.visible = Main.sessionMode.allowSettings;
|
||||
this._settingsActions[desktopFile] = menuItem;
|
||||
|
||||
return menuItem;
|
||||
@@ -494,7 +519,7 @@ var PopupMenuBase = class {
|
||||
_setSettingsVisibility(visible) {
|
||||
for (let id in this._settingsActions) {
|
||||
let item = this._settingsActions[id];
|
||||
item.actor.visible = visible;
|
||||
item.visible = visible;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -517,16 +542,17 @@ var PopupMenuBase = class {
|
||||
|
||||
_subMenuActiveChanged(submenu, submenuItem) {
|
||||
if (this._activeMenuItem && this._activeMenuItem != submenuItem)
|
||||
this._activeMenuItem.setActive(false);
|
||||
this._activeMenuItem.active = false;
|
||||
this._activeMenuItem = submenuItem;
|
||||
this.emit('active-changed', submenuItem);
|
||||
}
|
||||
|
||||
_connectItemSignals(menuItem) {
|
||||
menuItem._activeChangeId = menuItem.connect('active-changed', (menuItem, active) => {
|
||||
menuItem._activeChangeId = menuItem.connect('notify::active', (menuItem) => {
|
||||
let active = menuItem.active;
|
||||
if (active && this._activeMenuItem != menuItem) {
|
||||
if (this._activeMenuItem)
|
||||
this._activeMenuItem.setActive(false);
|
||||
this._activeMenuItem.active = false;
|
||||
this._activeMenuItem = menuItem;
|
||||
this.emit('active-changed', menuItem);
|
||||
} else if (!active && this._activeMenuItem == menuItem) {
|
||||
@@ -534,8 +560,8 @@ var PopupMenuBase = class {
|
||||
this.emit('active-changed', null);
|
||||
}
|
||||
});
|
||||
menuItem._sensitiveChangeId = menuItem.connect('sensitive-changed', () => {
|
||||
let sensitive = menuItem.getSensitive();
|
||||
menuItem._sensitiveChangeId = menuItem.connect('notify::sensitive', () => {
|
||||
let sensitive = menuItem.sensitive;
|
||||
if (!sensitive && this._activeMenuItem == menuItem) {
|
||||
if (!this.actor.navigate_focus(menuItem.actor,
|
||||
St.DirectionType.TAB_FORWARD,
|
||||
@@ -551,7 +577,7 @@ var PopupMenuBase = class {
|
||||
this.itemActivated(BoxPointer.PopupAnimation.FULL);
|
||||
});
|
||||
|
||||
menuItem._parentSensitiveChangeId = this.connect('sensitive-changed', () => {
|
||||
menuItem._parentSensitiveChangeId = this.connect('notify::sensitive', () => {
|
||||
menuItem.syncSensitive();
|
||||
});
|
||||
|
||||
@@ -603,7 +629,7 @@ var PopupMenuBase = class {
|
||||
return;
|
||||
}
|
||||
|
||||
menuItem.actor.show();
|
||||
menuItem.show();
|
||||
}
|
||||
|
||||
moveMenuItem(menuItem, position) {
|
||||
@@ -650,8 +676,8 @@ var PopupMenuBase = class {
|
||||
let parentClosingId = this.connect('menu-closed', () => {
|
||||
menuItem.emit('menu-closed');
|
||||
});
|
||||
let subMenuSensitiveChangedId = this.connect('sensitive-changed', () => {
|
||||
menuItem.emit('sensitive-changed');
|
||||
let subMenuSensitiveChangedId = this.connect('notify::sensitive', () => {
|
||||
menuItem.emit('notify::sensitive');
|
||||
});
|
||||
|
||||
menuItem.connect('destroy', () => {
|
||||
@@ -857,9 +883,9 @@ var PopupMenu = class extends PopupMenuBase {
|
||||
|
||||
close(animate) {
|
||||
if (this._activeMenuItem)
|
||||
this._activeMenuItem.setActive(false);
|
||||
this._activeMenuItem.active = false;
|
||||
|
||||
if (this._boxPointer.actor.visible) {
|
||||
if (this._boxPointer.visible) {
|
||||
this._boxPointer.close(animate, () => {
|
||||
this.emit('menu-closed');
|
||||
});
|
||||
@@ -890,6 +916,10 @@ var PopupDummyMenu = class {
|
||||
return true;
|
||||
}
|
||||
|
||||
get sensitive() {
|
||||
return this.getSensitive();
|
||||
}
|
||||
|
||||
open() { this.emit('open-state-changed', true); }
|
||||
close() { this.emit('open-state-changed', false); }
|
||||
toggle() {}
|
||||
@@ -929,7 +959,11 @@ var PopupSubMenu = class extends PopupMenuBase {
|
||||
}
|
||||
|
||||
getSensitive() {
|
||||
return this._sensitive && this.sourceActor._delegate.getSensitive();
|
||||
return this._sensitive && this.sourceActor.sensitive;
|
||||
}
|
||||
|
||||
get sensitive() {
|
||||
return this.getSensitive();
|
||||
}
|
||||
|
||||
open(animate) {
|
||||
@@ -996,7 +1030,7 @@ var PopupSubMenu = class extends PopupMenuBase {
|
||||
this.emit('open-state-changed', false);
|
||||
|
||||
if (this._activeMenuItem)
|
||||
this._activeMenuItem.setActive(false);
|
||||
this._activeMenuItem.active = false;
|
||||
|
||||
if (animate && this._needsScrollbar())
|
||||
animate = false;
|
||||
@@ -1028,7 +1062,7 @@ var PopupSubMenu = class extends PopupMenuBase {
|
||||
|
||||
if (this.isOpen && event.get_key_symbol() == Clutter.KEY_Left) {
|
||||
this.close(BoxPointer.PopupAnimation.FULL);
|
||||
this.sourceActor._delegate.setActive(true);
|
||||
this.sourceActor._delegate.active = true;
|
||||
return Clutter.EVENT_STOP;
|
||||
}
|
||||
|
||||
@@ -1059,25 +1093,26 @@ var PopupMenuSection = class extends PopupMenuBase {
|
||||
close() { this.emit('open-state-changed', false); }
|
||||
};
|
||||
|
||||
var PopupSubMenuMenuItem = class extends PopupBaseMenuItem {
|
||||
constructor(text, wantIcon) {
|
||||
super();
|
||||
var PopupSubMenuMenuItem = GObject.registerClass(
|
||||
class PopupSubMenuMenuItem extends PopupBaseMenuItem {
|
||||
_init(text, wantIcon) {
|
||||
super._init();
|
||||
|
||||
this.actor.add_style_class_name('popup-submenu-menu-item');
|
||||
this.add_style_class_name('popup-submenu-menu-item');
|
||||
|
||||
if (wantIcon) {
|
||||
this.icon = new St.Icon({ style_class: 'popup-menu-icon' });
|
||||
this.actor.add_child(this.icon);
|
||||
this.add_child(this.icon);
|
||||
}
|
||||
|
||||
this.label = new St.Label({ text: text,
|
||||
y_expand: true,
|
||||
y_align: Clutter.ActorAlign.CENTER });
|
||||
this.actor.add_child(this.label);
|
||||
this.actor.label_actor = this.label;
|
||||
this.add_child(this.label);
|
||||
this.label_actor = this.label;
|
||||
|
||||
let expander = new St.Bin({ style_class: 'popup-menu-item-expander' });
|
||||
this.actor.add(expander, { expand: true });
|
||||
this.add(expander, { expand: true });
|
||||
|
||||
this._triangle = arrowIcon(St.Side.RIGHT);
|
||||
this._triangle.pivot_point = new Clutter.Point({ x: 0.5, y: 0.6 });
|
||||
@@ -1086,11 +1121,12 @@ var PopupSubMenuMenuItem = class extends PopupBaseMenuItem {
|
||||
y_align: Clutter.ActorAlign.CENTER });
|
||||
this._triangleBin.add_child(this._triangle);
|
||||
|
||||
this.actor.add_child(this._triangleBin);
|
||||
this.actor.add_accessible_state (Atk.StateType.EXPANDABLE);
|
||||
this.add_child(this._triangleBin);
|
||||
this.add_accessible_state(Atk.StateType.EXPANDABLE);
|
||||
|
||||
this.menu = new PopupSubMenu(this.actor, this._triangle);
|
||||
this.menu = new PopupSubMenu(this, this._triangle);
|
||||
this.menu.connect('open-state-changed', this._subMenuOpenStateChanged.bind(this));
|
||||
this.connect('destroy', () => { this.menu.destroy(); });
|
||||
}
|
||||
|
||||
_setParent(parent) {
|
||||
@@ -1107,24 +1143,18 @@ var PopupSubMenuMenuItem = class extends PopupBaseMenuItem {
|
||||
|
||||
_subMenuOpenStateChanged(menu, open) {
|
||||
if (open) {
|
||||
this.actor.add_style_pseudo_class('open');
|
||||
this.add_style_pseudo_class('open');
|
||||
this._getTopMenu()._setOpenedSubMenu(this.menu);
|
||||
this.actor.add_accessible_state (Atk.StateType.EXPANDED);
|
||||
this.actor.add_style_pseudo_class('checked');
|
||||
this.add_accessible_state(Atk.StateType.EXPANDED);
|
||||
this.add_style_pseudo_class('checked');
|
||||
} else {
|
||||
this.actor.remove_style_pseudo_class('open');
|
||||
this.remove_style_pseudo_class('open');
|
||||
this._getTopMenu()._setOpenedSubMenu(null);
|
||||
this.actor.remove_accessible_state (Atk.StateType.EXPANDED);
|
||||
this.actor.remove_style_pseudo_class('checked');
|
||||
this.remove_accessible_state (Atk.StateType.EXPANDED);
|
||||
this.remove_style_pseudo_class('checked');
|
||||
}
|
||||
}
|
||||
|
||||
destroy() {
|
||||
this.menu.destroy();
|
||||
|
||||
super.destroy();
|
||||
}
|
||||
|
||||
setSubmenuShown(open) {
|
||||
if (open)
|
||||
this.menu.open(BoxPointer.PopupAnimation.FULL);
|
||||
@@ -1162,7 +1192,7 @@ var PopupSubMenuMenuItem = class extends PopupBaseMenuItem {
|
||||
_onButtonReleaseEvent(actor) {
|
||||
// Since we override the parent, we need to manage what the parent does
|
||||
// with the active style class
|
||||
this.actor.remove_style_pseudo_class ('active');
|
||||
this.remove_style_pseudo_class('active');
|
||||
this._setOpenState(!this._getOpenState());
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
}
|
||||
@@ -1171,12 +1201,12 @@ var PopupSubMenuMenuItem = class extends PopupBaseMenuItem {
|
||||
if (event.type() == Clutter.EventType.TOUCH_END) {
|
||||
// Since we override the parent, we need to manage what the parent does
|
||||
// with the active style class
|
||||
this.actor.remove_style_pseudo_class ('active');
|
||||
this.remove_style_pseudo_class('active');
|
||||
this._setOpenState(!this._getOpenState());
|
||||
}
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
/* Basic implementation of a menu manager.
|
||||
* Call addMenu to add menus
|
||||
@@ -1186,7 +1216,7 @@ var PopupMenuManager = class {
|
||||
grabParams = Params.parse(grabParams,
|
||||
{ actionMode: Shell.ActionMode.POPUP });
|
||||
this._owner = owner;
|
||||
this._grabHelper = new GrabHelper.GrabHelper(owner.actor, grabParams);
|
||||
this._grabHelper = new GrabHelper.GrabHelper(owner, grabParams);
|
||||
this._menus = [];
|
||||
}
|
||||
|
||||
|
@@ -810,16 +810,8 @@ var ScreenShield = class {
|
||||
|
||||
this._maybeCancelDialog();
|
||||
|
||||
if (this._longLightbox.actor.visible ||
|
||||
this._isActive) {
|
||||
// We're either shown and active, or in the process of
|
||||
// showing.
|
||||
// The latter is a very unlikely condition (it requires
|
||||
// idle-delay < 20), but in any case we have nothing
|
||||
// to do at this point: either isActive is true, or
|
||||
// it will soon be.
|
||||
// isActive can also be true if the lightbox is hidden,
|
||||
// in case the shield is down and the user hasn't unlocked yet
|
||||
if (this._longLightbox.actor.visible) {
|
||||
// We're in the process of showing.
|
||||
return;
|
||||
}
|
||||
|
||||
|
@@ -1,6 +1,6 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
|
||||
const { Clutter, Gio, GLib, Gtk, Meta, Shell, St } = imports.gi;
|
||||
const { Clutter, Gio, GLib, Meta, Shell, St } = imports.gi;
|
||||
const Signals = imports.signals;
|
||||
|
||||
const GrabHelper = imports.ui.grabHelper;
|
||||
@@ -227,8 +227,6 @@ var SelectArea = class {
|
||||
this._lastY = 0;
|
||||
this._result = null;
|
||||
|
||||
this._initRubberbandColors();
|
||||
|
||||
this._group = new St.Widget({ visible: false,
|
||||
reactive: true,
|
||||
x: 0,
|
||||
@@ -248,10 +246,10 @@ var SelectArea = class {
|
||||
coordinate: Clutter.BindCoordinate.ALL });
|
||||
this._group.add_constraint(constraint);
|
||||
|
||||
this._rubberband = new Clutter.Rectangle({ color: this._background,
|
||||
has_border: true,
|
||||
border_width: 1,
|
||||
border_color: this._border });
|
||||
this._rubberband = new St.Widget({
|
||||
style_class: 'select-area-rubberband',
|
||||
visible: false
|
||||
});
|
||||
this._group.add_actor(this._rubberband);
|
||||
}
|
||||
|
||||
@@ -265,25 +263,6 @@ var SelectArea = class {
|
||||
this._group.visible = true;
|
||||
}
|
||||
|
||||
_initRubberbandColors() {
|
||||
function colorFromRGBA(rgba) {
|
||||
return new Clutter.Color({ red: rgba.red * 255,
|
||||
green: rgba.green * 255,
|
||||
blue: rgba.blue * 255,
|
||||
alpha: rgba.alpha * 255 });
|
||||
}
|
||||
|
||||
let path = new Gtk.WidgetPath();
|
||||
path.append_type(Gtk.IconView);
|
||||
|
||||
let context = new Gtk.StyleContext();
|
||||
context.set_path(path);
|
||||
context.add_class('rubberband');
|
||||
|
||||
this._background = colorFromRGBA(context.get_background_color(Gtk.StateFlags.NORMAL));
|
||||
this._border = colorFromRGBA(context.get_border_color(Gtk.StateFlags.NORMAL));
|
||||
}
|
||||
|
||||
_getGeometry() {
|
||||
return { x: Math.min(this._startX, this._lastX),
|
||||
y: Math.min(this._startY, this._lastY),
|
||||
@@ -302,6 +281,7 @@ var SelectArea = class {
|
||||
|
||||
this._rubberband.set_position(geometry.x, geometry.y);
|
||||
this._rubberband.set_size(geometry.width, geometry.height);
|
||||
this._rubberband.show();
|
||||
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
}
|
||||
|
@@ -37,16 +37,13 @@ const { loadInterfaceXML } = imports.misc.fileUtils;
|
||||
* 'yield Scripting.sleep(500);'
|
||||
*/
|
||||
function sleep(milliseconds) {
|
||||
let cb;
|
||||
|
||||
let id = Mainloop.timeout_add(milliseconds, () => {
|
||||
if (cb)
|
||||
cb();
|
||||
return GLib.SOURCE_REMOVE;
|
||||
return new Promise(resolve => {
|
||||
let id = Mainloop.timeout_add(milliseconds, () => {
|
||||
resolve();
|
||||
return GLib.SOURCE_REMOVE;
|
||||
});
|
||||
GLib.Source.set_name_by_id(id, '[gnome-shell] sleep');
|
||||
});
|
||||
GLib.Source.set_name_by_id(id, '[gnome-shell] sleep');
|
||||
|
||||
return callback => { cb = callback; };
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -57,14 +54,9 @@ function sleep(milliseconds) {
|
||||
* 'yield Scripting.waitLeisure();'
|
||||
*/
|
||||
function waitLeisure() {
|
||||
let cb;
|
||||
|
||||
global.run_at_leisure(() => {
|
||||
if (cb)
|
||||
cb();
|
||||
return new Promise(resolve => {
|
||||
global.run_at_leisure(resolve);
|
||||
});
|
||||
|
||||
return callback => { cb = callback; };
|
||||
}
|
||||
|
||||
const PerfHelperIface = loadInterfaceXML('org.gnome.Shell.PerfHelper');
|
||||
@@ -82,25 +74,16 @@ function _getPerfHelper() {
|
||||
}
|
||||
|
||||
function _callRemote(obj, method, ...args) {
|
||||
let cb;
|
||||
let errcb;
|
||||
return new Promise((resolve, reject) => {
|
||||
args.push((result, excp) => {
|
||||
if (excp)
|
||||
reject(excp);
|
||||
else
|
||||
resolve();
|
||||
});
|
||||
|
||||
args.push((result, excp) => {
|
||||
if (excp) {
|
||||
if (errcb)
|
||||
errcb(excp);
|
||||
} else {
|
||||
if (cb)
|
||||
cb();
|
||||
}
|
||||
method.apply(obj, args);
|
||||
});
|
||||
|
||||
method.apply(obj, args);
|
||||
|
||||
return (callback, error_callback) => {
|
||||
cb = callback;
|
||||
errcb = error_callback;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -192,27 +175,6 @@ function collectStatistics() {
|
||||
Shell.PerfLog.get_default().collect_statistics();
|
||||
}
|
||||
|
||||
function _step(g, finish, onError) {
|
||||
try {
|
||||
let waitFunction = g.next();
|
||||
waitFunction(() => {
|
||||
_step(g, finish, onError);
|
||||
},
|
||||
err => {
|
||||
if (onError)
|
||||
onError(err);
|
||||
});
|
||||
} catch (err) {
|
||||
if (err instanceof StopIteration) {
|
||||
if (finish)
|
||||
finish();
|
||||
} else {
|
||||
if (onError)
|
||||
onError(err);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function _collect(scriptModule, outputFile) {
|
||||
let eventHandlers = {};
|
||||
|
||||
@@ -348,23 +310,23 @@ function _collect(scriptModule, outputFile) {
|
||||
* After running the script and collecting statistics from the
|
||||
* event log, GNOME Shell will exit.
|
||||
**/
|
||||
function runPerfScript(scriptModule, outputFile) {
|
||||
async function runPerfScript(scriptModule, outputFile) {
|
||||
Shell.PerfLog.get_default().set_enabled(true);
|
||||
|
||||
let g = scriptModule.run();
|
||||
for (let step of scriptModule.run()) {
|
||||
try {
|
||||
await step;
|
||||
} catch (err) {
|
||||
log(`Script failed: ${err}\n${err.stack}`);
|
||||
Meta.exit(Meta.ExitCode.ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
_step(g,
|
||||
() => {
|
||||
try {
|
||||
_collect(scriptModule, outputFile);
|
||||
} catch (err) {
|
||||
log("Script failed: " + err + "\n" + err.stack);
|
||||
Meta.exit(Meta.ExitCode.ERROR);
|
||||
}
|
||||
Meta.exit(Meta.ExitCode.SUCCESS);
|
||||
},
|
||||
err => {
|
||||
log("Script failed: " + err + "\n" + err.stack);
|
||||
Meta.exit(Meta.ExitCode.ERROR);
|
||||
});
|
||||
try {
|
||||
_collect(scriptModule, outputFile);
|
||||
} catch (err) {
|
||||
log(`Script failed: ${err}\n${err.stack}`);
|
||||
Meta.exit(Meta.ExitCode.ERROR);
|
||||
}
|
||||
Meta.exit(Meta.ExitCode.SUCCESS);
|
||||
}
|
||||
|
@@ -79,14 +79,17 @@ var GnomeShell = class {
|
||||
for (let param in params)
|
||||
params[param] = params[param].deep_unpack();
|
||||
|
||||
let { monitor: monitorIndex,
|
||||
let { connector,
|
||||
label,
|
||||
level,
|
||||
max_level: maxLevel,
|
||||
icon: serializedIcon } = params;
|
||||
|
||||
if (monitorIndex === undefined)
|
||||
monitorIndex = -1;
|
||||
let monitorIndex = -1;
|
||||
if (connector) {
|
||||
let monitorManager = Meta.MonitorManager.get();
|
||||
monitorIndex = monitorManager.get_monitor_for_connector(connector);
|
||||
}
|
||||
|
||||
let icon = null;
|
||||
if (serializedIcon)
|
||||
@@ -124,13 +127,20 @@ var GnomeShell = class {
|
||||
|
||||
UngrabAcceleratorAsync(params, invocation) {
|
||||
let [action] = params;
|
||||
let grabbedBy = this._grabbedAccelerators.get(action);
|
||||
if (invocation.get_sender() != grabbedBy)
|
||||
return invocation.return_value(GLib.Variant.new('(b)', [false]));
|
||||
let sender = invocation.get_sender();
|
||||
let ungrabSucceeded = this._ungrabAcceleratorForSender(action, sender);
|
||||
|
||||
return invocation.return_value(GLib.Variant.new('(b)', [ungrabSucceeded]));
|
||||
}
|
||||
|
||||
UngrabAcceleratorsAsync(params, invocation) {
|
||||
let [actions] = params;
|
||||
let sender = invocation.get_sender();
|
||||
let ungrabSucceeded = true;
|
||||
|
||||
for (let i = 0; i < actions.length; i++)
|
||||
ungrabSucceeded &= this._ungrabAcceleratorForSender(actions[i], sender);
|
||||
|
||||
let ungrabSucceeded = global.display.ungrab_accelerator(action);
|
||||
if (ungrabSucceeded)
|
||||
this._grabbedAccelerators.delete(action);
|
||||
return invocation.return_value(GLib.Variant.new('(b)', [ungrabSucceeded]));
|
||||
}
|
||||
|
||||
@@ -174,6 +184,16 @@ var GnomeShell = class {
|
||||
let ungrabSucceeded = global.display.ungrab_accelerator(action);
|
||||
if (ungrabSucceeded)
|
||||
this._grabbedAccelerators.delete(action);
|
||||
|
||||
return ungrabSucceeded;
|
||||
}
|
||||
|
||||
_ungrabAcceleratorForSender(action, sender) {
|
||||
let grabbedBy = this._grabbedAccelerators.get(action);
|
||||
if (sender != grabbedBy)
|
||||
return false;
|
||||
|
||||
return this._ungrabAccelerator(action);
|
||||
}
|
||||
|
||||
_onGrabberBusNameVanished(connection, name) {
|
||||
@@ -186,16 +206,10 @@ var GnomeShell = class {
|
||||
this._grabbers.delete(name);
|
||||
}
|
||||
|
||||
ShowMonitorLabelsAsync(params, invocation) {
|
||||
let sender = invocation.get_sender();
|
||||
let [dict] = params;
|
||||
Main.osdMonitorLabeler.show(sender, dict);
|
||||
}
|
||||
|
||||
ShowMonitorLabels2Async(params, invocation) {
|
||||
let sender = invocation.get_sender();
|
||||
let [dict] = params;
|
||||
Main.osdMonitorLabeler.show2(sender, dict);
|
||||
Main.osdMonitorLabeler.show(sender, dict);
|
||||
}
|
||||
|
||||
HideMonitorLabelsAsync(params, invocation) {
|
||||
|
@@ -148,7 +148,7 @@ function addContextMenu(entry, params) {
|
||||
|
||||
entry.menu = new EntryMenu(entry);
|
||||
entry.menu.isPassword = params.isPassword;
|
||||
entry._menuManager = new PopupMenu.PopupMenuManager({ actor: entry },
|
||||
entry._menuManager = new PopupMenu.PopupMenuManager(entry,
|
||||
{ actionMode: params.actionMode });
|
||||
entry._menuManager.addMenu(entry.menu);
|
||||
|
||||
|
@@ -39,7 +39,7 @@ class ATIndicator extends PanelMenu.Button {
|
||||
icon_name: 'preferences-desktop-accessibility-symbolic' }));
|
||||
this._hbox.add_child(PopupMenu.arrowIcon(St.Side.BOTTOM));
|
||||
|
||||
this.actor.add_child(this._hbox);
|
||||
this.add_child(this._hbox);
|
||||
|
||||
this._a11ySettings = new Gio.Settings({ schema_id: A11Y_SCHEMA });
|
||||
this._a11ySettings.connect('changed::' + KEY_ALWAYS_SHOW, this._queueSyncMenuVisibility.bind(this));
|
||||
@@ -86,7 +86,7 @@ class ATIndicator extends PanelMenu.Button {
|
||||
let alwaysShow = this._a11ySettings.get_boolean(KEY_ALWAYS_SHOW);
|
||||
let items = this.menu._getMenuItems();
|
||||
|
||||
this.actor.visible = alwaysShow || items.some(f => !!f.state);
|
||||
this.visible = alwaysShow || items.some(f => !!f.state);
|
||||
|
||||
return GLib.SOURCE_REMOVE;
|
||||
}
|
||||
@@ -112,38 +112,22 @@ class ATIndicator extends PanelMenu.Button {
|
||||
|
||||
_buildItem(string, schema, key) {
|
||||
let settings = new Gio.Settings({ schema_id: schema });
|
||||
settings.connect('changed::'+key, () => {
|
||||
let widget = this._buildItemExtended(string,
|
||||
settings.get_boolean(key),
|
||||
settings.is_writable(key),
|
||||
enabled => settings.set_boolean(key, enabled));
|
||||
|
||||
settings.connect('changed::' + key, () => {
|
||||
widget.setToggleState(settings.get_boolean(key));
|
||||
|
||||
this._queueSyncMenuVisibility();
|
||||
});
|
||||
|
||||
let widget = this._buildItemExtended(string,
|
||||
settings.get_boolean(key),
|
||||
settings.is_writable(key),
|
||||
enabled => settings.set_boolean(key, enabled));
|
||||
return widget;
|
||||
}
|
||||
|
||||
_buildHCItem() {
|
||||
let interfaceSettings = new Gio.Settings({ schema_id: DESKTOP_INTERFACE_SCHEMA });
|
||||
interfaceSettings.connect('changed::' + KEY_GTK_THEME, () => {
|
||||
let value = interfaceSettings.get_string(KEY_GTK_THEME);
|
||||
if (value == HIGH_CONTRAST_THEME) {
|
||||
highContrast.setToggleState(true);
|
||||
} else {
|
||||
highContrast.setToggleState(false);
|
||||
gtkTheme = value;
|
||||
}
|
||||
|
||||
this._queueSyncMenuVisibility();
|
||||
});
|
||||
interfaceSettings.connect('changed::' + KEY_ICON_THEME, () => {
|
||||
let value = interfaceSettings.get_string(KEY_ICON_THEME);
|
||||
if (value != HIGH_CONTRAST_THEME)
|
||||
iconTheme = value;
|
||||
});
|
||||
|
||||
let gtkTheme = interfaceSettings.get_string(KEY_GTK_THEME);
|
||||
let iconTheme = interfaceSettings.get_string(KEY_ICON_THEME);
|
||||
let hasHC = (gtkTheme == HIGH_CONTRAST_THEME);
|
||||
@@ -164,19 +148,30 @@ class ATIndicator extends PanelMenu.Button {
|
||||
interfaceSettings.reset(KEY_ICON_THEME);
|
||||
}
|
||||
});
|
||||
|
||||
interfaceSettings.connect('changed::' + KEY_GTK_THEME, () => {
|
||||
let value = interfaceSettings.get_string(KEY_GTK_THEME);
|
||||
if (value == HIGH_CONTRAST_THEME) {
|
||||
highContrast.setToggleState(true);
|
||||
} else {
|
||||
highContrast.setToggleState(false);
|
||||
gtkTheme = value;
|
||||
}
|
||||
|
||||
this._queueSyncMenuVisibility();
|
||||
});
|
||||
|
||||
interfaceSettings.connect('changed::' + KEY_ICON_THEME, () => {
|
||||
let value = interfaceSettings.get_string(KEY_ICON_THEME);
|
||||
if (value != HIGH_CONTRAST_THEME)
|
||||
iconTheme = value;
|
||||
});
|
||||
|
||||
return highContrast;
|
||||
}
|
||||
|
||||
_buildFontItem() {
|
||||
let settings = new Gio.Settings({ schema_id: DESKTOP_INTERFACE_SCHEMA });
|
||||
settings.connect('changed::' + KEY_TEXT_SCALING_FACTOR, () => {
|
||||
let factor = settings.get_double(KEY_TEXT_SCALING_FACTOR);
|
||||
let active = (factor > 1.0);
|
||||
widget.setToggleState(active);
|
||||
|
||||
this._queueSyncMenuVisibility();
|
||||
});
|
||||
|
||||
let factor = settings.get_double(KEY_TEXT_SCALING_FACTOR);
|
||||
let initial_setting = (factor > 1.0);
|
||||
let widget = this._buildItemExtended(_("Large Text"),
|
||||
@@ -189,6 +184,15 @@ class ATIndicator extends PanelMenu.Button {
|
||||
else
|
||||
settings.reset(KEY_TEXT_SCALING_FACTOR);
|
||||
});
|
||||
|
||||
settings.connect('changed::' + KEY_TEXT_SCALING_FACTOR, () => {
|
||||
let factor = settings.get_double(KEY_TEXT_SCALING_FACTOR);
|
||||
let active = (factor > 1.0);
|
||||
widget.setToggleState(active);
|
||||
|
||||
this._queueSyncMenuVisibility();
|
||||
});
|
||||
|
||||
return widget;
|
||||
}
|
||||
});
|
||||
|
@@ -118,9 +118,9 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
// Remember if there were setup devices and show the menu
|
||||
// if we've seen setup devices and we're not hard blocked
|
||||
if (nDevices > 0)
|
||||
this._item.actor.visible = !this._proxy.BluetoothHardwareAirplaneMode;
|
||||
this._item.visible = !this._proxy.BluetoothHardwareAirplaneMode;
|
||||
else
|
||||
this._item.actor.visible = this._proxy.BluetoothHasAirplaneMode && !this._proxy.BluetoothAirplaneMode;
|
||||
this._item.visible = this._proxy.BluetoothHasAirplaneMode && !this._proxy.BluetoothAirplaneMode;
|
||||
|
||||
if (nConnectedDevices > 0)
|
||||
/* Translators: this is the number of connected bluetooth devices */
|
||||
|
@@ -37,12 +37,12 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
|
||||
let icon = new St.Icon({ icon_name: 'display-brightness-symbolic',
|
||||
style_class: 'popup-menu-icon' });
|
||||
this._item.actor.add(icon);
|
||||
this._item.actor.add(this._slider.actor, { expand: true });
|
||||
this._item.actor.connect('button-press-event', (actor, event) => {
|
||||
this._item.add(icon);
|
||||
this._item.add(this._slider.actor, { expand: true });
|
||||
this._item.connect('button-press-event', (actor, event) => {
|
||||
return this._slider.startDragging(event);
|
||||
});
|
||||
this._item.actor.connect('key-press-event', (actor, event) => {
|
||||
this._item.connect('key-press-event', (actor, event) => {
|
||||
return this._slider.onKeyPressEvent(actor, event);
|
||||
});
|
||||
|
||||
@@ -55,7 +55,7 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
|
||||
_sync() {
|
||||
let visible = this._proxy.Brightness >= 0;
|
||||
this._item.actor.visible = visible;
|
||||
this._item.visible = visible;
|
||||
if (visible)
|
||||
this._slider.setValue(this._proxy.Brightness / 100.0);
|
||||
}
|
||||
|
@@ -15,17 +15,18 @@ const Util = imports.misc.util;
|
||||
const INPUT_SOURCE_TYPE_XKB = 'xkb';
|
||||
const INPUT_SOURCE_TYPE_IBUS = 'ibus';
|
||||
|
||||
var LayoutMenuItem = class extends PopupMenu.PopupBaseMenuItem {
|
||||
constructor(displayName, shortName) {
|
||||
super();
|
||||
var LayoutMenuItem = GObject.registerClass(
|
||||
class LayoutMenuItem extends PopupMenu.PopupBaseMenuItem {
|
||||
_init(displayName, shortName) {
|
||||
super._init();
|
||||
|
||||
this.label = new St.Label({ text: displayName });
|
||||
this.indicator = new St.Label({ text: shortName });
|
||||
this.actor.add(this.label, { expand: true });
|
||||
this.actor.add(this.indicator);
|
||||
this.actor.label_actor = this.label;
|
||||
this.add(this.label, { expand: true });
|
||||
this.add(this.indicator);
|
||||
this.label_actor = this.label;
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
var InputSource = class {
|
||||
constructor(type, id, displayName, shortName, index) {
|
||||
@@ -125,8 +126,8 @@ class InputSourceSwitcher extends SwitcherPopup.SwitcherList {
|
||||
|
||||
var InputSourceSettings = class {
|
||||
constructor() {
|
||||
if (new.target === InputSourceSettings)
|
||||
throw new TypeError('Cannot instantiate abstract class ' + new.target.name);
|
||||
if (this.constructor === InputSourceSettings)
|
||||
throw new TypeError(`Cannot instantiate abstract class ${this.constructor.name}`);
|
||||
}
|
||||
|
||||
_emitInputSourcesChanged() {
|
||||
@@ -822,7 +823,7 @@ class InputSourceIndicator extends PanelMenu.Button {
|
||||
this._hbox.add_child(this._container);
|
||||
this._hbox.add_child(PopupMenu.arrowIcon(St.Side.BOTTOM));
|
||||
|
||||
this.actor.add_child(this._hbox);
|
||||
this.add_child(this._hbox);
|
||||
|
||||
this._propSeparator = new PopupMenu.PopupSeparatorMenuItem();
|
||||
this.menu.addMenuItem(this._propSeparator);
|
||||
@@ -857,7 +858,7 @@ class InputSourceIndicator extends PanelMenu.Button {
|
||||
// but at least for now it is used as "allow popping up windows
|
||||
// from shell menus"; we can always add a separate sessionMode
|
||||
// option if need arises.
|
||||
this._showLayoutItem.actor.visible = Main.sessionMode.allowSettings;
|
||||
this._showLayoutItem.visible = Main.sessionMode.allowSettings;
|
||||
}
|
||||
|
||||
_sourcesChanged() {
|
||||
@@ -908,11 +909,11 @@ class InputSourceIndicator extends PanelMenu.Button {
|
||||
// We also hide if we have only one visible source unless
|
||||
// it's an IBus source with properties.
|
||||
this.menu.close();
|
||||
this.actor.hide();
|
||||
this.hide();
|
||||
return;
|
||||
}
|
||||
|
||||
this.actor.show();
|
||||
this.show();
|
||||
|
||||
this._buildPropSection(newSource.properties);
|
||||
|
||||
|
@@ -101,12 +101,12 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
_syncIndicator() {
|
||||
if (this._managerProxy == null) {
|
||||
this._indicator.visible = false;
|
||||
this._item.actor.visible = false;
|
||||
this._item.visible = false;
|
||||
return;
|
||||
}
|
||||
|
||||
this._indicator.visible = this._managerProxy.InUse;
|
||||
this._item.actor.visible = this._indicator.visible;
|
||||
this._item.visible = this._indicator.visible;
|
||||
this._updateMenuLabels();
|
||||
}
|
||||
|
||||
|
@@ -167,10 +167,10 @@ var NMConnectionItem = class {
|
||||
};
|
||||
Signals.addSignalMethods(NMConnectionItem.prototype);
|
||||
|
||||
var NMConnectionSection = class {
|
||||
var NMConnectionSection = class NMConnectionSection {
|
||||
constructor(client) {
|
||||
if (new.target === NMConnectionSection)
|
||||
throw new TypeError('Cannot instantiate abstract type ' + new.target.name);
|
||||
if (this.constructor === NMConnectionSection)
|
||||
throw new TypeError(`Cannot instantiate abstract type ${this.constructor.name}`);
|
||||
|
||||
this._client = client;
|
||||
|
||||
@@ -235,14 +235,14 @@ var NMConnectionSection = class {
|
||||
if (!this._connectionValid(connection))
|
||||
return;
|
||||
|
||||
// This function is called everytime connection is added or updated
|
||||
// This function is called every time the connection is added or updated.
|
||||
// In the usual case, we already added this connection and UUID
|
||||
// didn't change. So we need to check if we already have an item,
|
||||
// and update it for properties in the connection that changed
|
||||
// (the only one we care about is the name)
|
||||
// But it's also possible we didn't know about this connection
|
||||
// (eg, during coldplug, or because it was updated and suddenly
|
||||
// it's valid for this device), in which case we add a new item
|
||||
// it's valid for this device), in which case we add a new item.
|
||||
|
||||
let item = this._connectionItems.get(connection.get_uuid());
|
||||
if (item)
|
||||
@@ -297,12 +297,13 @@ var NMConnectionSection = class {
|
||||
};
|
||||
Signals.addSignalMethods(NMConnectionSection.prototype);
|
||||
|
||||
var NMConnectionDevice = class extends NMConnectionSection {
|
||||
var NMConnectionDevice = class NMConnectionDevice extends NMConnectionSection {
|
||||
constructor(client, device) {
|
||||
if (new.target === NMConnectionDevice)
|
||||
throw new TypeError('Cannot instantiate abstract type ' + new.target.name);
|
||||
|
||||
super(client);
|
||||
|
||||
if (this.constructor === NMConnectionDevice)
|
||||
throw new TypeError(`Cannot instantiate abstract type ${this.constructor.name}`);
|
||||
|
||||
this._device = device;
|
||||
this._description = '';
|
||||
|
||||
@@ -388,8 +389,8 @@ var NMConnectionDevice = class extends NMConnectionSection {
|
||||
|
||||
_sync() {
|
||||
let nItems = this._connectionItems.size;
|
||||
this._autoConnectItem.actor.visible = (nItems == 0);
|
||||
this._deactivateItem.actor.visible = this._device.state > NM.DeviceState.DISCONNECTED;
|
||||
this._autoConnectItem.visible = (nItems == 0);
|
||||
this._deactivateItem.visible = this._device.state > NM.DeviceState.DISCONNECTED;
|
||||
|
||||
if (this._activeConnection == null) {
|
||||
let activeConnection = this._device.active_connection;
|
||||
@@ -476,7 +477,7 @@ var NMDeviceWired = class extends NMConnectionDevice {
|
||||
}
|
||||
|
||||
_sync() {
|
||||
this.item.actor.visible = this._hasCarrier();
|
||||
this.item.visible = this._hasCarrier();
|
||||
super._sync();
|
||||
}
|
||||
|
||||
@@ -1075,7 +1076,7 @@ var NMWirelessDialog = class extends ModalDialog.ModalDialog {
|
||||
|
||||
let newPos = Util.insertSorted(this._networks, network, this._networkSortFunction);
|
||||
this._createNetworkItem(network);
|
||||
this._itemBox.insert_child_at_index(network.item.actor, newPos);
|
||||
this._itemBox.insert_child_at_index(network.item, newPos);
|
||||
}
|
||||
|
||||
this._syncView();
|
||||
@@ -1093,7 +1094,7 @@ var NMWirelessDialog = class extends ModalDialog.ModalDialog {
|
||||
network.accessPoints.splice(res.ap, 1);
|
||||
|
||||
if (network.accessPoints.length == 0) {
|
||||
network.item.actor.destroy();
|
||||
network.item.destroy();
|
||||
this._networks.splice(res.network, 1);
|
||||
} else {
|
||||
network.item.updateBestAP(network.accessPoints[0]);
|
||||
@@ -1109,7 +1110,7 @@ var NMWirelessDialog = class extends ModalDialog.ModalDialog {
|
||||
|
||||
this._itemBox.remove_all_children();
|
||||
this._networks.forEach(network => {
|
||||
this._itemBox.add_child(network.item.actor);
|
||||
this._itemBox.add_child(network.item);
|
||||
});
|
||||
|
||||
adjustment.value = scrollValue;
|
||||
@@ -1117,25 +1118,25 @@ var NMWirelessDialog = class extends ModalDialog.ModalDialog {
|
||||
|
||||
_selectNetwork(network) {
|
||||
if (this._selectedNetwork)
|
||||
this._selectedNetwork.item.actor.remove_style_pseudo_class('selected');
|
||||
this._selectedNetwork.item.remove_style_pseudo_class('selected');
|
||||
|
||||
this._selectedNetwork = network;
|
||||
this._updateSensitivity();
|
||||
|
||||
if (this._selectedNetwork)
|
||||
this._selectedNetwork.item.actor.add_style_pseudo_class('selected');
|
||||
this._selectedNetwork.item.add_style_pseudo_class('selected');
|
||||
}
|
||||
|
||||
_createNetworkItem(network) {
|
||||
network.item = new NMWirelessDialogItem(network);
|
||||
network.item.setActive(network == this._selectedNetwork);
|
||||
network.item.connect('selected', () => {
|
||||
Util.ensureActorVisibleInScrollView(this._scrollView, network.item.actor);
|
||||
Util.ensureActorVisibleInScrollView(this._scrollView, network.item);
|
||||
this._selectNetwork(network);
|
||||
});
|
||||
network.item.actor.connect('destroy', () => {
|
||||
network.item.connect('destroy', () => {
|
||||
let keyFocus = global.stage.key_focus;
|
||||
if (keyFocus && keyFocus.contains(network.item.actor))
|
||||
if (keyFocus && keyFocus.contains(network.item))
|
||||
this._itemBox.grab_key_focus();
|
||||
});
|
||||
}
|
||||
@@ -1236,7 +1237,6 @@ var NMDeviceWireless = class {
|
||||
}
|
||||
|
||||
_dialogClosed() {
|
||||
this._dialog.destroy();
|
||||
this._dialog = null;
|
||||
}
|
||||
|
||||
@@ -1262,7 +1262,7 @@ var NMDeviceWireless = class {
|
||||
|
||||
_sync() {
|
||||
this._toggleItem.label.text = this._client.wireless_enabled ? _("Turn Off") : _("Turn On");
|
||||
this._toggleItem.actor.visible = this._client.wireless_hardware_enabled;
|
||||
this._toggleItem.visible = this._client.wireless_hardware_enabled;
|
||||
|
||||
this.item.icon.icon_name = this._getMenuIcon();
|
||||
this.item.label.text = this._getStatus();
|
||||
@@ -1452,7 +1452,7 @@ var NMVpnSection = class extends NMConnectionSection {
|
||||
|
||||
_sync() {
|
||||
let nItems = this._connectionItems.size;
|
||||
this.item.actor.visible = (nItems > 0);
|
||||
this.item.visible = (nItems > 0);
|
||||
|
||||
super._sync();
|
||||
}
|
||||
@@ -1535,7 +1535,7 @@ var DeviceCategory = class extends PopupMenu.PopupMenuSection {
|
||||
|
||||
this._summaryItem.menu.addSettingsAction(_('Network Settings'),
|
||||
'gnome-network-panel.desktop');
|
||||
this._summaryItem.actor.hide();
|
||||
this._summaryItem.hide();
|
||||
|
||||
}
|
||||
|
||||
@@ -1544,7 +1544,7 @@ var DeviceCategory = class extends PopupMenu.PopupMenuSection {
|
||||
(prev, child) => prev + (child.visible ? 1 : 0), 0);
|
||||
this._summaryItem.label.text = this._getSummaryLabel(nDevices);
|
||||
let shouldSummarize = nDevices > MAX_DEVICE_ITEMS;
|
||||
this._summaryItem.actor.visible = shouldSummarize;
|
||||
this._summaryItem.visible = shouldSummarize;
|
||||
this.section.actor.visible = !shouldSummarize;
|
||||
}
|
||||
|
||||
@@ -1674,7 +1674,11 @@ var NMApplet = class extends PanelMenu.SystemIndicator {
|
||||
_readDevices() {
|
||||
let devices = this._client.get_devices() || [ ];
|
||||
for (let i = 0; i < devices.length; ++i) {
|
||||
this._deviceAdded(this._client, devices[i], true);
|
||||
try {
|
||||
this._deviceAdded(this._client, devices[i], true);
|
||||
} catch (e) {
|
||||
log(`Failed to add device ${devices[i]}: ${e}`);
|
||||
}
|
||||
}
|
||||
this._syncDeviceNames();
|
||||
}
|
||||
@@ -1727,14 +1731,24 @@ var NMApplet = class extends PanelMenu.SystemIndicator {
|
||||
this._addDeviceWrapper(wrapper);
|
||||
|
||||
this._nmDevices.push(device);
|
||||
if (!skipSyncDeviceNames)
|
||||
this._syncDeviceNames();
|
||||
this._deviceChanged(device, skipSyncDeviceNames);
|
||||
|
||||
if (wrapper instanceof NMConnectionSection) {
|
||||
this._connections.forEach(connection => {
|
||||
wrapper.checkConnection(connection);
|
||||
});
|
||||
}
|
||||
device.connect('notify::interface', () => {
|
||||
this._deviceChanged(device, false);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
_deviceChanged(device, skipSyncDeviceNames) {
|
||||
let wrapper = device._delegate;
|
||||
|
||||
if (!skipSyncDeviceNames)
|
||||
this._syncDeviceNames();
|
||||
|
||||
if (wrapper instanceof NMConnectionSection) {
|
||||
this._connections.forEach(connection => {
|
||||
wrapper.checkConnection(connection);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -61,6 +61,6 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
: _("Night Light On");
|
||||
this._disableItem.label.text = disabled ? _("Resume")
|
||||
: _("Disable Until Tomorrow");
|
||||
this._item.actor.visible = this._indicator.visible = visible;
|
||||
this._item.visible = this._indicator.visible = visible;
|
||||
}
|
||||
};
|
||||
|
@@ -96,11 +96,11 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
// Do we have batteries or a UPS?
|
||||
let visible = this._proxy.IsPresent;
|
||||
if (visible) {
|
||||
this._item.actor.show();
|
||||
this._item.show();
|
||||
this._percentageLabel.visible = this._desktopSettings.get_boolean(SHOW_BATTERY_PERCENTAGE);
|
||||
} else {
|
||||
// If there's no battery, then we use the power icon.
|
||||
this._item.actor.hide();
|
||||
this._item.hide();
|
||||
this._indicator.icon_name = 'system-shutdown-symbolic';
|
||||
this._percentageLabel.hide();
|
||||
return;
|
||||
|
@@ -53,10 +53,10 @@ var RemoteAccessApplet = class extends PanelMenu.SystemIndicator {
|
||||
_sync() {
|
||||
if (this._handles.size == 0) {
|
||||
this._indicator.visible = false;
|
||||
this._item.actor.visible = false;
|
||||
this._item.visible = false;
|
||||
} else {
|
||||
this._indicator.visible = true;
|
||||
this._item.actor.visible = true;
|
||||
this._item.visible = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -97,7 +97,7 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
let showAirplaneMode = this._manager.shouldShowAirplaneMode;
|
||||
|
||||
this._indicator.visible = (airplaneMode && showAirplaneMode);
|
||||
this._item.actor.visible = (airplaneMode && showAirplaneMode);
|
||||
this._item.visible = (airplaneMode && showAirplaneMode);
|
||||
this._offItem.setSensitive(!hwAirplaneMode);
|
||||
|
||||
if (hwAirplaneMode)
|
||||
|
@@ -116,10 +116,10 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
|
||||
this._createSubMenu();
|
||||
|
||||
this._loginScreenItem.actor.connect('notify::visible',
|
||||
() => { this._updateMultiUser(); });
|
||||
this._logoutItem.actor.connect('notify::visible',
|
||||
() => { this._updateMultiUser(); });
|
||||
this._loginScreenItem.connect('notify::visible',
|
||||
() => { this._updateMultiUser(); });
|
||||
this._logoutItem.connect('notify::visible',
|
||||
() => { this._updateMultiUser(); });
|
||||
// Whether shutdown is available or not depends on both lockdown
|
||||
// settings (disable-log-out) and Polkit policy - the latter doesn't
|
||||
// notify, so we update the menu item each time the menu opens or
|
||||
@@ -142,7 +142,7 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
this._lockScreenAction.visible ||
|
||||
this._altSwitcher.actor.visible);
|
||||
|
||||
this._actionsItem.actor.visible = visible;
|
||||
this.buttonGroup.visible = visible;
|
||||
}
|
||||
|
||||
_sessionUpdated() {
|
||||
@@ -150,10 +150,10 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
}
|
||||
|
||||
_updateMultiUser() {
|
||||
let hasSwitchUser = this._loginScreenItem.actor.visible;
|
||||
let hasLogout = this._logoutItem.actor.visible;
|
||||
let hasSwitchUser = this._loginScreenItem.visible;
|
||||
let hasLogout = this._logoutItem.visible;
|
||||
|
||||
this._switchUserSubMenu.actor.visible = hasSwitchUser || hasLogout;
|
||||
this._switchUserSubMenu.visible = hasSwitchUser || hasLogout;
|
||||
}
|
||||
|
||||
_updateSwitchUserSubMenu() {
|
||||
@@ -208,7 +208,7 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
this._switchUserSubMenu.menu.addMenuItem(item);
|
||||
this._loginScreenItem = item;
|
||||
this._systemActions.bind_property('can-switch-user',
|
||||
this._loginScreenItem.actor,
|
||||
this._loginScreenItem,
|
||||
'visible',
|
||||
bindFlags);
|
||||
|
||||
@@ -220,7 +220,7 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
this._switchUserSubMenu.menu.addMenuItem(item);
|
||||
this._logoutItem = item;
|
||||
this._systemActions.bind_property('can-logout',
|
||||
this._logoutItem.actor,
|
||||
this._logoutItem,
|
||||
'visible',
|
||||
bindFlags);
|
||||
|
||||
@@ -236,6 +236,7 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
|
||||
item = new PopupMenu.PopupBaseMenuItem({ reactive: false,
|
||||
can_focus: false });
|
||||
this.buttonGroup = item;
|
||||
|
||||
let app = this._settingsApp = Shell.AppSystem.get_default().lookup_app(
|
||||
'gnome-control-center.desktop'
|
||||
@@ -250,14 +251,14 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
log('Missing required core component Settings, expect trouble…');
|
||||
this._settingsAction = new St.Widget();
|
||||
}
|
||||
item.actor.add(this._settingsAction, { expand: true, x_fill: false });
|
||||
item.add(this._settingsAction, { expand: true, x_fill: false });
|
||||
|
||||
this._orientationLockAction = this._createActionButton('', _("Orientation Lock"));
|
||||
this._orientationLockAction.connect('clicked', () => {
|
||||
this.menu.itemActivated(BoxPointer.PopupAnimation.NONE),
|
||||
this._systemActions.activateLockOrientation();
|
||||
});
|
||||
item.actor.add(this._orientationLockAction, { expand: true, x_fill: false });
|
||||
item.add(this._orientationLockAction, { expand: true, x_fill: false });
|
||||
this._systemActions.bind_property('can-lock-orientation',
|
||||
this._orientationLockAction,
|
||||
'visible',
|
||||
@@ -272,7 +273,7 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
this.menu.itemActivated(BoxPointer.PopupAnimation.NONE);
|
||||
this._systemActions.activateLockScreen();
|
||||
});
|
||||
item.actor.add(this._lockScreenAction, { expand: true, x_fill: false });
|
||||
item.add(this._lockScreenAction, { expand: true, x_fill: false });
|
||||
this._systemActions.bind_property('can-lock-screen',
|
||||
this._lockScreenAction,
|
||||
'visible',
|
||||
@@ -299,9 +300,8 @@ var Indicator = class extends PanelMenu.SystemIndicator {
|
||||
bindFlags);
|
||||
|
||||
this._altSwitcher = new AltSwitcher(this._powerOffAction, this._suspendAction);
|
||||
item.actor.add(this._altSwitcher.actor, { expand: true, x_fill: false });
|
||||
item.add(this._altSwitcher.actor, { expand: true, x_fill: false });
|
||||
|
||||
this._actionsItem = item;
|
||||
this.menu.addMenuItem(item);
|
||||
|
||||
|
||||
|
@@ -41,12 +41,12 @@ var StreamSlider = class {
|
||||
this._slider.connect('drag-end', this._notifyVolumeChange.bind(this));
|
||||
|
||||
this._icon = new St.Icon({ style_class: 'popup-menu-icon' });
|
||||
this.item.actor.add(this._icon);
|
||||
this.item.actor.add(this._slider.actor, { expand: true });
|
||||
this.item.actor.connect('button-press-event', (actor, event) => {
|
||||
this.item.add(this._icon);
|
||||
this.item.add(this._slider.actor, { expand: true });
|
||||
this.item.connect('button-press-event', (actor, event) => {
|
||||
return this._slider.startDragging(event);
|
||||
});
|
||||
this.item.actor.connect('key-press-event', (actor, event) => {
|
||||
this.item.connect('key-press-event', (actor, event) => {
|
||||
return this._slider.onKeyPressEvent(actor, event);
|
||||
});
|
||||
|
||||
@@ -93,7 +93,7 @@ var StreamSlider = class {
|
||||
|
||||
_updateVisibility() {
|
||||
let visible = this._shouldBeVisible();
|
||||
this.item.actor.visible = visible;
|
||||
this.item.visible = visible;
|
||||
}
|
||||
|
||||
scroll(event) {
|
||||
|
@@ -30,12 +30,10 @@ function primaryModifier(mask) {
|
||||
return primary;
|
||||
}
|
||||
|
||||
var SwitcherPopup = GObject.registerClass(
|
||||
class SwitcherPopup extends St.Widget {
|
||||
var SwitcherPopup = GObject.registerClass({
|
||||
GTypeFlags: GObject.TypeFlags.ABSTRACT
|
||||
}, class SwitcherPopup extends St.Widget {
|
||||
_init(items) {
|
||||
if (new.target === SwitcherPopup)
|
||||
throw new TypeError('Cannot instantiate abstract class ' + new.target.name);
|
||||
|
||||
super._init({ style_class: 'switcher-popup',
|
||||
reactive: true,
|
||||
visible: false });
|
||||
|
@@ -152,7 +152,7 @@ function registerSpecialPropertySplitter(name, splitFunction, parameters) {
|
||||
// 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 continous
|
||||
// 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.)
|
||||
//
|
||||
|
@@ -18,7 +18,7 @@ var Avatar = class {
|
||||
this._user = user;
|
||||
params = Params.parse(params, { reactive: false,
|
||||
iconSize: AVATAR_ICON_SIZE,
|
||||
styleClass: 'framed-user-icon' });
|
||||
styleClass: 'user-icon' });
|
||||
this._iconSize = params.iconSize;
|
||||
|
||||
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
||||
@@ -46,15 +46,14 @@ var Avatar = class {
|
||||
if (iconFile) {
|
||||
let file = Gio.File.new_for_path(iconFile);
|
||||
this.actor.child = null;
|
||||
this.actor.style = 'background-image: url("%s");'.format(iconFile);
|
||||
this.actor.style = `
|
||||
background-image: url("${iconFile}");
|
||||
background-size: ${this._iconSize}px`;
|
||||
} else {
|
||||
this.actor.style = null;
|
||||
this.actor.child = new St.Icon({ icon_name: 'avatar-default-symbolic',
|
||||
icon_size: this._iconSize });
|
||||
}
|
||||
|
||||
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
||||
this.actor.set_size(this._iconSize * scaleFactor, this._iconSize * scaleFactor);
|
||||
}
|
||||
};
|
||||
|
||||
|
@@ -101,6 +101,5 @@ var Source = class WindowAttentionSource extends MessageTray.Source {
|
||||
|
||||
open() {
|
||||
Main.activateWindow(this._window);
|
||||
this.destroy();
|
||||
}
|
||||
};
|
||||
|
@@ -59,7 +59,7 @@ var DisplayChangeDialog = class extends ModalDialog.ModalDialog {
|
||||
{ x_fill: true,
|
||||
y_fill: true });
|
||||
|
||||
/* Translators: this and the following message should be limited in lenght,
|
||||
/* Translators: this and the following message should be limited in length,
|
||||
to avoid ellipsizing the labels.
|
||||
*/
|
||||
this._cancelButton = this.addButton({ label: _("Revert Settings"),
|
||||
@@ -456,13 +456,28 @@ var TilePreview = class {
|
||||
};
|
||||
|
||||
var TouchpadWorkspaceSwitchAction = class {
|
||||
constructor(actor) {
|
||||
constructor(actor, allowedModes) {
|
||||
this._allowedModes = allowedModes;
|
||||
this._dx = 0;
|
||||
this._dy = 0;
|
||||
this._enabled = true;
|
||||
actor.connect('captured-event', this._handleEvent.bind(this));
|
||||
this._touchpadSettings = new Gio.Settings({schema_id: 'org.gnome.desktop.peripherals.touchpad'});
|
||||
}
|
||||
|
||||
get enabled() {
|
||||
return this._enabled;
|
||||
}
|
||||
|
||||
set enabled(enabled) {
|
||||
if (this._enabled == enabled)
|
||||
return;
|
||||
|
||||
this._enabled = enabled;
|
||||
if (!enabled)
|
||||
this.emit('cancel');
|
||||
}
|
||||
|
||||
_checkActivated() {
|
||||
let dir;
|
||||
|
||||
@@ -482,15 +497,16 @@ var TouchpadWorkspaceSwitchAction = class {
|
||||
}
|
||||
|
||||
_handleEvent(actor, event) {
|
||||
let allowedModes = Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW;
|
||||
|
||||
if (event.type() != Clutter.EventType.TOUCHPAD_SWIPE)
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
|
||||
if (event.get_touchpad_gesture_finger_count() != 4)
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
|
||||
if ((allowedModes & Main.actionMode) == 0)
|
||||
if ((this._allowedModes & Main.actionMode) == 0)
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
|
||||
if (!this._enabled)
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
|
||||
if (event.get_gesture_phase() == Clutter.TouchpadGesturePhase.UPDATE) {
|
||||
@@ -523,10 +539,11 @@ var WorkspaceSwitchAction = GObject.registerClass({
|
||||
'motion': { param_types: [GObject.TYPE_DOUBLE, GObject.TYPE_DOUBLE] },
|
||||
'cancel': { param_types: [] }},
|
||||
}, class WorkspaceSwitchAction extends Clutter.SwipeAction {
|
||||
_init() {
|
||||
_init(allowedModes) {
|
||||
super._init();
|
||||
this.set_n_touch_points(4);
|
||||
this._swept = false;
|
||||
this._allowedModes = allowedModes;
|
||||
|
||||
global.display.connect('grab-op-begin', () => {
|
||||
this.cancel();
|
||||
@@ -534,14 +551,12 @@ var WorkspaceSwitchAction = GObject.registerClass({
|
||||
}
|
||||
|
||||
vfunc_gesture_prepare(actor) {
|
||||
let allowedModes = Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW;
|
||||
|
||||
this._swept = false;
|
||||
|
||||
if (!super.vfunc_gesture_prepare(actor))
|
||||
return false;
|
||||
|
||||
return (allowedModes & Main.actionMode);
|
||||
return (this._allowedModes & Main.actionMode);
|
||||
}
|
||||
|
||||
vfunc_gesture_progress(actor) {
|
||||
@@ -1043,14 +1058,15 @@ var WindowManager = class {
|
||||
global.workspace_manager.override_workspace_layout(Meta.DisplayCorner.TOPLEFT,
|
||||
false, -1, 1);
|
||||
|
||||
let gesture = new WorkspaceSwitchAction();
|
||||
let allowedModes = Shell.ActionMode.NORMAL;
|
||||
let gesture = new WorkspaceSwitchAction(allowedModes);
|
||||
gesture.connect('motion', this._switchWorkspaceMotion.bind(this));
|
||||
gesture.connect('activated', this._actionSwitchWorkspace.bind(this));
|
||||
gesture.connect('cancel', this._switchWorkspaceCancel.bind(this));
|
||||
global.stage.add_action(gesture);
|
||||
|
||||
// This is not a normal Clutter.GestureAction, doesn't need add_action()
|
||||
gesture = new TouchpadWorkspaceSwitchAction(global.stage);
|
||||
gesture = new TouchpadWorkspaceSwitchAction(global.stage, allowedModes);
|
||||
gesture.connect('motion', this._switchWorkspaceMotion.bind(this));
|
||||
gesture.connect('activated', this._actionSwitchWorkspace.bind(this));
|
||||
gesture.connect('cancel', this._switchWorkspaceCancel.bind(this));
|
||||
@@ -1202,6 +1218,10 @@ var WindowManager = class {
|
||||
// Same for OR windows
|
||||
if (window.is_override_redirect())
|
||||
return;
|
||||
// Sticky windows don't need moving, in fact moving would
|
||||
// unstick them
|
||||
if (window.on_all_workspaces)
|
||||
return;
|
||||
// Windows on workspaces below pos don't need moving
|
||||
let index = window.get_workspace().index();
|
||||
if (index < pos)
|
||||
@@ -1468,8 +1488,13 @@ var WindowManager = class {
|
||||
if (this._clearAnimationInfo(actor))
|
||||
this._shellwm.completed_size_change(actor);
|
||||
|
||||
let destroyId = actor.connect('destroy', () => {
|
||||
this._clearAnimationInfo(actor);
|
||||
});
|
||||
|
||||
actor.__animationInfo = { clone: actorClone,
|
||||
oldRect: oldFrameRect };
|
||||
oldRect: oldFrameRect,
|
||||
destroyId: destroyId };
|
||||
}
|
||||
|
||||
_sizeChangedWindow(shellwm, actor) {
|
||||
@@ -1530,6 +1555,7 @@ var WindowManager = class {
|
||||
_clearAnimationInfo(actor) {
|
||||
if (actor.__animationInfo) {
|
||||
actor.__animationInfo.clone.destroy();
|
||||
actor.disconnect(actor.__animationInfo.destroyId);
|
||||
delete actor.__animationInfo;
|
||||
return true;
|
||||
}
|
||||
@@ -1844,17 +1870,25 @@ var WindowManager = class {
|
||||
}
|
||||
}
|
||||
|
||||
_getPositionForDirection(direction) {
|
||||
_getPositionForDirection(direction, fromWs, toWs) {
|
||||
let xDest = 0, yDest = 0;
|
||||
|
||||
let oldWsIsFullscreen = fromWs.list_windows().some(w => w.is_fullscreen());
|
||||
let newWsIsFullscreen = toWs.list_windows().some(w => w.is_fullscreen());
|
||||
|
||||
// We have to shift windows up or down by the height of the panel to prevent having a
|
||||
// visible gap between the windows while switching workspaces. Since fullscreen windows
|
||||
// hide the panel, they don't need to be shifted up or down.
|
||||
let shiftHeight = Main.panel.height;
|
||||
|
||||
if (direction == Meta.MotionDirection.UP ||
|
||||
direction == Meta.MotionDirection.UP_LEFT ||
|
||||
direction == Meta.MotionDirection.UP_RIGHT)
|
||||
yDest = -global.screen_height + Main.panel.height;
|
||||
yDest = -global.screen_height + (oldWsIsFullscreen ? 0 : shiftHeight);
|
||||
else if (direction == Meta.MotionDirection.DOWN ||
|
||||
direction == Meta.MotionDirection.DOWN_LEFT ||
|
||||
direction == Meta.MotionDirection.DOWN_RIGHT)
|
||||
yDest = global.screen_height - Main.panel.height;
|
||||
yDest = global.screen_height - (newWsIsFullscreen ? 0 : shiftHeight);
|
||||
|
||||
if (direction == Meta.MotionDirection.LEFT ||
|
||||
direction == Meta.MotionDirection.UP_LEFT ||
|
||||
@@ -1912,7 +1946,7 @@ var WindowManager = class {
|
||||
switchData.container.add_actor(info.actor);
|
||||
info.actor.raise_top();
|
||||
|
||||
let [x, y] = this._getPositionForDirection(dir);
|
||||
let [x, y] = this._getPositionForDirection(dir, curWs, ws);
|
||||
info.actor.set_position(x, y);
|
||||
}
|
||||
|
||||
@@ -1998,7 +2032,11 @@ var WindowManager = class {
|
||||
|
||||
this._switchData.inProgress = true;
|
||||
|
||||
let [xDest, yDest] = this._getPositionForDirection(direction);
|
||||
let workspaceManager = global.workspace_manager;
|
||||
let fromWs = workspaceManager.get_workspace_by_index(from);
|
||||
let toWs = workspaceManager.get_workspace_by_index(to);
|
||||
|
||||
let [xDest, yDest] = this._getPositionForDirection(direction, fromWs, toWs);
|
||||
|
||||
/* @direction is the direction that the "camera" moves, so the
|
||||
* screen contents have to move one screen's worth in the
|
||||
|
@@ -173,7 +173,7 @@ var WindowMenu = class extends PopupMenu.PopupMenu {
|
||||
|
||||
var WindowMenuManager = class {
|
||||
constructor() {
|
||||
this._manager = new PopupMenu.PopupMenuManager({ actor: Main.layoutManager.dummyCursor });
|
||||
this._manager = new PopupMenu.PopupMenuManager(Main.layoutManager.dummyCursor);
|
||||
|
||||
this._sourceActor = new St.Widget({ reactive: true, visible: false });
|
||||
this._sourceActor.connect('button-press-event', () => {
|
||||
|
@@ -786,8 +786,8 @@ var WindowPositionFlags = {
|
||||
|
||||
var LayoutStrategy = class {
|
||||
constructor(monitor, rowSpacing, columnSpacing) {
|
||||
if (new.target === LayoutStrategy)
|
||||
throw new TypeError('Cannot instantiate abstract type ' + new.target.name);
|
||||
if (this.constructor === LayoutStrategy)
|
||||
throw new TypeError(`Cannot instantiate abstract type ${this.constructor.name}`);
|
||||
|
||||
this._monitor = monitor;
|
||||
this._rowSpacing = rowSpacing;
|
||||
@@ -813,7 +813,7 @@ var LayoutStrategy = class {
|
||||
}
|
||||
|
||||
// Computes and returns an individual scaling factor for @window,
|
||||
// to be applied in addition to the overal layout scale.
|
||||
// to be applied in addition to the overall layout scale.
|
||||
_computeWindowScale(window) {
|
||||
// Since we align windows next to each other, the height of the
|
||||
// thumbnails is much more important to preserve than the width of
|
||||
@@ -1266,7 +1266,7 @@ var Workspace = class {
|
||||
}
|
||||
|
||||
// We will reposition windows anyway when enter again overview or when ending the windows
|
||||
// animations whith fade animation.
|
||||
// animations with fade animation.
|
||||
// In this way we avoid unwanted animations of windows repositioning while
|
||||
// animating overview.
|
||||
if (this.leavingOverview || this._animatingWindowsFade)
|
||||
@@ -1886,10 +1886,10 @@ var Workspace = class {
|
||||
// Win win -- better scale and better space
|
||||
return true;
|
||||
} else if (newLayout.scale > oldLayout.scale && newLayout.space <= oldLayout.space) {
|
||||
// Keep new layout only if scale gain outweights aspect space loss
|
||||
// Keep new layout only if scale gain outweighs aspect space loss
|
||||
return scalePower > spacePower;
|
||||
} else if (newLayout.scale <= oldLayout.scale && newLayout.space > oldLayout.space) {
|
||||
// Keep new layout only if aspect space gain outweights scale loss
|
||||
// Keep new layout only if aspect space gain outweighs scale loss
|
||||
return spacePower > scalePower;
|
||||
} else {
|
||||
// Lose -- worse scale and space
|
||||
|
@@ -85,8 +85,6 @@ class WorkspaceSwitcherPopup extends St.Widget {
|
||||
height: global.screen_height,
|
||||
style_class: 'workspace-switcher-group' });
|
||||
|
||||
this.actor = this;
|
||||
|
||||
Main.uiGroup.add_actor(this);
|
||||
|
||||
this._timeoutId = 0;
|
||||
@@ -142,7 +140,7 @@ class WorkspaceSwitcherPopup extends St.Widget {
|
||||
time: ANIMATION_TIME,
|
||||
transition: 'easeOutQuad'
|
||||
});
|
||||
this.actor.show();
|
||||
this.show();
|
||||
}
|
||||
|
||||
display(direction, activeWorkspaceIndex) {
|
||||
|
@@ -601,8 +601,7 @@ class ThumbnailsBox extends St.Widget {
|
||||
style_class: 'workspace-thumbnails',
|
||||
request_mode: Clutter.RequestMode.WIDTH_FOR_HEIGHT });
|
||||
|
||||
this.actor = this;
|
||||
this.actor._delegate = this;
|
||||
this._delegate = this;
|
||||
|
||||
let indicator = new St.Bin({ style_class: 'workspace-thumbnail-indicator' });
|
||||
|
||||
|
@@ -1,10 +1,11 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
|
||||
const { Clutter, Gio, GObject, Meta, St } = imports.gi;
|
||||
const { Clutter, Gio, GObject, Meta, Shell, St } = imports.gi;
|
||||
const Signals = imports.signals;
|
||||
|
||||
const Main = imports.ui.main;
|
||||
const Tweener = imports.ui.tweener;
|
||||
const WindowManager = imports.ui.windowManager;
|
||||
const Workspace = imports.ui.workspace;
|
||||
|
||||
var WORKSPACE_SWITCH_TIME = 0.25;
|
||||
@@ -82,7 +83,8 @@ var WorkspacesView = class extends WorkspacesViewBase {
|
||||
|
||||
this._animating = false; // tweening
|
||||
this._scrolling = false; // swipe-scrolling
|
||||
this._animatingScroll = false; // programatically updating the adjustment
|
||||
this._gestureActive = false; // touch(pad) gestures
|
||||
this._animatingScroll = false; // programmatically updating the adjustment
|
||||
|
||||
let activeWorkspaceIndex = workspaceManager.get_active_workspace_index();
|
||||
this.scrollAdjustment = new St.Adjustment({ value: activeWorkspaceIndex,
|
||||
@@ -211,7 +213,7 @@ var WorkspacesView = class extends WorkspacesViewBase {
|
||||
|
||||
for (let w = 0; w < this._workspaces.length; w++) {
|
||||
let workspace = this._workspaces[w];
|
||||
if (this._animating || this._scrolling) {
|
||||
if (this._animating || this._scrolling || this._gestureActive) {
|
||||
workspace.actor.show();
|
||||
} else {
|
||||
if (this._inDrag)
|
||||
@@ -223,7 +225,7 @@ var WorkspacesView = class extends WorkspacesViewBase {
|
||||
}
|
||||
|
||||
_updateScrollAdjustment(index) {
|
||||
if (this._scrolling)
|
||||
if (this._scrolling || this._gestureActive)
|
||||
return;
|
||||
|
||||
this._animatingScroll = true;
|
||||
@@ -300,6 +302,18 @@ var WorkspacesView = class extends WorkspacesViewBase {
|
||||
this._updateVisibility();
|
||||
}
|
||||
|
||||
startTouchGesture() {
|
||||
this._gestureActive = true;
|
||||
}
|
||||
|
||||
endTouchGesture() {
|
||||
this._gestureActive = false;
|
||||
|
||||
// Make sure title captions etc are shown as necessary
|
||||
this._scrollToActive();
|
||||
this._updateVisibility();
|
||||
}
|
||||
|
||||
// sync the workspaces' positions to the value of the scroll adjustment
|
||||
// and change the active workspace if appropriate
|
||||
_onScroll(adj) {
|
||||
@@ -310,7 +324,7 @@ var WorkspacesView = class extends WorkspacesViewBase {
|
||||
let active = workspaceManager.get_active_workspace_index();
|
||||
let current = Math.round(adj.value);
|
||||
|
||||
if (active != current) {
|
||||
if (active != current && !this._gestureActive) {
|
||||
if (!this._workspaces[current]) {
|
||||
// The current workspace was destroyed. This could happen
|
||||
// when you are on the last empty workspace, and consolidate
|
||||
@@ -391,6 +405,12 @@ var ExtraWorkspaceView = class extends WorkspacesViewBase {
|
||||
|
||||
endSwipeScroll() {
|
||||
}
|
||||
|
||||
startTouchGesture() {
|
||||
}
|
||||
|
||||
endTouchGesture() {
|
||||
}
|
||||
};
|
||||
|
||||
var DelegateFocusNavigator = GObject.registerClass(
|
||||
@@ -430,27 +450,41 @@ var WorkspacesDisplay = class {
|
||||
return false;
|
||||
}
|
||||
|
||||
for (let i = 0; i < this._workspacesViews.length; i++)
|
||||
this._workspacesViews[i].startSwipeScroll();
|
||||
this._startSwipeScroll();
|
||||
return true;
|
||||
});
|
||||
panAction.connect('gesture-cancel', () => {
|
||||
clickAction.release();
|
||||
for (let i = 0; i < this._workspacesViews.length; i++)
|
||||
this._workspacesViews[i].endSwipeScroll();
|
||||
this._endSwipeScroll();
|
||||
});
|
||||
panAction.connect('gesture-end', () => {
|
||||
clickAction.release();
|
||||
for (let i = 0; i < this._workspacesViews.length; i++)
|
||||
this._workspacesViews[i].endSwipeScroll();
|
||||
this._endSwipeScroll();
|
||||
});
|
||||
Main.overview.addAction(panAction);
|
||||
this.actor.bind_property('mapped', panAction, 'enabled', GObject.BindingFlags.SYNC_CREATE);
|
||||
|
||||
let allowedModes = Shell.ActionMode.OVERVIEW;
|
||||
let switchGesture = new WindowManager.WorkspaceSwitchAction(allowedModes);
|
||||
switchGesture.connect('motion', this._onSwitchWorkspaceMotion.bind(this));
|
||||
switchGesture.connect('activated', this._onSwitchWorkspaceActivated.bind(this));
|
||||
switchGesture.connect('cancel', this._endTouchGesture.bind(this));
|
||||
Main.overview.addAction(switchGesture);
|
||||
this.actor.bind_property('mapped', switchGesture, 'enabled', GObject.BindingFlags.SYNC_CREATE);
|
||||
|
||||
switchGesture = new WindowManager.TouchpadWorkspaceSwitchAction(global.stage, allowedModes);
|
||||
switchGesture.connect('motion', this._onSwitchWorkspaceMotion.bind(this));
|
||||
switchGesture.connect('activated', this._onSwitchWorkspaceActivated.bind(this));
|
||||
switchGesture.connect('cancel', this._endTouchGesture.bind(this));
|
||||
this.actor.connect('notify::mapped', () => {
|
||||
switchGesture.enabled = this.actor.mapped;
|
||||
});
|
||||
|
||||
this._primaryIndex = Main.layoutManager.primaryIndex;
|
||||
|
||||
this._workspacesViews = [];
|
||||
this._primaryScrollAdjustment = null;
|
||||
switchGesture.enabled = this.actor.mapped;
|
||||
|
||||
this._settings = new Gio.Settings({ schema_id: MUTTER_SCHEMA });
|
||||
this._settings.connect('changed::workspaces-only-on-primary',
|
||||
@@ -474,6 +508,47 @@ var WorkspacesDisplay = class {
|
||||
return false;
|
||||
}
|
||||
|
||||
_startSwipeScroll() {
|
||||
for (let i = 0; i < this._workspacesViews.length; i++)
|
||||
this._workspacesViews[i].startSwipeScroll();
|
||||
}
|
||||
|
||||
_endSwipeScroll() {
|
||||
for (let i = 0; i < this._workspacesViews.length; i++)
|
||||
this._workspacesViews[i].endSwipeScroll();
|
||||
}
|
||||
|
||||
_startTouchGesture() {
|
||||
for (let i = 0; i < this._workspacesViews.length; i++)
|
||||
this._workspacesViews[i].startTouchGesture();
|
||||
}
|
||||
|
||||
_endTouchGesture() {
|
||||
for (let i = 0; i < this._workspacesViews.length; i++)
|
||||
this._workspacesViews[i].endTouchGesture();
|
||||
}
|
||||
|
||||
_onSwitchWorkspaceMotion(action, xRel, yRel) {
|
||||
// We don't have a way to hook into start of touchpad actions,
|
||||
// luckily this is safe to call repeatedly.
|
||||
this._startTouchGesture();
|
||||
|
||||
let workspaceManager = global.workspace_manager;
|
||||
let active = workspaceManager.get_active_workspace_index();
|
||||
let adjustment = this._scrollAdjustment;
|
||||
adjustment.value = (active - yRel / this.actor.height) * adjustment.page_size;
|
||||
}
|
||||
|
||||
_onSwitchWorkspaceActivated(action, direction) {
|
||||
let workspaceManager = global.workspace_manager;
|
||||
let activeWorkspace = workspaceManager.get_active_workspace();
|
||||
let newWs = activeWorkspace.get_neighbor(direction);
|
||||
if (newWs != activeWorkspace)
|
||||
newWs.activate(global.get_current_time());
|
||||
|
||||
this._endTouchGesture();
|
||||
}
|
||||
|
||||
navigateFocus(from, direction) {
|
||||
return this._getPrimaryView().actor.navigate_focus(from, direction, false);
|
||||
}
|
||||
|
52
meson.build
52
meson.build
@@ -1,5 +1,5 @@
|
||||
project('gnome-shell', 'c',
|
||||
version: '3.31.91',
|
||||
version: '3.33.1',
|
||||
meson_version: '>= 0.47.0',
|
||||
license: 'GPLv2+'
|
||||
)
|
||||
@@ -14,16 +14,16 @@ cogl_pango_pc = 'mutter-cogl-pango-' + mutter_api_version
|
||||
libmutter_pc = 'libmutter-' + mutter_api_version
|
||||
|
||||
croco_req = '>= 0.6.8'
|
||||
ecal_req = '>= 3.5.3'
|
||||
ecal_req = '>= 3.33.1'
|
||||
eds_req = '>= 3.17.2'
|
||||
gcr_req = '>= 3.7.5'
|
||||
gdesktop_req = '>= 3.7.90'
|
||||
gio_req = '>= 2.56.0'
|
||||
gi_req = '>= 1.49.1'
|
||||
gjs_req = '>= 1.47.0'
|
||||
gjs_req = '>= 1.54.0'
|
||||
gtk_req = '>= 3.15.0'
|
||||
json_glib_req = '>= 0.13.2'
|
||||
mutter_req = '>= 3.31.91'
|
||||
mutter_req = '>= 3.33.1'
|
||||
polkit_req = '>= 0.100'
|
||||
schemas_req = '>= 3.27.90'
|
||||
startup_req = '>= 0.11'
|
||||
@@ -73,7 +73,7 @@ else
|
||||
endif
|
||||
|
||||
atk_bridge_dep = dependency('atk-bridge-2.0')
|
||||
ecal_dep = dependency('libecal-1.2', version: ecal_req)
|
||||
ecal_dep = dependency('libecal-2.0', version: ecal_req)
|
||||
eds_dep = dependency('libedataserver-1.2', version: eds_req)
|
||||
gcr_dep = dependency('gcr-base-3', version: gcr_req)
|
||||
gdk_x11_dep = dependency('gdk-x11-3.0')
|
||||
@@ -167,6 +167,48 @@ cdata.set('HAVE_FDWALK',
|
||||
cc.has_function('fdwalk')
|
||||
)
|
||||
|
||||
all_warnings = [
|
||||
'-fno-strict-aliasing',
|
||||
'-Wpointer-arith',
|
||||
'-Wmissing-declarations',
|
||||
'-Wimplicit-function-declaration',
|
||||
'-Wformat=2',
|
||||
'-Wformat-nonliteral',
|
||||
'-Wformat-security',
|
||||
'-Wstrict-prototypes',
|
||||
'-Wmissing-prototypes',
|
||||
'-Wnested-externs',
|
||||
'-Wold-style-definition',
|
||||
'-Wundef',
|
||||
'-Wunused',
|
||||
'-Wcast-align',
|
||||
'-Wmissing-noreturn',
|
||||
'-Wmissing-format-attribute',
|
||||
'-Wmissing-include-dirs',
|
||||
'-Wlogical-op',
|
||||
'-Wignored-qualifiers',
|
||||
'-Werror=redundant-decls',
|
||||
'-Werror=implicit',
|
||||
'-Werror=nonnull',
|
||||
'-Werror=init-self',
|
||||
'-Werror=main',
|
||||
'-Werror=missing-braces',
|
||||
'-Werror=sequence-point',
|
||||
'-Werror=return-type',
|
||||
'-Werror=trigraphs',
|
||||
'-Werror=array-bounds',
|
||||
'-Werror=write-strings',
|
||||
'-Werror=address',
|
||||
'-Werror=int-to-pointer-cast',
|
||||
'-Werror=pointer-to-int-cast',
|
||||
'-Werror=empty-body',
|
||||
'-Werror=write-strings',
|
||||
]
|
||||
|
||||
supported_warnings = cc.get_supported_arguments(all_warnings)
|
||||
|
||||
add_project_arguments(supported_warnings, language: 'c')
|
||||
|
||||
config_h = configure_file(
|
||||
input: 'config.h.meson',
|
||||
output: 'config.h',
|
||||
|
2
po/af.po
2
po/af.po
@@ -330,7 +330,7 @@ msgstr "Netwerkaanmelding"
|
||||
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
|
||||
#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9
|
||||
msgid "network-workgroup"
|
||||
msgstr "netwerk-werkgroep"
|
||||
msgstr "network-workgroup"
|
||||
|
||||
#: js/extensionPrefs/main.js:120
|
||||
#, javascript-format
|
||||
|
1043
po/en_GB.po
1043
po/en_GB.po
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user