Compare commits
213 Commits
Author | SHA1 | Date | |
---|---|---|---|
bb6d9734e4 | |||
53be76c9e2 | |||
be40de5a9b | |||
7359e431d3 | |||
8a5de327bb | |||
1778adae0d | |||
0d035a4e53 | |||
46874eed05 | |||
e95f3febd6 | |||
0bdd1b6fc4 | |||
8a22092632 | |||
915415d919 | |||
14d7897a93 | |||
1398aa6562 | |||
8fcd6c7153 | |||
6ed5bc2f6c | |||
5ec4c2e43e | |||
6f8dd065a4 | |||
02db21fc55 | |||
8c28f9a77d | |||
95b80eec01 | |||
02c76695e5 | |||
d5a1a888d9 | |||
6c33aff6d1 | |||
61f86cbc54 | |||
4c5206954a | |||
8fda3116f0 | |||
7ac35c644e | |||
29b04fcbf2 | |||
55235c2552 | |||
f250643385 | |||
d008c6c5c5 | |||
e2e02c9a2f | |||
e56d7f5021 | |||
e7d44bb349 | |||
321730fcb9 | |||
fe83cd91bb | |||
0b08ee54bb | |||
f6b4b96737 | |||
b87455c089 | |||
2c1a81f448 | |||
b3736f45e6 | |||
3c382c4bbe | |||
5f3bad9c94 | |||
6970f43e66 | |||
9476aa598a | |||
69725e5d41 | |||
42dabef8c7 | |||
e10a768ddb | |||
a8f0787c91 | |||
074129682b | |||
c67460a1e3 | |||
eab320dab5 | |||
04c7cb6fbe | |||
d4582491f5 | |||
0641b1e279 | |||
ae0450b68e | |||
cb0a5de83b | |||
2f5086efaf | |||
68e580e394 | |||
b143869d5d | |||
6a477be874 | |||
03bb8cdcbd | |||
8864816b94 | |||
751cd2f1c1 | |||
6f6b6fb9d6 | |||
fe346b89f0 | |||
0744c6af2e | |||
2e070ab834 | |||
00f9b7bf69 | |||
94ba52af0c | |||
44e1a6ce06 | |||
ccf646f54a | |||
4e84b46c9b | |||
b4797956c7 | |||
c1c45f95af | |||
ac09e0110a | |||
0e37cd2ec9 | |||
76dc77f617 | |||
cb4c0d32c0 | |||
3d4ba028c4 | |||
5481c1899f | |||
2fd120162f | |||
523ba5a719 | |||
07d25cd69d | |||
520cea9394 | |||
58c4212cfa | |||
7059e31f6a | |||
a9234f7631 | |||
1e5a8b0cd7 | |||
5ef343f245 | |||
22e33b4c47 | |||
5ace4682bf | |||
14d9839ed3 | |||
3b6fae582b | |||
3cbdf4f9a5 | |||
d8825e0d12 | |||
3c5fea59df | |||
443c8347ea | |||
ee3f52c097 | |||
4b01bb6f99 | |||
27ef8154dc | |||
0a7e717e0e | |||
2d2824b947 | |||
40c2a403ac | |||
238b87d386 | |||
8c01d341c7 | |||
866629b3d3 | |||
2b3ab3ecec | |||
759120b95f | |||
de0e21612c | |||
83e83444db | |||
5060aee7b2 | |||
12bace2721 | |||
2c45b5416e | |||
96c2473317 | |||
6359d6ef30 | |||
2f6323afc2 | |||
d25bcbc3a7 | |||
dd5d7d3b70 | |||
771b1a0788 | |||
5a9d094f3e | |||
9ca8433170 | |||
0ada312748 | |||
88697add1b | |||
4730b7a094 | |||
aa3e64aec3 | |||
af26e2b212 | |||
8167f20972 | |||
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 |
@ -15,8 +15,10 @@ variables:
|
|||||||
- merge_requests
|
- merge_requests
|
||||||
|
|
||||||
check_commit_log:
|
check_commit_log:
|
||||||
image: registry.gitlab.gnome.org/gnome/mutter/master:v1
|
image: registry.gitlab.gnome.org/gnome/mutter/master:v2
|
||||||
stage: review
|
stage: review
|
||||||
|
variables:
|
||||||
|
GIT_DEPTH: "100"
|
||||||
script:
|
script:
|
||||||
- ./.gitlab-ci/check-commit-log.sh
|
- ./.gitlab-ci/check-commit-log.sh
|
||||||
only:
|
only:
|
||||||
@ -38,7 +40,7 @@ js_check:
|
|||||||
when: on_failure
|
when: on_failure
|
||||||
|
|
||||||
build:
|
build:
|
||||||
image: registry.gitlab.gnome.org/gnome/gnome-shell/master:v1
|
image: registry.gitlab.gnome.org/gnome/mutter/master:v2
|
||||||
stage: build
|
stage: build
|
||||||
before_script:
|
before_script:
|
||||||
- .gitlab-ci/checkout-mutter.sh
|
- .gitlab-ci/checkout-mutter.sh
|
||||||
@ -56,7 +58,7 @@ build:
|
|||||||
- build
|
- build
|
||||||
|
|
||||||
test:
|
test:
|
||||||
image: registry.gitlab.gnome.org/gnome/gnome-shell/master:v1
|
image: registry.gitlab.gnome.org/gnome/mutter/master:v2
|
||||||
stage: test
|
stage: test
|
||||||
before_script:
|
before_script:
|
||||||
- ninja -C mutter/build install
|
- ninja -C mutter/build install
|
||||||
@ -70,7 +72,7 @@ test:
|
|||||||
when: on_failure
|
when: on_failure
|
||||||
|
|
||||||
test-pot:
|
test-pot:
|
||||||
image: registry.gitlab.gnome.org/gnome/gnome-shell/master:v1
|
image: registry.gitlab.gnome.org/gnome/mutter/master:v2
|
||||||
stage: test
|
stage: test
|
||||||
before_script:
|
before_script:
|
||||||
- ninja -C mutter/build install
|
- ninja -C mutter/build install
|
||||||
|
@ -1,19 +0,0 @@
|
|||||||
FROM registry.gitlab.gnome.org/gnome/mutter/master:v1
|
|
||||||
|
|
||||||
RUN dnf -y update && dnf -y upgrade && \
|
|
||||||
dnf install -y 'dnf-command(copr)' && \
|
|
||||||
dnf copr enable -y fmuellner/gnome-shell-ci && \
|
|
||||||
dnf builddep -y gnome-shell --setopt=install_weak_deps=False && \
|
|
||||||
|
|
||||||
# bt only exports HAVE_BLUETOOTH to js, rest are outdated build-requires
|
|
||||||
dnf remove -y gnome-bluetooth-libs-devel dbus-glib-devel \
|
|
||||||
upower-devel python3-devel && \
|
|
||||||
|
|
||||||
# We'll build mutter ourselves
|
|
||||||
dnf remove -y --noautoremove mutter mutter-devel && \
|
|
||||||
|
|
||||||
# Needed for tests
|
|
||||||
dnf install -y '*/xvfb-run' gdm-lib accountsservice-libs && \
|
|
||||||
|
|
||||||
dnf clean all && \
|
|
||||||
rm -rf /var/cache/dnf
|
|
@ -17,15 +17,19 @@ if [ "$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" ]; then
|
|||||||
merge_request_branch=$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME
|
merge_request_branch=$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME
|
||||||
|
|
||||||
echo Looking for $merge_request_branch on remote ...
|
echo Looking for $merge_request_branch on remote ...
|
||||||
if git fetch $merge_request_remote $merge_request_branch >/dev/null 2>&1; then
|
if git fetch -q $merge_request_remote $merge_request_branch 2>/dev/null; then
|
||||||
mutter_target=FETCH_HEAD
|
mutter_target=FETCH_HEAD
|
||||||
|
else
|
||||||
|
mutter_target=origin/$CI_MERGE_REQUEST_TARGET_BRANCH_NAME
|
||||||
|
echo Using $mutter_target instead
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -z "$mutter_target" ]; then
|
if [ -z "$mutter_target" ]; then
|
||||||
mutter_target=$(git branch -r -l $shell_branch)
|
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}
|
mutter_target=${mutter_target:-origin/master}
|
||||||
echo Using $mutter_target instead
|
echo Using $mutter_target instead
|
||||||
fi
|
fi
|
||||||
|
|
||||||
git checkout $mutter_target
|
git checkout -q $mutter_target
|
||||||
|
73
NEWS
@ -1,3 +1,76 @@
|
|||||||
|
3.33.3
|
||||||
|
======
|
||||||
|
* Prepare for optional X11 [Carlos; !378]
|
||||||
|
* Fix opening window menu [Marco; !557]
|
||||||
|
* Reload search providers when installed applications change [Cosimo; !562]
|
||||||
|
* Implement locate-pointer accessibility feature [Olivier; #981]
|
||||||
|
* Allow to disable window menus via session mode [Cosimo; !569]
|
||||||
|
* Implement mouse accessibility [Olivier; !474]
|
||||||
|
* Call GDM's RegisterSession() after startup [Iain; !570]
|
||||||
|
* Fix extended keys popups being hidden by on-screen keyboard [Marco; !583]
|
||||||
|
* Fix top bar being hidden by lock screen [Jonas; !571]
|
||||||
|
* Update theme to better match GTK's Adwaita [Frederik; #841]
|
||||||
|
* Set up GJS profiler when GJS_TRACE_FD is set [Christian; !573]
|
||||||
|
* Misc. bug fixes and cleanups [Jonas, Cosimo, Robert, Florian, Marco, Simon,
|
||||||
|
Laurent, Niels, Will; !551, !555, !464, #1333, !565, !572, !568, !558, #1205,
|
||||||
|
#1336, !579, !576, #1392, !582, !586, #1406, #1351]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Laurent Bigonville, Cosimo Cecchi, Piotr Drąg, Jonas Dreßler,
|
||||||
|
Frederik Feichtmeier, Olivier Fourdan, Carlos Garnacho, Niels De Graef,
|
||||||
|
Christian Hergert, Iain Lane, Robert Mader, Florian Müllner, Simon Schampijer,
|
||||||
|
Jakub Steiner, Will Thompson, Marco Trevisan (Treviño)
|
||||||
|
|
||||||
|
Translators:
|
||||||
|
Kukuh Syafaat [id], Balázs Meskó [hu], Daniel Mustieles [es],
|
||||||
|
Fabio Tomat [fur], Nathan Follens [nl], Goran Vidović [hr], Jordi Mas [ca]
|
||||||
|
|
||||||
|
3.33.2
|
||||||
|
======
|
||||||
|
* Fix keeping actors visible in scrollviews [Marco; #1061]
|
||||||
|
* Move some chrome above popup windows [Jonas D.; !358]
|
||||||
|
* Include 'sandboxed-app-id' in winodw introspection info [Florian; #1289]
|
||||||
|
* Port to libecal-2.0 [Milan; !501]
|
||||||
|
* Support TCRYPT in mount password dialog [segfault; !126]
|
||||||
|
* Misc. bug fixes and cleanups [Florian, Marco, Veerasamy; !517, #745, !499,
|
||||||
|
!510, !515, !546, !549]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Cosimo Cecchi, Milan Crha, Jonas Dreßler, Florian Müllner, segfault,
|
||||||
|
Veerasamy Sevagen, Marco Trevisan (Treviño)
|
||||||
|
|
||||||
|
Translators:
|
||||||
|
Daniel Mustieles [es]
|
||||||
|
|
||||||
|
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
|
3.32.1
|
||||||
======
|
======
|
||||||
* Fix avatar scaling on login screen [Florian; #1024]
|
* Fix avatar scaling on login screen [Florian; #1024]
|
||||||
|
@ -20,10 +20,16 @@
|
|||||||
<file>no-notifications.svg</file>
|
<file>no-notifications.svg</file>
|
||||||
<file>noise-texture.png</file>
|
<file>noise-texture.png</file>
|
||||||
<file>pad-osd.css</file>
|
<file>pad-osd.css</file>
|
||||||
|
<file alias="icons/pointer-double-click-symbolic.svg">pointer-double-click-symbolic.svg</file>
|
||||||
|
<file alias="icons/pointer-drag-symbolic.svg">pointer-drag-symbolic.svg</file>
|
||||||
|
<file alias="icons/pointer-primary-click-symbolic.svg">pointer-primary-click-symbolic.svg</file>
|
||||||
|
<file alias="icons/pointer-secondary-click-symbolic.svg">pointer-secondary-click-symbolic.svg</file>
|
||||||
<file>process-working.svg</file>
|
<file>process-working.svg</file>
|
||||||
<file>toggle-off-intl.svg</file>
|
<file>toggle-off.svg</file>
|
||||||
|
<file>toggle-off-dark.svg</file>
|
||||||
<file>toggle-off-hc.svg</file>
|
<file>toggle-off-hc.svg</file>
|
||||||
<file>toggle-on-intl.svg</file>
|
<file>toggle-on.svg</file>
|
||||||
|
<file>toggle-on-dark.svg</file>
|
||||||
<file>toggle-on-hc.svg</file>
|
<file>toggle-on-hc.svg</file>
|
||||||
</gresource>
|
</gresource>
|
||||||
</gresources>
|
</gresources>
|
||||||
|
@ -99,7 +99,6 @@
|
|||||||
</description>
|
</description>
|
||||||
</key>
|
</key>
|
||||||
<child name="keybindings" schema="org.gnome.shell.keybindings"/>
|
<child name="keybindings" schema="org.gnome.shell.keybindings"/>
|
||||||
<child name="keyboard" schema="org.gnome.shell.keyboard"/>
|
|
||||||
</schema>
|
</schema>
|
||||||
|
|
||||||
<schema id="org.gnome.shell.keybindings" path="/org/gnome/shell/keybindings/"
|
<schema id="org.gnome.shell.keybindings" path="/org/gnome/shell/keybindings/"
|
||||||
@ -183,17 +182,6 @@
|
|||||||
</key>
|
</key>
|
||||||
</schema>
|
</schema>
|
||||||
|
|
||||||
<schema id="org.gnome.shell.keyboard" path="/org/gnome/shell/keyboard/"
|
|
||||||
gettext-domain="@GETTEXT_PACKAGE@">
|
|
||||||
<key name="keyboard-type" type="s">
|
|
||||||
<default>'touch'</default>
|
|
||||||
<summary>Which keyboard to use</summary>
|
|
||||||
<description>
|
|
||||||
The type of keyboard to use.
|
|
||||||
</description>
|
|
||||||
</key>
|
|
||||||
</schema>
|
|
||||||
|
|
||||||
<schema id="org.gnome.shell.app-switcher"
|
<schema id="org.gnome.shell.app-switcher"
|
||||||
path="/org/gnome/shell/app-switcher/"
|
path="/org/gnome/shell/app-switcher/"
|
||||||
gettext-domain="@GETTEXT_PACKAGE@">
|
gettext-domain="@GETTEXT_PACKAGE@">
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
$variant: 'light';
|
||||||
|
|
||||||
@import "gnome-shell-sass/_high-contrast-colors"; //use gtk colors
|
@import "gnome-shell-sass/_high-contrast-colors"; //use gtk colors
|
||||||
@import "gnome-shell-sass/_drawing";
|
@import "gnome-shell-sass/_drawing";
|
||||||
@import "gnome-shell-sass/_common";
|
@import "gnome-shell-sass/_common";
|
||||||
|
@ -3,11 +3,11 @@
|
|||||||
|
|
||||||
|
|
||||||
$base_color: if($variant == 'light', #ffffff, lighten(desaturate(#241f31, 20%), 2%));
|
$base_color: if($variant == 'light', #ffffff, lighten(desaturate(#241f31, 20%), 2%));
|
||||||
$bg_color: if($variant == 'light', #f6f5f4, desaturate(#3d3846, 10%));
|
$bg_color: if($variant == 'light', #f6f5f4, darken(desaturate(#3d3846, 100%), 4%));
|
||||||
$fg_color: if($variant == 'light', #2e3436, #eeeeec);
|
$fg_color: if($variant == 'light', #2e3436, #eeeeec);
|
||||||
|
|
||||||
$selected_fg_color: #ffffff;
|
$selected_fg_color: #ffffff;
|
||||||
$selected_bg_color: if($variant == 'light', #3584e4, darken(#3584e4, 20%));
|
$selected_bg_color: if($variant == 'light', #3584e4, darken(#3584e4, 10%));
|
||||||
$selected_borders_color: if($variant== 'light', darken($selected_bg_color, 15%), darken($selected_bg_color, 30%));
|
$selected_borders_color: if($variant== 'light', darken($selected_bg_color, 15%), darken($selected_bg_color, 30%));
|
||||||
$borders_color: if($variant == 'light', darken($bg_color, 18%), darken($bg_color, 10%));
|
$borders_color: if($variant == 'light', darken($bg_color, 18%), darken($bg_color, 10%));
|
||||||
$borders_edge: if($variant == 'light', transparentize(white, 0.2), transparentize($fg_color, 0.93));
|
$borders_edge: if($variant == 'light', transparentize(white, 0.2), transparentize($fg_color, 0.93));
|
||||||
@ -21,11 +21,15 @@ $success_color: if($variant == 'light', #33d17a, darken(#33d17a, 10%));
|
|||||||
$destructive_color: if($variant == 'light', #e01b24, darken(#e01b24, 10%));
|
$destructive_color: if($variant == 'light', #e01b24, darken(#e01b24, 10%));
|
||||||
|
|
||||||
$osd_fg_color: #eeeeec;
|
$osd_fg_color: #eeeeec;
|
||||||
$osd_bg_color: #2e3436;
|
$osd_text_color: white;
|
||||||
|
$osd_bg_color: transparentize(darken(desaturate(#3d3846, 100%), 12%),0.04);
|
||||||
|
$osd_insensitive_bg_color: transparentize(mix($osd_fg_color, opacify($osd_bg_color, 1), 10%), 0.5);
|
||||||
|
$osd_insensitive_fg_color: mix($osd_fg_color, opacify($osd_bg_color, 1), 50%);
|
||||||
$osd_borders_color: transparentize(black, 0.3);
|
$osd_borders_color: transparentize(black, 0.3);
|
||||||
$osd_outer_borders_color: transparentize(white, 0.9);
|
$osd_outer_borders_color: transparentize(white, 0.84);
|
||||||
|
|
||||||
$tooltip_borders_color: $osd_outer_borders_color;
|
$tooltip_borders_color: $osd_outer_borders_color;
|
||||||
|
$shadow_color: transparentize(black, 0.9);
|
||||||
|
|
||||||
//insensitive state derived colors
|
//insensitive state derived colors
|
||||||
$insensitive_fg_color: mix($fg_color, $bg_color, 50%);
|
$insensitive_fg_color: mix($fg_color, $bg_color, 50%);
|
||||||
|
@ -37,16 +37,13 @@
|
|||||||
// possible $t values:
|
// possible $t values:
|
||||||
// normal, focus, insensitive
|
// normal, focus, insensitive
|
||||||
//
|
//
|
||||||
$_inner_shadows: inset 0 2px 4px transparentize(black, 0.6);
|
|
||||||
|
|
||||||
@if $t==normal {
|
@if $t==normal {
|
||||||
background-color: $base_color;
|
background-color: $base_color;
|
||||||
border-color: $borders_color;
|
border-color: $borders_color;
|
||||||
@include _shadows($_inner_shadows);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@if $t==focus {
|
@if $t==focus {
|
||||||
@include _shadows($_inner_shadows);
|
|
||||||
border-color: if($fc==$selected_bg_color,
|
border-color: if($fc==$selected_bg_color,
|
||||||
$selected_borders_color,
|
$selected_borders_color,
|
||||||
darken($fc,35%));
|
darken($fc,35%));
|
||||||
@ -111,7 +108,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@mixin button($t, $c:$osd_bg_color, $tc:$fg_color, $edge: $borders_edge) {
|
@mixin button($t, $c:$bg_color, $tc:$fg_color, $edge: $borders_edge) {
|
||||||
//
|
//
|
||||||
// Button drawing function
|
// Button drawing function
|
||||||
//
|
//
|
||||||
@ -130,19 +127,17 @@
|
|||||||
$_hilight_color: _button_hilight_color($c);
|
$_hilight_color: _button_hilight_color($c);
|
||||||
$_button_edge: if($edge == none, none, _widget_edge($edge));
|
$_button_edge: if($edge == none, none, _widget_edge($edge));
|
||||||
$_blank_edge: if($edge == none, none, _widget_edge(transparentize($edge,1)));
|
$_blank_edge: if($edge == none, none, _widget_edge(transparentize($edge,1)));
|
||||||
|
$_button_shadow: 0 1px 2px transparentize($shadow_color, 0.03);
|
||||||
|
|
||||||
@if $t==normal {
|
@if $t==normal {
|
||||||
//
|
//
|
||||||
// normal button
|
// normal button
|
||||||
//
|
//
|
||||||
$_bg: if($c!=$osd_bg_color, transparentize($c, 0.5),
|
|
||||||
$osd_bg_color);
|
|
||||||
|
|
||||||
color: $osd_fg_color;
|
color: $tc;
|
||||||
background-color: $_bg;
|
background-color: $c;
|
||||||
border-color: $osd_borders_color;
|
border-color: $borders_color;
|
||||||
box-shadow: inset 0 1px lighten($osd_bg_color,10%);
|
box-shadow: $_button_shadow;
|
||||||
text-shadow: 0 1px black;
|
text-shadow: 0 1px black;
|
||||||
icon-shadow: 0 1px black;
|
icon-shadow: 0 1px black;
|
||||||
}
|
}
|
||||||
@ -150,26 +145,21 @@
|
|||||||
//
|
//
|
||||||
// focused button
|
// focused button
|
||||||
//
|
//
|
||||||
$_bg: if($c!=$osd_bg_color, transparentize($c, 0.3),
|
color: $tc;
|
||||||
lighten($osd_bg_color,3%));
|
|
||||||
|
|
||||||
color: $osd_fg_color;
|
|
||||||
text-shadow: 0 1px black;
|
text-shadow: 0 1px black;
|
||||||
icon-shadow: 0 1px black;
|
icon-shadow: 0 1px black;
|
||||||
box-shadow: inset 0px 0px 0px 1px $selected_bg_color;
|
box-shadow: inset 0px 0px 0px 2px $selected_bg_color;
|
||||||
|
//border-color: $selected_bg_color;
|
||||||
}
|
}
|
||||||
|
|
||||||
@else if $t==hover {
|
@else if $t==hover {
|
||||||
//
|
//
|
||||||
// active osd button
|
// active osd button
|
||||||
//
|
//
|
||||||
$_bg: if($c!=$osd_bg_color, transparentize($c, 0.3),
|
color: $tc;
|
||||||
lighten($osd_bg_color,3%));
|
border-color: $borders_color;
|
||||||
|
background-color: $c;
|
||||||
color: white;
|
box-shadow: $_button_shadow;
|
||||||
border-color: $osd_borders_color;
|
|
||||||
background-color: $_bg;
|
|
||||||
box-shadow: inset 0 1px lighten($osd_bg_color,20%);
|
|
||||||
text-shadow: 0 1px black;
|
text-shadow: 0 1px black;
|
||||||
icon-shadow: 0 1px black;
|
icon-shadow: 0 1px black;
|
||||||
|
|
||||||
@ -178,27 +168,18 @@
|
|||||||
//
|
//
|
||||||
// active osd button
|
// active osd button
|
||||||
//
|
//
|
||||||
$_bg: if($c!=$bg_color, $c, $osd_borders_color);
|
color: $tc;
|
||||||
|
border-color: $borders_color;
|
||||||
color: white;
|
background-color: $c;
|
||||||
border-color: $osd_borders_color;
|
|
||||||
background-color: $selected_bg_color;
|
|
||||||
// This should be none, but it's creating some issues with borders, so to
|
|
||||||
// workaround it for now, use inset wich goes through a different code path.
|
|
||||||
// see https://bugzilla.gnome.org/show_bug.cgi?id=752934
|
|
||||||
box-shadow: inset 0 0 black;
|
|
||||||
text-shadow: none;
|
text-shadow: none;
|
||||||
icon-shadow: none;
|
icon-shadow: none;
|
||||||
|
box-shadow: none;
|
||||||
}
|
}
|
||||||
@else if $t==insensitive {
|
@else if $t==insensitive {
|
||||||
//
|
|
||||||
// insensitive osd button
|
|
||||||
//
|
|
||||||
$_bg: transparentize(mix($insensitive_fg_color,$osd_bg_color,20%),0.3);
|
|
||||||
|
|
||||||
color: $insensitive_fg_color;
|
color: $insensitive_fg_color;
|
||||||
border-color: $osd_borders_color;
|
border-color: $insensitive_borders_color;
|
||||||
background-color: $_bg;
|
background-color: $insensitive_bg_color;
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
text-shadow: none;
|
text-shadow: none;
|
||||||
icon-shadow: none;
|
icon-shadow: none;
|
||||||
|
@ -26,6 +26,7 @@ $osd_borders_color: transparentize(black, 0.3);
|
|||||||
$osd_outer_borders_color: transparentize(white, 0.9);
|
$osd_outer_borders_color: transparentize(white, 0.9);
|
||||||
|
|
||||||
$tooltip_borders_color: $osd_outer_borders_color;
|
$tooltip_borders_color: $osd_outer_borders_color;
|
||||||
|
$shadow_color: transparentize(black, 0.9);
|
||||||
|
|
||||||
//insensitive state derived colors
|
//insensitive state derived colors
|
||||||
$insensitive_fg_color: mix($fg_color, $bg_color, 50%);
|
$insensitive_fg_color: mix($fg_color, $bg_color, 50%);
|
||||||
|
28
data/theme/pointer-double-click-symbolic.svg
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="20"
|
||||||
|
height="20"
|
||||||
|
id="svg2">
|
||||||
|
<g
|
||||||
|
id="layer1"
|
||||||
|
style="display:inline">
|
||||||
|
<g
|
||||||
|
id="id1"
|
||||||
|
transform="translate(-19,-0.75)">
|
||||||
|
<path
|
||||||
|
style="color:#000000;shape-padding:0;clip-rule:nonzero;display:block;overflow:visible;visibility:visible;opacity:1;solid-color:#000000;solid-opacity:1;fill:#464646;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
|
||||||
|
d="m 19.855469,0.45507812 c 0,6.69466128 0,13.38932288 0,20.08398388 1.414713,-1.38151 2.829427,-2.763021 4.24414,-4.144531 0.5882,1.18866 1.158389,2.386561 1.758464,3.569127 1.108631,1.640259 4.157538,0.465128 3.89799,-1.495859 0.01057,-0.470226 -0.405577,-0.908445 -0.434651,-1.313638 0.259401,-0.25321 0.518802,-0.50642 0.778203,-0.75963 0.5882,1.18866 1.158389,2.386561 1.758464,3.569127 1.108631,1.640259 4.157538,0.465128 3.89799,-1.495859 -0.192325,-0.904303 -0.717854,-1.698026 -1.068629,-2.548967 -0.238908,-0.512658 -0.477817,-1.025315 -0.716725,-1.537973 1.755859,0 3.511719,0 5.267578,0 C 34.777352,9.738932 30.31641,5.0970051 25.855469,0.45507812 c 0,2.08138018 0,4.16276048 0,6.24414068 -2,-2.0813802 -4,-4.1627605 -6,-6.24414068 z m 1.5,3.72656248 c 2,2.0813801 4,4.1627603 6,6.2441404 0,-2.0813801 0,-4.1627603 0,-6.2441404 2.786458,2.8997395 5.572917,5.7994789 8.359375,8.6992184 -1.366537,0 -2.733073,0 -4.09961,0 0.883468,1.903435 1.781983,3.800273 2.656081,5.707817 0.0065,0.622781 -1.227555,0.980575 -1.325116,0.207118 -0.80433,-1.640251 -1.608661,-3.280501 -2.412991,-4.920752 -1.020182,0.995443 -2.040365,1.990885 -3.060547,2.986328 0.263642,0.608048 0.596803,1.192457 0.814693,1.816134 -0.182662,0.601037 -1.26833,0.8373 -1.365856,0.06795 -0.796094,-1.623456 -1.592189,-3.246912 -2.388284,-4.870368 -1.059245,1.033854 -2.118489,2.067708 -3.177734,3.101562 -4e-6,-4.265002 -7e-6,-8.5300036 -1.1e-5,-12.7950054 z"
|
||||||
|
id="path5565" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="id2"
|
||||||
|
transform="translate(-25,-0.75)" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.5 KiB |
20
data/theme/pointer-drag-symbolic.svg
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="20"
|
||||||
|
height="20"
|
||||||
|
id="svg2">
|
||||||
|
<g
|
||||||
|
id="g835">
|
||||||
|
<path
|
||||||
|
style="color:#000000;shape-padding:0;clip-rule:nonzero;display:block;overflow:visible;visibility:visible;opacity:1;solid-color:#000000;solid-opacity:1;fill:#464646;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
|
||||||
|
d="M 10.705078 1.671875 C 9.8685536 1.7465699 8.886927 1.5353073 8.2578125 2.2480469 C 8.0785627 2.7511513 7.8667422 2.9777446 7.3125 2.8652344 C 6.5186841 2.8141575 5.6105879 2.9190179 5.125 3.6386719 C 4.5700923 4.4696324 4.8113194 5.4949043 4.7578125 6.4316406 L 4.7578125 7.9335938 C 4.2480917 7.6156216 3.6258927 7.8015358 3.0585938 7.7519531 C 2.6157606 7.7312277 2.1774807 7.7771069 1.7402344 7.84375 C 1.7971654 10.529678 1.813967 13.217089 1.8613281 15.902344 C 1.9550191 17.204635 3.0933719 18.307155 4.40625 18.326172 C 5.0391993 18.341272 5.8885801 18.332951 6.6308594 18.337891 C 9.8526764 18.325821 13.076973 18.38774 16.296875 18.28125 C 17.459088 18.161027 18.510143 17.092798 18.367188 15.884766 L 18.367188 6.4042969 C 17.660379 5.4636119 16.551912 4.623434 15.308594 4.8339844 C 15.009045 4.3804158 14.822476 3.3608651 14.082031 3.0351562 C 13.727176 2.744118 13.242443 2.9253873 12.822266 2.8730469 C 12.524824 2.8003648 11.966366 3.0655864 11.953125 2.6210938 C 11.795774 2.0995736 11.23789 1.7125276 10.705078 1.671875 z M 10.599609 3.1757812 C 10.764131 3.4472414 10.782382 3.9294982 10.818359 4.3007812 C 10.824915 4.3076775 10.838155 4.3066925 10.845703 4.3125 C 10.836598 4.3123268 10.827465 4.3126732 10.818359 4.3125 L 11.3125 10.212891 L 11.976562 4.3710938 L 13.322266 4.375 C 13.858345 4.7645492 13.735252 5.5154752 13.876953 6.0976562 C 13.865826 6.1651282 13.88335 6.1937019 13.892578 6.234375 C 13.891928 6.2343667 13.891276 6.2343833 13.890625 6.234375 L 13.902344 6.3203125 L 14.384766 10.185547 L 15.048828 6.265625 C 15.622863 6.228498 16.206517 6.3041365 16.607422 6.7675781 C 17.017062 6.9844433 16.823063 7.4565491 16.867188 7.8261719 L 16.867188 16.167969 C 16.530129 17.131654 15.267211 16.71624 14.492188 16.828125 C 11.121671 16.841205 7.7500508 16.861953 4.3808594 16.814453 C 3.4051926 16.786173 3.2389196 15.744474 3.3398438 14.972656 C 3.3282027 13.065594 3.2950998 11.158732 3.2617188 9.2519531 C 3.5880829 9.2584131 3.9376766 9.2391948 4.25 9.2617188 C 4.7438842 10.17694 4.7346154 11.262903 4.7578125 12.277344 C 5.2504494 12.270544 5.8011939 12.317174 6.2578125 12.277344 C 6.2669593 9.7577406 6.2393741 7.2373172 6.2714844 4.71875 C 6.3763823 4.198849 7.0022289 4.409587 7.3828125 4.3652344 L 8.0585938 4.3652344 L 8.546875 10.212891 L 9.2167969 4.3359375 L 9.2128906 4.3359375 C 9.2438386 3.9531035 9.0622615 3.4401006 9.4609375 3.2167969 L 10.599609 3.1757812 z "
|
||||||
|
id="path5630" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 3.3 KiB |
26
data/theme/pointer-primary-click-symbolic.svg
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="20"
|
||||||
|
height="20"
|
||||||
|
id="svg2"
|
||||||
|
version="1.1">
|
||||||
|
<g
|
||||||
|
id="layer1"
|
||||||
|
style="display:inline">
|
||||||
|
<g
|
||||||
|
id="id1"
|
||||||
|
transform="translate(-22.25,-0.75)">
|
||||||
|
<path
|
||||||
|
style="color:#000000;shape-padding:0;clip-rule:nonzero;display:block;overflow:visible;visibility:visible;opacity:1;solid-color:#000000;solid-opacity:1;fill:#464646;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
|
||||||
|
d="m 25.855469,0.45507812 c 0,6.69466128 0,13.38932288 0,20.08398388 1.414713,-1.380859 2.829427,-2.761719 4.24414,-4.142578 0.612408,1.215372 1.173049,2.460221 1.819709,3.656095 1.141947,1.476279 3.975266,0.389006 3.846009,-1.473608 -0.09413,-0.822519 -0.594755,-1.521423 -0.899969,-2.277599 -0.298869,-0.640171 -0.597739,-1.280342 -0.896608,-1.920513 1.75651,0 3.513021,0 5.269531,0 C 34.777344,9.738932 30.316406,5.0970051 25.855469,0.45507812 Z m 1.5,3.72656248 c 2.786458,2.8997395 5.572917,5.7994789 8.359375,8.6992184 -1.367188,0 -2.734375,0 -4.101563,0 0.885072,1.903196 1.781799,3.80152 2.659622,5.707744 0.0349,0.566084 -1.149057,0.988823 -1.282093,0.297971 -0.818567,-1.671162 -1.637133,-3.342323 -2.455699,-5.013485 -1.059896,1.034505 -2.119791,2.06901 -3.179687,3.103515 1.5e-5,-4.264988 3e-5,-8.5299756 4.5e-5,-12.7949634 z"
|
||||||
|
id="path5565" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.9 KiB |
26
data/theme/pointer-secondary-click-symbolic.svg
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="20"
|
||||||
|
height="20"
|
||||||
|
id="svg2">
|
||||||
|
<g
|
||||||
|
id="layer1"
|
||||||
|
style="display:inline;stroke-width:1.5;stroke-miterlimit:4;stroke-dasharray:none;stroke:#000000;stroke-opacity:1">
|
||||||
|
<g
|
||||||
|
transform="matrix(-1,0,0,1,42,-0.75)"
|
||||||
|
id="g5847"
|
||||||
|
style="stroke-width:1.5;stroke-miterlimit:4;stroke-dasharray:none;stroke:#000000;stroke-opacity:1">
|
||||||
|
<path
|
||||||
|
style="color:#000000;shape-padding:0;clip-rule:nonzero;display:block;overflow:visible;visibility:visible;opacity:1;solid-color:#000000;solid-opacity:1;fill:#464646;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
|
||||||
|
d="m 25.855469,0.45507812 c 0,6.69466128 0,13.38932288 0,20.08398388 1.414713,-1.380859 2.829427,-2.761719 4.24414,-4.142578 0.612408,1.215372 1.173049,2.460221 1.819709,3.656095 1.141947,1.476279 3.975266,0.389006 3.846009,-1.473608 -0.09413,-0.822519 -0.594755,-1.521423 -0.899969,-2.277599 -0.298869,-0.640171 -0.597739,-1.280342 -0.896608,-1.920513 1.75651,0 3.513021,0 5.269531,0 C 34.777344,9.738932 30.316406,5.0970051 25.855469,0.45507812 Z m 1.5,3.72656248 c 2.786458,2.8997395 5.572917,5.7994789 8.359375,8.6992184 -1.367188,0 -2.734375,0 -4.101563,0 0.885072,1.903196 1.781799,3.80152 2.659622,5.707744 0.0349,0.566084 -1.149057,0.988823 -1.282093,0.297971 -0.818567,-1.671162 -1.637133,-3.342323 -2.455699,-5.013485 -1.059896,1.034505 -2.119791,2.06901 -3.179687,3.103515 1.5e-5,-4.264988 3e-5,-8.5299756 4.5e-5,-12.7949634 z"
|
||||||
|
id="path5851" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.0 KiB |
1
data/theme/toggle-off-dark.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="46" height="22"><defs><linearGradient id="a"><stop offset="0" stop-color="#39393a"/><stop offset="1" stop-color="#302f30"/></linearGradient><linearGradient xlink:href="#a" id="b" x1="53" y1="294.429" x2="53" y2="309.804" gradientUnits="userSpaceOnUse" gradientTransform="translate(-42.76)"/></defs><g transform="translate(0 -291.18)" stroke-width="1.085"><rect style="marker:none" width="44.446" height="20.911" x=".625" y="291.715" rx="10.455" ry="10.073" fill="#323233" stroke="#272728"/><rect ry="10.455" rx="10.455" y="291.715" x=".543" height="20.911" width="21.143" style="marker:none" fill="url(#b)" stroke="#151515"/></g></svg>
|
After Width: | Height: | Size: 725 B |
@ -1,103 +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="46"
|
|
||||||
height="22"
|
|
||||||
viewBox="0 0 46 22"
|
|
||||||
version="1.1"
|
|
||||||
id="svg2751"
|
|
||||||
inkscape:version="0.92.4 5da689c313, 2019-01-14"
|
|
||||||
sodipodi:docname="toggle-off-intl.svg">
|
|
||||||
<defs
|
|
||||||
id="defs2745">
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
id="linearGradient3329">
|
|
||||||
<stop
|
|
||||||
style="stop-color:#39393a;stop-opacity:1;"
|
|
||||||
offset="0"
|
|
||||||
id="stop3325" />
|
|
||||||
<stop
|
|
||||||
style="stop-color:#302f30;stop-opacity:1"
|
|
||||||
offset="1"
|
|
||||||
id="stop3327" />
|
|
||||||
</linearGradient>
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient3329"
|
|
||||||
id="linearGradient3331"
|
|
||||||
x1="53"
|
|
||||||
y1="294.42917"
|
|
||||||
x2="53"
|
|
||||||
y2="309.80417"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
gradientTransform="translate(-42.760724)" />
|
|
||||||
</defs>
|
|
||||||
<sodipodi:namedview
|
|
||||||
id="base"
|
|
||||||
pagecolor="#535353"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1.0"
|
|
||||||
inkscape:pageopacity="1"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:zoom="1"
|
|
||||||
inkscape:cx="-19.436775"
|
|
||||||
inkscape:cy="-13.499723"
|
|
||||||
inkscape:document-units="px"
|
|
||||||
inkscape:current-layer="layer1"
|
|
||||||
showgrid="false"
|
|
||||||
units="px"
|
|
||||||
inkscape:pagecheckerboard="true"
|
|
||||||
borderlayer="true"
|
|
||||||
inkscape:showpageshadow="false"
|
|
||||||
showborder="false">
|
|
||||||
<inkscape:grid
|
|
||||||
type="xygrid"
|
|
||||||
id="grid3298" />
|
|
||||||
</sodipodi:namedview>
|
|
||||||
<metadata
|
|
||||||
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>
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<g
|
|
||||||
inkscape:label="Layer 1"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
id="layer1"
|
|
||||||
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: 3.3 KiB |
1
data/theme/toggle-off.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="46" height="22"><g transform="translate(0 -291.18)"><rect style="marker:none;font-variant-east_asian:normal" width="44.446" height="20.911" x=".625" y="291.715" rx="10.455" ry="10.073" fill="#e1dedb" stroke="#cdc7c2" stroke-linecap="round" stroke-linejoin="round"/><rect ry="10.455" rx="10.455" y="291.715" x=".543" height="20.911" width="21.143" style="marker:none;font-variant-east_asian:normal" fill="#f8f7f7" stroke="#aa9f98" stroke-linecap="round" stroke-linejoin="round"/><g transform="matrix(.97148 0 0 1 1658.914 -2552.91)" stroke-width="1.015" stroke-linecap="round" stroke-linejoin="round"><rect ry="13.17" rx="13.556" y="1234.681" x="-1242.732" height="26" width="49.409" style="marker:none" fill="#e1dedb" stroke="#cdc7c2"/><rect style="marker:none" width="26.763" height="26" x="-1242.732" y="1234.769" rx="13.511" ry="13.126" fill="#f8f7f7" stroke="#aa9f98"/></g><g transform="matrix(.97148 0 0 1 1658.914 -2512.91)" stroke-width="1.015" stroke="#2b73cc"><rect style="marker:none" width="49.409" height="26" x="-1242.732" y="1234.681" rx="13.556" ry="13.17" fill="#3081e3"/><rect ry="13.126" rx="13.511" y="1234.769" x="-1220.086" height="26" width="26.763" style="marker:none" fill="#f8f7f7" stroke-linecap="round" stroke-linejoin="round"/></g></g></svg>
|
After Width: | Height: | Size: 1.3 KiB |
1
data/theme/toggle-on-dark.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="46" height="22"><defs><linearGradient id="a"><stop offset="0" stop-color="#39393a"/><stop offset="1" stop-color="#302f30"/></linearGradient><linearGradient xlink:href="#a" id="b" x1="53" y1="294.429" x2="53" y2="309.804" gradientUnits="userSpaceOnUse" gradientTransform="translate(-19)"/></defs><g transform="translate(0 -291.18)" stroke="#030e1b" stroke-width="1.085"><rect style="marker:none" width="44.446" height="20.911" x=".625" y="291.715" rx="10.455" ry="10.073" fill="#15539e"/><rect ry="10.455" rx="10.455" y="291.715" x="24.304" height="20.911" width="21.143" style="marker:none" fill="url(#b)"/></g></svg>
|
After Width: | Height: | Size: 707 B |
@ -1,103 +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="46"
|
|
||||||
height="22"
|
|
||||||
viewBox="0 0 46 22"
|
|
||||||
version="1.1"
|
|
||||||
id="svg2751"
|
|
||||||
inkscape:version="0.92.4 5da689c313, 2019-01-14"
|
|
||||||
sodipodi:docname="toggle-on-intl.svg">
|
|
||||||
<defs
|
|
||||||
id="defs2745">
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
id="linearGradient3329">
|
|
||||||
<stop
|
|
||||||
style="stop-color:#39393a;stop-opacity:1;"
|
|
||||||
offset="0"
|
|
||||||
id="stop3325" />
|
|
||||||
<stop
|
|
||||||
style="stop-color:#302f30;stop-opacity:1"
|
|
||||||
offset="1"
|
|
||||||
id="stop3327" />
|
|
||||||
</linearGradient>
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient3329"
|
|
||||||
id="linearGradient3331"
|
|
||||||
x1="53"
|
|
||||||
y1="294.42917"
|
|
||||||
x2="53"
|
|
||||||
y2="309.80417"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
gradientTransform="translate(-19)" />
|
|
||||||
</defs>
|
|
||||||
<sodipodi:namedview
|
|
||||||
id="base"
|
|
||||||
pagecolor="#535353"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1.0"
|
|
||||||
inkscape:pageopacity="1"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:zoom="1"
|
|
||||||
inkscape:cx="13.588971"
|
|
||||||
inkscape:cy="14.124546"
|
|
||||||
inkscape:document-units="px"
|
|
||||||
inkscape:current-layer="layer1"
|
|
||||||
showgrid="false"
|
|
||||||
units="px"
|
|
||||||
inkscape:pagecheckerboard="true"
|
|
||||||
borderlayer="true"
|
|
||||||
inkscape:showpageshadow="false"
|
|
||||||
showborder="false">
|
|
||||||
<inkscape:grid
|
|
||||||
type="xygrid"
|
|
||||||
id="grid3298" />
|
|
||||||
</sodipodi:namedview>
|
|
||||||
<metadata
|
|
||||||
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>
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<g
|
|
||||||
inkscape:label="Layer 1"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
id="layer1"
|
|
||||||
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: 3.3 KiB |
1
data/theme/toggle-on.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="46" height="22"><g transform="translate(0 -291.18)" stroke="#2b73cc"><rect style="marker:none;font-variant-east_asian:normal" width="44.446" height="20.911" x=".625" y="291.715" rx="10.455" ry="10.073" fill="#3081e3"/><rect ry="10.455" rx="10.455" y="291.715" x="24.304" height="20.911" width="21.143" style="marker:none;font-variant-east_asian:normal" fill="#f8f7f7" stroke-linecap="round" stroke-linejoin="round"/></g></svg>
|
After Width: | Height: | Size: 473 B |
@ -168,13 +168,20 @@ var Application = class {
|
|||||||
|
|
||||||
copyButton.connect('clicked', w => {
|
copyButton.connect('clicked', w => {
|
||||||
let clipboard = Gtk.Clipboard.get_default(w.get_display());
|
let clipboard = Gtk.Clipboard.get_default(w.get_display());
|
||||||
let backticks = '```';
|
|
||||||
clipboard.set_text(
|
|
||||||
// markdown for pasting in gitlab issues
|
// markdown for pasting in gitlab issues
|
||||||
`The settings of extension ${extension.uuid} had an error:\n${
|
let lines = [
|
||||||
backticks}\n${exc}\n${backticks}\n\nStack trace:\n${
|
`The settings of extension ${extension.uuid} had an error:`,
|
||||||
backticks}\n${exc.stack}${backticks}\n`, -1
|
'```',
|
||||||
);
|
`${exc}`,
|
||||||
|
'```',
|
||||||
|
'',
|
||||||
|
'Stack trace:',
|
||||||
|
'```',
|
||||||
|
exc.stack.replace(/\n$/, ''), // stack without trailing newline
|
||||||
|
'```',
|
||||||
|
''
|
||||||
|
];
|
||||||
|
clipboard.set_text(lines.join('\n'), -1);
|
||||||
});
|
});
|
||||||
|
|
||||||
let spacing = new Gtk.SeparatorToolItem({ draw: false });
|
let spacing = new Gtk.SeparatorToolItem({ draw: false });
|
||||||
@ -582,12 +589,12 @@ class ExtensionRow extends Gtk.ListBoxRow {
|
|||||||
|
|
||||||
_isEnabled() {
|
_isEnabled() {
|
||||||
let extensions = this._settings.get_strv('enabled-extensions');
|
let extensions = this._settings.get_strv('enabled-extensions');
|
||||||
return extensions.indexOf(this.uuid) != -1;
|
return extensions.includes(this.uuid);
|
||||||
}
|
}
|
||||||
|
|
||||||
_enable() {
|
_enable() {
|
||||||
let extensions = this._settings.get_strv('enabled-extensions');
|
let extensions = this._settings.get_strv('enabled-extensions');
|
||||||
if (extensions.indexOf(this.uuid) != -1)
|
if (extensions.includes(this.uuid))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
extensions.push(this.uuid);
|
extensions.push(this.uuid);
|
||||||
@ -611,12 +618,12 @@ function initEnvironment() {
|
|||||||
// Monkey-patch in a "global" object that fakes some Shell utilities
|
// Monkey-patch in a "global" object that fakes some Shell utilities
|
||||||
// that ExtensionUtils depends on.
|
// that ExtensionUtils depends on.
|
||||||
window.global = {
|
window.global = {
|
||||||
log() {
|
log(...args) {
|
||||||
print([].join.call(arguments, ', '));
|
print(args.join(', '));
|
||||||
},
|
},
|
||||||
|
|
||||||
logError(s) {
|
logError(s) {
|
||||||
log('ERROR: ' + s);
|
log(`ERROR: ${s}`);
|
||||||
},
|
},
|
||||||
|
|
||||||
userdatadir: GLib.build_filenamev([GLib.get_user_data_dir(), 'gnome-shell'])
|
userdatadir: GLib.build_filenamev([GLib.get_user_data_dir(), 'gnome-shell'])
|
||||||
|
@ -138,7 +138,7 @@ var AuthPrompt = class {
|
|||||||
reactive: true,
|
reactive: true,
|
||||||
can_focus: true,
|
can_focus: true,
|
||||||
label: _("Cancel") });
|
label: _("Cancel") });
|
||||||
this.cancelButton.connect('clicked', () => { this.cancel(); });
|
this.cancelButton.connect('clicked', () => this.cancel());
|
||||||
this._buttonBox.add(this.cancelButton,
|
this._buttonBox.add(this.cancelButton,
|
||||||
{ expand: false,
|
{ expand: false,
|
||||||
x_fill: false,
|
x_fill: false,
|
||||||
@ -157,7 +157,7 @@ var AuthPrompt = class {
|
|||||||
reactive: true,
|
reactive: true,
|
||||||
can_focus: true,
|
can_focus: true,
|
||||||
label: _("Next") });
|
label: _("Next") });
|
||||||
this.nextButton.connect('clicked', () => { this.emit('next'); });
|
this.nextButton.connect('clicked', () => this.emit('next'));
|
||||||
this.nextButton.add_style_pseudo_class('default');
|
this.nextButton.add_style_pseudo_class('default');
|
||||||
this._buttonBox.add(this.nextButton,
|
this._buttonBox.add(this.nextButton,
|
||||||
{ expand: false,
|
{ expand: false,
|
||||||
@ -295,8 +295,7 @@ var AuthPrompt = class {
|
|||||||
time: DEFAULT_BUTTON_WELL_ANIMATION_TIME,
|
time: DEFAULT_BUTTON_WELL_ANIMATION_TIME,
|
||||||
delay: DEFAULT_BUTTON_WELL_ANIMATION_DELAY,
|
delay: DEFAULT_BUTTON_WELL_ANIMATION_DELAY,
|
||||||
transition: 'linear',
|
transition: 'linear',
|
||||||
onCompleteScope: this,
|
onComplete: () => {
|
||||||
onComplete() {
|
|
||||||
if (wasSpinner) {
|
if (wasSpinner) {
|
||||||
if (this._spinner)
|
if (this._spinner)
|
||||||
this._spinner.stop();
|
this._spinner.stop();
|
||||||
|
@ -44,6 +44,7 @@
|
|||||||
* replaced by something else.
|
* replaced by something else.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
const { GObject } = imports.gi;
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
|
|
||||||
var Task = class {
|
var Task = class {
|
||||||
@ -124,7 +125,7 @@ var Batch = class extends Task {
|
|||||||
}
|
}
|
||||||
|
|
||||||
process() {
|
process() {
|
||||||
throw new Error('Not implemented');
|
throw new GObject.NotImplementedError(`process in ${this.constructor.name}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
runTask() {
|
runTask() {
|
||||||
|
@ -24,7 +24,7 @@ function FprintManager() {
|
|||||||
try {
|
try {
|
||||||
self.init(null);
|
self.init(null);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
log('Failed to connect to Fprint service: ' + e.message);
|
log(`Failed to connect to Fprint service: ${e.message}`);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -187,8 +187,6 @@ var UserList = class {
|
|||||||
}
|
}
|
||||||
|
|
||||||
updateStyle(isExpanded) {
|
updateStyle(isExpanded) {
|
||||||
let tasks = [];
|
|
||||||
|
|
||||||
if (isExpanded)
|
if (isExpanded)
|
||||||
this._box.add_style_pseudo_class('expanded');
|
this._box.add_style_pseudo_class('expanded');
|
||||||
else
|
else
|
||||||
@ -261,7 +259,7 @@ var UserList = class {
|
|||||||
item.connect('activate', this._onItemActivated.bind(this));
|
item.connect('activate', this._onItemActivated.bind(this));
|
||||||
|
|
||||||
// Try to keep the focused item front-and-center
|
// Try to keep the focused item front-and-center
|
||||||
item.actor.connect('key-focus-in', () => { this.scrollToItem(item); });
|
item.actor.connect('key-focus-in', () => this.scrollToItem(item));
|
||||||
|
|
||||||
this._moveFocusToItems();
|
this._moveFocusToItems();
|
||||||
|
|
||||||
@ -325,11 +323,11 @@ var SessionMenuButton = class {
|
|||||||
this._button.remove_style_pseudo_class('active');
|
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 });
|
{ actionMode: Shell.ActionMode.NONE });
|
||||||
this._manager.addMenu(this._menu);
|
this._manager.addMenu(this._menu);
|
||||||
|
|
||||||
this._button.connect('clicked', () => { this._menu.toggle(); });
|
this._button.connect('clicked', () => this._menu.toggle());
|
||||||
|
|
||||||
this._items = {};
|
this._items = {};
|
||||||
this._activeSessionId = null;
|
this._activeSessionId = null;
|
||||||
@ -403,18 +401,18 @@ var LoginDialog = GObject.registerClass({
|
|||||||
this.connect('destroy', this._onDestroy.bind(this));
|
this.connect('destroy', this._onDestroy.bind(this));
|
||||||
parentActor.add_child(this);
|
parentActor.add_child(this);
|
||||||
|
|
||||||
this._userManager = AccountsService.UserManager.get_default()
|
this._userManager = AccountsService.UserManager.get_default();
|
||||||
this._gdmClient = new Gdm.Client();
|
this._gdmClient = new Gdm.Client();
|
||||||
|
|
||||||
this._settings = new Gio.Settings({ schema_id: GdmUtil.LOGIN_SCREEN_SCHEMA });
|
this._settings = new Gio.Settings({ schema_id: GdmUtil.LOGIN_SCREEN_SCHEMA });
|
||||||
|
|
||||||
this._settings.connect('changed::' + GdmUtil.BANNER_MESSAGE_KEY,
|
this._settings.connect(`changed::${GdmUtil.BANNER_MESSAGE_KEY}`,
|
||||||
this._updateBanner.bind(this));
|
this._updateBanner.bind(this));
|
||||||
this._settings.connect('changed::' + GdmUtil.BANNER_MESSAGE_TEXT_KEY,
|
this._settings.connect(`changed::${GdmUtil.BANNER_MESSAGE_TEXT_KEY}`,
|
||||||
this._updateBanner.bind(this));
|
this._updateBanner.bind(this));
|
||||||
this._settings.connect('changed::' + GdmUtil.DISABLE_USER_LIST_KEY,
|
this._settings.connect(`changed::${GdmUtil.DISABLE_USER_LIST_KEY}`,
|
||||||
this._updateDisableUserList.bind(this));
|
this._updateDisableUserList.bind(this));
|
||||||
this._settings.connect('changed::' + GdmUtil.LOGO_KEY,
|
this._settings.connect(`changed::${GdmUtil.LOGO_KEY}`,
|
||||||
this._updateLogo.bind(this));
|
this._updateLogo.bind(this));
|
||||||
|
|
||||||
this._textureCache = St.TextureCache.get_default();
|
this._textureCache = St.TextureCache.get_default();
|
||||||
@ -575,19 +573,15 @@ var LoginDialog = GObject.registerClass({
|
|||||||
// First find out what space the children require
|
// First find out what space the children require
|
||||||
let bannerAllocation = null;
|
let bannerAllocation = null;
|
||||||
let bannerHeight = 0;
|
let bannerHeight = 0;
|
||||||
let bannerWidth = 0;
|
|
||||||
if (this._bannerView.visible) {
|
if (this._bannerView.visible) {
|
||||||
bannerAllocation = this._getBannerAllocation(dialogBox, this._bannerView);
|
bannerAllocation = this._getBannerAllocation(dialogBox, this._bannerView);
|
||||||
bannerHeight = bannerAllocation.y2 - bannerAllocation.y1;
|
bannerHeight = bannerAllocation.y2 - bannerAllocation.y1;
|
||||||
bannerWidth = bannerAllocation.x2 - bannerAllocation.x1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let authPromptAllocation = null;
|
let authPromptAllocation = null;
|
||||||
let authPromptHeight = 0;
|
|
||||||
let authPromptWidth = 0;
|
let authPromptWidth = 0;
|
||||||
if (this._authPrompt.actor.visible) {
|
if (this._authPrompt.actor.visible) {
|
||||||
authPromptAllocation = this._getCenterActorAllocation(dialogBox, this._authPrompt.actor);
|
authPromptAllocation = this._getCenterActorAllocation(dialogBox, this._authPrompt.actor);
|
||||||
authPromptHeight = authPromptAllocation.y2 - authPromptAllocation.y1;
|
|
||||||
authPromptWidth = authPromptAllocation.x2 - authPromptAllocation.x1;
|
authPromptWidth = authPromptAllocation.x2 - authPromptAllocation.x1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -652,7 +646,7 @@ var LoginDialog = GObject.registerClass({
|
|||||||
bannerAllocation.x2 = Math.floor(centerX - centerGap / 2);
|
bannerAllocation.x2 = Math.floor(centerX - centerGap / 2);
|
||||||
bannerAllocation.x1 = Math.floor(bannerAllocation.x2 - wideBannerWidth);
|
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
|
// but don't let it get too close to the logo
|
||||||
let [wideMinHeight, wideBannerHeight] = this._bannerView.get_preferred_height(wideBannerWidth);
|
let [wideMinHeight, wideBannerHeight] = this._bannerView.get_preferred_height(wideBannerWidth);
|
||||||
|
|
||||||
@ -919,7 +913,7 @@ var LoginDialog = GObject.registerClass({
|
|||||||
{ opacity: 255,
|
{ opacity: 255,
|
||||||
time: _FADE_ANIMATION_TIME,
|
time: _FADE_ANIMATION_TIME,
|
||||||
transition: 'easeOutQuad',
|
transition: 'easeOutQuad',
|
||||||
onUpdate() {
|
onUpdate: () => {
|
||||||
let children = Main.layoutManager.uiGroup.get_children();
|
let children = Main.layoutManager.uiGroup.get_children();
|
||||||
|
|
||||||
for (let i = 0; i < children.length; i++) {
|
for (let i = 0; i < children.length; i++) {
|
||||||
@ -927,12 +921,10 @@ var LoginDialog = GObject.registerClass({
|
|||||||
children[i].opacity = this.opacity;
|
children[i].opacity = this.opacity;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onUpdateScope: this,
|
onComplete: () => {
|
||||||
onComplete() {
|
|
||||||
if (this._authPrompt.verificationStatus != AuthPrompt.AuthPromptStatus.NOT_VERIFYING)
|
if (this._authPrompt.verificationStatus != AuthPrompt.AuthPromptStatus.NOT_VERIFYING)
|
||||||
this._authPrompt.reset();
|
this._authPrompt.reset();
|
||||||
},
|
} });
|
||||||
onCompleteScope: this });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_gotGreeterSessionProxy(proxy) {
|
_gotGreeterSessionProxy(proxy) {
|
||||||
@ -949,7 +941,7 @@ var LoginDialog = GObject.registerClass({
|
|||||||
{ opacity: 0,
|
{ opacity: 0,
|
||||||
time: _FADE_ANIMATION_TIME,
|
time: _FADE_ANIMATION_TIME,
|
||||||
transition: 'easeOutQuad',
|
transition: 'easeOutQuad',
|
||||||
onUpdate() {
|
onUpdate: () => {
|
||||||
let children = Main.layoutManager.uiGroup.get_children();
|
let children = Main.layoutManager.uiGroup.get_children();
|
||||||
|
|
||||||
for (let i = 0; i < children.length; i++) {
|
for (let i = 0; i < children.length; i++) {
|
||||||
@ -957,15 +949,13 @@ var LoginDialog = GObject.registerClass({
|
|||||||
children[i].opacity = this.opacity;
|
children[i].opacity = this.opacity;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onUpdateScope: this,
|
onComplete: () => {
|
||||||
onComplete() {
|
|
||||||
this._greeter.call_start_session_when_ready_sync(serviceName, true, null);
|
this._greeter.call_start_session_when_ready_sync(serviceName, true, null);
|
||||||
},
|
} });
|
||||||
onCompleteScope: this });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_onSessionOpened(client, serviceName) {
|
_onSessionOpened(client, serviceName) {
|
||||||
this._authPrompt.finish(() => { this._startSession(serviceName); });
|
this._authPrompt.finish(() => this._startSession(serviceName));
|
||||||
}
|
}
|
||||||
|
|
||||||
_waitForItemForUser(userName) {
|
_waitForItemForUser(userName) {
|
||||||
@ -983,7 +973,7 @@ var LoginDialog = GObject.registerClass({
|
|||||||
hold.release();
|
hold.release();
|
||||||
});
|
});
|
||||||
|
|
||||||
hold.connect('release', () => { this._userList.disconnect(signalId); });
|
hold.connect('release', () => this._userList.disconnect(signalId));
|
||||||
|
|
||||||
return hold;
|
return hold;
|
||||||
}
|
}
|
||||||
@ -1047,6 +1037,7 @@ var LoginDialog = GObject.registerClass({
|
|||||||
return this._blockTimedLoginUntilIdle();
|
return this._blockTimedLoginUntilIdle();
|
||||||
} else {
|
} else {
|
||||||
animationTime = delay;
|
animationTime = delay;
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ var Manager = class {
|
|||||||
this._aggregateProvider = Provider(Gio.DBus.system,
|
this._aggregateProvider = Provider(Gio.DBus.system,
|
||||||
'org.freedesktop.realmd',
|
'org.freedesktop.realmd',
|
||||||
'/org/freedesktop/realmd',
|
'/org/freedesktop/realmd',
|
||||||
this._reloadRealms.bind(this))
|
this._reloadRealms.bind(this));
|
||||||
this._realms = {};
|
this._realms = {};
|
||||||
|
|
||||||
this._signalId = this._aggregateProvider.connect('g-properties-changed',
|
this._signalId = this._aggregateProvider.connect('g-properties-changed',
|
||||||
@ -36,7 +36,7 @@ var Manager = class {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
for (let i = 0; i < realmPaths.length; i++) {
|
for (let i = 0; i < realmPaths.length; i++) {
|
||||||
let realm = Realm(Gio.DBus.system,
|
Realm(Gio.DBus.system,
|
||||||
'org.freedesktop.realmd',
|
'org.freedesktop.realmd',
|
||||||
realmPaths[i],
|
realmPaths[i],
|
||||||
this._onRealmLoaded.bind(this));
|
this._onRealmLoaded.bind(this));
|
||||||
@ -98,10 +98,10 @@ var Manager = class {
|
|||||||
Service(Gio.DBus.system,
|
Service(Gio.DBus.system,
|
||||||
'org.freedesktop.realmd',
|
'org.freedesktop.realmd',
|
||||||
'/org/freedesktop/realmd',
|
'/org/freedesktop/realmd',
|
||||||
service => { service.ReleaseRemote(); });
|
service => service.ReleaseRemote());
|
||||||
this._aggregateProvider.disconnect(this._signalId);
|
this._aggregateProvider.disconnect(this._signalId);
|
||||||
this._realms = { };
|
this._realms = { };
|
||||||
this._updateLoginFormat();
|
this._updateLoginFormat();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
Signals.addSignalMethods(Manager.prototype)
|
Signals.addSignalMethods(Manager.prototype);
|
||||||
|
@ -30,7 +30,7 @@ var LOGO_KEY = 'logo';
|
|||||||
var DISABLE_USER_LIST_KEY = 'disable-user-list';
|
var DISABLE_USER_LIST_KEY = 'disable-user-list';
|
||||||
|
|
||||||
// Give user 48ms to read each character of a PAM message
|
// Give user 48ms to read each character of a PAM message
|
||||||
var USER_READ_TIME = 48
|
var USER_READ_TIME = 48;
|
||||||
|
|
||||||
var MessageType = {
|
var MessageType = {
|
||||||
NONE: 0,
|
NONE: 0,
|
||||||
@ -423,10 +423,7 @@ var ShellUserVerifier = class {
|
|||||||
_startService(serviceName) {
|
_startService(serviceName) {
|
||||||
this._hold.acquire();
|
this._hold.acquire();
|
||||||
if (this._userName) {
|
if (this._userName) {
|
||||||
this._userVerifier.call_begin_verification_for_user(serviceName,
|
this._userVerifier.call_begin_verification_for_user(serviceName, this._userName, this._cancellable, (obj, result) => {
|
||||||
this._userName,
|
|
||||||
this._cancellable,
|
|
||||||
(obj, result) => {
|
|
||||||
try {
|
try {
|
||||||
obj.call_begin_verification_for_user_finish(result);
|
obj.call_begin_verification_for_user_finish(result);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@ -439,9 +436,7 @@ var ShellUserVerifier = class {
|
|||||||
this._hold.release();
|
this._hold.release();
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
this._userVerifier.call_begin_verification(serviceName,
|
this._userVerifier.call_begin_verification(serviceName, this._cancellable, (obj, result) => {
|
||||||
this._cancellable,
|
|
||||||
(obj, result) => {
|
|
||||||
try {
|
try {
|
||||||
obj.call_begin_verification_finish(result);
|
obj.call_begin_verification_finish(result);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
@ -64,6 +64,7 @@
|
|||||||
<file>ui/keyboard.js</file>
|
<file>ui/keyboard.js</file>
|
||||||
<file>ui/layout.js</file>
|
<file>ui/layout.js</file>
|
||||||
<file>ui/lightbox.js</file>
|
<file>ui/lightbox.js</file>
|
||||||
|
<file>ui/locatePointer.js</file>
|
||||||
<file>ui/lookingGlass.js</file>
|
<file>ui/lookingGlass.js</file>
|
||||||
<file>ui/magnifier.js</file>
|
<file>ui/magnifier.js</file>
|
||||||
<file>ui/magnifierDBus.js</file>
|
<file>ui/magnifierDBus.js</file>
|
||||||
@ -81,9 +82,11 @@
|
|||||||
<file>ui/pageIndicators.js</file>
|
<file>ui/pageIndicators.js</file>
|
||||||
<file>ui/panel.js</file>
|
<file>ui/panel.js</file>
|
||||||
<file>ui/panelMenu.js</file>
|
<file>ui/panelMenu.js</file>
|
||||||
|
<file>ui/pointerA11yTimeout.js</file>
|
||||||
<file>ui/pointerWatcher.js</file>
|
<file>ui/pointerWatcher.js</file>
|
||||||
<file>ui/popupMenu.js</file>
|
<file>ui/popupMenu.js</file>
|
||||||
<file>ui/remoteSearch.js</file>
|
<file>ui/remoteSearch.js</file>
|
||||||
|
<file>ui/ripples.js</file>
|
||||||
<file>ui/runDialog.js</file>
|
<file>ui/runDialog.js</file>
|
||||||
<file>ui/screenShield.js</file>
|
<file>ui/screenShield.js</file>
|
||||||
<file>ui/screencast.js</file>
|
<file>ui/screencast.js</file>
|
||||||
@ -120,6 +123,7 @@
|
|||||||
|
|
||||||
<file>ui/status/accessibility.js</file>
|
<file>ui/status/accessibility.js</file>
|
||||||
<file>ui/status/brightness.js</file>
|
<file>ui/status/brightness.js</file>
|
||||||
|
<file>ui/status/dwellClick.js</file>
|
||||||
<file>ui/status/location.js</file>
|
<file>ui/status/location.js</file>
|
||||||
<file>ui/status/keyboard.js</file>
|
<file>ui/status/keyboard.js</file>
|
||||||
<file>ui/status/nightLight.js</file>
|
<file>ui/status/nightLight.js</file>
|
||||||
|
@ -31,7 +31,7 @@ function getCurrentExtension() {
|
|||||||
// Search for an occurrence of an extension stack frame
|
// Search for an occurrence of an extension stack frame
|
||||||
// Start at 1 because 0 is the stack frame of this function
|
// Start at 1 because 0 is the stack frame of this function
|
||||||
for (let i = 1; i < stack.length; i++) {
|
for (let i = 1; i < stack.length; i++) {
|
||||||
if (stack[i].indexOf('/gnome-shell/extensions/') > -1) {
|
if (stack[i].includes('/gnome-shell/extensions/')) {
|
||||||
extensionStackLine = stack[i];
|
extensionStackLine = stack[i];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -162,8 +162,6 @@ function isOutOfDate(extension) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function createExtensionObject(uuid, dir, type) {
|
function createExtensionObject(uuid, dir, type) {
|
||||||
let info;
|
|
||||||
|
|
||||||
let metadataFile = dir.get_child('metadata.json');
|
let metadataFile = dir.get_child('metadata.json');
|
||||||
if (!metadataFile.query_exists(null)) {
|
if (!metadataFile.query_exists(null)) {
|
||||||
throw new Error('Missing metadata.json');
|
throw new Error('Missing metadata.json');
|
||||||
@ -175,25 +173,25 @@ function createExtensionObject(uuid, dir, type) {
|
|||||||
if (metadataContents instanceof Uint8Array)
|
if (metadataContents instanceof Uint8Array)
|
||||||
metadataContents = imports.byteArray.toString(metadataContents);
|
metadataContents = imports.byteArray.toString(metadataContents);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
throw new Error('Failed to load metadata.json: ' + e);
|
throw new Error(`Failed to load metadata.json: ${e}`);
|
||||||
}
|
}
|
||||||
let meta;
|
let meta;
|
||||||
try {
|
try {
|
||||||
meta = JSON.parse(metadataContents);
|
meta = JSON.parse(metadataContents);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
throw new Error('Failed to parse metadata.json: ' + e);
|
throw new Error(`Failed to parse metadata.json: ${e}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
let requiredProperties = ['uuid', 'name', 'description', 'shell-version'];
|
let requiredProperties = ['uuid', 'name', 'description', 'shell-version'];
|
||||||
for (let i = 0; i < requiredProperties.length; i++) {
|
for (let i = 0; i < requiredProperties.length; i++) {
|
||||||
let prop = requiredProperties[i];
|
let prop = requiredProperties[i];
|
||||||
if (!meta[prop]) {
|
if (!meta[prop]) {
|
||||||
throw new Error('missing "' + prop + '" property in metadata.json');
|
throw new Error(`missing "${prop}" property in metadata.json`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (uuid != meta.uuid) {
|
if (uuid != meta.uuid) {
|
||||||
throw new Error('uuid "' + meta.uuid + '" from metadata.json does not match directory name "' + uuid + '"');
|
throw new Error(`uuid "${meta.uuid}" from metadata.json does not match directory name "${uuid}"`);
|
||||||
}
|
}
|
||||||
|
|
||||||
let extension = {};
|
let extension = {};
|
||||||
|
@ -36,7 +36,7 @@ function recursivelyDeleteDir(dir, deleteParent) {
|
|||||||
let children = dir.enumerate_children('standard::name,standard::type',
|
let children = dir.enumerate_children('standard::name,standard::type',
|
||||||
Gio.FileQueryInfoFlags.NONE, null);
|
Gio.FileQueryInfoFlags.NONE, null);
|
||||||
|
|
||||||
let info, child;
|
let info;
|
||||||
while ((info = children.next_file(null)) != null) {
|
while ((info = children.next_file(null)) != null) {
|
||||||
let type = info.get_file_type();
|
let type = info.get_file_type();
|
||||||
let child = dir.get_child(info.get_name());
|
let child = dir.get_child(info.get_name());
|
||||||
@ -57,7 +57,7 @@ function recursivelyMoveDir(srcDir, destDir) {
|
|||||||
if (!destDir.query_exists(null))
|
if (!destDir.query_exists(null))
|
||||||
destDir.make_directory_with_parents(null);
|
destDir.make_directory_with_parents(null);
|
||||||
|
|
||||||
let info, child;
|
let info;
|
||||||
while ((info = children.next_file(null)) != null) {
|
while ((info = children.next_file(null)) != null) {
|
||||||
let type = info.get_file_type();
|
let type = info.get_file_type();
|
||||||
let srcChild = srcDir.get_child(info.get_name());
|
let srcChild = srcDir.get_child(info.get_name());
|
||||||
@ -86,11 +86,11 @@ function loadInterfaceXML(iface) {
|
|||||||
try {
|
try {
|
||||||
let [ok, bytes] = f.load_contents(null);
|
let [ok, bytes] = f.load_contents(null);
|
||||||
if (bytes instanceof Uint8Array)
|
if (bytes instanceof Uint8Array)
|
||||||
xml = imports.byteArray.toString(bytes)
|
xml = imports.byteArray.toString(bytes);
|
||||||
else
|
else
|
||||||
xml = bytes.toString();
|
xml = bytes.toString();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
log('Failed to load D-Bus interface ' + iface);
|
log(`Failed to load D-Bus interface ${iface}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
return xml;
|
return xml;
|
||||||
|
@ -18,7 +18,7 @@ var HistoryManager = class {
|
|||||||
this._historyIndex = 0;
|
this._historyIndex = 0;
|
||||||
if (this._key) {
|
if (this._key) {
|
||||||
this._history = global.settings.get_strv(this._key);
|
this._history = global.settings.get_strv(this._key);
|
||||||
global.settings.connect('changed::' + this._key,
|
global.settings.connect(`changed::${this._key}`,
|
||||||
this._historyChanged.bind(this));
|
this._historyChanged.bind(this));
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
@ -42,7 +42,7 @@ var IBusManager = class {
|
|||||||
this._candidatePopup = new IBusCandidatePopup.CandidatePopup();
|
this._candidatePopup = new IBusCandidatePopup.CandidatePopup();
|
||||||
|
|
||||||
this._panelService = null;
|
this._panelService = null;
|
||||||
this._engines = {};
|
this._engines = new Map();
|
||||||
this._ready = false;
|
this._ready = false;
|
||||||
this._registerPropertiesId = 0;
|
this._registerPropertiesId = 0;
|
||||||
this._currentEngineName = null;
|
this._currentEngineName = null;
|
||||||
@ -63,7 +63,7 @@ var IBusManager = class {
|
|||||||
Gio.Subprocess.new(['ibus-daemon', '--xim', '--panel', 'disable'],
|
Gio.Subprocess.new(['ibus-daemon', '--xim', '--panel', 'disable'],
|
||||||
Gio.SubprocessFlags.NONE);
|
Gio.SubprocessFlags.NONE);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
log('Failed to launch ibus-daemon: ' + e.message);
|
log(`Failed to launch ibus-daemon: ${e.message}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -73,7 +73,7 @@ var IBusManager = class {
|
|||||||
|
|
||||||
this._panelService = null;
|
this._panelService = null;
|
||||||
this._candidatePopup.setPanelService(null);
|
this._candidatePopup.setPanelService(null);
|
||||||
this._engines = {};
|
this._engines.clear();
|
||||||
this._ready = false;
|
this._ready = false;
|
||||||
this._registerPropertiesId = 0;
|
this._registerPropertiesId = 0;
|
||||||
this._currentEngineName = null;
|
this._currentEngineName = null;
|
||||||
@ -96,7 +96,7 @@ var IBusManager = class {
|
|||||||
if (enginesList) {
|
if (enginesList) {
|
||||||
for (let i = 0; i < enginesList.length; ++i) {
|
for (let i = 0; i < enginesList.length; ++i) {
|
||||||
let name = enginesList[i].get_name();
|
let name = enginesList[i].get_name();
|
||||||
this._engines[name] = enginesList[i];
|
this._engines.set(name, enginesList[i]);
|
||||||
}
|
}
|
||||||
this._updateReadiness();
|
this._updateReadiness();
|
||||||
} else {
|
} else {
|
||||||
@ -119,7 +119,7 @@ var IBusManager = class {
|
|||||||
if (!GLib.str_has_suffix(path, '/InputContext_1'))
|
if (!GLib.str_has_suffix(path, '/InputContext_1'))
|
||||||
this.emit ('focus-in');
|
this.emit ('focus-in');
|
||||||
});
|
});
|
||||||
this._panelService.connect('focus-out', () => { this.emit('focus-out'); });
|
this._panelService.connect('focus-out', () => this.emit('focus-out'));
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// IBus versions older than 1.5.10 have a bug which
|
// IBus versions older than 1.5.10 have a bug which
|
||||||
@ -150,8 +150,7 @@ var IBusManager = class {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_updateReadiness() {
|
_updateReadiness() {
|
||||||
this._ready = (Object.keys(this._engines).length > 0 &&
|
this._ready = this._engines.size > 0 && this._panelService != null;
|
||||||
this._panelService != null);
|
|
||||||
this.emit('ready', this._ready);
|
this.emit('ready', this._ready);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -189,10 +188,10 @@ var IBusManager = class {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getEngineDesc(id) {
|
getEngineDesc(id) {
|
||||||
if (!this._ready || !this._engines.hasOwnProperty(id))
|
if (!this._ready || !this._engines.has(id))
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
return this._engines[id];
|
return this._engines.get(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
setEngine(id, callback) {
|
setEngine(id, callback) {
|
||||||
|
@ -74,7 +74,7 @@ class InputMethod extends Clutter.InputMethod {
|
|||||||
this._context = null;
|
this._context = null;
|
||||||
this._hints = 0;
|
this._hints = 0;
|
||||||
this._purpose = 0;
|
this._purpose = 0;
|
||||||
this._preeditStr = ''
|
this._preeditStr = '';
|
||||||
this._preeditPos = 0;
|
this._preeditPos = 0;
|
||||||
this._preeditVisible = false;
|
this._preeditVisible = false;
|
||||||
}
|
}
|
||||||
@ -262,7 +262,7 @@ class InputMethod extends Clutter.InputMethod {
|
|||||||
let retval = context.process_key_event_async_finish(res);
|
let retval = context.process_key_event_async_finish(res);
|
||||||
this.notify_key_event(event, retval);
|
this.notify_key_event(event, retval);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
log('Error processing key on IM: ' + e.message);
|
log(`Error processing key on IM: ${e.message}`);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return true;
|
return true;
|
||||||
|
@ -42,8 +42,6 @@ var IntrospectService = class {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_isStandaloneApp(app) {
|
_isStandaloneApp(app) {
|
||||||
let windows = app.get_windows();
|
|
||||||
|
|
||||||
return app.get_windows().some(w => w.transient_for == null);
|
return app.get_windows().some(w => w.transient_for == null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -55,6 +53,11 @@ var IntrospectService = class {
|
|||||||
return APP_WHITELIST.includes(sender);
|
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() {
|
_syncRunningApplications() {
|
||||||
let tracker = Shell.WindowTracker.get_default();
|
let tracker = Shell.WindowTracker.get_default();
|
||||||
let apps = this._appSystem.get_running();
|
let apps = this._appSystem.get_running();
|
||||||
@ -76,6 +79,10 @@ var IntrospectService = class {
|
|||||||
newActiveApplication = app.get_id();
|
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;
|
newRunningApplications[app.get_id()] = appInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -137,6 +144,7 @@ var IntrospectService = class {
|
|||||||
let frameRect = window.get_frame_rect();
|
let frameRect = window.get_frame_rect();
|
||||||
let title = window.get_title();
|
let title = window.get_title();
|
||||||
let wmClass = window.get_wm_class();
|
let wmClass = window.get_wm_class();
|
||||||
|
let sandboxedAppId = window.get_sandboxed_app_id();
|
||||||
|
|
||||||
windowsList[windowId] = {
|
windowsList[windowId] = {
|
||||||
'app-id': GLib.Variant.new('s', app.get_id()),
|
'app-id': GLib.Variant.new('s', app.get_id()),
|
||||||
@ -153,6 +161,10 @@ var IntrospectService = class {
|
|||||||
|
|
||||||
if (wmClass != null)
|
if (wmClass != null)
|
||||||
windowsList[windowId]['wm-class'] = GLib.Variant.new('s', wmClass);
|
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]));
|
invocation.return_value(new GLib.Variant('(a{ta{sv}})', [windowsList]));
|
||||||
|
@ -51,7 +51,7 @@ function getCompletions(text, commandHeader, globalCompletionList) {
|
|||||||
// if we encounter anything that isn't a letter, '.', ')', or ']',
|
// if we encounter anything that isn't a letter, '.', ')', or ']',
|
||||||
// we should stop parsing.
|
// we should stop parsing.
|
||||||
function isStopChar(c) {
|
function isStopChar(c) {
|
||||||
return !c.match(/[\w\.\)\]]/);
|
return !c.match(/[\w.)\]]/);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Given the ending position of a quoted string, find where it starts
|
// Given the ending position of a quoted string, find where it starts
|
||||||
@ -121,7 +121,7 @@ function getExpressionOffset(expr, offset) {
|
|||||||
return offset + 1;
|
return offset + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (currChar.match(/[\)\]]/)) {
|
if (currChar.match(/[)\]]/)) {
|
||||||
offset = findMatchingBrace(expr, offset);
|
offset = findMatchingBrace(expr, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -125,7 +125,7 @@ var KeyboardManager = class {
|
|||||||
|
|
||||||
_getLocaleLayout() {
|
_getLocaleLayout() {
|
||||||
let locale = GLib.get_language_names()[0];
|
let locale = GLib.get_language_names()[0];
|
||||||
if (locale.indexOf('_') == -1)
|
if (!locale.includes('_'))
|
||||||
locale = DEFAULT_LOCALE;
|
locale = DEFAULT_LOCALE;
|
||||||
|
|
||||||
let [found, , id] = GnomeDesktop.get_input_source_from_locale(locale);
|
let [found, , id] = GnomeDesktop.get_input_source_from_locale(locale);
|
||||||
|
@ -48,6 +48,28 @@ function canLock() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function registerSessionWithGDM() {
|
||||||
|
log("Registering session with GDM");
|
||||||
|
Gio.DBus.system.call('org.gnome.DisplayManager',
|
||||||
|
'/org/gnome/DisplayManager/Manager',
|
||||||
|
'org.gnome.DisplayManager.Manager',
|
||||||
|
'RegisterSession',
|
||||||
|
GLib.Variant.new('(a{sv})', [{}]), null,
|
||||||
|
Gio.DBusCallFlags.NONE, -1, null,
|
||||||
|
(source, result) => {
|
||||||
|
try {
|
||||||
|
source.call_finish(result);
|
||||||
|
} catch (e) {
|
||||||
|
if (!e.matches(Gio.DBusError, Gio.DBusError.UNKNOWN_METHOD))
|
||||||
|
log(`Error registering session with GDM: ${e.message}`);
|
||||||
|
else
|
||||||
|
log("Not calling RegisterSession(): method not exported, GDM too old?");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
let _loginManager = null;
|
let _loginManager = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -26,33 +26,33 @@ function _getMobileProvidersDatabase() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// _findProviderForMccMnc:
|
// _findProviderForMccMnc:
|
||||||
// @operator_name: operator name
|
// @operatorName: operator name
|
||||||
// @operator_code: operator code
|
// @operatorCode: operator code
|
||||||
//
|
//
|
||||||
// Given an operator name string (which may not be a real operator name) and an
|
// Given an operator name string (which may not be a real operator name) and an
|
||||||
// operator code string, tries to find a proper operator name to display.
|
// operator code string, tries to find a proper operator name to display.
|
||||||
//
|
//
|
||||||
function _findProviderForMccMnc(operator_name, operator_code) {
|
function _findProviderForMccMnc(operatorName, operatorCode) {
|
||||||
if (operator_name) {
|
if (operatorName) {
|
||||||
if (operator_name.length != 0 &&
|
if (operatorName.length != 0 &&
|
||||||
(operator_name.length > 6 || operator_name.length < 5)) {
|
(operatorName.length > 6 || operatorName.length < 5)) {
|
||||||
// this looks like a valid name, i.e. not an MCCMNC (that some
|
// this looks like a valid name, i.e. not an MCCMNC (that some
|
||||||
// devices return when not yet connected
|
// devices return when not yet connected
|
||||||
return operator_name;
|
return operatorName;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isNaN(parseInt(operator_name))) {
|
if (isNaN(parseInt(operatorName))) {
|
||||||
// name is definitely not a MCCMNC, so it may be a name
|
// name is definitely not a MCCMNC, so it may be a name
|
||||||
// after all; return that
|
// after all; return that
|
||||||
return operator_name;
|
return operatorName;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let needle;
|
let needle;
|
||||||
if ((!operator_name || operator_name.length == 0) && operator_code)
|
if ((!operatorName || operatorName.length == 0) && operatorCode)
|
||||||
needle = operator_code;
|
needle = operatorCode;
|
||||||
else if (operator_name && (operator_name.length == 6 || operator_name.length == 5))
|
else if (operatorName && (operatorName.length == 6 || operatorName.length == 5))
|
||||||
needle = operator_name;
|
needle = operatorName;
|
||||||
else // nothing to search
|
else // nothing to search
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
@ -71,7 +71,7 @@ function _findProviderForMccMnc(operator_name, operator_code) {
|
|||||||
// Tries to find the operator name corresponding to the given SID
|
// Tries to find the operator name corresponding to the given SID
|
||||||
//
|
//
|
||||||
function _findProviderForSid(sid) {
|
function _findProviderForSid(sid) {
|
||||||
if (sid == 0)
|
if (!sid)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
let mpd = _getMobileProvidersDatabase();
|
let mpd = _getMobileProvidersDatabase();
|
||||||
@ -173,7 +173,7 @@ var ModemCdma = class {
|
|||||||
} else {
|
} else {
|
||||||
let [bandClass, band, sid] = result;
|
let [bandClass, band, sid] = result;
|
||||||
|
|
||||||
this.operator_name = _findProviderForSid(sid)
|
this.operator_name = _findProviderForSid(sid);
|
||||||
}
|
}
|
||||||
this.emit('notify::operator-name');
|
this.emit('notify::operator-name');
|
||||||
});
|
});
|
||||||
@ -230,17 +230,17 @@ var BroadbandModem = class {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_reloadOperatorName() {
|
_reloadOperatorName() {
|
||||||
let new_name = "";
|
let newName = "";
|
||||||
if (this.operator_name_3gpp && this.operator_name_3gpp.length > 0)
|
if (this.operator_name_3gpp && this.operator_name_3gpp.length > 0)
|
||||||
new_name += this.operator_name_3gpp;
|
newName += this.operator_name_3gpp;
|
||||||
|
|
||||||
if (this.operator_name_cdma && this.operator_name_cdma.length > 0) {
|
if (this.operator_name_cdma && this.operator_name_cdma.length > 0) {
|
||||||
if (new_name != "")
|
if (newName != "")
|
||||||
new_name += ", ";
|
newName += ", ";
|
||||||
new_name += this.operator_name_cdma;
|
newName += this.operator_name_cdma;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.operator_name = new_name;
|
this.operator_name = newName;
|
||||||
this.emit('notify::operator-name');
|
this.emit('notify::operator-name');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -89,14 +89,11 @@ var ObjectManager = class {
|
|||||||
g_interface_info: info,
|
g_interface_info: info,
|
||||||
g_flags: Gio.DBusProxyFlags.DO_NOT_AUTO_START });
|
g_flags: Gio.DBusProxyFlags.DO_NOT_AUTO_START });
|
||||||
|
|
||||||
proxy.init_async(GLib.PRIORITY_DEFAULT,
|
proxy.init_async(GLib.PRIORITY_DEFAULT, this._cancellable, (initable, result) => {
|
||||||
this._cancellable,
|
|
||||||
(initable, result) => {
|
|
||||||
let error = null;
|
|
||||||
try {
|
try {
|
||||||
initable.init_finish(result);
|
initable.init_finish(result);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
logError(e, 'could not initialize proxy for interface ' + interfaceName);
|
logError(e, `could not initialize proxy for interface ${interfaceName}`);
|
||||||
|
|
||||||
if (onFinished)
|
if (onFinished)
|
||||||
onFinished();
|
onFinished();
|
||||||
@ -155,11 +152,10 @@ var ObjectManager = class {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_onManagerProxyLoaded(initable, result) {
|
_onManagerProxyLoaded(initable, result) {
|
||||||
let error = null;
|
|
||||||
try {
|
try {
|
||||||
initable.init_finish(result);
|
initable.init_finish(result);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
logError(e, 'could not initialize object manager for object ' + this._serviceName);
|
logError(e, `could not initialize object manager for object ${this._serviceName}`);
|
||||||
|
|
||||||
this._tryToCompleteLoad();
|
this._tryToCompleteLoad();
|
||||||
return;
|
return;
|
||||||
@ -197,7 +193,7 @@ var ObjectManager = class {
|
|||||||
this._managerProxy.GetManagedObjectsRemote((result, error) => {
|
this._managerProxy.GetManagedObjectsRemote((result, error) => {
|
||||||
if (!result) {
|
if (!result) {
|
||||||
if (error) {
|
if (error) {
|
||||||
logError(error, 'could not get remote objects for service ' + this._serviceName + ' path ' + this._managerPath);
|
logError(error, `could not get remote objects for service ${this._serviceName} path ${this._managerPath}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
this._tryToCompleteLoad();
|
this._tryToCompleteLoad();
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
|
||||||
|
const Lang = imports.lang;
|
||||||
|
|
||||||
// parse:
|
// parse:
|
||||||
// @params: caller-provided parameter object, or %null
|
// @params: caller-provided parameter object, or %null
|
||||||
// @defaults-provided defaults object
|
// @defaults-provided defaults object
|
||||||
@ -14,22 +16,14 @@
|
|||||||
//
|
//
|
||||||
// Return value: a new object, containing the merged parameters from
|
// Return value: a new object, containing the merged parameters from
|
||||||
// @params and @defaults
|
// @params and @defaults
|
||||||
function parse(params, defaults, allowExtras) {
|
function parse(params = {}, defaults, allowExtras) {
|
||||||
let ret = {}, prop;
|
if (!allowExtras) {
|
||||||
|
for (let prop in params)
|
||||||
if (!params)
|
if (!(prop in defaults))
|
||||||
params = {};
|
throw new Error(`Unrecognized parameter "${prop}"`);
|
||||||
|
|
||||||
for (prop in params) {
|
|
||||||
if (!(prop in defaults) && !allowExtras)
|
|
||||||
throw new Error('Unrecognized parameter "' + prop + '"');
|
|
||||||
ret[prop] = params[prop];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (prop in defaults) {
|
let defaultsCopy = {};
|
||||||
if (!(prop in params))
|
Lang.copyProperties(defaults, defaultsCopy);
|
||||||
ret[prop] = defaults[prop];
|
return Object.assign(defaultsCopy, params);
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
@ -12,4 +12,4 @@ function PermissionStore(initCallback, cancellable) {
|
|||||||
'org.freedesktop.impl.portal.PermissionStore',
|
'org.freedesktop.impl.portal.PermissionStore',
|
||||||
'/org/freedesktop/impl/portal/PermissionStore',
|
'/org/freedesktop/impl/portal/PermissionStore',
|
||||||
initCallback, cancellable);
|
initCallback, cancellable);
|
||||||
};
|
}
|
||||||
|
@ -83,48 +83,54 @@ const SystemActions = GObject.registerClass({
|
|||||||
this._canHaveSuspend = true;
|
this._canHaveSuspend = true;
|
||||||
|
|
||||||
this._actions = new Map();
|
this._actions = new Map();
|
||||||
this._actions.set(POWER_OFF_ACTION_ID,
|
this._actions.set(POWER_OFF_ACTION_ID, {
|
||||||
{ // Translators: The name of the power-off action in search
|
// Translators: The name of the power-off action in search
|
||||||
name: C_("search-result", "Power Off"),
|
name: C_("search-result", "Power Off"),
|
||||||
iconName: 'system-shutdown-symbolic',
|
iconName: 'system-shutdown-symbolic',
|
||||||
// Translators: A list of keywords that match the power-off action, separated by semicolons
|
// Translators: A list of keywords that match the power-off action, separated by semicolons
|
||||||
keywords: _("power off;shutdown;reboot;restart").split(';'),
|
keywords: _("power off;shutdown;reboot;restart").split(/[; ]/),
|
||||||
available: false });
|
available: false
|
||||||
this._actions.set(LOCK_SCREEN_ACTION_ID,
|
});
|
||||||
{ // Translators: The name of the lock screen action in search
|
this._actions.set(LOCK_SCREEN_ACTION_ID, {
|
||||||
|
// Translators: The name of the lock screen action in search
|
||||||
name: C_("search-result", "Lock Screen"),
|
name: C_("search-result", "Lock Screen"),
|
||||||
iconName: 'system-lock-screen-symbolic',
|
iconName: 'system-lock-screen-symbolic',
|
||||||
// Translators: A list of keywords that match the lock screen action, separated by semicolons
|
// Translators: A list of keywords that match the lock screen action, separated by semicolons
|
||||||
keywords: _("lock screen").split(';'),
|
keywords: _("lock screen").split(/[; ]/),
|
||||||
available: false });
|
available: false
|
||||||
this._actions.set(LOGOUT_ACTION_ID,
|
});
|
||||||
{ // Translators: The name of the logout action in search
|
this._actions.set(LOGOUT_ACTION_ID, {
|
||||||
|
// Translators: The name of the logout action in search
|
||||||
name: C_("search-result", "Log Out"),
|
name: C_("search-result", "Log Out"),
|
||||||
iconName: 'application-exit-symbolic',
|
iconName: 'application-exit-symbolic',
|
||||||
// Translators: A list of keywords that match the logout action, separated by semicolons
|
// Translators: A list of keywords that match the logout action, separated by semicolons
|
||||||
keywords: _("logout;sign off").split(';'),
|
keywords: _("logout;log out;sign off").split(/[; ]/),
|
||||||
available: false });
|
available: false
|
||||||
this._actions.set(SUSPEND_ACTION_ID,
|
});
|
||||||
{ // Translators: The name of the suspend action in search
|
this._actions.set(SUSPEND_ACTION_ID, {
|
||||||
|
// Translators: The name of the suspend action in search
|
||||||
name: C_("search-result", "Suspend"),
|
name: C_("search-result", "Suspend"),
|
||||||
iconName: 'media-playback-pause-symbolic',
|
iconName: 'media-playback-pause-symbolic',
|
||||||
// Translators: A list of keywords that match the suspend action, separated by semicolons
|
// Translators: A list of keywords that match the suspend action, separated by semicolons
|
||||||
keywords: _("suspend;sleep").split(';'),
|
keywords: _("suspend;sleep").split(/[; ]/),
|
||||||
available: false });
|
available: false
|
||||||
this._actions.set(SWITCH_USER_ACTION_ID,
|
});
|
||||||
{ // Translators: The name of the switch user action in search
|
this._actions.set(SWITCH_USER_ACTION_ID, {
|
||||||
|
// Translators: The name of the switch user action in search
|
||||||
name: C_("search-result", "Switch User"),
|
name: C_("search-result", "Switch User"),
|
||||||
iconName: 'system-switch-user-symbolic',
|
iconName: 'system-switch-user-symbolic',
|
||||||
// Translators: A list of keywords that match the switch user action, separated by semicolons
|
// Translators: A list of keywords that match the switch user action, separated by semicolons
|
||||||
keywords: _("switch user").split(';'),
|
keywords: _("switch user").split(/[; ]/),
|
||||||
available: false });
|
available: false
|
||||||
this._actions.set(LOCK_ORIENTATION_ACTION_ID,
|
});
|
||||||
{ // Translators: The name of the lock orientation action in search
|
this._actions.set(LOCK_ORIENTATION_ACTION_ID, {
|
||||||
|
// Translators: The name of the lock orientation action in search
|
||||||
name: C_("search-result", "Lock Orientation"),
|
name: C_("search-result", "Lock Orientation"),
|
||||||
iconName: '',
|
iconName: '',
|
||||||
// Translators: A list of keywords that match the lock orientation action, separated by semicolons
|
// Translators: A list of keywords that match the lock orientation action, separated by semicolons
|
||||||
keywords: _("lock orientation;screen;rotation").split(';'),
|
keywords: _("lock orientation;screen;rotation").split(/[; ]/),
|
||||||
available: false });
|
available: false
|
||||||
|
});
|
||||||
|
|
||||||
this._loginScreenSettings = new Gio.Settings({ schema_id: LOGIN_SCREEN_SCHEMA });
|
this._loginScreenSettings = new Gio.Settings({ schema_id: LOGIN_SCREEN_SCHEMA });
|
||||||
this._lockdownSettings = new Gio.Settings({ schema_id: LOCKDOWN_SCHEMA });
|
this._lockdownSettings = new Gio.Settings({ schema_id: LOCKDOWN_SCHEMA });
|
||||||
@ -137,37 +143,39 @@ const SystemActions = GObject.registerClass({
|
|||||||
this._userManager = AccountsService.UserManager.get_default();
|
this._userManager = AccountsService.UserManager.get_default();
|
||||||
|
|
||||||
this._userManager.connect('notify::is-loaded',
|
this._userManager.connect('notify::is-loaded',
|
||||||
() => { this._updateMultiUser(); });
|
() => this._updateMultiUser());
|
||||||
this._userManager.connect('notify::has-multiple-users',
|
this._userManager.connect('notify::has-multiple-users',
|
||||||
() => { this._updateMultiUser(); });
|
() => this._updateMultiUser());
|
||||||
this._userManager.connect('user-added',
|
this._userManager.connect('user-added',
|
||||||
() => { this._updateMultiUser(); });
|
() => this._updateMultiUser());
|
||||||
this._userManager.connect('user-removed',
|
this._userManager.connect('user-removed',
|
||||||
() => { this._updateMultiUser(); });
|
() => this._updateMultiUser());
|
||||||
|
|
||||||
this._lockdownSettings.connect('changed::' + DISABLE_USER_SWITCH_KEY,
|
this._lockdownSettings.connect(`changed::${DISABLE_USER_SWITCH_KEY}`,
|
||||||
() => { this._updateSwitchUser(); });
|
() => this._updateSwitchUser());
|
||||||
this._lockdownSettings.connect('changed::' + DISABLE_LOG_OUT_KEY,
|
this._lockdownSettings.connect(`changed::${DISABLE_LOG_OUT_KEY}`,
|
||||||
() => { this._updateLogout(); });
|
() => this._updateLogout());
|
||||||
global.settings.connect('changed::' + ALWAYS_SHOW_LOG_OUT_KEY,
|
global.settings.connect(`changed::${ALWAYS_SHOW_LOG_OUT_KEY}`,
|
||||||
() => { this._updateLogout(); });
|
() => this._updateLogout());
|
||||||
|
|
||||||
this._lockdownSettings.connect('changed::' + DISABLE_LOCK_SCREEN_KEY,
|
this._lockdownSettings.connect(`changed::${DISABLE_LOCK_SCREEN_KEY}`,
|
||||||
() => { this._updateLockScreen(); });
|
() => this._updateLockScreen());
|
||||||
|
|
||||||
this._lockdownSettings.connect('changed::' + DISABLE_LOG_OUT_KEY,
|
this._lockdownSettings.connect(`changed::${DISABLE_LOG_OUT_KEY}`,
|
||||||
() => { this._updateHaveShutdown(); });
|
() => this._updateHaveShutdown());
|
||||||
|
|
||||||
this.forceUpdate();
|
this.forceUpdate();
|
||||||
|
|
||||||
this._orientationSettings.connect('changed::orientation-lock',
|
this._orientationSettings.connect('changed::orientation-lock',
|
||||||
() => { this._updateOrientationLock();
|
() => {
|
||||||
this._updateOrientationLockIcon(); });
|
this._updateOrientationLock();
|
||||||
|
this._updateOrientationLockIcon();
|
||||||
|
});
|
||||||
Main.layoutManager.connect('monitors-changed',
|
Main.layoutManager.connect('monitors-changed',
|
||||||
() => { this._updateOrientationLock(); });
|
() => this._updateOrientationLock());
|
||||||
Gio.DBus.system.watch_name(SENSOR_BUS_NAME,
|
Gio.DBus.system.watch_name(SENSOR_BUS_NAME,
|
||||||
Gio.BusNameWatcherFlags.NONE,
|
Gio.BusNameWatcherFlags.NONE,
|
||||||
() => { this._sensorProxyAppeared(); },
|
() => this._sensorProxyAppeared(),
|
||||||
() => {
|
() => {
|
||||||
this._sensorProxy = null;
|
this._sensorProxy = null;
|
||||||
this._updateOrientationLock();
|
this._updateOrientationLock();
|
||||||
@ -175,7 +183,7 @@ const SystemActions = GObject.registerClass({
|
|||||||
this._updateOrientationLock();
|
this._updateOrientationLock();
|
||||||
this._updateOrientationLockIcon();
|
this._updateOrientationLockIcon();
|
||||||
|
|
||||||
Main.sessionMode.connect('updated', () => { this._sessionUpdated(); });
|
Main.sessionMode.connect('updated', () => this._sessionUpdated());
|
||||||
this._sessionUpdated();
|
this._sessionUpdated();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -215,7 +223,7 @@ const SystemActions = GObject.registerClass({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this._sensorProxy.connect('g-properties-changed',
|
this._sensorProxy.connect('g-properties-changed',
|
||||||
() => { this._updateOrientationLock(); });
|
() => this._updateOrientationLock());
|
||||||
this._updateOrientationLock();
|
this._updateOrientationLock();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -257,12 +265,12 @@ const SystemActions = GObject.registerClass({
|
|||||||
|
|
||||||
getMatchingActions(terms) {
|
getMatchingActions(terms) {
|
||||||
// terms is a list of strings
|
// terms is a list of strings
|
||||||
terms = terms.map((term) => { return term.toLowerCase(); });
|
terms = terms.map((term) => term.toLowerCase());
|
||||||
|
|
||||||
let results = [];
|
let results = [];
|
||||||
|
|
||||||
for (let [key, { available, keywords }] of this._actions)
|
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);
|
results.push(key);
|
||||||
|
|
||||||
return results;
|
return results;
|
||||||
|
@ -17,7 +17,7 @@ const _leadingJunk = '[\\s`(\\[{\'\\"<\u00AB\u201C\u2018]';
|
|||||||
const _notTrailingJunk = '[^\\s`!()\\[\\]{};:\'\\".,<>?\u00AB\u00BB\u201C\u201D\u2018\u2019]';
|
const _notTrailingJunk = '[^\\s`!()\\[\\]{};:\'\\".,<>?\u00AB\u00BB\u201C\u201D\u2018\u2019]';
|
||||||
|
|
||||||
const _urlRegexp = new RegExp(
|
const _urlRegexp = new RegExp(
|
||||||
'(^|' + _leadingJunk + ')' +
|
`(^|${_leadingJunk})` +
|
||||||
'(' +
|
'(' +
|
||||||
'(?:' +
|
'(?:' +
|
||||||
'(?:http|https|ftp)://' + // scheme://
|
'(?:http|https|ftp)://' + // scheme://
|
||||||
@ -29,12 +29,12 @@ const _urlRegexp = new RegExp(
|
|||||||
'(?:' + // one or more:
|
'(?:' + // one or more:
|
||||||
'[^\\s()<>]+' + // run of non-space non-()
|
'[^\\s()<>]+' + // run of non-space non-()
|
||||||
'|' + // or
|
'|' + // or
|
||||||
_balancedParens + // balanced parens
|
`${_balancedParens}` + // balanced parens
|
||||||
')+' +
|
')+' +
|
||||||
'(?:' + // end with:
|
'(?:' + // end with:
|
||||||
_balancedParens + // balanced parens
|
`${_balancedParens}` + // balanced parens
|
||||||
'|' + // or
|
'|' + // or
|
||||||
_notTrailingJunk + // last non-junk char
|
`${_notTrailingJunk}` + // last non-junk char
|
||||||
')' +
|
')' +
|
||||||
')', 'gi');
|
')', 'gi');
|
||||||
|
|
||||||
@ -69,16 +69,16 @@ function spawn(argv) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// spawnCommandLine:
|
// spawnCommandLine:
|
||||||
// @command_line: a command line
|
// @commandLine: a command line
|
||||||
//
|
//
|
||||||
// Runs @command_line in the background, handling any errors that
|
// Runs @commandLine in the background, handling any errors that
|
||||||
// occur when trying to parse or start the program.
|
// occur when trying to parse or start the program.
|
||||||
function spawnCommandLine(command_line) {
|
function spawnCommandLine(commandLine) {
|
||||||
try {
|
try {
|
||||||
let [success, argv] = GLib.shell_parse_argv(command_line);
|
let [success, argv] = GLib.shell_parse_argv(commandLine);
|
||||||
trySpawn(argv);
|
trySpawn(argv);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
_handleSpawnError(command_line, err);
|
_handleSpawnError(commandLine, err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -103,8 +103,7 @@ function spawnApp(argv) {
|
|||||||
//
|
//
|
||||||
// Runs @argv in the background. If launching @argv fails,
|
// Runs @argv in the background. If launching @argv fails,
|
||||||
// this will throw an error.
|
// this will throw an error.
|
||||||
function trySpawn(argv)
|
function trySpawn(argv) {
|
||||||
{
|
|
||||||
var success, pid;
|
var success, pid;
|
||||||
try {
|
try {
|
||||||
[success, pid] = GLib.spawn_async(null, argv, null,
|
[success, pid] = GLib.spawn_async(null, argv, null,
|
||||||
@ -135,19 +134,19 @@ function trySpawn(argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// trySpawnCommandLine:
|
// trySpawnCommandLine:
|
||||||
// @command_line: a command line
|
// @commandLine: a command line
|
||||||
//
|
//
|
||||||
// Runs @command_line in the background. If launching @command_line
|
// Runs @commandLine in the background. If launching @commandLine
|
||||||
// fails, this will throw an error.
|
// fails, this will throw an error.
|
||||||
function trySpawnCommandLine(command_line) {
|
function trySpawnCommandLine(commandLine) {
|
||||||
let success, argv;
|
let success, argv;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
[success, argv] = GLib.shell_parse_argv(command_line);
|
[success, argv] = GLib.shell_parse_argv(commandLine);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
// Replace "Error invoking GLib.shell_parse_argv: " with
|
// Replace "Error invoking GLib.shell_parse_argv: " with
|
||||||
// something nicer
|
// something nicer
|
||||||
err.message = err.message.replace(/[^:]*: /, _("Could not parse command:") + "\n");
|
err.message = err.message.replace(/[^:]*: /, `${_("Could not parse command:")}\n`);
|
||||||
throw err;
|
throw err;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -289,7 +288,7 @@ function createTimeLabel(date, params) {
|
|||||||
let id = _desktopSettings.connect('changed::clock-format', () => {
|
let id = _desktopSettings.connect('changed::clock-format', () => {
|
||||||
label.text = formatTime(date, params);
|
label.text = formatTime(date, params);
|
||||||
});
|
});
|
||||||
label.connect('destroy', () => { _desktopSettings.disconnect(id); });
|
label.connect('destroy', () => _desktopSettings.disconnect(id));
|
||||||
return label;
|
return label;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -366,7 +365,7 @@ class CloseButton extends St.Button {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_computeBoxPointerOffset() {
|
_computeBoxPointerOffset() {
|
||||||
if (!this._boxPointer || !this._boxPointer.actor.get_stage())
|
if (!this._boxPointer || !this._boxPointer.get_stage())
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
let side = this._boxPointer.arrowSide;
|
let side = this._boxPointer.arrowSide;
|
||||||
@ -380,7 +379,7 @@ class CloseButton extends St.Button {
|
|||||||
let themeNode = this.get_theme_node();
|
let themeNode = this.get_theme_node();
|
||||||
|
|
||||||
let offY = this._computeBoxPointerOffset();
|
let offY = this._computeBoxPointerOffset();
|
||||||
this.translation_x = themeNode.get_length('-shell-close-overlap-x')
|
this.translation_x = themeNode.get_length('-shell-close-overlap-x');
|
||||||
this.translation_y = themeNode.get_length('-shell-close-overlap-y') + offY;
|
this.translation_y = themeNode.get_length('-shell-close-overlap-y') + offY;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -467,7 +466,7 @@ var AppSettingsMonitor = class {
|
|||||||
if (!this._settings || handler.id > 0)
|
if (!this._settings || handler.id > 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
handler.id = this._settings.connect('changed::' + handler.key,
|
handler.id = this._settings.connect(`changed::${handler.key}`,
|
||||||
handler.callback);
|
handler.callback);
|
||||||
handler.callback(this._settings, handler.key);
|
handler.callback(this._settings, handler.key);
|
||||||
}
|
}
|
||||||
@ -493,13 +492,13 @@ var AppSettingsMonitor = class {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_setSettings(settings) {
|
_setSettings(settings) {
|
||||||
this._handlers.forEach((handler) => { this._disconnectHandler(handler); });
|
this._handlers.forEach((handler) => this._disconnectHandler(handler));
|
||||||
|
|
||||||
let hadSettings = (this._settings != null);
|
let hadSettings = (this._settings != null);
|
||||||
this._settings = settings;
|
this._settings = settings;
|
||||||
let haveSettings = (this._settings != null);
|
let haveSettings = (this._settings != null);
|
||||||
|
|
||||||
this._handlers.forEach((handler) => { this._connectHandler(handler); });
|
this._handlers.forEach((handler) => this._connectHandler(handler));
|
||||||
|
|
||||||
if (hadSettings != haveSettings)
|
if (hadSettings != haveSettings)
|
||||||
this.emit('available-changed');
|
this.emit('available-changed');
|
||||||
|
@ -26,7 +26,7 @@ var WeatherClient = class {
|
|||||||
this._weatherAuthorized = false;
|
this._weatherAuthorized = false;
|
||||||
this._permStore = new PermissionStore.PermissionStore((proxy, error) => {
|
this._permStore = new PermissionStore.PermissionStore((proxy, error) => {
|
||||||
if (error) {
|
if (error) {
|
||||||
log('Failed to connect to permissionStore: ' + error.message);
|
log(`Failed to connect to permissionStore: ${error.message}`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -40,7 +40,7 @@ var WeatherClient = class {
|
|||||||
|
|
||||||
this._permStore.LookupRemote('gnome', 'geolocation', (res, error) => {
|
this._permStore.LookupRemote('gnome', 'geolocation', (res, error) => {
|
||||||
if (error)
|
if (error)
|
||||||
log('Error looking up permission: ' + error.message);
|
log(`Error looking up permission: ${error.message}`);
|
||||||
|
|
||||||
let [perms, data] = error ? [{}, null] : res;
|
let [perms, data] = error ? [{}, null] : res;
|
||||||
let params = ['gnome', 'geolocation', false, data, perms];
|
let params = ['gnome', 'geolocation', false, data, perms];
|
||||||
@ -68,7 +68,7 @@ var WeatherClient = class {
|
|||||||
|
|
||||||
this._weatherAppMon = new Util.AppSettingsMonitor('org.gnome.Weather.desktop',
|
this._weatherAppMon = new Util.AppSettingsMonitor('org.gnome.Weather.desktop',
|
||||||
'org.gnome.Weather');
|
'org.gnome.Weather');
|
||||||
this._weatherAppMon.connect('available-changed', () => { this.emit('changed'); });
|
this._weatherAppMon.connect('available-changed', () => this.emit('changed'));
|
||||||
this._weatherAppMon.watchSetting('automatic-location',
|
this._weatherAppMon.watchSetting('automatic-location',
|
||||||
this._onAutomaticLocationChanged.bind(this));
|
this._onAutomaticLocationChanged.bind(this));
|
||||||
this._weatherAppMon.watchSetting('locations',
|
this._weatherAppMon.watchSetting('locations',
|
||||||
@ -179,7 +179,7 @@ var WeatherClient = class {
|
|||||||
try {
|
try {
|
||||||
this._gclueService = Geoclue.Simple.new_finish(res);
|
this._gclueService = Geoclue.Simple.new_finish(res);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
log('Failed to connect to Geoclue2 service: ' + e.message);
|
log(`Failed to connect to Geoclue2 service: ${e.message}`);
|
||||||
this._setLocation(this._mostRecentLocation);
|
this._setLocation(this._mostRecentLocation);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -136,7 +136,6 @@ let overviewFrames;
|
|||||||
let overviewLatency;
|
let overviewLatency;
|
||||||
let mallocUsedSize = 0;
|
let mallocUsedSize = 0;
|
||||||
let overviewShowCount = 0;
|
let overviewShowCount = 0;
|
||||||
let firstOverviewUsedSize;
|
|
||||||
let haveSwapComplete = false;
|
let haveSwapComplete = false;
|
||||||
let applicationsShowStart;
|
let applicationsShowStart;
|
||||||
let applicationsShowCount = 0;
|
let applicationsShowCount = 0;
|
||||||
|
@ -30,7 +30,7 @@ var METRICS = {
|
|||||||
geditStartTime:
|
geditStartTime:
|
||||||
{ description: "Time from gedit launch to window drawn",
|
{ description: "Time from gedit launch to window drawn",
|
||||||
units: "us" },
|
units: "us" },
|
||||||
}
|
};
|
||||||
|
|
||||||
function waitAndDraw(milliseconds) {
|
function waitAndDraw(milliseconds) {
|
||||||
let cb;
|
let cb;
|
||||||
@ -48,7 +48,7 @@ function waitAndDraw(milliseconds) {
|
|||||||
cb();
|
cb();
|
||||||
});
|
});
|
||||||
|
|
||||||
return callback => { cb = callback; };
|
return callback => cb = callback;
|
||||||
}
|
}
|
||||||
|
|
||||||
function waitSignal(object, signal) {
|
function waitSignal(object, signal) {
|
||||||
@ -60,7 +60,7 @@ function waitSignal(object, signal) {
|
|||||||
cb();
|
cb();
|
||||||
});
|
});
|
||||||
|
|
||||||
return callback => { cb = callback; };
|
return callback => cb = callback;
|
||||||
}
|
}
|
||||||
|
|
||||||
function extractBootTimestamp() {
|
function extractBootTimestamp() {
|
||||||
@ -273,7 +273,7 @@ function script_collectTimings(time) {
|
|||||||
else
|
else
|
||||||
median = Math.round((times[len / 2 - 1] + times[len / 2]) / 2);
|
median = Math.round((times[len / 2 - 1] + times[len / 2]) / 2);
|
||||||
|
|
||||||
METRICS[timing + 'RedrawTime'].value = median;
|
METRICS[`${timing}RedrawTime`].value = median;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,7 +19,6 @@ const PortalHelperSecurityLevel = {
|
|||||||
INSECURE: 2
|
INSECURE: 2
|
||||||
};
|
};
|
||||||
|
|
||||||
const INACTIVITY_TIMEOUT = 30000; //ms
|
|
||||||
const CONNECTIVITY_CHECK_HOST = 'nmcheck.gnome.org';
|
const CONNECTIVITY_CHECK_HOST = 'nmcheck.gnome.org';
|
||||||
const CONNECTIVITY_CHECK_URI = 'http://' + CONNECTIVITY_CHECK_HOST;
|
const CONNECTIVITY_CHECK_URI = 'http://' + CONNECTIVITY_CHECK_HOST;
|
||||||
const CONNECTIVITY_RECHECK_RATELIMIT_TIMEOUT = 30 * GLib.USEC_PER_SEC;
|
const CONNECTIVITY_RECHECK_RATELIMIT_TIMEOUT = 30 * GLib.USEC_PER_SEC;
|
||||||
@ -265,7 +264,7 @@ class WebPortalHelper extends Gtk.Application {
|
|||||||
this._queue = [];
|
this._queue = [];
|
||||||
|
|
||||||
let action = new Gio.SimpleAction({ name: 'quit' });
|
let action = new Gio.SimpleAction({ name: 'quit' });
|
||||||
action.connect('activate', () => { this.active_window.destroyWindow(); });
|
action.connect('activate', () => this.active_window.destroyWindow());
|
||||||
this.add_action(action);
|
this.add_action(action);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
const { Clutter, Gio, GLib, Shell } = imports.gi;
|
const { Clutter, Gio, GLib, GObject, Shell } = imports.gi;
|
||||||
|
|
||||||
const CheckBox = imports.ui.checkBox;
|
const CheckBox = imports.ui.checkBox;
|
||||||
const Dialog = imports.ui.dialog;
|
const Dialog = imports.ui.dialog;
|
||||||
@ -15,9 +15,10 @@ var DialogResponse = {
|
|||||||
CLOSED: 2
|
CLOSED: 2
|
||||||
};
|
};
|
||||||
|
|
||||||
var AccessDialog = class extends ModalDialog.ModalDialog {
|
var AccessDialog = GObject.registerClass(
|
||||||
constructor(invocation, handle, title, subtitle, body, options) {
|
class AccessDialog extends ModalDialog.ModalDialog {
|
||||||
super({ styleClass: 'access-dialog' });
|
_init(invocation, handle, title, subtitle, body, options) {
|
||||||
|
super._init({ styleClass: 'access-dialog' });
|
||||||
|
|
||||||
this._invocation = invocation;
|
this._invocation = invocation;
|
||||||
this._handle = handle;
|
this._handle = handle;
|
||||||
@ -109,7 +110,7 @@ var AccessDialog = class extends ModalDialog.ModalDialog {
|
|||||||
});
|
});
|
||||||
this.close();
|
this.close();
|
||||||
}
|
}
|
||||||
};
|
});
|
||||||
|
|
||||||
var AccessDialogDBus = class {
|
var AccessDialogDBus = class {
|
||||||
constructor() {
|
constructor() {
|
||||||
@ -134,7 +135,7 @@ var AccessDialogDBus = class {
|
|||||||
let [handle, appId, parentWindow, title, subtitle, body, options] = params;
|
let [handle, appId, parentWindow, title, subtitle, body, options] = params;
|
||||||
// We probably want to use parentWindow and global.display.focus_window
|
// We probably want to use parentWindow and global.display.focus_window
|
||||||
// for this check in the future
|
// for this check in the future
|
||||||
if (appId && appId + '.desktop' != this._windowTracker.focus_app.id) {
|
if (appId && `${appId}.desktop` != this._windowTracker.focus_app.id) {
|
||||||
invocation.return_error_literal(Gio.DBusError,
|
invocation.return_error_literal(Gio.DBusError,
|
||||||
Gio.DBusError.ACCESS_DENIED,
|
Gio.DBusError.ACCESS_DENIED,
|
||||||
'Only the focused app is allowed to show a system access dialog');
|
'Only the focused app is allowed to show a system access dialog');
|
||||||
@ -145,7 +146,7 @@ var AccessDialogDBus = class {
|
|||||||
subtitle, body, options);
|
subtitle, body, options);
|
||||||
dialog.open();
|
dialog.open();
|
||||||
|
|
||||||
dialog.connect('closed', () => { this._accessDialog = null; });
|
dialog.connect('closed', () => this._accessDialog = null);
|
||||||
|
|
||||||
this._accessDialog = dialog;
|
this._accessDialog = dialog;
|
||||||
}
|
}
|
||||||
|
@ -36,7 +36,7 @@ function _createWindowClone(window, size) {
|
|||||||
// usual hack for the usual bug in ClutterBinLayout...
|
// usual hack for the usual bug in ClutterBinLayout...
|
||||||
x_expand: true,
|
x_expand: true,
|
||||||
y_expand: true });
|
y_expand: true });
|
||||||
};
|
}
|
||||||
|
|
||||||
function getWindows(workspace) {
|
function getWindows(workspace) {
|
||||||
// We ignore skip-taskbar windows in switchers, but if they are attached
|
// We ignore skip-taskbar windows in switchers, but if they are attached
|
||||||
@ -395,7 +395,7 @@ class AppSwitcherPopup extends SwitcherPopup.SwitcherPopup {
|
|||||||
{ opacity: 255,
|
{ opacity: 255,
|
||||||
time: THUMBNAIL_FADE_TIME,
|
time: THUMBNAIL_FADE_TIME,
|
||||||
transition: 'easeOutQuad',
|
transition: 'easeOutQuad',
|
||||||
onComplete: () => { this.thumbnailsVisible = true; }
|
onComplete: () => this.thumbnailsVisible = true
|
||||||
});
|
});
|
||||||
|
|
||||||
this._switcherList._items[this._selectedIndex].add_accessible_state (Atk.StateType.EXPANDED);
|
this._switcherList._items[this._selectedIndex].add_accessible_state (Atk.StateType.EXPANDED);
|
||||||
@ -459,7 +459,7 @@ class CyclerHighlight {
|
|||||||
_onDestroy() {
|
_onDestroy() {
|
||||||
this.window = null;
|
this.window = null;
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
// We don't show an actual popup, so just provide what SwitcherPopup
|
// We don't show an actual popup, so just provide what SwitcherPopup
|
||||||
// expects instead of inheriting from SwitcherList
|
// expects instead of inheriting from SwitcherList
|
||||||
@ -474,12 +474,10 @@ var CyclerList = GObject.registerClass({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var CyclerPopup = GObject.registerClass(
|
var CyclerPopup = GObject.registerClass({
|
||||||
class CyclerPopup extends SwitcherPopup.SwitcherPopup {
|
GTypeFlags: GObject.TypeFlags.ABSTRACT
|
||||||
|
}, class CyclerPopup extends SwitcherPopup.SwitcherPopup {
|
||||||
_init() {
|
_init() {
|
||||||
if (new.target === CyclerPopup)
|
|
||||||
throw new TypeError('Cannot instantiate abstract class ' + new.target.name);
|
|
||||||
|
|
||||||
super._init();
|
super._init();
|
||||||
|
|
||||||
this._items = this._getWindows();
|
this._items = this._getWindows();
|
||||||
@ -665,14 +663,6 @@ class AppIcon extends St.BoxLayout {
|
|||||||
set_size(size) {
|
set_size(size) {
|
||||||
this.icon = this.app.create_icon_texture(size);
|
this.icon = this.app.create_icon_texture(size);
|
||||||
this._iconBin.child = this.icon;
|
this._iconBin.child = this.icon;
|
||||||
this._iconBin.set_size(size, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
vfunc_get_preferred_width(forHeight) {
|
|
||||||
let [minWidth, ] = super.vfunc_get_preferred_width(forHeight);
|
|
||||||
|
|
||||||
minWidth = Math.max(minWidth, forHeight);
|
|
||||||
return [minWidth, minWidth];
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -730,11 +720,12 @@ class AppSwitcher extends SwitcherPopup.SwitcherList {
|
|||||||
j++;
|
j++;
|
||||||
}
|
}
|
||||||
let themeNode = this._items[j].get_theme_node();
|
let themeNode = this._items[j].get_theme_node();
|
||||||
|
this._list.ensure_style();
|
||||||
|
|
||||||
let iconPadding = themeNode.get_horizontal_padding();
|
let iconPadding = themeNode.get_horizontal_padding();
|
||||||
let iconBorder = themeNode.get_border_width(St.Side.LEFT) + themeNode.get_border_width(St.Side.RIGHT);
|
let iconBorder = themeNode.get_border_width(St.Side.LEFT) + themeNode.get_border_width(St.Side.RIGHT);
|
||||||
let [iconMinHeight, iconNaturalHeight] = this.icons[j].label.get_preferred_height(-1);
|
let [, labelNaturalHeight] = this.icons[j].label.get_preferred_height(-1);
|
||||||
let iconSpacing = iconNaturalHeight + iconPadding + iconBorder;
|
let iconSpacing = labelNaturalHeight + iconPadding + iconBorder;
|
||||||
let totalSpacing = this._list.spacing * (this._items.length - 1);
|
let totalSpacing = this._list.spacing * (this._items.length - 1);
|
||||||
|
|
||||||
// We just assume the whole screen here due to weirdness happing with the passed width
|
// We just assume the whole screen here due to weirdness happing with the passed width
|
||||||
@ -804,9 +795,10 @@ class AppSwitcher extends SwitcherPopup.SwitcherList {
|
|||||||
return GLib.SOURCE_REMOVE;
|
return GLib.SOURCE_REMOVE;
|
||||||
});
|
});
|
||||||
GLib.Source.set_name_by_id(this._mouseTimeOutId, '[gnome-shell] this._enterItem');
|
GLib.Source.set_name_by_id(this._mouseTimeOutId, '[gnome-shell] this._enterItem');
|
||||||
} else
|
} else {
|
||||||
this._itemEntered(index);
|
this._itemEntered(index);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
_enterItem(index) {
|
_enterItem(index) {
|
||||||
let [x, y, mask] = global.get_pointer();
|
let [x, y, mask] = global.get_pointer();
|
||||||
@ -850,9 +842,8 @@ class AppSwitcher extends SwitcherPopup.SwitcherList {
|
|||||||
this._removeIcon(app);
|
this._removeIcon(app);
|
||||||
});
|
});
|
||||||
|
|
||||||
let n = this._arrows.length;
|
|
||||||
let arrow = new St.DrawingArea({ style_class: 'switcher-arrow' });
|
let arrow = new St.DrawingArea({ style_class: 'switcher-arrow' });
|
||||||
arrow.connect('repaint', () => { SwitcherPopup.drawArrow(arrow, St.Side.BOTTOM); });
|
arrow.connect('repaint', () => SwitcherPopup.drawArrow(arrow, St.Side.BOTTOM));
|
||||||
this.add_actor(arrow);
|
this.add_actor(arrow);
|
||||||
this._arrows.push(arrow);
|
this._arrows.push(arrow);
|
||||||
|
|
||||||
@ -1046,7 +1037,7 @@ class WindowList extends SwitcherPopup.SwitcherList {
|
|||||||
this.icons.push(icon);
|
this.icons.push(icon);
|
||||||
|
|
||||||
icon._unmanagedSignalId = icon.window.connect('unmanaged', (window) => {
|
icon._unmanagedSignalId = icon.window.connect('unmanaged', (window) => {
|
||||||
this._removeWindow(window)
|
this._removeWindow(window);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1082,7 +1073,7 @@ class WindowList extends SwitcherPopup.SwitcherList {
|
|||||||
childBox.y1 = childBox.y2 - this._label.height;
|
childBox.y1 = childBox.y2 - this._label.height;
|
||||||
this._label.allocate(childBox, flags);
|
this._label.allocate(childBox, flags);
|
||||||
|
|
||||||
let totalLabelHeight = this._label.height + themeNode.get_padding(St.Side.BOTTOM)
|
let totalLabelHeight = this._label.height + themeNode.get_padding(St.Side.BOTTOM);
|
||||||
childBox.x1 = box.x1;
|
childBox.x1 = box.x1;
|
||||||
childBox.x2 = box.x2;
|
childBox.x2 = box.x2;
|
||||||
childBox.y1 = box.y1;
|
childBox.y1 = box.y1;
|
||||||
|
@ -62,9 +62,9 @@ var Animation = class {
|
|||||||
if (!validResourceScale)
|
if (!validResourceScale)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
let texture_cache = St.TextureCache.get_default();
|
let textureCache = St.TextureCache.get_default();
|
||||||
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
||||||
this._animations = texture_cache.load_sliced_image(file, width, height,
|
this._animations = textureCache.load_sliced_image(file, width, height,
|
||||||
scaleFactor, resourceScale,
|
scaleFactor, resourceScale,
|
||||||
this._animationsLoaded.bind(this));
|
this._animationsLoaded.bind(this));
|
||||||
this.actor.set_child(this._animations);
|
this.actor.set_child(this._animations);
|
||||||
@ -162,7 +162,7 @@ var Spinner = class extends AnimatedIcon {
|
|||||||
time: SPINNER_ANIMATION_TIME,
|
time: SPINNER_ANIMATION_TIME,
|
||||||
transition: 'linear',
|
transition: 'linear',
|
||||||
onComplete: () => {
|
onComplete: () => {
|
||||||
this.stop(false);
|
super.stop();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
|
@ -20,7 +20,6 @@ const SystemActions = imports.misc.systemActions;
|
|||||||
|
|
||||||
const { loadInterfaceXML } = imports.misc.fileUtils;
|
const { loadInterfaceXML } = imports.misc.fileUtils;
|
||||||
|
|
||||||
var MAX_APPLICATION_WORK_MILLIS = 75;
|
|
||||||
var MENU_POPUP_TIMEOUT = 600;
|
var MENU_POPUP_TIMEOUT = 600;
|
||||||
var MAX_COLUMNS = 6;
|
var MAX_COLUMNS = 6;
|
||||||
var MIN_COLUMNS = 4;
|
var MIN_COLUMNS = 4;
|
||||||
@ -34,23 +33,9 @@ var FOLDER_SUBICON_FRACTION = .4;
|
|||||||
|
|
||||||
var MIN_FREQUENT_APPS_COUNT = 3;
|
var MIN_FREQUENT_APPS_COUNT = 3;
|
||||||
|
|
||||||
var INDICATORS_BASE_TIME = 0.25;
|
|
||||||
var INDICATORS_ANIMATION_DELAY = 0.125;
|
|
||||||
var INDICATORS_ANIMATION_MAX_TIME = 0.75;
|
|
||||||
|
|
||||||
var VIEWS_SWITCH_TIME = 0.4;
|
var VIEWS_SWITCH_TIME = 0.4;
|
||||||
var VIEWS_SWITCH_ANIMATION_DELAY = 0.1;
|
var VIEWS_SWITCH_ANIMATION_DELAY = 0.1;
|
||||||
|
|
||||||
// Follow iconGrid animations approach and divide by 2 to animate out to
|
|
||||||
// not annoy the user when the user wants to quit appDisplay.
|
|
||||||
// Also, make sure we don't exceed iconGrid animation total time or
|
|
||||||
// views switch time.
|
|
||||||
var INDICATORS_BASE_TIME_OUT = 0.125;
|
|
||||||
var INDICATORS_ANIMATION_DELAY_OUT = 0.0625;
|
|
||||||
var INDICATORS_ANIMATION_MAX_TIME_OUT =
|
|
||||||
Math.min (VIEWS_SWITCH_TIME,
|
|
||||||
IconGrid.ANIMATION_TIME_OUT + IconGrid.ANIMATION_MAX_DELAY_OUT_FOR_ITEM);
|
|
||||||
|
|
||||||
var PAGE_SWITCH_TIME = 0.3;
|
var PAGE_SWITCH_TIME = 0.3;
|
||||||
|
|
||||||
const SWITCHEROO_BUS_NAME = 'net.hadess.SwitcherooControl';
|
const SWITCHEROO_BUS_NAME = 'net.hadess.SwitcherooControl';
|
||||||
@ -69,7 +54,7 @@ function _getCategories(info) {
|
|||||||
|
|
||||||
function _listsIntersect(a, b) {
|
function _listsIntersect(a, b) {
|
||||||
for (let itemA of a)
|
for (let itemA of a)
|
||||||
if (b.indexOf(itemA) >= 0)
|
if (b.includes(itemA))
|
||||||
return true;
|
return true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -98,8 +83,8 @@ function clamp(value, min, max) {
|
|||||||
|
|
||||||
class BaseAppView {
|
class BaseAppView {
|
||||||
constructor(params, gridParams) {
|
constructor(params, gridParams) {
|
||||||
if (new.target === BaseAppView)
|
if (this.constructor === BaseAppView)
|
||||||
throw new TypeError('Cannot instantiate abstract class ' + new.target.name);
|
throw new TypeError(`Cannot instantiate abstract class ${this.constructor.name}`);
|
||||||
|
|
||||||
gridParams = Params.parse(gridParams, { xAlign: St.Align.MIDDLE,
|
gridParams = Params.parse(gridParams, { xAlign: St.Align.MIDDLE,
|
||||||
columnLimit: MAX_COLUMNS,
|
columnLimit: MAX_COLUMNS,
|
||||||
@ -158,7 +143,7 @@ class BaseAppView {
|
|||||||
|
|
||||||
loadGrid() {
|
loadGrid() {
|
||||||
this._allItems.sort(this._compareItems);
|
this._allItems.sort(this._compareItems);
|
||||||
this._allItems.forEach(item => { this._grid.addItem(item); });
|
this._allItems.forEach(item => this._grid.addItem(item));
|
||||||
this.emit('view-loaded');
|
this.emit('view-loaded');
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -166,7 +151,7 @@ class BaseAppView {
|
|||||||
if (this._items[id])
|
if (this._items[id])
|
||||||
this._items[id].actor.navigate_focus(null, St.DirectionType.TAB_FORWARD, false);
|
this._items[id].actor.navigate_focus(null, St.DirectionType.TAB_FORWARD, false);
|
||||||
else
|
else
|
||||||
log('No such application ' + id);
|
log(`No such application ${id}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
selectApp(id) {
|
selectApp(id) {
|
||||||
@ -227,12 +212,12 @@ class BaseAppView {
|
|||||||
} else {
|
} else {
|
||||||
params.opacity = 0;
|
params.opacity = 0;
|
||||||
params.delay = 0;
|
params.delay = 0;
|
||||||
params.onComplete = () => { this.actor.hide(); };
|
params.onComplete = () => this.actor.hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
Tweener.addTween(this._grid, params);
|
Tweener.addTween(this._grid, params);
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
Signals.addSignalMethods(BaseAppView.prototype);
|
Signals.addSignalMethods(BaseAppView.prototype);
|
||||||
|
|
||||||
var AllView = class AllView extends BaseAppView {
|
var AllView = class AllView extends BaseAppView {
|
||||||
@ -300,7 +285,7 @@ var AllView = class AllView extends BaseAppView {
|
|||||||
this._availWidth = 0;
|
this._availWidth = 0;
|
||||||
this._availHeight = 0;
|
this._availHeight = 0;
|
||||||
|
|
||||||
Main.overview.connect('hidden', () => { this.goToPage(0); });
|
Main.overview.connect('hidden', () => this.goToPage(0));
|
||||||
this._grid.connect('space-opened', () => {
|
this._grid.connect('space-opened', () => {
|
||||||
let fadeEffect = this._scrollView.get_effect('fade');
|
let fadeEffect = this._scrollView.get_effect('fade');
|
||||||
if (fadeEffect)
|
if (fadeEffect)
|
||||||
@ -373,7 +358,7 @@ var AllView = class AllView extends BaseAppView {
|
|||||||
_loadApps() {
|
_loadApps() {
|
||||||
this._appInfoList = Shell.AppSystem.get_default().get_installed().filter(appInfo => {
|
this._appInfoList = Shell.AppSystem.get_default().get_installed().filter(appInfo => {
|
||||||
try {
|
try {
|
||||||
let id = appInfo.get_id(); // catch invalid file encodings
|
(appInfo.get_id()); // catch invalid file encodings
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -414,7 +399,7 @@ var AllView = class AllView extends BaseAppView {
|
|||||||
this._refilterApps();
|
this._refilterApps();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Overriden from BaseAppView
|
// Overridden from BaseAppView
|
||||||
animate(animationDirection, onComplete) {
|
animate(animationDirection, onComplete) {
|
||||||
this._scrollView.reactive = false;
|
this._scrollView.reactive = false;
|
||||||
let completionFunc = () => {
|
let completionFunc = () => {
|
||||||
@ -632,9 +617,9 @@ var AllView = class AllView extends BaseAppView {
|
|||||||
this._scrollView.get_effect('fade').fade_edges = true;
|
this._scrollView.get_effect('fade').fade_edges = true;
|
||||||
|
|
||||||
if (this._availWidth != availWidth || this._availHeight != availHeight || oldNPages != this._grid.nPages()) {
|
if (this._availWidth != availWidth || this._availHeight != availHeight || oldNPages != this._grid.nPages()) {
|
||||||
|
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => {
|
||||||
this._adjustment.value = 0;
|
this._adjustment.value = 0;
|
||||||
this._grid.currentPage = 0;
|
this._grid.currentPage = 0;
|
||||||
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => {
|
|
||||||
this._pageIndicators.setNPages(this._grid.nPages());
|
this._pageIndicators.setNPages(this._grid.nPages());
|
||||||
this._pageIndicators.setCurrentPage(0);
|
this._pageIndicators.setCurrentPage(0);
|
||||||
});
|
});
|
||||||
@ -867,7 +852,7 @@ var AppDisplay = class AppDisplay {
|
|||||||
this._controls.opacity = 0;
|
this._controls.opacity = 0;
|
||||||
finalOpacity = 255;
|
finalOpacity = 255;
|
||||||
} else {
|
} else {
|
||||||
finalOpacity = 0
|
finalOpacity = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Tweener.addTween(this._controls,
|
Tweener.addTween(this._controls,
|
||||||
@ -1017,7 +1002,7 @@ var FolderView = class FolderView extends BaseAppView {
|
|||||||
Util.ensureActorVisibleInScrollView(this.actor, actor);
|
Util.ensureActorVisibleInScrollView(this.actor, actor);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Overriden from BaseAppView
|
// Overridden from BaseAppView
|
||||||
animate(animationDirection) {
|
animate(animationDirection) {
|
||||||
this._grid.animatePulse(animationDirection);
|
this._grid.animatePulse(animationDirection);
|
||||||
}
|
}
|
||||||
@ -1081,7 +1066,7 @@ var FolderView = class FolderView extends BaseAppView {
|
|||||||
|
|
||||||
let contentBox = this.actor.get_theme_node().get_content_box(pageBox);
|
let contentBox = this.actor.get_theme_node().get_content_box(pageBox);
|
||||||
// We only can show icons inside the collection view boxPointer
|
// 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];
|
return [(contentBox.x2 - contentBox.x1) - 2 * this._offsetForEachSide, (contentBox.y2 - contentBox.y1) - 2 * this._offsetForEachSide];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1165,7 +1150,7 @@ var FolderIcon = class FolderIcon {
|
|||||||
let excludedApps = this._folder.get_strv('excluded-apps');
|
let excludedApps = this._folder.get_strv('excluded-apps');
|
||||||
let appSys = Shell.AppSystem.get_default();
|
let appSys = Shell.AppSystem.get_default();
|
||||||
let addAppId = appId => {
|
let addAppId = appId => {
|
||||||
if (excludedApps.indexOf(appId) >= 0)
|
if (excludedApps.includes(appId))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
let app = appSys.lookup_app(appId);
|
let app = appSys.lookup_app(appId);
|
||||||
@ -1301,20 +1286,20 @@ var AppFolderPopup = class AppFolderPopup {
|
|||||||
x_expand: true,
|
x_expand: true,
|
||||||
x_align: St.Align.START });
|
x_align: St.Align.START });
|
||||||
|
|
||||||
this._boxPointer.actor.style_class = 'app-folder-popup';
|
this._boxPointer.style_class = 'app-folder-popup';
|
||||||
this.actor.add_actor(this._boxPointer.actor);
|
this.actor.add_actor(this._boxPointer);
|
||||||
this._boxPointer.bin.set_child(this._view.actor);
|
this._boxPointer.bin.set_child(this._view.actor);
|
||||||
|
|
||||||
this.closeButton = Util.makeCloseButton(this._boxPointer);
|
this.closeButton = Util.makeCloseButton(this._boxPointer);
|
||||||
this.closeButton.connect('clicked', this.popdown.bind(this));
|
this.closeButton.connect('clicked', this.popdown.bind(this));
|
||||||
this.actor.add_actor(this.closeButton);
|
this.actor.add_actor(this.closeButton);
|
||||||
|
|
||||||
this._boxPointer.actor.bind_property('opacity', this.closeButton, 'opacity',
|
this._boxPointer.bind_property('opacity', this.closeButton, 'opacity',
|
||||||
GObject.BindingFlags.SYNC_CREATE);
|
GObject.BindingFlags.SYNC_CREATE);
|
||||||
|
|
||||||
global.focus_manager.add_group(this.actor);
|
global.focus_manager.add_group(this.actor);
|
||||||
|
|
||||||
source.actor.connect('destroy', () => { this.actor.destroy(); });
|
source.actor.connect('destroy', () => this.actor.destroy());
|
||||||
this._grabHelper = new GrabHelper.GrabHelper(this.actor, {
|
this._grabHelper = new GrabHelper.GrabHelper(this.actor, {
|
||||||
actionMode: Shell.ActionMode.POPUP
|
actionMode: Shell.ActionMode.POPUP
|
||||||
});
|
});
|
||||||
@ -1479,7 +1464,7 @@ var AppIcon = class AppIcon {
|
|||||||
this.actor.connect('popup-menu', this._onKeyboardPopupMenu.bind(this));
|
this.actor.connect('popup-menu', this._onKeyboardPopupMenu.bind(this));
|
||||||
|
|
||||||
this._menu = null;
|
this._menu = null;
|
||||||
this._menuManager = new PopupMenu.PopupMenuManager(this);
|
this._menuManager = new PopupMenu.PopupMenuManager(this.actor);
|
||||||
|
|
||||||
if (isDraggable) {
|
if (isDraggable) {
|
||||||
this._draggable = DND.makeDraggable(this.actor);
|
this._draggable = DND.makeDraggable(this.actor);
|
||||||
@ -1707,25 +1692,20 @@ var AppIconMenu = class AppIconMenu extends PopupMenu.PopupMenu {
|
|||||||
w => !w.skip_taskbar
|
w => !w.skip_taskbar
|
||||||
);
|
);
|
||||||
|
|
||||||
// Display the app windows menu items and the separator between windows
|
if (windows.length > 0)
|
||||||
// of the current desktop and other windows.
|
this.addMenuItem(
|
||||||
let workspaceManager = global.workspace_manager;
|
/* Translators: This is the heading of a list of open windows */
|
||||||
let activeWorkspace = workspaceManager.get_active_workspace();
|
new PopupMenu.PopupSeparatorMenuItem(_("Open Windows"))
|
||||||
let separatorShown = windows.length > 0 && windows[0].get_workspace() != activeWorkspace;
|
);
|
||||||
|
|
||||||
for (let i = 0; i < windows.length; i++) {
|
windows.forEach(window => {
|
||||||
let window = windows[i];
|
|
||||||
if (!separatorShown && window.get_workspace() != activeWorkspace) {
|
|
||||||
this._appendSeparator();
|
|
||||||
separatorShown = true;
|
|
||||||
}
|
|
||||||
let title = window.title ? window.title
|
let title = window.title ? window.title
|
||||||
: this._source.app.get_name();
|
: this._source.app.get_name();
|
||||||
let item = this._appendMenuItem(title);
|
let item = this._appendMenuItem(title);
|
||||||
item.connect('activate', () => {
|
item.connect('activate', () => {
|
||||||
this.emit('activate-window', window);
|
this.emit('activate-window', window);
|
||||||
});
|
});
|
||||||
}
|
});
|
||||||
|
|
||||||
if (!this._source.app.is_window_backed()) {
|
if (!this._source.app.is_window_backed()) {
|
||||||
this._appendSeparator();
|
this._appendSeparator();
|
||||||
@ -1733,7 +1713,7 @@ var AppIconMenu = class AppIconMenu extends PopupMenu.PopupMenu {
|
|||||||
let appInfo = this._source.app.get_app_info();
|
let appInfo = this._source.app.get_app_info();
|
||||||
let actions = appInfo.list_actions();
|
let actions = appInfo.list_actions();
|
||||||
if (this._source.app.can_open_new_window() &&
|
if (this._source.app.can_open_new_window() &&
|
||||||
actions.indexOf('new-window') == -1) {
|
actions.includes('new-window')) {
|
||||||
this._newWindowMenuItem = this._appendMenuItem(_("New Window"));
|
this._newWindowMenuItem = this._appendMenuItem(_("New Window"));
|
||||||
this._newWindowMenuItem.connect('activate', () => {
|
this._newWindowMenuItem.connect('activate', () => {
|
||||||
if (this._source.app.state == Shell.AppState.STOPPED)
|
if (this._source.app.state == Shell.AppState.STOPPED)
|
||||||
@ -1747,7 +1727,7 @@ var AppIconMenu = class AppIconMenu extends PopupMenu.PopupMenu {
|
|||||||
|
|
||||||
if (discreteGpuAvailable &&
|
if (discreteGpuAvailable &&
|
||||||
this._source.app.state == Shell.AppState.STOPPED &&
|
this._source.app.state == Shell.AppState.STOPPED &&
|
||||||
actions.indexOf('activate-discrete-gpu') == -1) {
|
actions.includes('activate-discrete-gpu')) {
|
||||||
this._onDiscreteGpuMenuItem = this._appendMenuItem(_("Launch using Dedicated Graphics Card"));
|
this._onDiscreteGpuMenuItem = this._appendMenuItem(_("Launch using Dedicated Graphics Card"));
|
||||||
this._onDiscreteGpuMenuItem.connect('activate', () => {
|
this._onDiscreteGpuMenuItem.connect('activate', () => {
|
||||||
if (this._source.app.state == Shell.AppState.STOPPED)
|
if (this._source.app.state == Shell.AppState.STOPPED)
|
||||||
|
@ -63,7 +63,7 @@ class AppFavorites {
|
|||||||
constructor() {
|
constructor() {
|
||||||
this.FAVORITE_APPS_KEY = 'favorite-apps';
|
this.FAVORITE_APPS_KEY = 'favorite-apps';
|
||||||
this._favorites = {};
|
this._favorites = {};
|
||||||
global.settings.connect('changed::' + this.FAVORITE_APPS_KEY, this._onFavsChanged.bind(this));
|
global.settings.connect(`changed::${this.FAVORITE_APPS_KEY}`, this._onFavsChanged.bind(this));
|
||||||
this.reload();
|
this.reload();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -187,7 +187,7 @@ class AppFavorites {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
Signals.addSignalMethods(AppFavorites.prototype);
|
Signals.addSignalMethods(AppFavorites.prototype);
|
||||||
|
|
||||||
var appFavoritesInstance = null;
|
var appFavoritesInstance = null;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
const { Clutter, Gio, GLib, Meta, Shell, St } = imports.gi;
|
const { Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi;
|
||||||
|
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const ModalDialog = imports.ui.modalDialog;
|
const ModalDialog = imports.ui.modalDialog;
|
||||||
@ -13,10 +13,11 @@ var AudioDevice = {
|
|||||||
|
|
||||||
const AudioDeviceSelectionIface = loadInterfaceXML('org.gnome.Shell.AudioDeviceSelection');
|
const AudioDeviceSelectionIface = loadInterfaceXML('org.gnome.Shell.AudioDeviceSelection');
|
||||||
|
|
||||||
var AudioDeviceSelectionDialog =
|
var AudioDeviceSelectionDialog = GObject.registerClass({
|
||||||
class AudioDeviceSelectionDialog extends ModalDialog.ModalDialog {
|
Signals: { 'device-selected': { param_types: [GObject.TYPE_UINT] } }
|
||||||
constructor(devices) {
|
}, class AudioDeviceSelectionDialog extends ModalDialog.ModalDialog {
|
||||||
super({ styleClass: 'audio-device-selection-dialog' });
|
_init(devices) {
|
||||||
|
super._init({ styleClass: 'audio-device-selection-dialog' });
|
||||||
|
|
||||||
this._deviceItems = {};
|
this._deviceItems = {};
|
||||||
|
|
||||||
@ -33,10 +34,6 @@ class AudioDeviceSelectionDialog extends ModalDialog.ModalDialog {
|
|||||||
throw new Error('Too few devices for a selection');
|
throw new Error('Too few devices for a selection');
|
||||||
}
|
}
|
||||||
|
|
||||||
destroy() {
|
|
||||||
super.destroy();
|
|
||||||
}
|
|
||||||
|
|
||||||
_buildLayout(devices) {
|
_buildLayout(devices) {
|
||||||
let title = new St.Label({ style_class: 'audio-selection-title',
|
let title = new St.Label({ style_class: 'audio-selection-title',
|
||||||
text: _("Select Audio Device"),
|
text: _("Select Audio Device"),
|
||||||
@ -113,11 +110,11 @@ class AudioDeviceSelectionDialog extends ModalDialog.ModalDialog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_openSettings() {
|
_openSettings() {
|
||||||
let desktopFile = 'gnome-sound-panel.desktop'
|
let desktopFile = 'gnome-sound-panel.desktop';
|
||||||
let app = Shell.AppSystem.get_default().lookup_app(desktopFile);
|
let app = Shell.AppSystem.get_default().lookup_app(desktopFile);
|
||||||
|
|
||||||
if (!app) {
|
if (!app) {
|
||||||
log('Settings panel for desktop file ' + desktopFile + ' could not be loaded!');
|
log(`Settings panel for desktop file ${desktopFile} could not be loaded!`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -125,7 +122,7 @@ class AudioDeviceSelectionDialog extends ModalDialog.ModalDialog {
|
|||||||
Main.overview.hide();
|
Main.overview.hide();
|
||||||
app.activate();
|
app.activate();
|
||||||
}
|
}
|
||||||
};
|
});
|
||||||
|
|
||||||
var AudioDeviceSelectionDBus = class AudioDeviceSelectionDBus {
|
var AudioDeviceSelectionDBus = class AudioDeviceSelectionDBus {
|
||||||
constructor() {
|
constructor() {
|
||||||
@ -162,7 +159,7 @@ var AudioDeviceSelectionDBus = class AudioDeviceSelectionDBus {
|
|||||||
|
|
||||||
let [deviceNames] = params;
|
let [deviceNames] = params;
|
||||||
let devices = 0;
|
let devices = 0;
|
||||||
deviceNames.forEach(n => { devices |= AudioDevice[n.toUpperCase()]; });
|
deviceNames.forEach(n => devices |= AudioDevice[n.toUpperCase()]);
|
||||||
|
|
||||||
let dialog;
|
let dialog;
|
||||||
try {
|
try {
|
||||||
|
@ -108,7 +108,6 @@ const PRIMARY_COLOR_KEY = 'primary-color';
|
|||||||
const SECONDARY_COLOR_KEY = 'secondary-color';
|
const SECONDARY_COLOR_KEY = 'secondary-color';
|
||||||
const COLOR_SHADING_TYPE_KEY = 'color-shading-type';
|
const COLOR_SHADING_TYPE_KEY = 'color-shading-type';
|
||||||
const BACKGROUND_STYLE_KEY = 'picture-options';
|
const BACKGROUND_STYLE_KEY = 'picture-options';
|
||||||
const PICTURE_OPACITY_KEY = 'picture-opacity';
|
|
||||||
const PICTURE_URI_KEY = 'picture-uri';
|
const PICTURE_URI_KEY = 'picture-uri';
|
||||||
|
|
||||||
var FADE_ANIMATION_TIME = 1.0;
|
var FADE_ANIMATION_TIME = 1.0;
|
||||||
@ -257,14 +256,15 @@ var Background = class Background {
|
|||||||
this._refreshAnimation();
|
this._refreshAnimation();
|
||||||
});
|
});
|
||||||
|
|
||||||
this._settingsChangedSignalId = this._settings.connect('changed', () => {
|
this._settingsChangedSignalId =
|
||||||
this.emit('changed');
|
this._settings.connect('changed', this._emitChangedSignal.bind(this));
|
||||||
});
|
|
||||||
|
|
||||||
this._load();
|
this._load();
|
||||||
}
|
}
|
||||||
|
|
||||||
destroy() {
|
destroy() {
|
||||||
|
this.background = null;
|
||||||
|
|
||||||
this._cancellable.cancel();
|
this._cancellable.cancel();
|
||||||
this._removeAnimationTimeout();
|
this._removeAnimationTimeout();
|
||||||
|
|
||||||
@ -288,6 +288,22 @@ var Background = class Background {
|
|||||||
if (this._settingsChangedSignalId != 0)
|
if (this._settingsChangedSignalId != 0)
|
||||||
this._settings.disconnect(this._settingsChangedSignalId);
|
this._settings.disconnect(this._settingsChangedSignalId);
|
||||||
this._settingsChangedSignalId = 0;
|
this._settingsChangedSignalId = 0;
|
||||||
|
|
||||||
|
if (this._changedIdleId) {
|
||||||
|
GLib.source_remove(this._changedIdleId);
|
||||||
|
this._changedIdleId = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_emitChangedSignal() {
|
||||||
|
if (this._changedIdleId)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._changedIdleId = GLib.idle_add(GLib.PRIORITY_DEFAULT, () => {
|
||||||
|
this._changedIdleId = 0;
|
||||||
|
this.emit('changed');
|
||||||
|
return GLib.SOURCE_REMOVE;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
updateResolution() {
|
updateResolution() {
|
||||||
@ -343,7 +359,7 @@ var Background = class Background {
|
|||||||
if (changedFile.equal(file)) {
|
if (changedFile.equal(file)) {
|
||||||
let imageCache = Meta.BackgroundImageCache.get_default();
|
let imageCache = Meta.BackgroundImageCache.get_default();
|
||||||
imageCache.purge(changedFile);
|
imageCache.purge(changedFile);
|
||||||
this.emit('changed');
|
this._emitChangedSignal();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
this._fileWatches[key] = signalId;
|
this._fileWatches[key] = signalId;
|
||||||
@ -448,9 +464,9 @@ var Background = class Background {
|
|||||||
|
|
||||||
let cache = Meta.BackgroundImageCache.get_default();
|
let cache = Meta.BackgroundImageCache.get_default();
|
||||||
let image = cache.load(file);
|
let image = cache.load(file);
|
||||||
if (image.is_loaded())
|
if (image.is_loaded()) {
|
||||||
this._setLoaded();
|
this._setLoaded();
|
||||||
else {
|
} else {
|
||||||
let id = image.connect('loaded', () => {
|
let id = image.connect('loaded', () => {
|
||||||
this._setLoaded();
|
this._setLoaded();
|
||||||
image.disconnect(id);
|
image.disconnect(id);
|
||||||
@ -699,7 +715,6 @@ var BackgroundManager = class BackgroundManager {
|
|||||||
time: FADE_ANIMATION_TIME,
|
time: FADE_ANIMATION_TIME,
|
||||||
transition: 'easeOutQuad',
|
transition: 'easeOutQuad',
|
||||||
onComplete() {
|
onComplete() {
|
||||||
oldBackgroundActor.background.run_dispose();
|
|
||||||
oldBackgroundActor.destroy();
|
oldBackgroundActor.destroy();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -25,7 +25,7 @@ var BackgroundMenu = class BackgroundMenu extends PopupMenu.PopupMenu {
|
|||||||
function addBackgroundMenu(actor, layoutManager) {
|
function addBackgroundMenu(actor, layoutManager) {
|
||||||
actor.reactive = true;
|
actor.reactive = true;
|
||||||
actor._backgroundMenu = new BackgroundMenu(layoutManager);
|
actor._backgroundMenu = new BackgroundMenu(layoutManager);
|
||||||
actor._backgroundManager = new PopupMenu.PopupMenuManager({ actor: actor });
|
actor._backgroundManager = new PopupMenu.PopupMenuManager(actor);
|
||||||
actor._backgroundManager.addMenu(actor._backgroundMenu);
|
actor._backgroundManager.addMenu(actor._backgroundMenu);
|
||||||
|
|
||||||
function openMenu(x, y) {
|
function openMenu(x, y) {
|
||||||
|
@ -14,7 +14,7 @@ var BarLevel = class {
|
|||||||
this._barLevelWidth = 0;
|
this._barLevelWidth = 0;
|
||||||
|
|
||||||
if (params == undefined)
|
if (params == undefined)
|
||||||
params = {}
|
params = {};
|
||||||
|
|
||||||
this.actor = new St.DrawingArea({ styleClass: params['styleClass'] || 'barlevel',
|
this.actor = new St.DrawingArea({ styleClass: params['styleClass'] || 'barlevel',
|
||||||
can_focus: params['canFocus'] || false,
|
can_focus: params['canFocus'] || false,
|
||||||
@ -105,7 +105,7 @@ var BarLevel = class {
|
|||||||
overdriveSeparatorWidth = themeNode.get_length('-barlevel-overdrive-separator-width');
|
overdriveSeparatorWidth = themeNode.get_length('-barlevel-overdrive-separator-width');
|
||||||
|
|
||||||
/* background bar */
|
/* background bar */
|
||||||
cr.arc(width - barLevelBorderRadius - barLevelBorderWidth, height / 2, barLevelBorderRadius, TAU * 3 / 4, TAU * 1 / 4);
|
cr.arc(width - barLevelBorderRadius - barLevelBorderWidth, height / 2, barLevelBorderRadius, TAU * (3 / 4), TAU * (1 / 4));
|
||||||
cr.lineTo(endX, (height + barLevelHeight) / 2);
|
cr.lineTo(endX, (height + barLevelHeight) / 2);
|
||||||
cr.lineTo(endX, (height - barLevelHeight) / 2);
|
cr.lineTo(endX, (height - barLevelHeight) / 2);
|
||||||
cr.lineTo(width - barLevelBorderRadius - barLevelBorderWidth, (height - barLevelHeight) / 2);
|
cr.lineTo(width - barLevelBorderRadius - barLevelBorderWidth, (height - barLevelHeight) / 2);
|
||||||
@ -117,7 +117,7 @@ var BarLevel = class {
|
|||||||
|
|
||||||
/* normal progress bar */
|
/* normal progress bar */
|
||||||
let x = Math.min(endX, overdriveSeparatorX - overdriveSeparatorWidth / 2);
|
let x = Math.min(endX, overdriveSeparatorX - overdriveSeparatorWidth / 2);
|
||||||
cr.arc(barLevelBorderRadius + barLevelBorderWidth, height / 2, barLevelBorderRadius, TAU * 1 / 4, TAU * 3 / 4);
|
cr.arc(barLevelBorderRadius + barLevelBorderWidth, height / 2, barLevelBorderRadius, TAU * (1 / 4), TAU * (3 / 4));
|
||||||
cr.lineTo(x, (height - barLevelHeight) / 2);
|
cr.lineTo(x, (height - barLevelHeight) / 2);
|
||||||
cr.lineTo(x, (height + barLevelHeight) / 2);
|
cr.lineTo(x, (height + barLevelHeight) / 2);
|
||||||
cr.lineTo(barLevelBorderRadius + barLevelBorderWidth, (height + barLevelHeight) / 2);
|
cr.lineTo(barLevelBorderRadius + barLevelBorderWidth, (height + barLevelHeight) / 2);
|
||||||
@ -149,7 +149,7 @@ var BarLevel = class {
|
|||||||
Clutter.cairo_set_source_color(cr, barLevelActiveColor);
|
Clutter.cairo_set_source_color(cr, barLevelActiveColor);
|
||||||
else
|
else
|
||||||
Clutter.cairo_set_source_color(cr, barLevelOverdriveColor);
|
Clutter.cairo_set_source_color(cr, barLevelOverdriveColor);
|
||||||
cr.arc(endX, height / 2, barLevelBorderRadius, TAU * 3 / 4, TAU * 1 / 4);
|
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(Math.floor(endX), (height - barLevelHeight) / 2);
|
cr.lineTo(Math.floor(endX), (height - barLevelHeight) / 2);
|
||||||
cr.lineTo(endX, (height - barLevelHeight) / 2);
|
cr.lineTo(endX, (height - barLevelHeight) / 2);
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
|
||||||
const { Clutter, GObject, Meta, Shell, St } = imports.gi;
|
const { Clutter, GObject, Shell, St } = imports.gi;
|
||||||
|
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
@ -33,8 +33,6 @@ var BoxPointer = GObject.registerClass({
|
|||||||
_init(arrowSide, binProperties) {
|
_init(arrowSide, binProperties) {
|
||||||
super._init();
|
super._init();
|
||||||
|
|
||||||
this.actor = this;
|
|
||||||
|
|
||||||
this.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS);
|
this.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS);
|
||||||
|
|
||||||
this._arrowSide = arrowSide;
|
this._arrowSide = arrowSide;
|
||||||
@ -50,6 +48,15 @@ var BoxPointer = GObject.registerClass({
|
|||||||
this._sourceAlignment = 0.5;
|
this._sourceAlignment = 0.5;
|
||||||
this._capturedEventId = 0;
|
this._capturedEventId = 0;
|
||||||
this._muteInput();
|
this._muteInput();
|
||||||
|
|
||||||
|
this.connect('destroy', this._onDestroy.bind(this));
|
||||||
|
}
|
||||||
|
|
||||||
|
_onDestroy() {
|
||||||
|
if (this._sourceActorDestroyId) {
|
||||||
|
this._sourceActor.disconnect(this._sourceActorDestroyId);
|
||||||
|
delete this._sourceActorDestroyId;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
get arrowSide() {
|
get arrowSide() {
|
||||||
@ -69,36 +76,6 @@ var BoxPointer = GObject.registerClass({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// BoxPointer.show() and BoxPointer.hide() are here for only compatibility
|
|
||||||
// purposes, and will be removed in 3.32.
|
|
||||||
show(animate, onComplete) {
|
|
||||||
if (animate !== undefined) {
|
|
||||||
try {
|
|
||||||
throw new Error('BoxPointer.show() has been moved to BoxPointer.open(), this code will break in the future.');
|
|
||||||
} catch(e) {
|
|
||||||
logError(e);
|
|
||||||
this.open(animate, onComplete);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.visible = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
hide(animate, onComplete) {
|
|
||||||
if (animate !== undefined) {
|
|
||||||
try {
|
|
||||||
throw new Error('BoxPointer.hide() has been moved to BoxPointer.close(), this code will break in the future.');
|
|
||||||
} catch(e) {
|
|
||||||
logError(e);
|
|
||||||
this.close(animate, onComplete);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.visible = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
open(animate, onComplete) {
|
open(animate, onComplete) {
|
||||||
let themeNode = this.get_theme_node();
|
let themeNode = this.get_theme_node();
|
||||||
let rise = themeNode.get_length('-arrow-rise');
|
let rise = themeNode.get_length('-arrow-rise');
|
||||||
@ -227,13 +204,10 @@ var BoxPointer = GObject.registerClass({
|
|||||||
this.set_allocation(box, flags);
|
this.set_allocation(box, flags);
|
||||||
|
|
||||||
let themeNode = this.get_theme_node();
|
let themeNode = this.get_theme_node();
|
||||||
box = themeNode.get_content_box(box);
|
|
||||||
|
|
||||||
let borderWidth = themeNode.get_length('-arrow-border-width');
|
let borderWidth = themeNode.get_length('-arrow-border-width');
|
||||||
let rise = themeNode.get_length('-arrow-rise');
|
let rise = themeNode.get_length('-arrow-rise');
|
||||||
let childBox = new Clutter.ActorBox();
|
let childBox = new Clutter.ActorBox();
|
||||||
let availWidth = box.x2 - box.x1;
|
let [availWidth, availHeight] = themeNode.get_content_box(box).get_size();
|
||||||
let availHeight = box.y2 - box.y1;
|
|
||||||
|
|
||||||
childBox.x1 = 0;
|
childBox.x1 = 0;
|
||||||
childBox.y1 = 0;
|
childBox.y1 = 0;
|
||||||
@ -262,8 +236,9 @@ var BoxPointer = GObject.registerClass({
|
|||||||
this.bin.allocate(childBox, flags);
|
this.bin.allocate(childBox, flags);
|
||||||
|
|
||||||
if (this._sourceActor && this._sourceActor.mapped) {
|
if (this._sourceActor && this._sourceActor.mapped) {
|
||||||
this._reposition();
|
this._reposition(box);
|
||||||
this._updateFlip();
|
this._updateFlip(box);
|
||||||
|
this.set_allocation(box, flags);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -421,7 +396,7 @@ var BoxPointer = GObject.registerClass({
|
|||||||
cr.lineTo(x1 - rise, y1);
|
cr.lineTo(x1 - rise, y1);
|
||||||
cr.lineTo(x1 + borderRadius, y1);
|
cr.lineTo(x1 + borderRadius, y1);
|
||||||
} else if (skipBottomLeft) {
|
} else if (skipBottomLeft) {
|
||||||
cr.lineTo(x1 - rise, y2)
|
cr.lineTo(x1 - rise, y2);
|
||||||
cr.lineTo(x1 - rise, y2 - halfBase);
|
cr.lineTo(x1 - rise, y2 - halfBase);
|
||||||
} else {
|
} else {
|
||||||
cr.lineTo(x1, this._arrowOrigin + halfBase);
|
cr.lineTo(x1, this._arrowOrigin + halfBase);
|
||||||
@ -450,15 +425,25 @@ var BoxPointer = GObject.registerClass({
|
|||||||
}
|
}
|
||||||
|
|
||||||
setPosition(sourceActor, alignment) {
|
setPosition(sourceActor, alignment) {
|
||||||
// We need to show it now to force an allocation,
|
if (!this._sourceActor || sourceActor != this._sourceActor) {
|
||||||
// so that we can query the correct size.
|
if (this._sourceActorDestroyId) {
|
||||||
this.show();
|
this._sourceActor.disconnect(this._sourceActorDestroyId);
|
||||||
|
delete this._sourceActorDestroyId;
|
||||||
|
}
|
||||||
|
|
||||||
this._sourceActor = sourceActor;
|
this._sourceActor = sourceActor;
|
||||||
|
|
||||||
|
if (this._sourceActor) {
|
||||||
|
this._sourceActorDestroyId = this._sourceActor.connect('destroy', () => {
|
||||||
|
this._sourceActor = null;
|
||||||
|
delete this._sourceActorDestroyId;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
this._arrowAlignment = alignment;
|
this._arrowAlignment = alignment;
|
||||||
|
|
||||||
this._reposition();
|
this.queue_relayout();
|
||||||
this._updateFlip();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
setSourceAlignment(alignment) {
|
setSourceAlignment(alignment) {
|
||||||
@ -470,7 +455,7 @@ var BoxPointer = GObject.registerClass({
|
|||||||
this.setPosition(this._sourceActor, this._arrowAlignment);
|
this.setPosition(this._sourceActor, this._arrowAlignment);
|
||||||
}
|
}
|
||||||
|
|
||||||
_reposition() {
|
_reposition(allocationBox) {
|
||||||
let sourceActor = this._sourceActor;
|
let sourceActor = this._sourceActor;
|
||||||
let alignment = this._arrowAlignment;
|
let alignment = this._arrowAlignment;
|
||||||
let monitorIndex = Main.layoutManager.findIndexForActor(sourceActor);
|
let monitorIndex = Main.layoutManager.findIndexForActor(sourceActor);
|
||||||
@ -584,8 +569,7 @@ var BoxPointer = GObject.registerClass({
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Actually set the position
|
// Actually set the position
|
||||||
this.x = Math.floor(x);
|
allocationBox.set_origin(Math.floor(x), Math.floor(y));
|
||||||
this.y = Math.floor(y);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// @origin: Coordinate specifying middle of the arrow, along
|
// @origin: Coordinate specifying middle of the arrow, along
|
||||||
@ -639,15 +623,11 @@ var BoxPointer = GObject.registerClass({
|
|||||||
return arrowSide;
|
return arrowSide;
|
||||||
}
|
}
|
||||||
|
|
||||||
_updateFlip() {
|
_updateFlip(allocationBox) {
|
||||||
let arrowSide = this._calculateArrowSide(this._userArrowSide);
|
let arrowSide = this._calculateArrowSide(this._userArrowSide);
|
||||||
if (this._arrowSide != arrowSide) {
|
if (this._arrowSide != arrowSide) {
|
||||||
this._arrowSide = arrowSide;
|
this._arrowSide = arrowSide;
|
||||||
this._reposition();
|
this._reposition(allocationBox);
|
||||||
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => {
|
|
||||||
this.queue_relayout();
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
|
|
||||||
this.emit('arrow-side-changed');
|
this.emit('arrow-side-changed');
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,7 @@ var ELLIPSIS_CHAR = '\u2026';
|
|||||||
|
|
||||||
var MESSAGE_ICON_SIZE = -1; // pick up from CSS
|
var MESSAGE_ICON_SIZE = -1; // pick up from CSS
|
||||||
|
|
||||||
var NC_ = (context, str) => context + '\u0004' + str;
|
var NC_ = (context, str) => `${context}\u0004${str}`;
|
||||||
|
|
||||||
function sameYear(dateA, dateB) {
|
function sameYear(dateA, dateB) {
|
||||||
return (dateA.getYear() == dateB.getYear());
|
return (dateA.getYear() == dateB.getYear());
|
||||||
@ -38,7 +38,7 @@ function isToday(date) {
|
|||||||
function _isWorkDay(date) {
|
function _isWorkDay(date) {
|
||||||
/* Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). */
|
/* Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). */
|
||||||
let days = C_('calendar-no-work', "06");
|
let days = C_('calendar-no-work', "06");
|
||||||
return days.indexOf(date.getDay().toString()) == -1;
|
return !days.includes(date.getDay().toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
function _getBeginningOfDay(date) {
|
function _getBeginningOfDay(date) {
|
||||||
@ -143,8 +143,7 @@ function _datesEqual(a, b) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
function _dateIntervalsOverlap(a0, a1, b0, b1)
|
function _dateIntervalsOverlap(a0, a1, b0, b1) {
|
||||||
{
|
|
||||||
if (a1 <= b0)
|
if (a1 <= b0)
|
||||||
return false;
|
return false;
|
||||||
else if (b1 <= a0)
|
else if (b1 <= a0)
|
||||||
@ -178,7 +177,7 @@ var DBusEventSource = class DBusEventSource {
|
|||||||
// about the HasCalendars property and would cause an exception trying
|
// about the HasCalendars property and would cause an exception trying
|
||||||
// to read it)
|
// to read it)
|
||||||
} else {
|
} else {
|
||||||
log('Error loading calendars: ' + e.message);
|
log(`Error loading calendars: ${e.message}`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -320,7 +319,7 @@ var Calendar = class Calendar {
|
|||||||
this._weekStart = Shell.util_get_week_start();
|
this._weekStart = Shell.util_get_week_start();
|
||||||
this._settings = new Gio.Settings({ schema_id: 'org.gnome.desktop.calendar' });
|
this._settings = new Gio.Settings({ schema_id: 'org.gnome.desktop.calendar' });
|
||||||
|
|
||||||
this._settings.connect('changed::' + SHOW_WEEKDATE_KEY, this._onSettingsChange.bind(this));
|
this._settings.connect(`changed::${SHOW_WEEKDATE_KEY}`, this._onSettingsChange.bind(this));
|
||||||
this._useWeekdate = this._settings.get_boolean(SHOW_WEEKDATE_KEY);
|
this._useWeekdate = this._settings.get_boolean(SHOW_WEEKDATE_KEY);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -466,8 +465,7 @@ var Calendar = class Calendar {
|
|||||||
let day = 32 - new Date(newDate.getFullYear() - 1, 11, 32).getDate();
|
let day = 32 - new Date(newDate.getFullYear() - 1, 11, 32).getDate();
|
||||||
newDate = new Date(newDate.getFullYear() - 1, 11, day);
|
newDate = new Date(newDate.getFullYear() - 1, 11, day);
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
newDate.setMonth(oldMonth - 1);
|
newDate.setMonth(oldMonth - 1);
|
||||||
if (newDate.getMonth() != oldMonth - 1) {
|
if (newDate.getMonth() != oldMonth - 1) {
|
||||||
let day = 32 - new Date(newDate.getFullYear(), oldMonth - 1, 32).getDate();
|
let day = 32 - new Date(newDate.getFullYear(), oldMonth - 1, 32).getDate();
|
||||||
@ -490,8 +488,7 @@ var Calendar = class Calendar {
|
|||||||
let day = 32 - new Date(newDate.getFullYear() + 1, 0, 32).getDate();
|
let day = 32 - new Date(newDate.getFullYear() + 1, 0, 32).getDate();
|
||||||
newDate = new Date(newDate.getFullYear() + 1, 0, day);
|
newDate = new Date(newDate.getFullYear() + 1, 0, day);
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
newDate.setMonth(oldMonth + 1);
|
newDate.setMonth(oldMonth + 1);
|
||||||
if (newDate.getMonth() != oldMonth + 1) {
|
if (newDate.getMonth() != oldMonth + 1) {
|
||||||
let day = 32 - new Date(newDate.getFullYear(), oldMonth + 1, 32).getDate();
|
let day = 32 - new Date(newDate.getFullYear(), oldMonth + 1, 32).getDate();
|
||||||
@ -546,8 +543,6 @@ var Calendar = class Calendar {
|
|||||||
this._calendarBegin = new Date(beginDate);
|
this._calendarBegin = new Date(beginDate);
|
||||||
this._markedAsToday = now;
|
this._markedAsToday = now;
|
||||||
|
|
||||||
let year = beginDate.getYear();
|
|
||||||
|
|
||||||
let daysToWeekStart = (7 + beginDate.getDay() - this._weekStart) % 7;
|
let daysToWeekStart = (7 + beginDate.getDay() - this._weekStart) % 7;
|
||||||
let startsOnWeekStart = daysToWeekStart == 0;
|
let startsOnWeekStart = daysToWeekStart == 0;
|
||||||
let weekPadding = startsOnWeekStart ? 7 : 0;
|
let weekPadding = startsOnWeekStart ? 7 : 0;
|
||||||
@ -559,7 +554,7 @@ var Calendar = class Calendar {
|
|||||||
let row = 2;
|
let row = 2;
|
||||||
// nRows here means 6 weeks + one header + one navbar
|
// nRows here means 6 weeks + one header + one navbar
|
||||||
let nRows = 8;
|
let nRows = 8;
|
||||||
while (row < 8) {
|
while (row < nRows) {
|
||||||
// xgettext:no-javascript-format
|
// xgettext:no-javascript-format
|
||||||
let button = new St.Button({ label: iter.toLocaleFormat(C_("date day number format", "%d")),
|
let button = new St.Button({ label: iter.toLocaleFormat(C_("date day number format", "%d")),
|
||||||
can_focus: true });
|
can_focus: true });
|
||||||
@ -585,12 +580,12 @@ var Calendar = class Calendar {
|
|||||||
|
|
||||||
// Hack used in lieu of border-collapse - see gnome-shell.css
|
// Hack used in lieu of border-collapse - see gnome-shell.css
|
||||||
if (row == 2)
|
if (row == 2)
|
||||||
styleClass = 'calendar-day-top ' + styleClass;
|
styleClass = `calendar-day-top ${styleClass}`;
|
||||||
|
|
||||||
let leftMost = rtl ? iter.getDay() == (this._weekStart + 6) % 7
|
let leftMost = rtl ? iter.getDay() == (this._weekStart + 6) % 7
|
||||||
: iter.getDay() == this._weekStart;
|
: iter.getDay() == this._weekStart;
|
||||||
if (leftMost)
|
if (leftMost)
|
||||||
styleClass = 'calendar-day-left ' + styleClass;
|
styleClass = `calendar-day-left ${styleClass}`;
|
||||||
|
|
||||||
if (sameDay(now, iter))
|
if (sameDay(now, iter))
|
||||||
styleClass += ' calendar-today';
|
styleClass += ' calendar-today';
|
||||||
@ -648,9 +643,9 @@ var Calendar = class Calendar {
|
|||||||
button.add_style_pseudo_class('selected');
|
button.add_style_pseudo_class('selected');
|
||||||
if (this._shouldDateGrabFocus)
|
if (this._shouldDateGrabFocus)
|
||||||
button.grab_key_focus();
|
button.grab_key_focus();
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
button.remove_style_pseudo_class('selected');
|
button.remove_style_pseudo_class('selected');
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -1077,7 +1072,7 @@ var CalendarMessageList = class CalendarMessageList {
|
|||||||
this._clearButton.set_x_align(Clutter.ActorAlign.END);
|
this._clearButton.set_x_align(Clutter.ActorAlign.END);
|
||||||
this._clearButton.connect('clicked', () => {
|
this._clearButton.connect('clicked', () => {
|
||||||
let sections = [...this._sections.keys()];
|
let sections = [...this._sections.keys()];
|
||||||
sections.forEach((s) => { s.clear(); });
|
sections.forEach((s) => s.clear());
|
||||||
});
|
});
|
||||||
box.add_actor(this._clearButton);
|
box.add_actor(this._clearButton);
|
||||||
|
|
||||||
|
@ -6,8 +6,8 @@ const Dialog = imports.ui.dialog;
|
|||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
|
|
||||||
var FROZEN_WINDOW_BRIGHTNESS = -0.3
|
var FROZEN_WINDOW_BRIGHTNESS = -0.3;
|
||||||
var DIALOG_TRANSITION_TIME = 0.15
|
var DIALOG_TRANSITION_TIME = 0.15;
|
||||||
var ALIVE_TIMEOUT = 5000;
|
var ALIVE_TIMEOUT = 5000;
|
||||||
|
|
||||||
var CloseDialog = GObject.registerClass({
|
var CloseDialog = GObject.registerClass({
|
||||||
@ -165,7 +165,7 @@ var CloseDialog = GObject.registerClass({
|
|||||||
GLib.source_remove(this._timeoutId);
|
GLib.source_remove(this._timeoutId);
|
||||||
this._timeoutId = 0;
|
this._timeoutId = 0;
|
||||||
|
|
||||||
global.display.disconnect(this._windowFocusChangedId)
|
global.display.disconnect(this._windowFocusChangedId);
|
||||||
this._windowFocusChangedId = 0;
|
this._windowFocusChangedId = 0;
|
||||||
|
|
||||||
global.stage.disconnect(this._keyFocusChangedId);
|
global.stage.disconnect(this._keyFocusChangedId);
|
||||||
|
@ -13,13 +13,13 @@ var ComponentManager = class {
|
|||||||
let newEnabledComponents = Main.sessionMode.components;
|
let newEnabledComponents = Main.sessionMode.components;
|
||||||
|
|
||||||
newEnabledComponents.filter(
|
newEnabledComponents.filter(
|
||||||
name => this._enabledComponents.indexOf(name) == -1
|
name => !this._enabledComponents.includes(name)
|
||||||
).forEach(name => {
|
).forEach(name => {
|
||||||
this._enableComponent(name);
|
this._enableComponent(name);
|
||||||
});
|
});
|
||||||
|
|
||||||
this._enabledComponents.filter(
|
this._enabledComponents.filter(
|
||||||
name => newEnabledComponents.indexOf(name) == -1
|
name => !newEnabledComponents.includes(name)
|
||||||
).forEach(name => {
|
).forEach(name => {
|
||||||
this._disableComponent(name);
|
this._disableComponent(name);
|
||||||
});
|
});
|
||||||
|
@ -5,6 +5,7 @@ const Mainloop = imports.mainloop;
|
|||||||
const Params = imports.misc.params;
|
const Params = imports.misc.params;
|
||||||
|
|
||||||
const GnomeSession = imports.misc.gnomeSession;
|
const GnomeSession = imports.misc.gnomeSession;
|
||||||
|
const Main = imports.ui.main;
|
||||||
const ShellMountOperation = imports.ui.shellMountOperation;
|
const ShellMountOperation = imports.ui.shellMountOperation;
|
||||||
|
|
||||||
var GNOME_SESSION_AUTOMOUNT_INHIBIT = 16;
|
var GNOME_SESSION_AUTOMOUNT_INHIBIT = 16;
|
||||||
@ -108,23 +109,21 @@ var AutomountManager = class {
|
|||||||
// we force stop/eject in this case, so we don't have to pass a
|
// we force stop/eject in this case, so we don't have to pass a
|
||||||
// mount operation object
|
// mount operation object
|
||||||
if (drive.can_stop()) {
|
if (drive.can_stop()) {
|
||||||
drive.stop
|
drive.stop(Gio.MountUnmountFlags.FORCE, null, null,
|
||||||
(Gio.MountUnmountFlags.FORCE, null, null,
|
|
||||||
(drive, res) => {
|
(drive, res) => {
|
||||||
try {
|
try {
|
||||||
drive.stop_finish(res);
|
drive.stop_finish(res);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
log("Unable to stop the drive after drive-eject-button " + e.toString());
|
log(`Unable to stop the drive after drive-eject-button ${e.toString()}`);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else if (drive.can_eject()) {
|
} else if (drive.can_eject()) {
|
||||||
drive.eject_with_operation
|
drive.eject_with_operation(Gio.MountUnmountFlags.FORCE, null, null,
|
||||||
(Gio.MountUnmountFlags.FORCE, null, null,
|
|
||||||
(drive, res) => {
|
(drive, res) => {
|
||||||
try {
|
try {
|
||||||
drive.eject_with_operation_finish(res);
|
drive.eject_with_operation_finish(res);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
log("Unable to eject the drive after drive-eject-button " + e.toString());
|
log(`Unable to eject the drive after drive-eject-button ${e.toString()}`);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -199,12 +198,20 @@ var AutomountManager = class {
|
|||||||
// error strings are not unique for the cases in the comments below.
|
// error strings are not unique for the cases in the comments below.
|
||||||
if (e.message.includes('No key available with this passphrase') || // cryptsetup
|
if (e.message.includes('No key available with this passphrase') || // cryptsetup
|
||||||
e.message.includes('No key available to unlock device') || // udisks (no password)
|
e.message.includes('No key available to unlock device') || // udisks (no password)
|
||||||
e.message.includes('Error unlocking')) { // udisks (wrong password)
|
// libblockdev wrong password opening LUKS device
|
||||||
|
e.message.includes('Failed to activate device: Incorrect passphrase') ||
|
||||||
|
// cryptsetup returns EINVAL in many cases, including wrong TCRYPT password/parameters
|
||||||
|
e.message.includes('Failed to load device\'s parameters: Invalid argument')) {
|
||||||
|
|
||||||
this._reaskPassword(volume);
|
this._reaskPassword(volume);
|
||||||
} else {
|
} else {
|
||||||
if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.FAILED_HANDLED))
|
if (e.message.includes('Compiled against a version of libcryptsetup that does not support the VeraCrypt PIM setting')) {
|
||||||
log('Unable to mount volume ' + volume.get_name() + ': ' + e.toString());
|
Main.notifyError(_("Unable to unlock volume"),
|
||||||
|
_("The installed udisks version does not support the PIM setting"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.FAILED_HANDLED))
|
||||||
|
log(`Unable to mount volume ${volume.get_name()}: ${e.toString()}`);
|
||||||
this._closeOperation(volume);
|
this._closeOperation(volume);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -40,7 +40,7 @@ function isMountRootHidden(root) {
|
|||||||
let path = root.get_path();
|
let path = root.get_path();
|
||||||
|
|
||||||
// skip any mounts in hidden directory hierarchies
|
// skip any mounts in hidden directory hierarchies
|
||||||
return (path.indexOf('/.') != -1);
|
return (path.includes('/.'));
|
||||||
}
|
}
|
||||||
|
|
||||||
function isMountNonLocal(mount) {
|
function isMountNonLocal(mount) {
|
||||||
@ -65,8 +65,7 @@ function startAppForMount(app, mount) {
|
|||||||
retval = app.launch(files,
|
retval = app.launch(files,
|
||||||
global.create_app_launch_context(0, -1));
|
global.create_app_launch_context(0, -1));
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
log('Unable to launch the application ' + app.get_name()
|
log(`Unable to launch the application ${app.get_name()}: ${e}`);
|
||||||
+ ': ' + e.toString());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
@ -107,8 +106,7 @@ var ContentTypeDiscoverer = class {
|
|||||||
try {
|
try {
|
||||||
contentTypes = mount.guess_content_type_finish(res);
|
contentTypes = mount.guess_content_type_finish(res);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
log('Unable to guess content types on added mount ' + mount.get_name()
|
log(`Unable to guess content types on added mount ${mount.get_name()}: ${e}`);
|
||||||
+ ': ' + e.toString());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (contentTypes.length) {
|
if (contentTypes.length) {
|
||||||
@ -192,15 +190,15 @@ var AutorunDispatcher = class {
|
|||||||
|
|
||||||
_getAutorunSettingForType(contentType) {
|
_getAutorunSettingForType(contentType) {
|
||||||
let runApp = this._settings.get_strv(SETTING_START_APP);
|
let runApp = this._settings.get_strv(SETTING_START_APP);
|
||||||
if (runApp.indexOf(contentType) != -1)
|
if (runApp.includes(contentType))
|
||||||
return AutorunSetting.RUN;
|
return AutorunSetting.RUN;
|
||||||
|
|
||||||
let ignore = this._settings.get_strv(SETTING_IGNORE);
|
let ignore = this._settings.get_strv(SETTING_IGNORE);
|
||||||
if (ignore.indexOf(contentType) != -1)
|
if (ignore.includes(contentType))
|
||||||
return AutorunSetting.IGNORE;
|
return AutorunSetting.IGNORE;
|
||||||
|
|
||||||
let openFiles = this._settings.get_strv(SETTING_OPEN_FOLDER);
|
let openFiles = this._settings.get_strv(SETTING_OPEN_FOLDER);
|
||||||
if (openFiles.indexOf(contentType) != -1)
|
if (openFiles.includes(contentType))
|
||||||
return AutorunSetting.FILES;
|
return AutorunSetting.FILES;
|
||||||
|
|
||||||
return AutorunSetting.ASK;
|
return AutorunSetting.ASK;
|
||||||
|
@ -10,9 +10,10 @@ const CheckBox = imports.ui.checkBox;
|
|||||||
|
|
||||||
var WORK_SPINNER_ICON_SIZE = 16;
|
var WORK_SPINNER_ICON_SIZE = 16;
|
||||||
|
|
||||||
var KeyringDialog = class extends ModalDialog.ModalDialog {
|
var KeyringDialog = GObject.registerClass(
|
||||||
constructor() {
|
class KeyringDialog extends ModalDialog.ModalDialog {
|
||||||
super({ styleClass: 'prompt-dialog' });
|
_init() {
|
||||||
|
super._init({ styleClass: 'prompt-dialog' });
|
||||||
|
|
||||||
this.prompt = new Shell.KeyringPrompt();
|
this.prompt = new Shell.KeyringPrompt();
|
||||||
this.prompt.connect('show-password', this._onShowPassword.bind(this));
|
this.prompt.connect('show-password', this._onShowPassword.bind(this));
|
||||||
@ -23,20 +24,8 @@ var KeyringDialog = class extends ModalDialog.ModalDialog {
|
|||||||
this._content = new Dialog.MessageDialogContent({ icon });
|
this._content = new Dialog.MessageDialogContent({ icon });
|
||||||
this.contentLayout.add(this._content);
|
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('message', this._content, 'title', GObject.BindingFlags.SYNC_CREATE);
|
||||||
this.prompt.bind_property('description', this._content, 'body', 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._workSpinner = null;
|
||||||
this._controlTable = null;
|
this._controlTable = null;
|
||||||
@ -183,7 +172,7 @@ var KeyringDialog = class extends ModalDialog.ModalDialog {
|
|||||||
|
|
||||||
log('keyringPrompt: Failed to show modal dialog.' +
|
log('keyringPrompt: Failed to show modal dialog.' +
|
||||||
' Dismissing prompt request');
|
' Dismissing prompt request');
|
||||||
this.prompt.cancel()
|
this.prompt.cancel();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -224,7 +213,7 @@ var KeyringDialog = class extends ModalDialog.ModalDialog {
|
|||||||
_onCancelButton() {
|
_onCancelButton() {
|
||||||
this.prompt.cancel();
|
this.prompt.cancel();
|
||||||
}
|
}
|
||||||
};
|
});
|
||||||
|
|
||||||
var KeyringDummyDialog = class {
|
var KeyringDummyDialog = class {
|
||||||
constructor() {
|
constructor() {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
|
||||||
const { Clutter, Gio, GLib, NM, Pango, Shell, St } = imports.gi;
|
const { Clutter, Gio, GLib, GObject, NM, Pango, Shell, St } = imports.gi;
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
|
|
||||||
const Config = imports.misc.config;
|
const Config = imports.misc.config;
|
||||||
@ -12,9 +12,10 @@ const ShellEntry = imports.ui.shellEntry;
|
|||||||
|
|
||||||
const VPN_UI_GROUP = 'VPN Plugin UI';
|
const VPN_UI_GROUP = 'VPN Plugin UI';
|
||||||
|
|
||||||
var NetworkSecretDialog = class extends ModalDialog.ModalDialog {
|
var NetworkSecretDialog = GObject.registerClass(
|
||||||
constructor(agent, requestId, connection, settingName, hints, flags, contentOverride) {
|
class NetworkSecretDialog extends ModalDialog.ModalDialog {
|
||||||
super({ styleClass: 'prompt-dialog' });
|
_init(agent, requestId, connection, settingName, hints, flags, contentOverride) {
|
||||||
|
super._init({ styleClass: 'prompt-dialog' });
|
||||||
|
|
||||||
this._agent = agent;
|
this._agent = agent;
|
||||||
this._requestId = requestId;
|
this._requestId = requestId;
|
||||||
@ -79,8 +80,9 @@ var NetworkSecretDialog = class extends ModalDialog.ModalDialog {
|
|||||||
secret.valid = secret.value.length > 0;
|
secret.valid = secret.value.length > 0;
|
||||||
this._updateOkButton();
|
this._updateOkButton();
|
||||||
});
|
});
|
||||||
} else
|
} else {
|
||||||
secret.valid = true;
|
secret.valid = true;
|
||||||
|
}
|
||||||
|
|
||||||
if (rtl) {
|
if (rtl) {
|
||||||
layout.attach(secret.entry, 0, pos, 1, 1);
|
layout.attach(secret.entry, 0, pos, 1, 1);
|
||||||
@ -187,8 +189,9 @@ var NetworkSecretDialog = class extends ModalDialog.ModalDialog {
|
|||||||
|| (value[i] >= 'A' && value[i] <= 'Z')))
|
|| (value[i] >= 'A' && value[i] <= 'Z')))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else
|
} else {
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
} else if (secret.wep_key_type == NM.WepKeyType.PASSPHRASE) {
|
} else if (secret.wep_key_type == NM.WepKeyType.PASSPHRASE) {
|
||||||
if (value.length < 0 || value.length > 64)
|
if (value.length < 0 || value.length > 64)
|
||||||
return false;
|
return false;
|
||||||
@ -213,7 +216,7 @@ var NetworkSecretDialog = class extends ModalDialog.ModalDialog {
|
|||||||
validate: this._validateWpaPsk, password: true });
|
validate: this._validateWpaPsk, password: true });
|
||||||
break;
|
break;
|
||||||
case 'none': // static WEP
|
case 'none': // static WEP
|
||||||
secrets.push({ label: _("Key: "), key: 'wep-key' + wirelessSecuritySetting.wep_tx_keyidx,
|
secrets.push({ label: _("Key: "), key: `wep-key${wirelessSecuritySetting.wep_tx_keyidx}`,
|
||||||
value: wirelessSecuritySetting.get_wep_key(wirelessSecuritySetting.wep_tx_keyidx) || '',
|
value: wirelessSecuritySetting.get_wep_key(wirelessSecuritySetting.wep_tx_keyidx) || '',
|
||||||
wep_key_type: wirelessSecuritySetting.wep_key_type,
|
wep_key_type: wirelessSecuritySetting.wep_key_type,
|
||||||
validate: this._validateStaticWep, password: true });
|
validate: this._validateStaticWep, password: true });
|
||||||
@ -229,13 +232,12 @@ var NetworkSecretDialog = class extends ModalDialog.ModalDialog {
|
|||||||
this._get8021xSecrets(secrets);
|
this._get8021xSecrets(secrets);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
log('Invalid wireless key management: ' + wirelessSecuritySetting.key_mgmt);
|
log(`Invalid wireless key management: ${wirelessSecuritySetting.key_mgmt}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_get8021xSecrets(secrets) {
|
_get8021xSecrets(secrets) {
|
||||||
let ieee8021xSetting = this._connection.get_setting_802_1x();
|
let ieee8021xSetting = this._connection.get_setting_802_1x();
|
||||||
let phase2method;
|
|
||||||
|
|
||||||
/* If hints were given we know exactly what we need to ask */
|
/* If hints were given we know exactly what we need to ask */
|
||||||
if (this._settingName == "802-1x" && this._hints.length) {
|
if (this._settingName == "802-1x" && this._hints.length) {
|
||||||
@ -272,7 +274,7 @@ var NetworkSecretDialog = class extends ModalDialog.ModalDialog {
|
|||||||
value: ieee8021xSetting.private_key_password || '', password: true });
|
value: ieee8021xSetting.private_key_password || '', password: true });
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
log('Invalid EAP/IEEE802.1x method: ' + ieee8021xSetting.get_eap_method(0));
|
log(`Invalid EAP/IEEE802.1x method: ${ieee8021xSetting.get_eap_method(0)}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -326,7 +328,7 @@ var NetworkSecretDialog = class extends ModalDialog.ModalDialog {
|
|||||||
this._getPPPoESecrets(content.secrets);
|
this._getPPPoESecrets(content.secrets);
|
||||||
break;
|
break;
|
||||||
case 'gsm':
|
case 'gsm':
|
||||||
if (this._hints.indexOf('pin') != -1) {
|
if (this._hints.includes('pin')) {
|
||||||
let gsmSetting = this._connection.get_setting_gsm();
|
let gsmSetting = this._connection.get_setting_gsm();
|
||||||
content.title = _("PIN code required");
|
content.title = _("PIN code required");
|
||||||
content.message = _("PIN code is needed for the mobile broadband device");
|
content.message = _("PIN code is needed for the mobile broadband device");
|
||||||
@ -342,12 +344,12 @@ var NetworkSecretDialog = class extends ModalDialog.ModalDialog {
|
|||||||
this._getMobileSecrets(content.secrets, connectionType);
|
this._getMobileSecrets(content.secrets, connectionType);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
log('Invalid connection type: ' + connectionType);
|
log(`Invalid connection type: ${connectionType}`);
|
||||||
};
|
}
|
||||||
|
|
||||||
return content;
|
return content;
|
||||||
}
|
}
|
||||||
};
|
});
|
||||||
|
|
||||||
var VPNRequestHandler = class {
|
var VPNRequestHandler = class {
|
||||||
constructor(agent, requestId, authHelper, serviceType, connection, hints, flags) {
|
constructor(agent, requestId, authHelper, serviceType, connection, hints, flags) {
|
||||||
@ -366,8 +368,7 @@ var VPNRequestHandler = class {
|
|||||||
let argv = [authHelper.fileName,
|
let argv = [authHelper.fileName,
|
||||||
'-u', connectionSetting.uuid,
|
'-u', connectionSetting.uuid,
|
||||||
'-n', connectionSetting.id,
|
'-n', connectionSetting.id,
|
||||||
'-s', serviceType
|
'-s', serviceType];
|
||||||
];
|
|
||||||
if (authHelper.externalUIMode)
|
if (authHelper.externalUIMode)
|
||||||
argv.push('--external-ui-mode');
|
argv.push('--external-ui-mode');
|
||||||
if (flags & NM.SecretAgentGetSecretsFlags.ALLOW_INTERACTION)
|
if (flags & NM.SecretAgentGetSecretsFlags.ALLOW_INTERACTION)
|
||||||
@ -458,8 +459,9 @@ var VPNRequestHandler = class {
|
|||||||
this._agent.respond(this._requestId, Shell.NetworkAgentResponse.USER_CANCELED);
|
this._agent.respond(this._requestId, Shell.NetworkAgentResponse.USER_CANCELED);
|
||||||
else
|
else
|
||||||
this._agent.respond(this._requestId, Shell.NetworkAgentResponse.CONFIRMED);
|
this._agent.respond(this._requestId, Shell.NetworkAgentResponse.CONFIRMED);
|
||||||
} else
|
} else {
|
||||||
this._agent.respond(this._requestId, Shell.NetworkAgentResponse.INTERNAL_ERROR);
|
this._agent.respond(this._requestId, Shell.NetworkAgentResponse.INTERNAL_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
this.destroy();
|
this.destroy();
|
||||||
}
|
}
|
||||||
@ -586,12 +588,12 @@ var VPNRequestHandler = class {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
vpnSetting.foreach_data_item((key, value) => {
|
vpnSetting.foreach_data_item((key, value) => {
|
||||||
this._stdin.write('DATA_KEY=' + key + '\n', null);
|
this._stdin.write(`DATA_KEY=${key}\n`, null);
|
||||||
this._stdin.write('DATA_VAL=' + (value || '') + '\n\n', null);
|
this._stdin.write(`DATA_VAL=${value || ''}\n\n`, null);
|
||||||
});
|
});
|
||||||
vpnSetting.foreach_secret((key, value) => {
|
vpnSetting.foreach_secret((key, value) => {
|
||||||
this._stdin.write('SECRET_KEY=' + key + '\n', null);
|
this._stdin.write(`SECRET_KEY=${key}\n`, null);
|
||||||
this._stdin.write('SECRET_VAL=' + (value || '') + '\n\n', null);
|
this._stdin.write(`SECRET_VAL=${value || ''}\n\n`, null);
|
||||||
});
|
});
|
||||||
this._stdin.write('DONE\n\n', null);
|
this._stdin.write('DONE\n\n', null);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@ -618,9 +620,9 @@ var NetworkAgent = class {
|
|||||||
this._pluginDir = Gio.file_new_for_path(Config.VPNDIR);
|
this._pluginDir = Gio.file_new_for_path(Config.VPNDIR);
|
||||||
try {
|
try {
|
||||||
let monitor = this._pluginDir.monitor(Gio.FileMonitorFlags.NONE, null);
|
let monitor = this._pluginDir.monitor(Gio.FileMonitorFlags.NONE, null);
|
||||||
monitor.connect('changed', () => { this._vpnCacheBuilt = false; });
|
monitor.connect('changed', () => this._vpnCacheBuilt = false);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
log('Failed to create monitor for VPN plugin dir: ' + e.message);
|
log(`Failed to create monitor for VPN plugin dir: ${e.message}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
this._native.connect('new-request', this._newRequest.bind(this));
|
this._native.connect('new-request', this._newRequest.bind(this));
|
||||||
@ -679,12 +681,13 @@ var NetworkAgent = class {
|
|||||||
let connectionSetting = connection.get_setting_connection();
|
let connectionSetting = connection.get_setting_connection();
|
||||||
let connectionType = connectionSetting.get_connection_type();
|
let connectionType = connectionSetting.get_connection_type();
|
||||||
switch (connectionType) {
|
switch (connectionType) {
|
||||||
case '802-11-wireless':
|
case '802-11-wireless': {
|
||||||
let wirelessSetting = connection.get_setting_wireless();
|
let wirelessSetting = connection.get_setting_wireless();
|
||||||
let ssid = NM.utils_ssid_to_utf8(wirelessSetting.get_ssid().get_data());
|
let ssid = NM.utils_ssid_to_utf8(wirelessSetting.get_ssid().get_data());
|
||||||
title = _("Authentication required by wireless network");
|
title = _("Authentication required by wireless network");
|
||||||
body = _("Passwords or encryption keys are required to access the wireless network “%s”.").format(ssid);
|
body = _("Passwords or encryption keys are required to access the wireless network “%s”.").format(ssid);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case '802-3-ethernet':
|
case '802-3-ethernet':
|
||||||
title = _("Wired 802.1X authentication");
|
title = _("Wired 802.1X authentication");
|
||||||
body = _("A password is required to connect to “%s”.".format(connection.get_id()));
|
body = _("A password is required to connect to “%s”.".format(connection.get_id()));
|
||||||
@ -694,8 +697,7 @@ var NetworkAgent = class {
|
|||||||
body = _("A password is required to connect to “%s”.".format(connection.get_id()));
|
body = _("A password is required to connect to “%s”.".format(connection.get_id()));
|
||||||
break;
|
break;
|
||||||
case 'gsm':
|
case 'gsm':
|
||||||
if (hints.indexOf('pin') != -1) {
|
if (hints.includes('pin')) {
|
||||||
let gsmSetting = connection.get_setting_gsm();
|
|
||||||
title = _("PIN code required");
|
title = _("PIN code required");
|
||||||
body = _("PIN code is needed for the mobile broadband device");
|
body = _("PIN code is needed for the mobile broadband device");
|
||||||
break;
|
break;
|
||||||
@ -707,7 +709,7 @@ var NetworkAgent = class {
|
|||||||
body = _("A password is required to connect to “%s”.").format(connectionSetting.get_id());
|
body = _("A password is required to connect to “%s”.").format(connectionSetting.get_id());
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
log('Invalid connection type: ' + connectionType);
|
log(`Invalid connection type: ${connectionType}`);
|
||||||
this._native.respond(requestId, Shell.NetworkAgentResponse.INTERNAL_ERROR);
|
this._native.respond(requestId, Shell.NetworkAgentResponse.INTERNAL_ERROR);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,7 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
|
||||||
const { AccountsService, Clutter, Gio, GLib,
|
const { AccountsService, Clutter, Gio, GLib,
|
||||||
Pango, PolkitAgent, Polkit, Shell, St } = imports.gi;
|
GObject, Pango, PolkitAgent, Polkit, Shell, St } = imports.gi;
|
||||||
const Signals = imports.signals;
|
|
||||||
|
|
||||||
const Animation = imports.ui.animation;
|
const Animation = imports.ui.animation;
|
||||||
const Dialog = imports.ui.dialog;
|
const Dialog = imports.ui.dialog;
|
||||||
@ -15,9 +14,11 @@ var DIALOG_ICON_SIZE = 48;
|
|||||||
|
|
||||||
var WORK_SPINNER_ICON_SIZE = 16;
|
var WORK_SPINNER_ICON_SIZE = 16;
|
||||||
|
|
||||||
var AuthenticationDialog = class extends ModalDialog.ModalDialog {
|
var AuthenticationDialog = GObject.registerClass({
|
||||||
constructor(actionId, body, cookie, userNames) {
|
Signals: { 'done': { param_types: [GObject.TYPE_BOOLEAN] } }
|
||||||
super({ styleClass: 'prompt-dialog' });
|
}, class AuthenticationDialog extends ModalDialog.ModalDialog {
|
||||||
|
_init(actionId, body, cookie, userNames) {
|
||||||
|
super._init({ styleClass: 'prompt-dialog' });
|
||||||
|
|
||||||
this.actionId = actionId;
|
this.actionId = actionId;
|
||||||
this.message = body;
|
this.message = body;
|
||||||
@ -25,7 +26,7 @@ var AuthenticationDialog = class extends ModalDialog.ModalDialog {
|
|||||||
this._wasDismissed = false;
|
this._wasDismissed = false;
|
||||||
|
|
||||||
this._sessionUpdatedId = Main.sessionMode.connect('updated', () => {
|
this._sessionUpdatedId = Main.sessionMode.connect('updated', () => {
|
||||||
this._group.visible = !Main.sessionMode.isLocked;
|
this.visible = !Main.sessionMode.isLocked;
|
||||||
});
|
});
|
||||||
|
|
||||||
this.connect('closed', this._onDialogClosed.bind(this));
|
this.connect('closed', this._onDialogClosed.bind(this));
|
||||||
@ -37,19 +38,19 @@ var AuthenticationDialog = class extends ModalDialog.ModalDialog {
|
|||||||
this.contentLayout.add_actor(content);
|
this.contentLayout.add_actor(content);
|
||||||
|
|
||||||
if (userNames.length > 1) {
|
if (userNames.length > 1) {
|
||||||
log('polkitAuthenticationAgent: Received ' + userNames.length +
|
log(`polkitAuthenticationAgent: Received ${userNames.length} ` +
|
||||||
'identities that can be used for authentication. Only ' +
|
'identities that can be used for authentication. Only ' +
|
||||||
'considering one.');
|
'considering one.');
|
||||||
}
|
}
|
||||||
|
|
||||||
let userName = GLib.get_user_name();
|
let userName = GLib.get_user_name();
|
||||||
if (userNames.indexOf(userName) < 0)
|
if (!userNames.includes(userName))
|
||||||
userName = 'root';
|
userName = 'root';
|
||||||
if (userNames.indexOf(userName) < 0)
|
if (!userNames.includes(userName))
|
||||||
userName = userNames[0];
|
userName = userNames[0];
|
||||||
|
|
||||||
this._user = AccountsService.UserManager.get_default().get_user(userName);
|
this._user = AccountsService.UserManager.get_default().get_user(userName);
|
||||||
let userRealName = this._user.get_real_name()
|
let userRealName = this._user.get_real_name();
|
||||||
this._userLoadedId = this._user.connect('notify::is_loaded',
|
this._userLoadedId = this._user.connect('notify::is_loaded',
|
||||||
this._onUserChanged.bind(this));
|
this._onUserChanged.bind(this));
|
||||||
this._userChangedId = this._user.connect('changed',
|
this._userChangedId = this._user.connect('changed',
|
||||||
@ -180,8 +181,8 @@ var AuthenticationDialog = class extends ModalDialog.ModalDialog {
|
|||||||
// We could add retrying if this turns out to be a problem
|
// We could add retrying if this turns out to be a problem
|
||||||
|
|
||||||
log('polkitAuthenticationAgent: Failed to show modal dialog. ' +
|
log('polkitAuthenticationAgent: Failed to show modal dialog. ' +
|
||||||
' Dismissing authentication request for action-id ' + this.actionId +
|
`Dismissing authentication request for action-id ${this.actionId} ` +
|
||||||
' cookie ' + this._cookie);
|
`cookie ${this._cookie}`);
|
||||||
this._emitDone(true);
|
this._emitDone(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -249,14 +250,14 @@ var AuthenticationDialog = class extends ModalDialog.ModalDialog {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_onSessionRequest(session, request, echo_on) {
|
_onSessionRequest(session, request, echoOn) {
|
||||||
// Cheap localization trick
|
// Cheap localization trick
|
||||||
if (request == 'Password:' || request == 'Password: ')
|
if (request == 'Password:' || request == 'Password: ')
|
||||||
this._passwordLabel.set_text(_("Password:"));
|
this._passwordLabel.set_text(_("Password:"));
|
||||||
else
|
else
|
||||||
this._passwordLabel.set_text(request);
|
this._passwordLabel.set_text(request);
|
||||||
|
|
||||||
if (echo_on)
|
if (echoOn)
|
||||||
this._passwordEntry.clutter_text.set_password_char('');
|
this._passwordEntry.clutter_text.set_password_char('');
|
||||||
else
|
else
|
||||||
this._passwordEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE
|
this._passwordEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE
|
||||||
@ -326,8 +327,7 @@ var AuthenticationDialog = class extends ModalDialog.ModalDialog {
|
|||||||
|
|
||||||
this._destroySession();
|
this._destroySession();
|
||||||
}
|
}
|
||||||
};
|
});
|
||||||
Signals.addSignalMethods(AuthenticationDialog.prototype);
|
|
||||||
|
|
||||||
var AuthenticationAgent = class {
|
var AuthenticationAgent = class {
|
||||||
constructor() {
|
constructor() {
|
||||||
|
@ -40,8 +40,6 @@ var NotificationDirection = {
|
|||||||
RECEIVED: 'chat-received'
|
RECEIVED: 'chat-received'
|
||||||
};
|
};
|
||||||
|
|
||||||
var N_ = s => s;
|
|
||||||
|
|
||||||
function makeMessageFromTpMessage(tpMessage, direction) {
|
function makeMessageFromTpMessage(tpMessage, direction) {
|
||||||
let [text, flags] = tpMessage.to_text();
|
let [text, flags] = tpMessage.to_text();
|
||||||
|
|
||||||
@ -89,7 +87,7 @@ var TelepathyComponent = class {
|
|||||||
try {
|
try {
|
||||||
this._client.register();
|
this._client.register();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
throw new Error('Couldn\'t register Telepathy client. Error: \n' + e);
|
throw new Error(`Could not register Telepathy client. Error: ${e}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!this._client.account_manager.is_prepared(Tp.AccountManager.get_feature_quark_core()))
|
if (!this._client.account_manager.is_prepared(Tp.AccountManager.get_feature_quark_core()))
|
||||||
@ -149,8 +147,8 @@ class TelepathyClient extends Tp.BaseClient {
|
|||||||
this._delegatedChannelsCb.bind(this));
|
this._delegatedChannelsCb.bind(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
vfunc_observe_channels(account, conn, channels,
|
vfunc_observe_channels(...args) {
|
||||||
dispatchOp, requests, context) {
|
let [account, conn, channels, dispatchOp, requests, context] = args;
|
||||||
let len = channels.length;
|
let len = channels.length;
|
||||||
for (let i = 0; i < len; i++) {
|
for (let i = 0; i < len; i++) {
|
||||||
let channel = channels[i];
|
let channel = channels[i];
|
||||||
@ -182,8 +180,8 @@ class TelepathyClient extends Tp.BaseClient {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
vfunc_handle_channels(account, conn, channels, requests,
|
vfunc_handle_channels(...args) {
|
||||||
user_action_time, context) {
|
let [account, conn, channels, requests, userActionTime, context] = args;
|
||||||
this._handlingChannels(account, conn, channels, true);
|
this._handlingChannels(account, conn, channels, true);
|
||||||
context.accept();
|
context.accept();
|
||||||
}
|
}
|
||||||
@ -222,8 +220,8 @@ class TelepathyClient extends Tp.BaseClient {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
vfunc_add_dispatch_operation(account, conn, channels,
|
vfunc_add_dispatch_operation(...args) {
|
||||||
dispatchOp, context) {
|
let [account, conn, channels, dispatchOp, context] = args;
|
||||||
let channel = channels[0];
|
let channel = channels[0];
|
||||||
let chanType = channel.get_channel_type();
|
let chanType = channel.get_channel_type();
|
||||||
|
|
||||||
@ -255,7 +253,7 @@ class TelepathyClient extends Tp.BaseClient {
|
|||||||
dispatchOp.claim_with_finish(result);
|
dispatchOp.claim_with_finish(result);
|
||||||
this._handlingChannels(account, conn, [channel], false);
|
this._handlingChannels(account, conn, [channel], false);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
log('Failed to Claim channel: ' + err);
|
log(`Failed to Claim channel: ${err}`);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -401,7 +399,7 @@ var ChatSource = class extends MessageTray.Source {
|
|||||||
if (this._client.is_handling_channel(this._channel)) {
|
if (this._client.is_handling_channel(this._channel)) {
|
||||||
// We are handling the channel, try to pass it to Empathy or Polari
|
// We are handling the channel, try to pass it to Empathy or Polari
|
||||||
// (depending on the channel type)
|
// (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
|
// fallback to something else if activation fails
|
||||||
|
|
||||||
let target;
|
let target;
|
||||||
|
@ -7,7 +7,6 @@ const SwitcherPopup = imports.ui.switcherPopup;
|
|||||||
const Params = imports.misc.params;
|
const Params = imports.misc.params;
|
||||||
|
|
||||||
var POPUP_APPICON_SIZE = 96;
|
var POPUP_APPICON_SIZE = 96;
|
||||||
var POPUP_FADE_TIME = 0.1; // seconds
|
|
||||||
|
|
||||||
var SortGroup = {
|
var SortGroup = {
|
||||||
TOP: 0,
|
TOP: 0,
|
||||||
@ -33,7 +32,7 @@ var CtrlAltTabManager = class CtrlAltTabManager {
|
|||||||
item.iconName = icon;
|
item.iconName = icon;
|
||||||
|
|
||||||
this._items.push(item);
|
this._items.push(item);
|
||||||
root.connect('destroy', () => { this.removeGroup(root); });
|
root.connect('destroy', () => this.removeGroup(root));
|
||||||
if (root instanceof St.Widget)
|
if (root instanceof St.Widget)
|
||||||
global.focus_manager.add_group(root);
|
global.focus_manager.add_group(root);
|
||||||
}
|
}
|
||||||
|
@ -81,7 +81,7 @@ class DashItemContainer extends St.Widget {
|
|||||||
let itemHeight = this.allocation.y2 - this.allocation.y1;
|
let itemHeight = this.allocation.y2 - this.allocation.y1;
|
||||||
|
|
||||||
let labelHeight = this.label.get_height();
|
let labelHeight = this.label.get_height();
|
||||||
let yOffset = Math.floor((itemHeight - labelHeight) / 2)
|
let yOffset = Math.floor((itemHeight - labelHeight) / 2);
|
||||||
|
|
||||||
let y = stageY + yOffset;
|
let y = stageY + yOffset;
|
||||||
|
|
||||||
@ -321,8 +321,8 @@ class DashActor extends St.Widget {
|
|||||||
let themeNode = this.get_theme_node();
|
let themeNode = this.get_theme_node();
|
||||||
let adjustedForWidth = themeNode.adjust_for_width(forWidth);
|
let adjustedForWidth = themeNode.adjust_for_width(forWidth);
|
||||||
let [, showAppsButton] = this.get_children();
|
let [, showAppsButton] = this.get_children();
|
||||||
let [minHeight, ] = showAppsButton.get_preferred_height(adjustedForWidth);
|
let [minHeight] = showAppsButton.get_preferred_height(adjustedForWidth);
|
||||||
[minHeight, ] = themeNode.adjust_preferred_height(minHeight, natHeight);
|
[minHeight] = themeNode.adjust_preferred_height(minHeight, natHeight);
|
||||||
|
|
||||||
return [minHeight, natHeight];
|
return [minHeight, natHeight];
|
||||||
}
|
}
|
||||||
@ -700,14 +700,14 @@ var Dash = class Dash {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// App removed at oldIndex
|
// App removed at oldIndex
|
||||||
if (oldApp && newApps.indexOf(oldApp) == -1) {
|
if (oldApp && !newApps.includes(oldApp)) {
|
||||||
removedActors.push(children[oldIndex]);
|
removedActors.push(children[oldIndex]);
|
||||||
oldIndex++;
|
oldIndex++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// App added at newIndex
|
// App added at newIndex
|
||||||
if (newApp && oldApps.indexOf(newApp) == -1) {
|
if (newApp && !oldApps.includes(newApp)) {
|
||||||
addedItems.push({ app: newApp,
|
addedItems.push({ app: newApp,
|
||||||
item: this._createAppItem(newApp),
|
item: this._createAppItem(newApp),
|
||||||
pos: newIndex });
|
pos: newIndex });
|
||||||
@ -899,7 +899,7 @@ var Dash = class Dash {
|
|||||||
favPos++;
|
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
|
// and we are dragging it to its original position
|
||||||
if (!this._dragPlaceholder)
|
if (!this._dragPlaceholder)
|
||||||
return true;
|
return true;
|
||||||
|
@ -47,7 +47,7 @@ var TodayButton = class TodayButton {
|
|||||||
this._calendar.connect('selected-date-changed', (calendar, date) => {
|
this._calendar.connect('selected-date-changed', (calendar, date) => {
|
||||||
// Make the button reactive only if the selected date is not the
|
// Make the button reactive only if the selected date is not the
|
||||||
// current date.
|
// current date.
|
||||||
this.actor.reactive = !_isToday(date)
|
this.actor.reactive = !_isToday(date);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -118,7 +118,7 @@ var WorldClocksSection = class WorldClocksSection {
|
|||||||
if (!clocks[i].location)
|
if (!clocks[i].location)
|
||||||
continue;
|
continue;
|
||||||
let l = world.deserialize(clocks[i].location);
|
let l = world.deserialize(clocks[i].location);
|
||||||
if (l)
|
if (l && l.get_timezone() != null)
|
||||||
this._locations.push({ location: l });
|
this._locations.push({ location: l });
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -357,7 +357,7 @@ var MessagesIndicator = class MessagesIndicator {
|
|||||||
Main.messageTray.connect('queue-changed', this._updateCount.bind(this));
|
Main.messageTray.connect('queue-changed', this._updateCount.bind(this));
|
||||||
|
|
||||||
let sources = Main.messageTray.getSources();
|
let sources = Main.messageTray.getSources();
|
||||||
sources.forEach(source => { this._onSourceAdded(null, source); });
|
sources.forEach(source => this._onSourceAdded(null, source));
|
||||||
}
|
}
|
||||||
|
|
||||||
_onSourceAdded(tray, source) {
|
_onSourceAdded(tray, source) {
|
||||||
@ -373,7 +373,7 @@ var MessagesIndicator = class MessagesIndicator {
|
|||||||
|
|
||||||
_updateCount() {
|
_updateCount() {
|
||||||
let count = 0;
|
let count = 0;
|
||||||
this._sources.forEach(source => { count += source.unseenCount; });
|
this._sources.forEach(source => count += source.unseenCount);
|
||||||
count -= Main.messageTray.queueCount;
|
count -= Main.messageTray.queueCount;
|
||||||
|
|
||||||
this.actor.visible = (count > 0);
|
this.actor.visible = (count > 0);
|
||||||
@ -384,8 +384,8 @@ var IndicatorPad = GObject.registerClass(
|
|||||||
class IndicatorPad extends St.Widget {
|
class IndicatorPad extends St.Widget {
|
||||||
_init(actor) {
|
_init(actor) {
|
||||||
this._source = actor;
|
this._source = actor;
|
||||||
this._source.connect('notify::visible', () => { this.queue_relayout(); });
|
this._source.connect('notify::visible', () => this.queue_relayout());
|
||||||
this._source.connect('notify::size', () => { this.queue_relayout(); });
|
this._source.connect('notify::size', () => this.queue_relayout());
|
||||||
super._init();
|
super._init();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -459,7 +459,6 @@ class CalendarColumnLayout extends Clutter.BoxLayout {
|
|||||||
var DateMenuButton = GObject.registerClass(
|
var DateMenuButton = GObject.registerClass(
|
||||||
class DateMenuButton extends PanelMenu.Button {
|
class DateMenuButton extends PanelMenu.Button {
|
||||||
_init() {
|
_init() {
|
||||||
let item;
|
|
||||||
let hbox;
|
let hbox;
|
||||||
let vbox;
|
let vbox;
|
||||||
|
|
||||||
@ -476,10 +475,9 @@ class DateMenuButton extends PanelMenu.Button {
|
|||||||
box.add_actor(this._clockDisplay);
|
box.add_actor(this._clockDisplay);
|
||||||
box.add_actor(this._indicator.actor);
|
box.add_actor(this._indicator.actor);
|
||||||
|
|
||||||
this.actor.label_actor = this._clockDisplay;
|
this.label_actor = this._clockDisplay;
|
||||||
this.actor.add_actor(box);
|
this.add_actor(box);
|
||||||
this.actor.add_style_class_name ('clock-display');
|
this.add_style_class_name ('clock-display');
|
||||||
|
|
||||||
|
|
||||||
let layout = new FreezableBinLayout();
|
let layout = new FreezableBinLayout();
|
||||||
let bin = new St.Widget({ layout_manager: layout });
|
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}`);
|
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 };
|
line_wrap: true };
|
||||||
Object.assign(this._subtitle.clutter_text, textProps);
|
this._subtitle.clutter_text.set(textProps);
|
||||||
Object.assign(this._body.clutter_text, textProps);
|
this._body.clutter_text.set(textProps);
|
||||||
|
|
||||||
if (!params.hasOwnProperty('style_class'))
|
if (!params.hasOwnProperty('style_class'))
|
||||||
params.style_class = 'message-dialog-main-layout';
|
params.style_class = 'message-dialog-main-layout';
|
||||||
@ -214,7 +214,10 @@ var MessageDialogContent = GObject.registerClass({
|
|||||||
}
|
}
|
||||||
|
|
||||||
set icon(icon) {
|
set icon(icon) {
|
||||||
Object.assign(this._icon, { gicon: icon, visible: icon != null });
|
this._icon.set({
|
||||||
|
gicon: icon,
|
||||||
|
visible: icon != null
|
||||||
|
});
|
||||||
this.notify('icon');
|
this.notify('icon');
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -231,7 +234,10 @@ var MessageDialogContent = GObject.registerClass({
|
|||||||
}
|
}
|
||||||
|
|
||||||
_setLabel(label, prop, value) {
|
_setLabel(label, prop, value) {
|
||||||
Object.assign(label, { text: value || '', visible: value != null });
|
label.set({
|
||||||
|
text: value || '',
|
||||||
|
visible: value != null
|
||||||
|
});
|
||||||
this.notify(prop);
|
this.notify(prop);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
12
js/ui/dnd.js
@ -434,14 +434,13 @@ var _Draggable = class _Draggable {
|
|||||||
scale_y: scale * origScale,
|
scale_y: scale * origScale,
|
||||||
time: SCALE_ANIMATION_TIME,
|
time: SCALE_ANIMATION_TIME,
|
||||||
transition: 'easeOutQuad',
|
transition: 'easeOutQuad',
|
||||||
onUpdate() {
|
onUpdate: () => {
|
||||||
let currentScale = this._dragActor.scale_x / origScale;
|
let currentScale = this._dragActor.scale_x / origScale;
|
||||||
this._dragOffsetX = currentScale * origDragOffsetX;
|
this._dragOffsetX = currentScale * origDragOffsetX;
|
||||||
this._dragOffsetY = currentScale * origDragOffsetY;
|
this._dragOffsetY = currentScale * origDragOffsetY;
|
||||||
this._dragActor.set_position(this._dragX + this._dragOffsetX,
|
this._dragActor.set_position(this._dragX + this._dragOffsetX,
|
||||||
this._dragY + this._dragOffsetY);
|
this._dragY + this._dragOffsetY);
|
||||||
},
|
} });
|
||||||
onUpdateScope: this });
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -588,9 +587,10 @@ var _Draggable = class _Draggable {
|
|||||||
if (this._restoreOnSuccess) {
|
if (this._restoreOnSuccess) {
|
||||||
this._restoreDragActor(event.get_time());
|
this._restoreDragActor(event.get_time());
|
||||||
return true;
|
return true;
|
||||||
} else
|
} else {
|
||||||
this._dragActor.destroy();
|
this._dragActor.destroy();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
this._dragState = DragState.INIT;
|
this._dragState = DragState.INIT;
|
||||||
global.display.set_cursor(Meta.Cursor.DEFAULT);
|
global.display.set_cursor(Meta.Cursor.DEFAULT);
|
||||||
@ -689,12 +689,12 @@ var _Draggable = class _Draggable {
|
|||||||
params['onCompleteParams'] = [this._dragActor, eventTime];
|
params['onCompleteParams'] = [this._dragActor, eventTime];
|
||||||
|
|
||||||
// start the animation
|
// start the animation
|
||||||
Tweener.addTween(this._dragActor, params)
|
Tweener.addTween(this._dragActor, params);
|
||||||
}
|
}
|
||||||
|
|
||||||
_finishAnimation() {
|
_finishAnimation() {
|
||||||
if (!this._animationInProgress)
|
if (!this._animationInProgress)
|
||||||
return
|
return;
|
||||||
|
|
||||||
this._animationInProgress = false;
|
this._animationInProgress = false;
|
||||||
if (!this._buttonDown)
|
if (!this._buttonDown)
|
||||||
|
@ -16,7 +16,7 @@ var EdgeDragAction = GObject.registerClass({
|
|||||||
this._allowedModes = allowedModes;
|
this._allowedModes = allowedModes;
|
||||||
this.set_n_touch_points(1);
|
this.set_n_touch_points(1);
|
||||||
|
|
||||||
global.display.connect('grab-op-begin', () => { this.cancel(); });
|
global.display.connect('grab-op-begin', () => this.cancel());
|
||||||
}
|
}
|
||||||
|
|
||||||
_getMonitorRect(x, y) {
|
_getMonitorRect(x, y) {
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
const Mainloop = imports.mainloop;
|
const Mainloop = imports.mainloop;
|
||||||
|
|
||||||
const { AccountsService, Clutter, Gio,
|
const { AccountsService, Clutter, Gio,
|
||||||
GLib, Pango, Polkit, Shell, St } = imports.gi;
|
GLib, GObject, Pango, Polkit, Shell, St } = imports.gi;
|
||||||
|
|
||||||
const CheckBox = imports.ui.checkBox;
|
const CheckBox = imports.ui.checkBox;
|
||||||
const GnomeSession = imports.misc.gnomeSession;
|
const GnomeSession = imports.misc.gnomeSession;
|
||||||
@ -29,13 +29,9 @@ const UserWidget = imports.ui.userWidget;
|
|||||||
|
|
||||||
const { loadInterfaceXML } = imports.misc.fileUtils;
|
const { loadInterfaceXML } = imports.misc.fileUtils;
|
||||||
|
|
||||||
let _endSessionDialog = null;
|
|
||||||
|
|
||||||
const _ITEM_ICON_SIZE = 48;
|
const _ITEM_ICON_SIZE = 48;
|
||||||
const _DIALOG_ICON_SIZE = 48;
|
const _DIALOG_ICON_SIZE = 48;
|
||||||
|
|
||||||
var GSM_SESSION_MANAGER_LOGOUT_FORCE = 2;
|
|
||||||
|
|
||||||
const EndSessionDialogIface = loadInterfaceXML('org.gnome.SessionManager.EndSessionDialog');
|
const EndSessionDialogIface = loadInterfaceXML('org.gnome.SessionManager.EndSessionDialog');
|
||||||
|
|
||||||
const logoutDialogContent = {
|
const logoutDialogContent = {
|
||||||
@ -223,25 +219,25 @@ function init() {
|
|||||||
// This always returns the same singleton object
|
// This always returns the same singleton object
|
||||||
// By instantiating it initially, we register the
|
// By instantiating it initially, we register the
|
||||||
// bus object, etc.
|
// bus object, etc.
|
||||||
_endSessionDialog = new EndSessionDialog();
|
(new EndSessionDialog());
|
||||||
}
|
}
|
||||||
|
|
||||||
var EndSessionDialog = class EndSessionDialog extends ModalDialog.ModalDialog {
|
var EndSessionDialog = GObject.registerClass(
|
||||||
constructor() {
|
class EndSessionDialog extends ModalDialog.ModalDialog {
|
||||||
super({ styleClass: 'end-session-dialog',
|
_init() {
|
||||||
|
super._init({ styleClass: 'end-session-dialog',
|
||||||
destroyOnClose: false });
|
destroyOnClose: false });
|
||||||
|
|
||||||
this._loginManager = LoginManager.getLoginManager();
|
this._loginManager = LoginManager.getLoginManager();
|
||||||
this._userManager = AccountsService.UserManager.get_default();
|
this._userManager = AccountsService.UserManager.get_default();
|
||||||
this._user = this._userManager.get_user(GLib.get_user_name());
|
this._user = this._userManager.get_user(GLib.get_user_name());
|
||||||
|
this._updatesPermission = null;
|
||||||
|
|
||||||
this._pkOfflineProxy = new PkOfflineProxy(Gio.DBus.system,
|
this._pkOfflineProxy = new PkOfflineProxy(Gio.DBus.system,
|
||||||
'org.freedesktop.PackageKit',
|
'org.freedesktop.PackageKit',
|
||||||
'/org/freedesktop/PackageKit',
|
'/org/freedesktop/PackageKit',
|
||||||
(proxy, error) => {
|
this._onPkOfflineProxyCreated.bind(this));
|
||||||
if (error)
|
|
||||||
log(error.message);
|
|
||||||
});
|
|
||||||
this._powerProxy = new UPowerProxy(Gio.DBus.system,
|
this._powerProxy = new UPowerProxy(Gio.DBus.system,
|
||||||
'org.freedesktop.UPower',
|
'org.freedesktop.UPower',
|
||||||
'/org/freedesktop/UPower',
|
'/org/freedesktop/UPower',
|
||||||
@ -336,14 +332,31 @@ var EndSessionDialog = class EndSessionDialog extends ModalDialog.ModalDialog {
|
|||||||
this._inhibitorSection.add_actor(this._sessionHeader);
|
this._inhibitorSection.add_actor(this._sessionHeader);
|
||||||
this._inhibitorSection.add_actor(this._sessionList);
|
this._inhibitorSection.add_actor(this._sessionList);
|
||||||
|
|
||||||
|
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(EndSessionDialogIface, this);
|
||||||
|
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/SessionManager/EndSessionDialog');
|
||||||
|
}
|
||||||
|
|
||||||
|
_onPkOfflineProxyCreated(proxy, error) {
|
||||||
|
if (error) {
|
||||||
|
log(error.message);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Creating a D-Bus proxy won't propagate SERVICE_UNKNOWN or NAME_HAS_NO_OWNER
|
||||||
|
// errors if PackageKit is not available, but the GIO implementation will make
|
||||||
|
// sure in that case that the proxy's g-name-owner is set to null, so check that.
|
||||||
|
if (this._pkOfflineProxy.g_name_owner === null) {
|
||||||
|
this._pkOfflineProxy = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// It only makes sense to check for this permission if PackageKit is available.
|
||||||
try {
|
try {
|
||||||
this._updatesPermission = Polkit.Permission.new_sync("org.freedesktop.packagekit.trigger-offline-update", null, null);
|
this._updatesPermission = Polkit.Permission.new_sync(
|
||||||
|
"org.freedesktop.packagekit.trigger-offline-update", null, null);
|
||||||
} catch(e) {
|
} catch(e) {
|
||||||
log('No permission to trigger offline updates: %s'.format(e.toString()));
|
log('No permission to trigger offline updates: %s'.format(e.toString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(EndSessionDialogIface, this);
|
|
||||||
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/SessionManager/EndSessionDialog');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_onDestroy() {
|
_onDestroy() {
|
||||||
@ -390,7 +403,8 @@ var EndSessionDialog = class EndSessionDialog extends ModalDialog.ModalDialog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Use a different description when we are installing a system upgrade
|
// Use a different description when we are installing a system upgrade
|
||||||
if (dialogContent.upgradeDescription) {
|
// if the PackageKit proxy is available (i.e. PackageKit is available).
|
||||||
|
if (this._pkOfflineProxy && dialogContent.upgradeDescription) {
|
||||||
let name = this._pkOfflineProxy.PreparedUpgrade['name'].deep_unpack();
|
let name = this._pkOfflineProxy.PreparedUpgrade['name'].deep_unpack();
|
||||||
let version = this._pkOfflineProxy.PreparedUpgrade['version'].deep_unpack();
|
let version = this._pkOfflineProxy.PreparedUpgrade['version'].deep_unpack();
|
||||||
|
|
||||||
@ -499,6 +513,12 @@ var EndSessionDialog = class EndSessionDialog extends ModalDialog.ModalDialog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_triggerOfflineUpdateReboot(callback) {
|
_triggerOfflineUpdateReboot(callback) {
|
||||||
|
// Handle this gracefully if PackageKit is not available.
|
||||||
|
if (!this._pkOfflineProxy) {
|
||||||
|
callback();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
this._pkOfflineProxy.TriggerRemote('reboot', (result, error) => {
|
this._pkOfflineProxy.TriggerRemote('reboot', (result, error) => {
|
||||||
if (error)
|
if (error)
|
||||||
log(error.message);
|
log(error.message);
|
||||||
@ -508,6 +528,12 @@ var EndSessionDialog = class EndSessionDialog extends ModalDialog.ModalDialog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_triggerOfflineUpdateShutdown(callback) {
|
_triggerOfflineUpdateShutdown(callback) {
|
||||||
|
// Handle this gracefully if PackageKit is not available.
|
||||||
|
if (!this._pkOfflineProxy) {
|
||||||
|
callback();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
this._pkOfflineProxy.TriggerRemote('power-off', (result, error) => {
|
this._pkOfflineProxy.TriggerRemote('power-off', (result, error) => {
|
||||||
if (error)
|
if (error)
|
||||||
log(error.message);
|
log(error.message);
|
||||||
@ -517,6 +543,12 @@ var EndSessionDialog = class EndSessionDialog extends ModalDialog.ModalDialog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_triggerOfflineUpdateCancel(callback) {
|
_triggerOfflineUpdateCancel(callback) {
|
||||||
|
// Handle this gracefully if PackageKit is not available.
|
||||||
|
if (!this._pkOfflineProxy) {
|
||||||
|
callback();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
this._pkOfflineProxy.CancelRemote((result, error) => {
|
this._pkOfflineProxy.CancelRemote((result, error) => {
|
||||||
if (error)
|
if (error)
|
||||||
log(error.message);
|
log(error.message);
|
||||||
@ -584,7 +616,7 @@ var EndSessionDialog = class EndSessionDialog extends ModalDialog.ModalDialog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_onInhibitorLoaded(inhibitor) {
|
_onInhibitorLoaded(inhibitor) {
|
||||||
if (this._applications.indexOf(inhibitor) < 0) {
|
if (!this._applications.includes(inhibitor)) {
|
||||||
// Stale inhibitor
|
// Stale inhibitor
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -679,7 +711,8 @@ var EndSessionDialog = class EndSessionDialog extends ModalDialog.ModalDialog {
|
|||||||
this._totalSecondsToStayOpen = totalSecondsToStayOpen;
|
this._totalSecondsToStayOpen = totalSecondsToStayOpen;
|
||||||
this._type = type;
|
this._type = type;
|
||||||
|
|
||||||
if (this._type == DialogType.RESTART) {
|
// Only consider updates and upgrades if PackageKit is available.
|
||||||
|
if (this._pkOfflineProxy && this._type == DialogType.RESTART) {
|
||||||
if (this._pkOfflineProxy.UpdateTriggered)
|
if (this._pkOfflineProxy.UpdateTriggered)
|
||||||
this._type = DialogType.UPDATE_RESTART;
|
this._type = DialogType.UPDATE_RESTART;
|
||||||
else if (this._pkOfflineProxy.UpgradeTriggered)
|
else if (this._pkOfflineProxy.UpgradeTriggered)
|
||||||
@ -711,8 +744,9 @@ var EndSessionDialog = class EndSessionDialog extends ModalDialog.ModalDialog {
|
|||||||
if (dialogContent.showOtherSessions)
|
if (dialogContent.showOtherSessions)
|
||||||
this._loadSessions();
|
this._loadSessions();
|
||||||
|
|
||||||
let updateTriggered = this._pkOfflineProxy.UpdateTriggered;
|
// Only consider updates and upgrades if PackageKit is available.
|
||||||
let updatePrepared = this._pkOfflineProxy.UpdatePrepared;
|
let updateTriggered = this._pkOfflineProxy ? this._pkOfflineProxy.UpdateTriggered : false;
|
||||||
|
let updatePrepared = this._pkOfflineProxy ? this._pkOfflineProxy.UpdatePrepared : false;
|
||||||
let updatesAllowed = this._updatesPermission && this._updatesPermission.allowed;
|
let updatesAllowed = this._updatesPermission && this._updatesPermission.allowed;
|
||||||
|
|
||||||
_setCheckBoxLabel(this._checkBox, dialogContent.checkBoxText || '');
|
_setCheckBoxLabel(this._checkBox, dialogContent.checkBoxText || '');
|
||||||
@ -747,4 +781,4 @@ var EndSessionDialog = class EndSessionDialog extends ModalDialog.ModalDialog {
|
|||||||
Close(parameters, invocation) {
|
Close(parameters, invocation) {
|
||||||
this.close();
|
this.close();
|
||||||
}
|
}
|
||||||
};
|
});
|
||||||
|
@ -57,8 +57,8 @@ function _patchLayoutClass(layoutClass, styleProps) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function _loggingFunc() {
|
function _loggingFunc(...args) {
|
||||||
let fields = {'MESSAGE': [].join.call(arguments, ', ')};
|
let fields = { 'MESSAGE': args.join(', ') };
|
||||||
let domain = "GNOME Shell";
|
let domain = "GNOME Shell";
|
||||||
|
|
||||||
// If the caller is an extension, add it as metadata
|
// If the caller is an extension, add it as metadata
|
||||||
@ -96,13 +96,22 @@ function init() {
|
|||||||
Clutter.Actor.prototype.toString = function() {
|
Clutter.Actor.prototype.toString = function() {
|
||||||
return St.describe_actor(this);
|
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;
|
let origToString = Object.prototype.toString;
|
||||||
Object.prototype.toString = function() {
|
Object.prototype.toString = function() {
|
||||||
let base = origToString.call(this);
|
let base = origToString.call(this);
|
||||||
try {
|
try {
|
||||||
if ('actor' in this && this.actor instanceof Clutter.Actor)
|
if ('actor' in this && this.actor instanceof Clutter.Actor)
|
||||||
return base.replace(/\]$/, ' delegate for ' + this.actor.toString().substring(1));
|
return base.replace(/\]$/, ` delegate for ${this.actor.toString().substring(1)}`);
|
||||||
else
|
else
|
||||||
return base;
|
return base;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
@ -1,19 +1,18 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
|
||||||
const { Clutter, Gio, GLib, Soup, St } = imports.gi;
|
const { Clutter, Gio, GLib, GObject, Soup } = imports.gi;
|
||||||
|
|
||||||
const Config = imports.misc.config;
|
const Config = imports.misc.config;
|
||||||
|
const Dialog = imports.ui.dialog;
|
||||||
const ExtensionUtils = imports.misc.extensionUtils;
|
const ExtensionUtils = imports.misc.extensionUtils;
|
||||||
const ExtensionSystem = imports.ui.extensionSystem;
|
const ExtensionSystem = imports.ui.extensionSystem;
|
||||||
const FileUtils = imports.misc.fileUtils;
|
const FileUtils = imports.misc.fileUtils;
|
||||||
const ModalDialog = imports.ui.modalDialog;
|
const ModalDialog = imports.ui.modalDialog;
|
||||||
|
|
||||||
const _signals = ExtensionSystem._signals;
|
|
||||||
|
|
||||||
var REPOSITORY_URL_BASE = 'https://extensions.gnome.org';
|
var REPOSITORY_URL_BASE = 'https://extensions.gnome.org';
|
||||||
var REPOSITORY_URL_DOWNLOAD = REPOSITORY_URL_BASE + '/download-extension/%s.shell-extension.zip';
|
var REPOSITORY_URL_DOWNLOAD = `${REPOSITORY_URL_BASE}/download-extension/%s.shell-extension.zip`;
|
||||||
var REPOSITORY_URL_INFO = REPOSITORY_URL_BASE + '/extension-info/';
|
var REPOSITORY_URL_INFO = `${REPOSITORY_URL_BASE}/extension-info/`;
|
||||||
var REPOSITORY_URL_UPDATE = REPOSITORY_URL_BASE + '/update-info/';
|
var REPOSITORY_URL_UPDATE = `${REPOSITORY_URL_BASE}/update-info/`;
|
||||||
|
|
||||||
let _httpSession;
|
let _httpSession;
|
||||||
|
|
||||||
@ -25,7 +24,7 @@ function installExtension(uuid, invocation) {
|
|||||||
|
|
||||||
_httpSession.queue_message(message, (session, message) => {
|
_httpSession.queue_message(message, (session, message) => {
|
||||||
if (message.status_code != Soup.KnownStatusCode.OK) {
|
if (message.status_code != Soup.KnownStatusCode.OK) {
|
||||||
ExtensionSystem.logExtensionError(uuid, 'downloading info: ' + message.status_code);
|
ExtensionSystem.logExtensionError(uuid, `downloading info: ${message.status_code}`);
|
||||||
invocation.return_dbus_error('org.gnome.Shell.DownloadInfoError', message.status_code.toString());
|
invocation.return_dbus_error('org.gnome.Shell.DownloadInfoError', message.status_code.toString());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -34,7 +33,7 @@ function installExtension(uuid, invocation) {
|
|||||||
try {
|
try {
|
||||||
info = JSON.parse(message.response_body.data);
|
info = JSON.parse(message.response_body.data);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
ExtensionSystem.logExtensionError(uuid, 'parsing info: ' + e);
|
ExtensionSystem.logExtensionError(uuid, `parsing info: ${e}`);
|
||||||
invocation.return_dbus_error('org.gnome.Shell.ParseInfoError', e.toString());
|
invocation.return_dbus_error('org.gnome.Shell.ParseInfoError', e.toString());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -176,10 +175,10 @@ function checkForUpdates() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
var InstallExtensionDialog =
|
var InstallExtensionDialog = GObject.registerClass(
|
||||||
class InstallExtensionDialog extends ModalDialog.ModalDialog {
|
class InstallExtensionDialog extends ModalDialog.ModalDialog {
|
||||||
constructor(uuid, info, invocation) {
|
_init(uuid, info, invocation) {
|
||||||
super({ styleClass: 'extension-dialog' });
|
super._init({ styleClass: 'extension-dialog' });
|
||||||
|
|
||||||
this._uuid = uuid;
|
this._uuid = uuid;
|
||||||
this._info = info;
|
this._info = info;
|
||||||
@ -194,19 +193,14 @@ class InstallExtensionDialog extends ModalDialog.ModalDialog {
|
|||||||
default: true
|
default: true
|
||||||
}]);
|
}]);
|
||||||
|
|
||||||
let message = _("Download and install “%s” from extensions.gnome.org?").format(info.name);
|
let content = new Dialog.MessageDialogContent({
|
||||||
|
title: _("Download and install “%s” from extensions.gnome.org?").format(info.name),
|
||||||
|
icon: new Gio.FileIcon({
|
||||||
|
file: Gio.File.new_for_uri(`${REPOSITORY_URL_BASE}${info.icon}`)
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
let box = new St.BoxLayout({ style_class: 'message-dialog-main-layout',
|
this.contentLayout.add(content);
|
||||||
vertical: false });
|
|
||||||
this.contentLayout.add(box);
|
|
||||||
|
|
||||||
let gicon = new Gio.FileIcon({ file: Gio.File.new_for_uri(REPOSITORY_URL_BASE + info.icon) })
|
|
||||||
let icon = new St.Icon({ gicon: gicon });
|
|
||||||
box.add(icon);
|
|
||||||
|
|
||||||
let label = new St.Label({ style_class: 'message-dialog-title headline',
|
|
||||||
text: message });
|
|
||||||
box.add(label);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_onCancelButtonPressed(button, event) {
|
_onCancelButtonPressed(button, event) {
|
||||||
@ -226,13 +220,13 @@ class InstallExtensionDialog extends ModalDialog.ModalDialog {
|
|||||||
function errback(code, message) {
|
function errback(code, message) {
|
||||||
let msg = message ? message.toString() : '';
|
let msg = message ? message.toString() : '';
|
||||||
log('Error while installing %s: %s (%s)'.format(uuid, code, msg));
|
log('Error while installing %s: %s (%s)'.format(uuid, code, msg));
|
||||||
invocation.return_dbus_error('org.gnome.Shell.' + code, msg);
|
invocation.return_dbus_error(`org.gnome.Shell.${code}`, msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
function callback() {
|
function callback() {
|
||||||
// Add extension to 'enabled-extensions' for the user, always...
|
// Add extension to 'enabled-extensions' for the user, always...
|
||||||
let enabledExtensions = global.settings.get_strv(ExtensionSystem.ENABLED_EXTENSIONS_KEY);
|
let enabledExtensions = global.settings.get_strv(ExtensionSystem.ENABLED_EXTENSIONS_KEY);
|
||||||
if (enabledExtensions.indexOf(uuid) == -1) {
|
if (!enabledExtensions.includes(uuid)) {
|
||||||
enabledExtensions.push(uuid);
|
enabledExtensions.push(uuid);
|
||||||
global.settings.set_strv(ExtensionSystem.ENABLED_EXTENSIONS_KEY, enabledExtensions);
|
global.settings.set_strv(ExtensionSystem.ENABLED_EXTENSIONS_KEY, enabledExtensions);
|
||||||
}
|
}
|
||||||
@ -255,7 +249,7 @@ class InstallExtensionDialog extends ModalDialog.ModalDialog {
|
|||||||
|
|
||||||
this.close();
|
this.close();
|
||||||
}
|
}
|
||||||
};
|
});
|
||||||
|
|
||||||
function init() {
|
function init() {
|
||||||
_httpSession = new Soup.SessionAsync({ ssl_use_system_ca_file: true });
|
_httpSession = new Soup.SessionAsync({ ssl_use_system_ca_file: true });
|
||||||
|
@ -111,7 +111,7 @@ function enableExtension(uuid) {
|
|||||||
|
|
||||||
extensionOrder.push(uuid);
|
extensionOrder.push(uuid);
|
||||||
|
|
||||||
let stylesheetNames = [global.session_mode + '.css', 'stylesheet.css'];
|
let stylesheetNames = [`${global.session_mode}.css`, 'stylesheet.css'];
|
||||||
let theme = St.ThemeContext.get_for_stage(global.stage).get_theme();
|
let theme = St.ThemeContext.get_for_stage(global.stage).get_theme();
|
||||||
for (let i = 0; i < stylesheetNames.length; i++) {
|
for (let i = 0; i < stylesheetNames.length; i++) {
|
||||||
try {
|
try {
|
||||||
@ -147,7 +147,7 @@ function logExtensionError(uuid, error) {
|
|||||||
if (!extension)
|
if (!extension)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
let message = '' + error;
|
let message = `${error}`;
|
||||||
|
|
||||||
extension.state = ExtensionState.ERROR;
|
extension.state = ExtensionState.ERROR;
|
||||||
if (!extension.errors)
|
if (!extension.errors)
|
||||||
@ -169,7 +169,7 @@ function loadExtension(extension) {
|
|||||||
if (checkVersion && ExtensionUtils.isOutOfDate(extension)) {
|
if (checkVersion && ExtensionUtils.isOutOfDate(extension)) {
|
||||||
extension.state = ExtensionState.OUT_OF_DATE;
|
extension.state = ExtensionState.OUT_OF_DATE;
|
||||||
} else {
|
} else {
|
||||||
let enabled = enabledExtensions.indexOf(extension.uuid) != -1;
|
let enabled = enabledExtensions.includes(extension.uuid);
|
||||||
if (enabled) {
|
if (enabled) {
|
||||||
if (!initExtension(extension.uuid))
|
if (!initExtension(extension.uuid))
|
||||||
return;
|
return;
|
||||||
@ -313,9 +313,9 @@ function _onVersionValidationChanged() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function _loadExtensions() {
|
function _loadExtensions() {
|
||||||
global.settings.connect('changed::' + ENABLED_EXTENSIONS_KEY, onEnabledExtensionsChanged);
|
global.settings.connect(`changed::${ENABLED_EXTENSIONS_KEY}`, onEnabledExtensionsChanged);
|
||||||
global.settings.connect('changed::' + DISABLE_USER_EXTENSIONS_KEY, onEnabledExtensionsChanged);
|
global.settings.connect(`changed::${DISABLE_USER_EXTENSIONS_KEY}`, onEnabledExtensionsChanged);
|
||||||
global.settings.connect('changed::' + EXTENSION_DISABLE_VERSION_CHECK_KEY, _onVersionValidationChanged);
|
global.settings.connect(`changed::${EXTENSION_DISABLE_VERSION_CHECK_KEY}`, _onVersionValidationChanged);
|
||||||
|
|
||||||
enabledExtensions = getEnabledExtensions();
|
enabledExtensions = getEnabledExtensions();
|
||||||
|
|
||||||
|
@ -56,8 +56,8 @@ var FocusCaretTracker = class FocusCaretTracker {
|
|||||||
if (!this._initAtspi() || this._focusListenerRegistered)
|
if (!this._initAtspi() || this._focusListenerRegistered)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
this._atspiListener.register(STATECHANGED + ':focused');
|
this._atspiListener.register(`${STATECHANGED}:focused`);
|
||||||
this._atspiListener.register(STATECHANGED + ':selected');
|
this._atspiListener.register(`${STATECHANGED}:selected`);
|
||||||
this._focusListenerRegistered = true;
|
this._focusListenerRegistered = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -73,8 +73,8 @@ var FocusCaretTracker = class FocusCaretTracker {
|
|||||||
if (!this._focusListenerRegistered)
|
if (!this._focusListenerRegistered)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
this._atspiListener.deregister(STATECHANGED + ':focused');
|
this._atspiListener.deregister(`${STATECHANGED}:focused`);
|
||||||
this._atspiListener.deregister(STATECHANGED + ':selected');
|
this._atspiListener.deregister(`${STATECHANGED}:selected`);
|
||||||
this._focusListenerRegistered = false;
|
this._focusListenerRegistered = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -43,6 +43,9 @@ function _popGrabHelper(grabHelper) {
|
|||||||
// call grab().
|
// call grab().
|
||||||
var GrabHelper = class GrabHelper {
|
var GrabHelper = class GrabHelper {
|
||||||
constructor(owner, params) {
|
constructor(owner, params) {
|
||||||
|
if (!(owner instanceof Clutter.Actor))
|
||||||
|
throw new Error('GrabHelper owner must be a Clutter.Actor');
|
||||||
|
|
||||||
this._owner = owner;
|
this._owner = owner;
|
||||||
this._modalParams = params;
|
this._modalParams = params;
|
||||||
|
|
||||||
@ -84,7 +87,7 @@ var GrabHelper = class GrabHelper {
|
|||||||
_isWithinGrabbedActor(actor) {
|
_isWithinGrabbedActor(actor) {
|
||||||
let currentActor = this.currentGrab.actor;
|
let currentActor = this.currentGrab.actor;
|
||||||
while (actor) {
|
while (actor) {
|
||||||
if (this._actors.indexOf(actor) != -1)
|
if (this._actors.includes(actor))
|
||||||
return true;
|
return true;
|
||||||
if (actor == currentActor)
|
if (actor == currentActor)
|
||||||
return true;
|
return true;
|
||||||
|
@ -44,7 +44,7 @@ var CandidateArea = class CandidateArea {
|
|||||||
case Clutter.ScrollDirection.DOWN:
|
case Clutter.ScrollDirection.DOWN:
|
||||||
this.emit('cursor-down');
|
this.emit('cursor-down');
|
||||||
break;
|
break;
|
||||||
};
|
}
|
||||||
return Clutter.EVENT_PROPAGATE;
|
return Clutter.EVENT_PROPAGATE;
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -272,7 +272,7 @@ var CandidatePopup = class CandidatePopup {
|
|||||||
|
|
||||||
_setDummyCursorGeometry(x, y, w, h) {
|
_setDummyCursorGeometry(x, y, w, h) {
|
||||||
Main.layoutManager.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);
|
this._boxPointer.setPosition(Main.layoutManager.dummyCursor, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -285,7 +285,7 @@ var CandidatePopup = class CandidatePopup {
|
|||||||
if (isVisible) {
|
if (isVisible) {
|
||||||
this._boxPointer.setPosition(Main.layoutManager.dummyCursor, 0);
|
this._boxPointer.setPosition(Main.layoutManager.dummyCursor, 0);
|
||||||
this._boxPointer.open(BoxPointer.PopupAnimation.NONE);
|
this._boxPointer.open(BoxPointer.PopupAnimation.NONE);
|
||||||
this._boxPointer.actor.raise_top();
|
this._boxPointer.raise_top();
|
||||||
} else {
|
} else {
|
||||||
this._boxPointer.close(BoxPointer.PopupAnimation.NONE);
|
this._boxPointer.close(BoxPointer.PopupAnimation.NONE);
|
||||||
}
|
}
|
||||||
|
@ -43,8 +43,6 @@ class BaseIcon extends St.Bin {
|
|||||||
x_fill: true,
|
x_fill: true,
|
||||||
y_fill: true });
|
y_fill: true });
|
||||||
|
|
||||||
this.actor = this;
|
|
||||||
|
|
||||||
this.connect('destroy', this._onDestroy.bind(this));
|
this.connect('destroy', this._onDestroy.bind(this));
|
||||||
|
|
||||||
this._box = new St.BoxLayout({ vertical: true });
|
this._box = new St.BoxLayout({ vertical: true });
|
||||||
@ -81,7 +79,7 @@ class BaseIcon extends St.Bin {
|
|||||||
// This can be overridden by a subclass, or by the createIcon
|
// This can be overridden by a subclass, or by the createIcon
|
||||||
// parameter to _init()
|
// parameter to _init()
|
||||||
createIcon(size) {
|
createIcon(size) {
|
||||||
throw new Error('no implementation of createIcon in ' + this);
|
throw new GObject.NotImplementedError(`createIcon in ${this.constructor.name}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
setIconSize(size) {
|
setIconSize(size) {
|
||||||
@ -143,7 +141,7 @@ class BaseIcon extends St.Bin {
|
|||||||
|
|
||||||
function clamp(value, min, max) {
|
function clamp(value, min, max) {
|
||||||
return Math.max(Math.min(value, max), min);
|
return Math.max(Math.min(value, max), min);
|
||||||
};
|
}
|
||||||
|
|
||||||
function zoomOutActor(actor) {
|
function zoomOutActor(actor) {
|
||||||
let actorClone = new Clutter.Clone({ source: actor,
|
let actorClone = new Clutter.Clone({ source: actor,
|
||||||
@ -188,8 +186,6 @@ var IconGrid = GObject.registerClass({
|
|||||||
super._init({ style_class: 'icon-grid',
|
super._init({ style_class: 'icon-grid',
|
||||||
y_align: Clutter.ActorAlign.START });
|
y_align: Clutter.ActorAlign.START });
|
||||||
|
|
||||||
this.actor = this;
|
|
||||||
|
|
||||||
params = Params.parse(params, { rowLimit: null,
|
params = Params.parse(params, { rowLimit: null,
|
||||||
columnLimit: null,
|
columnLimit: null,
|
||||||
minRows: 1,
|
minRows: 1,
|
||||||
@ -280,7 +276,7 @@ var IconGrid = GObject.registerClass({
|
|||||||
if (forWidth < 0)
|
if (forWidth < 0)
|
||||||
nColumns = children.length;
|
nColumns = children.length;
|
||||||
else
|
else
|
||||||
[nColumns, ] = this._computeLayout(forWidth);
|
[nColumns] = this._computeLayout(forWidth);
|
||||||
|
|
||||||
let nRows;
|
let nRows;
|
||||||
if (nColumns > 0)
|
if (nColumns > 0)
|
||||||
@ -326,6 +322,7 @@ var IconGrid = GObject.registerClass({
|
|||||||
leftEmptySpace = availWidth - usedWidth;
|
leftEmptySpace = availWidth - usedWidth;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let animating = this._clonesAnimating.length > 0;
|
||||||
let x = box.x1 + leftEmptySpace + this.leftPadding;
|
let x = box.x1 + leftEmptySpace + this.leftPadding;
|
||||||
let y = box.y1 + this.topPadding;
|
let y = box.y1 + this.topPadding;
|
||||||
let columnIndex = 0;
|
let columnIndex = 0;
|
||||||
@ -335,10 +332,11 @@ var IconGrid = GObject.registerClass({
|
|||||||
|
|
||||||
if (this._rowLimit && rowIndex >= this._rowLimit ||
|
if (this._rowLimit && rowIndex >= this._rowLimit ||
|
||||||
this._fillParent && childBox.y2 > availHeight - this.bottomPadding) {
|
this._fillParent && childBox.y2 > availHeight - this.bottomPadding) {
|
||||||
children[i].hide();
|
children[i].opacity = 0;
|
||||||
} else {
|
} else {
|
||||||
|
if (!animating)
|
||||||
|
children[i].opacity = 255;
|
||||||
children[i].allocate(childBox, flags);
|
children[i].allocate(childBox, flags);
|
||||||
children[i].show();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
columnIndex++;
|
columnIndex++;
|
||||||
@ -382,12 +380,12 @@ var IconGrid = GObject.registerClass({
|
|||||||
child != null;
|
child != null;
|
||||||
child = child.get_next_sibling()) {
|
child = child.get_next_sibling()) {
|
||||||
|
|
||||||
if (!child.visible)
|
if (!child.visible || !child.opacity)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
let childVolume = child.get_transformed_paint_volume(this);
|
let childVolume = child.get_transformed_paint_volume(this);
|
||||||
if (!childVolume)
|
if (!childVolume)
|
||||||
return false
|
return false;
|
||||||
|
|
||||||
paintVolume.union(childVolume);
|
paintVolume.union(childVolume);
|
||||||
}
|
}
|
||||||
@ -404,7 +402,7 @@ var IconGrid = GObject.registerClass({
|
|||||||
}
|
}
|
||||||
|
|
||||||
_cancelAnimation() {
|
_cancelAnimation() {
|
||||||
this._clonesAnimating.forEach(clone => { clone.destroy(); });
|
this._clonesAnimating.forEach(clone => clone.destroy());
|
||||||
this._clonesAnimating = [];
|
this._clonesAnimating = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -420,7 +418,8 @@ var IconGrid = GObject.registerClass({
|
|||||||
|
|
||||||
animatePulse(animationDirection) {
|
animatePulse(animationDirection) {
|
||||||
if (animationDirection != AnimationDirection.IN)
|
if (animationDirection != AnimationDirection.IN)
|
||||||
throw new Error("Pulse animation only implements 'in' animation direction");
|
throw new GObject.NotImplementedError("Pulse animation only implements " +
|
||||||
|
"'in' animation direction");
|
||||||
|
|
||||||
this._cancelAnimation();
|
this._cancelAnimation();
|
||||||
|
|
||||||
@ -505,7 +504,7 @@ var IconGrid = GObject.registerClass({
|
|||||||
this._clonesAnimating.push(actorClone);
|
this._clonesAnimating.push(actorClone);
|
||||||
Main.uiGroup.add_actor(actorClone);
|
Main.uiGroup.add_actor(actorClone);
|
||||||
|
|
||||||
let [width, height,,] = this._getAllocatedChildSizeAndSpacing(actor);
|
let [width, height] = this._getAllocatedChildSizeAndSpacing(actor);
|
||||||
actorClone.set_size(width, height);
|
actorClone.set_size(width, height);
|
||||||
let scaleX = sourceScaledWidth / width;
|
let scaleX = sourceScaledWidth / width;
|
||||||
let scaleY = sourceScaledHeight / height;
|
let scaleY = sourceScaledHeight / height;
|
||||||
@ -744,7 +743,6 @@ var IconGrid = GObject.registerClass({
|
|||||||
this._fixedHItemSize = this._hItemSize;
|
this._fixedHItemSize = this._hItemSize;
|
||||||
this._fixedVItemSize = this._vItemSize;
|
this._fixedVItemSize = this._vItemSize;
|
||||||
this._updateSpacingForSize(availWidth, availHeight);
|
this._updateSpacingForSize(availWidth, availHeight);
|
||||||
let spacing = this._getSpacing();
|
|
||||||
|
|
||||||
if (this.columnsForWidth(availWidth) < this._minColumns || this.rowsForHeight(availHeight) < this._minRows) {
|
if (this.columnsForWidth(availWidth) < this._minColumns || this.rowsForHeight(availHeight) < this._minRows) {
|
||||||
let neededWidth = this.usedWidthForNColumns(this._minColumns) - availWidth;
|
let neededWidth = this.usedWidthForNColumns(this._minColumns) - availWidth;
|
||||||
@ -803,7 +801,6 @@ var PaginatedIconGrid = GObject.registerClass({
|
|||||||
}
|
}
|
||||||
let children = this._getVisibleChildren();
|
let children = this._getVisibleChildren();
|
||||||
let availWidth = box.x2 - box.x1;
|
let availWidth = box.x2 - box.x1;
|
||||||
let availHeight = box.y2 - box.y1;
|
|
||||||
let spacing = this._getSpacing();
|
let spacing = this._getSpacing();
|
||||||
let [nColumns, usedWidth] = this._computeLayout(availWidth);
|
let [nColumns, usedWidth] = this._computeLayout(availWidth);
|
||||||
|
|
||||||
@ -822,7 +819,6 @@ var PaginatedIconGrid = GObject.registerClass({
|
|||||||
let x = box.x1 + leftEmptySpace + this.leftPadding;
|
let x = box.x1 + leftEmptySpace + this.leftPadding;
|
||||||
let y = box.y1 + this.topPadding;
|
let y = box.y1 + this.topPadding;
|
||||||
let columnIndex = 0;
|
let columnIndex = 0;
|
||||||
let rowIndex = 0;
|
|
||||||
|
|
||||||
for (let i = 0; i < children.length; i++) {
|
for (let i = 0; i < children.length; i++) {
|
||||||
let childBox = this._calculateChildBox(children[i], x, y, box);
|
let childBox = this._calculateChildBox(children[i], x, y, box);
|
||||||
@ -832,19 +828,19 @@ var PaginatedIconGrid = GObject.registerClass({
|
|||||||
columnIndex++;
|
columnIndex++;
|
||||||
if (columnIndex == nColumns) {
|
if (columnIndex == nColumns) {
|
||||||
columnIndex = 0;
|
columnIndex = 0;
|
||||||
rowIndex++;
|
|
||||||
}
|
}
|
||||||
if (columnIndex == 0) {
|
if (columnIndex == 0) {
|
||||||
y += this._getVItemSize() + spacing;
|
y += this._getVItemSize() + spacing;
|
||||||
if ((i + 1) % this._childrenPerPage == 0)
|
if ((i + 1) % this._childrenPerPage == 0)
|
||||||
y += this._spaceBetweenPages - spacing + this.bottomPadding + this.topPadding;
|
y += this._spaceBetweenPages - spacing + this.bottomPadding + this.topPadding;
|
||||||
x = box.x1 + leftEmptySpace + this.leftPadding;
|
x = box.x1 + leftEmptySpace + this.leftPadding;
|
||||||
} else
|
} else {
|
||||||
x += this._getHItemSize() + spacing;
|
x += this._getHItemSize() + spacing;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Overriden from IconGrid
|
// Overridden from IconGrid
|
||||||
_getChildrenToAnimate() {
|
_getChildrenToAnimate() {
|
||||||
let children = this._getVisibleChildren();
|
let children = this._getVisibleChildren();
|
||||||
let firstIndex = this._childrenPerPage * this.currentPage;
|
let firstIndex = this._childrenPerPage * this.currentPage;
|
||||||
@ -864,7 +860,6 @@ var PaginatedIconGrid = GObject.registerClass({
|
|||||||
if (this._rowLimit)
|
if (this._rowLimit)
|
||||||
nRows = Math.min(nRows, this._rowLimit);
|
nRows = Math.min(nRows, this._rowLimit);
|
||||||
|
|
||||||
let spacing = this._getSpacing();
|
|
||||||
// We want to contain the grid inside the parent box with padding
|
// We want to contain the grid inside the parent box with padding
|
||||||
this._rowsPerPage = this.rowsForHeight(availHeightPerPage);
|
this._rowsPerPage = this.rowsForHeight(availHeightPerPage);
|
||||||
this._nPages = Math.ceil(nRows / this._rowsPerPage);
|
this._nPages = Math.ceil(nRows / this._rowsPerPage);
|
||||||
@ -893,7 +888,7 @@ var PaginatedIconGrid = GObject.registerClass({
|
|||||||
if (!this._nPages)
|
if (!this._nPages)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
let firstPageItem = pageNumber * this._childrenPerPage
|
let firstPageItem = pageNumber * this._childrenPerPage;
|
||||||
let childBox = this._getVisibleChildren()[firstPageItem].get_allocation_box();
|
let childBox = this._getVisibleChildren()[firstPageItem].get_allocation_box();
|
||||||
return childBox.y1 - this.topPadding;
|
return childBox.y1 - this.topPadding;
|
||||||
}
|
}
|
||||||
@ -972,7 +967,7 @@ var PaginatedIconGrid = GObject.registerClass({
|
|||||||
transition: 'easeInOutQuad'
|
transition: 'easeInOutQuad'
|
||||||
};
|
};
|
||||||
if (i == (children.length - 1))
|
if (i == (children.length - 1))
|
||||||
params.onComplete = () => { this.emit('space-opened'); };
|
params.onComplete = () => this.emit('space-opened');
|
||||||
Tweener.addTween(children[i], params);
|
Tweener.addTween(children[i], params);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -990,7 +985,7 @@ var PaginatedIconGrid = GObject.registerClass({
|
|||||||
{ translation_y: 0,
|
{ translation_y: 0,
|
||||||
time: EXTRA_SPACE_ANIMATION_TIME,
|
time: EXTRA_SPACE_ANIMATION_TIME,
|
||||||
transition: 'easeInOutQuad',
|
transition: 'easeInOutQuad',
|
||||||
onComplete: () => { this.emit('space-closed'); }
|
onComplete: () => this.emit('space-closed')
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -111,7 +111,7 @@ var InhibitShortcutsDialog = GObject.registerClass({
|
|||||||
}
|
}
|
||||||
|
|
||||||
vfunc_show() {
|
vfunc_show() {
|
||||||
if (this._app && APP_WHITELIST.indexOf(this._app.get_id()) != -1) {
|
if (this._app && APP_WHITELIST.includes(this._app.get_id())) {
|
||||||
this._emitResponse(DialogResponse.ALLOW);
|
this._emitResponse(DialogResponse.ALLOW);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -282,11 +282,11 @@ var Key = class Key {
|
|||||||
y_fill: true,
|
y_fill: true,
|
||||||
x_align: St.Align.START });
|
x_align: St.Align.START });
|
||||||
this._boxPointer.hide();
|
this._boxPointer.hide();
|
||||||
Main.layoutManager.addChrome(this._boxPointer.actor);
|
Main.layoutManager.addTopChrome(this._boxPointer);
|
||||||
this._boxPointer.setPosition(this.keyButton, 0.5);
|
this._boxPointer.setPosition(this.keyButton, 0.5);
|
||||||
|
|
||||||
// Adds style to existing keyboard style to avoid repetition
|
// 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._getExtendedKeys();
|
||||||
this.keyButton._extended_keys = this._extended_keyboard;
|
this.keyButton._extended_keys = this._extended_keyboard;
|
||||||
}
|
}
|
||||||
@ -297,7 +297,7 @@ var Key = class Key {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_press(key) {
|
_press(key) {
|
||||||
this.emit('activated')
|
this.emit('activated');
|
||||||
|
|
||||||
if (key != this.key || this._extended_keys.length == 0) {
|
if (key != this.key || this._extended_keys.length == 0) {
|
||||||
this.emit('pressed', this._getKeyval(key), key);
|
this.emit('pressed', this._getKeyval(key), key);
|
||||||
@ -405,9 +405,6 @@ var Key = class Key {
|
|||||||
return Clutter.EVENT_PROPAGATE;
|
return Clutter.EVENT_PROPAGATE;
|
||||||
});
|
});
|
||||||
button.connect('touch-event', (actor, event) => {
|
button.connect('touch-event', (actor, event) => {
|
||||||
let device = event.get_device();
|
|
||||||
let sequence = event.get_event_sequence();
|
|
||||||
|
|
||||||
// We only handle touch events here on wayland. On X11
|
// We only handle touch events here on wayland. On X11
|
||||||
// we do get emulated pointer events, which already works
|
// we do get emulated pointer events, which already works
|
||||||
// for single-touch cases. Besides, the X11 passive touch grab
|
// for single-touch cases. Besides, the X11 passive touch grab
|
||||||
@ -683,7 +680,7 @@ var EmojiPager = class EmojiPager {
|
|||||||
|
|
||||||
_onPanEnd() {
|
_onPanEnd() {
|
||||||
if (Math.abs(this._delta) < this.actor.width * PANEL_SWITCH_RELATIVE_DISTANCE) {
|
if (Math.abs(this._delta) < this.actor.width * PANEL_SWITCH_RELATIVE_DISTANCE) {
|
||||||
this._onPanCancel()
|
this._onPanCancel();
|
||||||
} else {
|
} else {
|
||||||
let value;
|
let value;
|
||||||
if (this._delta > 0)
|
if (this._delta > 0)
|
||||||
@ -865,7 +862,7 @@ var EmojiSelection = class EmojiSelection {
|
|||||||
x_expand: true,
|
x_expand: true,
|
||||||
y_expand: true,
|
y_expand: true,
|
||||||
vertical: true });
|
vertical: true });
|
||||||
this.actor.connect('notify::mapped', () => { this._emojiPager.setCurrentPage(0); });
|
this.actor.connect('notify::mapped', () => this._emojiPager.setCurrentPage(0));
|
||||||
|
|
||||||
this._emojiPager = new EmojiPager(this._sections, 11, 3);
|
this._emojiPager = new EmojiPager(this._sections, 11, 3);
|
||||||
this._emojiPager.connect('page-changed', (pager, section, page, nPages) => {
|
this._emojiPager.connect('page-changed', (pager, section, page, nPages) => {
|
||||||
@ -913,7 +910,6 @@ var EmojiSelection = class EmojiSelection {
|
|||||||
contents = imports.byteArray.toString(contents);
|
contents = imports.byteArray.toString(contents);
|
||||||
let emoji = JSON.parse(contents);
|
let emoji = JSON.parse(contents);
|
||||||
|
|
||||||
let pages = [];
|
|
||||||
let variants = [];
|
let variants = [];
|
||||||
let currentKey = 0;
|
let currentKey = 0;
|
||||||
let currentSection = null;
|
let currentSection = null;
|
||||||
@ -948,14 +944,14 @@ var EmojiSelection = class EmojiSelection {
|
|||||||
|
|
||||||
key = new Key('ABC', []);
|
key = new Key('ABC', []);
|
||||||
key.keyButton.add_style_class_name('default-key');
|
key.keyButton.add_style_class_name('default-key');
|
||||||
key.connect('released', () => { this.emit('toggle'); });
|
key.connect('released', () => this.emit('toggle'));
|
||||||
row.appendKey(key.actor, 1.5);
|
row.appendKey(key.actor, 1.5);
|
||||||
|
|
||||||
for (let i = 0; i < this._sections.length; i++) {
|
for (let i = 0; i < this._sections.length; i++) {
|
||||||
let section = this._sections[i];
|
let section = this._sections[i];
|
||||||
|
|
||||||
key = new Key(section.label, []);
|
key = new Key(section.label, []);
|
||||||
key.connect('released', () => { this._emojiPager.setCurrentSection(section, 0) });
|
key.connect('released', () => this._emojiPager.setCurrentSection(section, 0));
|
||||||
row.appendKey(key.actor);
|
row.appendKey(key.actor);
|
||||||
|
|
||||||
section.button = key;
|
section.button = key;
|
||||||
@ -1049,7 +1045,7 @@ var Keyboard = class Keyboard {
|
|||||||
this._a11yApplicationsSettings.connect('changed', this._syncEnabled.bind(this));
|
this._a11yApplicationsSettings.connect('changed', this._syncEnabled.bind(this));
|
||||||
this._lastDeviceId = null;
|
this._lastDeviceId = null;
|
||||||
this._suggestions = null;
|
this._suggestions = null;
|
||||||
this._emojiKeyVisible = true;
|
this._emojiKeyVisible = Meta.is_wayland_compositor();
|
||||||
|
|
||||||
this._focusTracker = new FocusTracker();
|
this._focusTracker = new FocusTracker();
|
||||||
this._focusTracker.connect('position-changed', this._onFocusPositionChanged.bind(this));
|
this._focusTracker.connect('position-changed', this._onFocusPositionChanged.bind(this));
|
||||||
@ -1074,7 +1070,7 @@ var Keyboard = class Keyboard {
|
|||||||
let manager = Clutter.DeviceManager.get_default();
|
let manager = Clutter.DeviceManager.get_default();
|
||||||
let device = manager.get_device(deviceId);
|
let device = manager.get_device(deviceId);
|
||||||
|
|
||||||
if (device.get_device_name().indexOf('XTEST') < 0) {
|
if (!device.get_device_name().includes('XTEST')) {
|
||||||
this._lastDeviceId = deviceId;
|
this._lastDeviceId = deviceId;
|
||||||
this._syncEnabled();
|
this._syncEnabled();
|
||||||
}
|
}
|
||||||
@ -1144,6 +1140,7 @@ var Keyboard = class Keyboard {
|
|||||||
this._keyboardController.disconnect(this._keypadVisibleId);
|
this._keyboardController.disconnect(this._keypadVisibleId);
|
||||||
if (this._focusNotifyId)
|
if (this._focusNotifyId)
|
||||||
global.stage.disconnect(this._focusNotifyId);
|
global.stage.disconnect(this._focusNotifyId);
|
||||||
|
this._clearShowIdle();
|
||||||
this._keyboard = null;
|
this._keyboard = null;
|
||||||
this.actor.destroy();
|
this.actor.destroy();
|
||||||
this.actor = null;
|
this.actor = null;
|
||||||
@ -1162,7 +1159,7 @@ var Keyboard = class Keyboard {
|
|||||||
this._keyboardController = new KeyboardController();
|
this._keyboardController = new KeyboardController();
|
||||||
|
|
||||||
this._groups = {};
|
this._groups = {};
|
||||||
this._current_page = null;
|
this._currentPage = null;
|
||||||
|
|
||||||
this._suggestions = new Suggestions();
|
this._suggestions = new Suggestions();
|
||||||
this.actor.add(this._suggestions.actor,
|
this.actor.add(this._suggestions.actor,
|
||||||
@ -1174,7 +1171,7 @@ var Keyboard = class Keyboard {
|
|||||||
|
|
||||||
this._emojiSelection = new EmojiSelection();
|
this._emojiSelection = new EmojiSelection();
|
||||||
this._emojiSelection.connect('toggle', this._toggleEmoji.bind(this));
|
this._emojiSelection.connect('toggle', this._toggleEmoji.bind(this));
|
||||||
this._emojiSelection.connect('hide', (selection) => { this.hide(); });
|
this._emojiSelection.connect('hide', (selection) => this.hide());
|
||||||
this._emojiSelection.connect('emoji-selected', (selection, emoji) => {
|
this._emojiSelection.connect('emoji-selected', (selection, emoji) => {
|
||||||
this._keyboardController.commitString(emoji);
|
this._keyboardController.commitString(emoji);
|
||||||
});
|
});
|
||||||
@ -1202,10 +1199,12 @@ var Keyboard = class Keyboard {
|
|||||||
this._keyboardNotifyId = this._keyboardController.connect('active-group', this._onGroupChanged.bind(this));
|
this._keyboardNotifyId = this._keyboardController.connect('active-group', this._onGroupChanged.bind(this));
|
||||||
this._keyboardGroupsChangedId = this._keyboardController.connect('groups-changed', this._onKeyboardGroupsChanged.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._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._keypadVisibleId = this._keyboardController.connect('keypad-visible', this._onKeypadVisible.bind(this));
|
||||||
this._focusNotifyId = global.stage.connect('notify::key-focus', this._onKeyFocusChanged.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();
|
this._relayout();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1227,6 +1226,7 @@ var Keyboard = class Keyboard {
|
|||||||
if (!this._showIdleId) {
|
if (!this._showIdleId) {
|
||||||
this._showIdleId = GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => {
|
this._showIdleId = GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => {
|
||||||
this.show(Main.layoutManager.focusIndex);
|
this.show(Main.layoutManager.focusIndex);
|
||||||
|
this._showIdleId = 0;
|
||||||
return GLib.SOURCE_REMOVE;
|
return GLib.SOURCE_REMOVE;
|
||||||
});
|
});
|
||||||
GLib.Source.set_name_by_id(this._showIdleId, '[gnome-shell] this.show');
|
GLib.Source.set_name_by_id(this._showIdleId, '[gnome-shell] this.show');
|
||||||
@ -1302,7 +1302,7 @@ var Keyboard = class Keyboard {
|
|||||||
this._languagePopup.destroy();
|
this._languagePopup.destroy();
|
||||||
|
|
||||||
this._languagePopup = new LanguageSelectionPopup(keyActor);
|
this._languagePopup = new LanguageSelectionPopup(keyActor);
|
||||||
Main.layoutManager.addChrome(this._languagePopup.actor);
|
Main.layoutManager.addTopChrome(this._languagePopup.actor);
|
||||||
this._languagePopup.open(true);
|
this._languagePopup.open(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1353,7 +1353,7 @@ var Keyboard = class Keyboard {
|
|||||||
} else if (switchToLevel == 1) {
|
} else if (switchToLevel == 1) {
|
||||||
extraButton.connect('long-press', () => {
|
extraButton.connect('long-press', () => {
|
||||||
this._latched = true;
|
this._latched = true;
|
||||||
this._setCurrentLevelLatched(this._current_page, this._latched);
|
this._setCurrentLevelLatched(this._currentPage, this._latched);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1380,8 +1380,8 @@ var Keyboard = class Keyboard {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_updateCurrentPageVisible() {
|
_updateCurrentPageVisible() {
|
||||||
if (this._current_page)
|
if (this._currentPage)
|
||||||
this._current_page.visible = !this._emojiActive && !this._keypadVisible;
|
this._currentPage.visible = !this._emojiActive && !this._keypadVisible;
|
||||||
}
|
}
|
||||||
|
|
||||||
_setEmojiActive(active) {
|
_setEmojiActive(active) {
|
||||||
@ -1402,8 +1402,6 @@ var Keyboard = class Keyboard {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_getDefaultKeysForRow(row, numRows, level) {
|
_getDefaultKeysForRow(row, numRows, level) {
|
||||||
let pre, post;
|
|
||||||
|
|
||||||
/* The first 2 rows in defaultKeysPre/Post belong together with
|
/* The first 2 rows in defaultKeysPre/Post belong together with
|
||||||
* the first 2 rows on each keymap. On keymaps that have more than
|
* the first 2 rows on each keymap. On keymaps that have more than
|
||||||
* 4 rows, the last 2 default key rows must be respectively
|
* 4 rows, the last 2 default key rows must be respectively
|
||||||
@ -1440,12 +1438,12 @@ var Keyboard = class Keyboard {
|
|||||||
|
|
||||||
_getGridSlots() {
|
_getGridSlots() {
|
||||||
let numOfHorizSlots = 0, numOfVertSlots;
|
let numOfHorizSlots = 0, numOfVertSlots;
|
||||||
let rows = this._current_page.get_children();
|
let rows = this._currentPage.get_children();
|
||||||
numOfVertSlots = rows.length;
|
numOfVertSlots = rows.length;
|
||||||
|
|
||||||
for (let i = 0; i < rows.length; ++i) {
|
for (let i = 0; i < rows.length; ++i) {
|
||||||
let keyboard_row = rows[i];
|
let keyboardRow = rows[i];
|
||||||
let keys = keyboard_row.get_children();
|
let keys = keyboardRow.get_children();
|
||||||
|
|
||||||
numOfHorizSlots = Math.max(numOfHorizSlots, keys.length);
|
numOfHorizSlots = Math.max(numOfHorizSlots, keys.length);
|
||||||
}
|
}
|
||||||
@ -1470,7 +1468,12 @@ var Keyboard = class Keyboard {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_onKeyboardGroupsChanged(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();
|
this._onGroupChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1512,13 +1515,24 @@ var Keyboard = class Keyboard {
|
|||||||
_setActiveLayer(activeLevel) {
|
_setActiveLayer(activeLevel) {
|
||||||
let activeGroupName = this._keyboardController.getCurrentGroup();
|
let activeGroupName = this._keyboardController.getCurrentGroup();
|
||||||
let layers = this._groups[activeGroupName];
|
let layers = this._groups[activeGroupName];
|
||||||
|
let currentPage = layers[activeLevel];
|
||||||
|
|
||||||
if (this._current_page != null) {
|
if (this._currentPage == currentPage) {
|
||||||
this._setCurrentLevelLatched(this._current_page, false);
|
this._updateCurrentPageVisible();
|
||||||
this._current_page.hide();
|
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();
|
this._updateCurrentPageVisible();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1606,18 +1620,6 @@ var Keyboard = class Keyboard {
|
|||||||
this.setCursorLocation(null);
|
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() {
|
resetSuggestions() {
|
||||||
if (this._suggestions)
|
if (this._suggestions)
|
||||||
this._suggestions.clear();
|
this._suggestions.clear();
|
||||||
@ -1638,8 +1640,7 @@ var Keyboard = class Keyboard {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_windowSlideAnimationComplete(window, delta) {
|
_windowSlideAnimationComplete(window, delta) {
|
||||||
// Synchronize window and actor positions again.
|
// Synchronize window positions again.
|
||||||
let windowActor = window.get_compositor_private();
|
|
||||||
let frameRect = window.get_frame_rect();
|
let frameRect = window.get_frame_rect();
|
||||||
frameRect.y += delta;
|
frameRect.y += delta;
|
||||||
window.move_frame(true, frameRect.x, frameRect.y);
|
window.move_frame(true, frameRect.x, frameRect.y);
|
||||||
@ -1685,7 +1686,6 @@ var Keyboard = class Keyboard {
|
|||||||
|
|
||||||
if (window && monitor) {
|
if (window && monitor) {
|
||||||
let keyboardHeight = Main.layoutManager.keyboardBox.height;
|
let keyboardHeight = Main.layoutManager.keyboardBox.height;
|
||||||
let focusObscured = false;
|
|
||||||
|
|
||||||
if (y + h >= monitor.y + monitor.height - keyboardHeight) {
|
if (y + h >= monitor.y + monitor.height - keyboardHeight) {
|
||||||
if (this._keyboardVisible)
|
if (this._keyboardVisible)
|
||||||
@ -1736,7 +1736,6 @@ var KeyboardController = class {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_onContentPurposeHintsChanged(method) {
|
_onContentPurposeHintsChanged(method) {
|
||||||
let hints = method.content_hints;
|
|
||||||
let purpose = method.content_purpose;
|
let purpose = method.content_purpose;
|
||||||
let emojiVisible = false;
|
let emojiVisible = false;
|
||||||
let keypadVisible = false;
|
let keypadVisible = false;
|
||||||
@ -1751,13 +1750,13 @@ var KeyboardController = class {
|
|||||||
purpose == Clutter.InputContentPurpose.PHONE)
|
purpose == Clutter.InputContentPurpose.PHONE)
|
||||||
keypadVisible = true;
|
keypadVisible = true;
|
||||||
|
|
||||||
this.emit('emoji-visible', emojiVisible)
|
this.emit('emoji-visible', emojiVisible);
|
||||||
this.emit('keypad-visible', keypadVisible);
|
this.emit('keypad-visible', keypadVisible);
|
||||||
}
|
}
|
||||||
|
|
||||||
getGroups() {
|
getGroups() {
|
||||||
let inputSources = this._inputSourceManager.inputSources;
|
let inputSources = this._inputSourceManager.inputSources;
|
||||||
let groups = []
|
let groups = [];
|
||||||
|
|
||||||
for (let i in inputSources) {
|
for (let i in inputSources) {
|
||||||
let is = inputSources[i];
|
let is = inputSources[i];
|
||||||
|
@ -11,6 +11,7 @@ const DND = imports.ui.dnd;
|
|||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const Params = imports.misc.params;
|
const Params = imports.misc.params;
|
||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
|
const Ripples = imports.ui.ripples;
|
||||||
|
|
||||||
var STARTUP_ANIMATION_TIME = 0.5;
|
var STARTUP_ANIMATION_TIME = 0.5;
|
||||||
var KEYBOARD_ANIMATION_TIME = 0.15;
|
var KEYBOARD_ANIMATION_TIME = 0.15;
|
||||||
@ -31,7 +32,8 @@ function isPopupMetaWindow(actor) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var MonitorConstraint = GObject.registerClass({
|
var MonitorConstraint = GObject.registerClass({
|
||||||
Properties: {'primary': GObject.ParamSpec.boolean('primary',
|
Properties: {
|
||||||
|
'primary': GObject.ParamSpec.boolean('primary',
|
||||||
'Primary', 'Track primary monitor',
|
'Primary', 'Track primary monitor',
|
||||||
GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE,
|
GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE,
|
||||||
false),
|
false),
|
||||||
@ -42,7 +44,8 @@ var MonitorConstraint = GObject.registerClass({
|
|||||||
'work-area': GObject.ParamSpec.boolean('work-area',
|
'work-area': GObject.ParamSpec.boolean('work-area',
|
||||||
'Work-area', 'Track monitor\'s work-area',
|
'Work-area', 'Track monitor\'s work-area',
|
||||||
GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE,
|
GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE,
|
||||||
false)},
|
false)
|
||||||
|
},
|
||||||
}, class MonitorConstraint extends Clutter.Constraint {
|
}, class MonitorConstraint extends Clutter.Constraint {
|
||||||
_init(props) {
|
_init(props) {
|
||||||
this._primary = false;
|
this._primary = false;
|
||||||
@ -146,13 +149,13 @@ var MonitorConstraint = GObject.registerClass({
|
|||||||
});
|
});
|
||||||
|
|
||||||
var Monitor = class Monitor {
|
var Monitor = class Monitor {
|
||||||
constructor(index, geometry, geometry_scale) {
|
constructor(index, geometry, geometryScale) {
|
||||||
this.index = index;
|
this.index = index;
|
||||||
this.x = geometry.x;
|
this.x = geometry.x;
|
||||||
this.y = geometry.y;
|
this.y = geometry.y;
|
||||||
this.width = geometry.width;
|
this.width = geometry.width;
|
||||||
this.height = geometry.height;
|
this.height = geometry.height;
|
||||||
this.geometry_scale = geometry_scale;
|
this.geometry_scale = geometryScale;
|
||||||
}
|
}
|
||||||
|
|
||||||
get inFullscreen() {
|
get inFullscreen() {
|
||||||
@ -216,10 +219,17 @@ var LayoutManager = GObject.registerClass({
|
|||||||
this.uiGroup = new UiActor({ name: 'uiGroup' });
|
this.uiGroup = new UiActor({ name: 'uiGroup' });
|
||||||
this.uiGroup.set_flags(Clutter.ActorFlags.NO_LAYOUT);
|
this.uiGroup.set_flags(Clutter.ActorFlags.NO_LAYOUT);
|
||||||
|
|
||||||
|
global.stage.add_child(this.uiGroup);
|
||||||
|
|
||||||
global.stage.remove_actor(global.window_group);
|
global.stage.remove_actor(global.window_group);
|
||||||
this.uiGroup.add_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',
|
this.overviewGroup = new St.Widget({ name: 'overviewGroup',
|
||||||
visible: false,
|
visible: false,
|
||||||
@ -247,7 +257,7 @@ var LayoutManager = GObject.registerClass({
|
|||||||
this.keyboardBox = new St.BoxLayout({ name: 'keyboardBox',
|
this.keyboardBox = new St.BoxLayout({ name: 'keyboardBox',
|
||||||
reactive: true,
|
reactive: true,
|
||||||
track_hover: true });
|
track_hover: true });
|
||||||
this.addChrome(this.keyboardBox);
|
this.addTopChrome(this.keyboardBox);
|
||||||
this._keyboardHeightNotifyId = 0;
|
this._keyboardHeightNotifyId = 0;
|
||||||
|
|
||||||
// A dummy actor that tracks the mouse or text cursor, based on the
|
// A dummy actor that tracks the mouse or text cursor, based on the
|
||||||
@ -255,9 +265,6 @@ var LayoutManager = GObject.registerClass({
|
|||||||
this.dummyCursor = new St.Widget({ width: 0, height: 0, opacity: 0 });
|
this.dummyCursor = new St.Widget({ width: 0, height: 0, opacity: 0 });
|
||||||
this.uiGroup.add_actor(this.dummyCursor);
|
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);
|
let feedbackGroup = Meta.get_feedback_group_for_display(global.display);
|
||||||
global.stage.remove_actor(feedbackGroup);
|
global.stage.remove_actor(feedbackGroup);
|
||||||
this.uiGroup.add_actor(feedbackGroup);
|
this.uiGroup.add_actor(feedbackGroup);
|
||||||
@ -802,6 +809,16 @@ var LayoutManager = GObject.registerClass({
|
|||||||
this._trackActor(actor, params);
|
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:
|
// trackChrome:
|
||||||
// @actor: a descendant of the chrome to begin tracking
|
// @actor: a descendant of the chrome to begin tracking
|
||||||
// @params: parameters describing how to track @actor
|
// @params: parameters describing how to track @actor
|
||||||
@ -1058,7 +1075,6 @@ var LayoutManager = GObject.registerClass({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!Meta.is_wayland_compositor())
|
|
||||||
global.set_stage_input_region(rects);
|
global.set_stage_input_region(rects);
|
||||||
this._isPopupWindowVisible = isPopupMenuVisible;
|
this._isPopupWindowVisible = isPopupMenuVisible;
|
||||||
|
|
||||||
@ -1104,14 +1120,15 @@ var HotCorner = class HotCorner {
|
|||||||
Shell.ActionMode.OVERVIEW);
|
Shell.ActionMode.OVERVIEW);
|
||||||
this._pressureBarrier.connect('trigger', this._toggleOverview.bind(this));
|
this._pressureBarrier.connect('trigger', this._toggleOverview.bind(this));
|
||||||
|
|
||||||
// Cache the three ripples instead of dynamically creating and destroying them.
|
let px = 0.0;
|
||||||
this._ripple1 = new St.BoxLayout({ style_class: 'ripple-box', opacity: 0, visible: false });
|
let py = 0.0;
|
||||||
this._ripple2 = new St.BoxLayout({ style_class: 'ripple-box', opacity: 0, visible: false });
|
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) {
|
||||||
this._ripple3 = new St.BoxLayout({ style_class: 'ripple-box', opacity: 0, visible: false });
|
px = 1.0;
|
||||||
|
py = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
layoutManager.uiGroup.add_actor(this._ripple1);
|
this._ripples = new Ripples.Ripples(px, py, 'ripple-box');
|
||||||
layoutManager.uiGroup.add_actor(this._ripple2);
|
this._ripples.addTo(layoutManager.uiGroup);
|
||||||
layoutManager.uiGroup.add_actor(this._ripple3);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
setBarrierSize(size) {
|
setBarrierSize(size) {
|
||||||
@ -1193,53 +1210,12 @@ var HotCorner = class HotCorner {
|
|||||||
this.actor.destroy();
|
this.actor.destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
_animRipple(ripple, delay, time, startScale, startOpacity, finalScale) {
|
|
||||||
// We draw a ripple by using a source image and animating it scaling
|
|
||||||
// outwards and fading away. We want the ripples to move linearly
|
|
||||||
// or it looks unrealistic, but if the opacity of the ripple goes
|
|
||||||
// linearly to zero it fades away too quickly, so we use Tweener's
|
|
||||||
// 'onUpdate' to give a non-linear curve to the fade-away and make
|
|
||||||
// it more visible in the middle section.
|
|
||||||
|
|
||||||
ripple._opacity = startOpacity;
|
|
||||||
|
|
||||||
if (ripple.get_text_direction() == Clutter.TextDirection.RTL)
|
|
||||||
ripple.set_anchor_point_from_gravity(Clutter.Gravity.NORTH_EAST);
|
|
||||||
|
|
||||||
ripple.visible = true;
|
|
||||||
ripple.opacity = 255 * Math.sqrt(startOpacity);
|
|
||||||
ripple.scale_x = ripple.scale_y = startScale;
|
|
||||||
|
|
||||||
ripple.x = this._x;
|
|
||||||
ripple.y = this._y;
|
|
||||||
|
|
||||||
Tweener.addTween(ripple, { _opacity: 0,
|
|
||||||
scale_x: finalScale,
|
|
||||||
scale_y: finalScale,
|
|
||||||
delay: delay,
|
|
||||||
time: time,
|
|
||||||
transition: 'linear',
|
|
||||||
onUpdate() { ripple.opacity = 255 * Math.sqrt(ripple._opacity); },
|
|
||||||
onComplete() { ripple.visible = false; } });
|
|
||||||
}
|
|
||||||
|
|
||||||
_rippleAnimation() {
|
|
||||||
// Show three concentric ripples expanding outwards; the exact
|
|
||||||
// parameters were found by trial and error, so don't look
|
|
||||||
// for them to make perfect sense mathematically
|
|
||||||
|
|
||||||
// delay time scale opacity => scale
|
|
||||||
this._animRipple(this._ripple1, 0.0, 0.83, 0.25, 1.0, 1.5);
|
|
||||||
this._animRipple(this._ripple2, 0.05, 1.0, 0.0, 0.7, 1.25);
|
|
||||||
this._animRipple(this._ripple3, 0.35, 1.0, 0.0, 0.3, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
_toggleOverview() {
|
_toggleOverview() {
|
||||||
if (this._monitor.inFullscreen && !Main.overview.visible)
|
if (this._monitor.inFullscreen && !Main.overview.visible)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (Main.overview.shouldToggleByCornerOrButton()) {
|
if (Main.overview.shouldToggleByCornerOrButton()) {
|
||||||
this._rippleAnimation();
|
this._ripples.playAnimation(this._x, this._y);
|
||||||
Main.overview.toggle();
|
Main.overview.toggle();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,7 @@ const Params = imports.misc.params;
|
|||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
|
|
||||||
var DEFAULT_FADE_FACTOR = 0.4;
|
var DEFAULT_FADE_FACTOR = 0.4;
|
||||||
var VIGNETTE_BRIGHTNESS = 0.8;
|
var VIGNETTE_BRIGHTNESS = 0.2;
|
||||||
var VIGNETTE_SHARPNESS = 0.7;
|
var VIGNETTE_SHARPNESS = 0.7;
|
||||||
|
|
||||||
const VIGNETTE_DECLARATIONS = '\
|
const VIGNETTE_DECLARATIONS = '\
|
||||||
|
24
js/ui/locatePointer.js
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
|
||||||
|
const { Gio } = imports.gi;
|
||||||
|
const Ripples = imports.ui.ripples;
|
||||||
|
const Main = imports.ui.main;
|
||||||
|
|
||||||
|
const LOCATE_POINTER_KEY = "locate-pointer";
|
||||||
|
const LOCATE_POINTER_SCHEMA = "org.gnome.desktop.interface";
|
||||||
|
|
||||||
|
var LocatePointer = class {
|
||||||
|
constructor() {
|
||||||
|
this._settings = new Gio.Settings({ schema_id: LOCATE_POINTER_SCHEMA });
|
||||||
|
this._ripples = new Ripples.Ripples(0.5, 0.5, 'ripple-pointer-location');
|
||||||
|
this._ripples.addTo(Main.uiGroup);
|
||||||
|
}
|
||||||
|
|
||||||
|
show() {
|
||||||
|
if (!this._settings.get_boolean(LOCATE_POINTER_KEY))
|
||||||
|
return;
|
||||||
|
|
||||||
|
let [x, y, mods] = global.get_pointer();
|
||||||
|
this._ripples.playAnimation(x, y);
|
||||||
|
}
|
||||||
|
};
|
@ -146,8 +146,8 @@ var Notebook = class Notebook {
|
|||||||
this.actor.add(scrollview, { expand: true });
|
this.actor.add(scrollview, { expand: true });
|
||||||
|
|
||||||
let vAdjust = scrollview.vscroll.adjustment;
|
let vAdjust = scrollview.vscroll.adjustment;
|
||||||
vAdjust.connect('changed', () => { this._onAdjustScopeChanged(tabData); });
|
vAdjust.connect('changed', () => this._onAdjustScopeChanged(tabData));
|
||||||
vAdjust.connect('notify::value', () => { this._onAdjustValueChanged(tabData); });
|
vAdjust.connect('notify::value', () => this._onAdjustValueChanged(tabData));
|
||||||
|
|
||||||
if (this._selectedIndex == -1)
|
if (this._selectedIndex == -1)
|
||||||
this.selectIndex(0);
|
this.selectIndex(0);
|
||||||
@ -185,9 +185,9 @@ var Notebook = class Notebook {
|
|||||||
}
|
}
|
||||||
|
|
||||||
selectChild(child) {
|
selectChild(child) {
|
||||||
if (child == null)
|
if (child == null) {
|
||||||
this.selectIndex(-1);
|
this.selectIndex(-1);
|
||||||
else {
|
} else {
|
||||||
for (let i = 0; i < this._tabs.length; i++) {
|
for (let i = 0; i < this._tabs.length; i++) {
|
||||||
let tabData = this._tabs[i];
|
let tabData = this._tabs[i];
|
||||||
if (tabData.child == child) {
|
if (tabData.child == child) {
|
||||||
@ -242,7 +242,7 @@ function objectToString(o) {
|
|||||||
// special case this since the default is way, way too verbose
|
// special case this since the default is way, way too verbose
|
||||||
return '<js function>';
|
return '<js function>';
|
||||||
} else {
|
} else {
|
||||||
return '' + o;
|
return `${o}`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -284,7 +284,7 @@ var Result = class Result {
|
|||||||
this.actor.add(cmdTxt);
|
this.actor.add(cmdTxt);
|
||||||
let box = new St.BoxLayout({});
|
let box = new St.BoxLayout({});
|
||||||
this.actor.add(box);
|
this.actor.add(box);
|
||||||
let resultTxt = new St.Label({ text: 'r(' + index + ') = ' });
|
let resultTxt = new St.Label({ text: `r(${index}) = ` });
|
||||||
resultTxt.clutter_text.ellipsize = Pango.EllipsizeMode.END;
|
resultTxt.clutter_text.ellipsize = Pango.EllipsizeMode.END;
|
||||||
box.add(resultTxt);
|
box.add(resultTxt);
|
||||||
let objLink = new ObjLink(this._lookingGlass, o);
|
let objLink = new ObjLink(this._lookingGlass, o);
|
||||||
@ -320,7 +320,7 @@ var WindowList = class WindowList {
|
|||||||
box.add(windowLink.actor, { x_align: St.Align.START, x_fill: false });
|
box.add(windowLink.actor, { x_align: St.Align.START, x_fill: false });
|
||||||
let propsBox = new St.BoxLayout({ vertical: true, style: 'padding-left: 6px;' });
|
let propsBox = new St.BoxLayout({ vertical: true, style: 'padding-left: 6px;' });
|
||||||
box.add(propsBox);
|
box.add(propsBox);
|
||||||
propsBox.add(new St.Label({ text: 'wmclass: ' + metaWindow.get_wm_class() }));
|
propsBox.add(new St.Label({ text: `wmclass: ${metaWindow.get_wm_class()}` }));
|
||||||
let app = tracker.get_window_app(metaWindow);
|
let app = tracker.get_window_app(metaWindow);
|
||||||
if (app != null && !app.is_window_backed()) {
|
if (app != null && !app.is_window_backed()) {
|
||||||
let icon = app.create_icon_texture(22);
|
let icon = app.create_icon_texture(22);
|
||||||
@ -394,7 +394,6 @@ var ObjInspector = class ObjInspector {
|
|||||||
|
|
||||||
for (let i = 0; i < properties.length; i++) {
|
for (let i = 0; i < properties.length; i++) {
|
||||||
let propName = properties[i];
|
let propName = properties[i];
|
||||||
let valueStr;
|
|
||||||
let link;
|
let link;
|
||||||
try {
|
try {
|
||||||
let prop = obj[propName];
|
let prop = obj[propName];
|
||||||
@ -403,8 +402,7 @@ var ObjInspector = class ObjInspector {
|
|||||||
link = new St.Label({ text: '<error>' });
|
link = new St.Label({ text: '<error>' });
|
||||||
}
|
}
|
||||||
let hbox = new St.BoxLayout();
|
let hbox = new St.BoxLayout();
|
||||||
let propText = propName + ': ' + valueStr;
|
hbox.add(new St.Label({ text: `${propName}: ` }));
|
||||||
hbox.add(new St.Label({ text: propName + ': ' }));
|
|
||||||
hbox.add(link);
|
hbox.add(link);
|
||||||
this._container.add_actor(hbox);
|
this._container.add_actor(hbox);
|
||||||
}
|
}
|
||||||
@ -493,8 +491,13 @@ var Inspector = GObject.registerClass({
|
|||||||
eventHandler.connect('button-press-event', this._onButtonPressEvent.bind(this));
|
eventHandler.connect('button-press-event', this._onButtonPressEvent.bind(this));
|
||||||
eventHandler.connect('scroll-event', this._onScrollEvent.bind(this));
|
eventHandler.connect('scroll-event', this._onScrollEvent.bind(this));
|
||||||
eventHandler.connect('motion-event', this._onMotionEvent.bind(this));
|
eventHandler.connect('motion-event', this._onMotionEvent.bind(this));
|
||||||
Clutter.grab_pointer(eventHandler);
|
|
||||||
Clutter.grab_keyboard(eventHandler);
|
let dm = Clutter.DeviceManager.get_default();
|
||||||
|
this._pointerDevice = dm.get_core_device(Clutter.InputDeviceType.POINTER_DEVICE);
|
||||||
|
this._keyboardDevice = dm.get_core_device(Clutter.InputDeviceType.KEYBOARD_DEVICE);
|
||||||
|
|
||||||
|
this._pointerDevice.grab(eventHandler);
|
||||||
|
this._keyboardDevice.grab(eventHandler);
|
||||||
|
|
||||||
// this._target is the actor currently shown by the inspector.
|
// this._target is the actor currently shown by the inspector.
|
||||||
// this._pointerTarget is the actor directly under the pointer.
|
// this._pointerTarget is the actor directly under the pointer.
|
||||||
@ -527,8 +530,8 @@ var Inspector = GObject.registerClass({
|
|||||||
}
|
}
|
||||||
|
|
||||||
_close() {
|
_close() {
|
||||||
Clutter.ungrab_pointer();
|
this._pointerDevice.ungrab();
|
||||||
Clutter.ungrab_keyboard();
|
this._keyboardDevice.ungrab();
|
||||||
this._eventHandler.destroy();
|
this._eventHandler.destroy();
|
||||||
this._eventHandler = null;
|
this._eventHandler = null;
|
||||||
this.emit('closed');
|
this.emit('closed');
|
||||||
@ -551,7 +554,7 @@ var Inspector = GObject.registerClass({
|
|||||||
|
|
||||||
_onScrollEvent(actor, event) {
|
_onScrollEvent(actor, event) {
|
||||||
switch (event.get_scroll_direction()) {
|
switch (event.get_scroll_direction()) {
|
||||||
case Clutter.ScrollDirection.UP:
|
case Clutter.ScrollDirection.UP: {
|
||||||
// select parent
|
// select parent
|
||||||
let parent = this._target.get_parent();
|
let parent = this._target.get_parent();
|
||||||
if (parent != null) {
|
if (parent != null) {
|
||||||
@ -559,6 +562,7 @@ var Inspector = GObject.registerClass({
|
|||||||
this._update(event);
|
this._update(event);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case Clutter.ScrollDirection.DOWN:
|
case Clutter.ScrollDirection.DOWN:
|
||||||
// select child
|
// select child
|
||||||
@ -598,9 +602,9 @@ var Inspector = GObject.registerClass({
|
|||||||
this._target = target;
|
this._target = target;
|
||||||
this._pointerTarget = target;
|
this._pointerTarget = target;
|
||||||
|
|
||||||
let position = '[inspect x: ' + stageX + ' y: ' + stageY + ']';
|
let position = `[inspect x: ${stageX} y: ${stageY}]`;
|
||||||
this._displayText.text = '';
|
this._displayText.text = '';
|
||||||
this._displayText.text = position + ' ' + this._target;
|
this._displayText.text = `${position} ${this._target}`;
|
||||||
|
|
||||||
this._lookingGlass.setBorderPaintTarget(this._target);
|
this._lookingGlass.setBorderPaintTarget(this._target);
|
||||||
}
|
}
|
||||||
@ -710,7 +714,6 @@ var Extensions = class Extensions {
|
|||||||
|
|
||||||
let metaBox = new St.BoxLayout({ style_class: 'lg-extension-meta' });
|
let metaBox = new St.BoxLayout({ style_class: 'lg-extension-meta' });
|
||||||
box.add(metaBox);
|
box.add(metaBox);
|
||||||
let stateString = this._stateToString(extension.state);
|
|
||||||
let state = new St.Label({ style_class: 'lg-extension-state',
|
let state = new St.Label({ style_class: 'lg-extension-state',
|
||||||
text: this._stateToString(extension.state) });
|
text: this._stateToString(extension.state) });
|
||||||
metaBox.add(state);
|
metaBox.add(state);
|
||||||
@ -795,7 +798,7 @@ var LookingGlass = class LookingGlass {
|
|||||||
inspectIcon.connect('button-press-event', () => {
|
inspectIcon.connect('button-press-event', () => {
|
||||||
let inspector = new Inspector(this);
|
let inspector = new Inspector(this);
|
||||||
inspector.connect('target', (i, target, stageX, stageY) => {
|
inspector.connect('target', (i, target, stageX, stageY) => {
|
||||||
this._pushResult('inspect(' + Math.round(stageX) + ', ' + Math.round(stageY) + ')', target);
|
this._pushResult(`inspect(${Math.round(stageX)}, ${Math.round(stageY)})`, target);
|
||||||
});
|
});
|
||||||
inspector.connect('closed', () => {
|
inspector.connect('closed', () => {
|
||||||
this.actor.show();
|
this.actor.show();
|
||||||
@ -889,9 +892,11 @@ var LookingGlass = class LookingGlass {
|
|||||||
let fontDesc = Pango.FontDescription.from_string(fontName);
|
let fontDesc = Pango.FontDescription.from_string(fontName);
|
||||||
// We ignore everything but size and style; you'd be crazy to set your system-wide
|
// We ignore everything but size and style; you'd be crazy to set your system-wide
|
||||||
// monospace font to be bold/oblique/etc. Could easily be added here.
|
// monospace font to be bold/oblique/etc. Could easily be added here.
|
||||||
this.actor.style =
|
let size = fontDesc.get_size() / 1024.;
|
||||||
'font-size: ' + fontDesc.get_size() / 1024. + (fontDesc.get_size_is_absolute() ? 'px' : 'pt') + ';'
|
let unit = fontDesc.get_size_is_absolute() ? 'px' : 'pt';
|
||||||
+ 'font-family: "' + fontDesc.get_family() + '";';
|
this.actor.style = `
|
||||||
|
font-size: ${size}${unit};
|
||||||
|
font-family: "${fontDesc.get_family()}";`;
|
||||||
}
|
}
|
||||||
|
|
||||||
setBorderPaintTarget(obj) {
|
setBorderPaintTarget(obj) {
|
||||||
@ -977,7 +982,7 @@ var LookingGlass = class LookingGlass {
|
|||||||
try {
|
try {
|
||||||
resultObj = Function(fullCmd)();
|
resultObj = Function(fullCmd)();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
resultObj = '<exception ' + e + '>';
|
resultObj = `<exception ${e}>`;
|
||||||
}
|
}
|
||||||
|
|
||||||
this._pushResult(command, resultObj);
|
this._pushResult(command, resultObj);
|
||||||
@ -1004,7 +1009,7 @@ var LookingGlass = class LookingGlass {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_queueResize() {
|
_queueResize() {
|
||||||
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { this._resize(); });
|
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => this._resize());
|
||||||
}
|
}
|
||||||
|
|
||||||
_resize() {
|
_resize() {
|
||||||
|
@ -41,8 +41,6 @@ const CROSS_HAIRS_OPACITY_KEY = 'cross-hairs-opacity';
|
|||||||
const CROSS_HAIRS_LENGTH_KEY = 'cross-hairs-length';
|
const CROSS_HAIRS_LENGTH_KEY = 'cross-hairs-length';
|
||||||
const CROSS_HAIRS_CLIP_KEY = 'cross-hairs-clip';
|
const CROSS_HAIRS_CLIP_KEY = 'cross-hairs-clip';
|
||||||
|
|
||||||
let magDBusService = null;
|
|
||||||
|
|
||||||
var MouseSpriteContent = GObject.registerClass({
|
var MouseSpriteContent = GObject.registerClass({
|
||||||
Implements: [Clutter.Content],
|
Implements: [Clutter.Content],
|
||||||
}, class MouseSpriteContent extends GObject.Object {
|
}, class MouseSpriteContent extends GObject.Object {
|
||||||
@ -122,7 +120,7 @@ var Magnifier = class Magnifier {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Export to dbus.
|
// Export to dbus.
|
||||||
magDBusService = new MagnifierDBus.ShellMagnifier();
|
(new MagnifierDBus.ShellMagnifier());
|
||||||
this.setActive(St.Settings.get().magnifier_active);
|
this.setActive(St.Settings.get().magnifier_active);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -349,8 +347,7 @@ var Magnifier = class Magnifier {
|
|||||||
if (!this._crossHairs)
|
if (!this._crossHairs)
|
||||||
this.addCrosshairs();
|
this.addCrosshairs();
|
||||||
this._crossHairs.show();
|
this._crossHairs.show();
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
if (this._crossHairs)
|
if (this._crossHairs)
|
||||||
this._crossHairs.hide();
|
this._crossHairs.hide();
|
||||||
}
|
}
|
||||||
@ -377,10 +374,10 @@ var Magnifier = class Magnifier {
|
|||||||
if (this._crossHairs) {
|
if (this._crossHairs) {
|
||||||
let clutterColor = this._crossHairs.getColor();
|
let clutterColor = this._crossHairs.getColor();
|
||||||
return clutterColor.to_string();
|
return clutterColor.to_string();
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
return '#00000000';
|
return '#00000000';
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* setCrosshairsThickness:
|
* setCrosshairsThickness:
|
||||||
@ -459,8 +456,7 @@ var Magnifier = class Magnifier {
|
|||||||
if (clip) {
|
if (clip) {
|
||||||
if (this._crossHairs)
|
if (this._crossHairs)
|
||||||
this._crossHairs.setClip(CROSSHAIRS_CLIP_SIZE);
|
this._crossHairs.setClip(CROSSHAIRS_CLIP_SIZE);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
// Setting no clipping on crosshairs means a zero sized clip
|
// Setting no clipping on crosshairs means a zero sized clip
|
||||||
// rectangle.
|
// rectangle.
|
||||||
if (this._crossHairs)
|
if (this._crossHairs)
|
||||||
@ -477,10 +473,10 @@ var Magnifier = class Magnifier {
|
|||||||
if (this._crossHairs) {
|
if (this._crossHairs) {
|
||||||
let [clipWidth, clipHeight] = this._crossHairs.getClip();
|
let [clipWidth, clipHeight] = this._crossHairs.getClip();
|
||||||
return (clipWidth > 0 && clipHeight > 0);
|
return (clipWidth > 0 && clipHeight > 0);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//// Private methods ////
|
//// Private methods ////
|
||||||
|
|
||||||
@ -504,61 +500,61 @@ var Magnifier = class Magnifier {
|
|||||||
_settingsInit(zoomRegion) {
|
_settingsInit(zoomRegion) {
|
||||||
this._settings = new Gio.Settings({ schema_id: MAGNIFIER_SCHEMA });
|
this._settings = new Gio.Settings({ schema_id: MAGNIFIER_SCHEMA });
|
||||||
|
|
||||||
this._settings.connect('changed::' + SCREEN_POSITION_KEY,
|
this._settings.connect(`changed::${SCREEN_POSITION_KEY}`,
|
||||||
this._updateScreenPosition.bind(this));
|
this._updateScreenPosition.bind(this));
|
||||||
this._settings.connect('changed::' + MAG_FACTOR_KEY,
|
this._settings.connect(`changed::${MAG_FACTOR_KEY}`,
|
||||||
this._updateMagFactor.bind(this));
|
this._updateMagFactor.bind(this));
|
||||||
this._settings.connect('changed::' + LENS_MODE_KEY,
|
this._settings.connect(`changed::${LENS_MODE_KEY}`,
|
||||||
this._updateLensMode.bind(this));
|
this._updateLensMode.bind(this));
|
||||||
this._settings.connect('changed::' + CLAMP_MODE_KEY,
|
this._settings.connect(`changed::${CLAMP_MODE_KEY}`,
|
||||||
this._updateClampMode.bind(this));
|
this._updateClampMode.bind(this));
|
||||||
this._settings.connect('changed::' + MOUSE_TRACKING_KEY,
|
this._settings.connect(`changed::${MOUSE_TRACKING_KEY}`,
|
||||||
this._updateMouseTrackingMode.bind(this));
|
this._updateMouseTrackingMode.bind(this));
|
||||||
this._settings.connect('changed::' + FOCUS_TRACKING_KEY,
|
this._settings.connect(`changed::${FOCUS_TRACKING_KEY}`,
|
||||||
this._updateFocusTrackingMode.bind(this));
|
this._updateFocusTrackingMode.bind(this));
|
||||||
this._settings.connect('changed::' + CARET_TRACKING_KEY,
|
this._settings.connect(`changed::${CARET_TRACKING_KEY}`,
|
||||||
this._updateCaretTrackingMode.bind(this));
|
this._updateCaretTrackingMode.bind(this));
|
||||||
|
|
||||||
this._settings.connect('changed::' + INVERT_LIGHTNESS_KEY,
|
this._settings.connect(`changed::${INVERT_LIGHTNESS_KEY}`,
|
||||||
this._updateInvertLightness.bind(this));
|
this._updateInvertLightness.bind(this));
|
||||||
this._settings.connect('changed::' + COLOR_SATURATION_KEY,
|
this._settings.connect(`changed::${COLOR_SATURATION_KEY}`,
|
||||||
this._updateColorSaturation.bind(this));
|
this._updateColorSaturation.bind(this));
|
||||||
|
|
||||||
this._settings.connect('changed::' + BRIGHT_RED_KEY,
|
this._settings.connect(`changed::${BRIGHT_RED_KEY}`,
|
||||||
this._updateBrightness.bind(this));
|
this._updateBrightness.bind(this));
|
||||||
this._settings.connect('changed::' + BRIGHT_GREEN_KEY,
|
this._settings.connect(`changed::${BRIGHT_GREEN_KEY}`,
|
||||||
this._updateBrightness.bind(this));
|
this._updateBrightness.bind(this));
|
||||||
this._settings.connect('changed::' + BRIGHT_BLUE_KEY,
|
this._settings.connect(`changed::${BRIGHT_BLUE_KEY}`,
|
||||||
this._updateBrightness.bind(this));
|
this._updateBrightness.bind(this));
|
||||||
|
|
||||||
this._settings.connect('changed::' + CONTRAST_RED_KEY,
|
this._settings.connect(`changed::${CONTRAST_RED_KEY}`,
|
||||||
this._updateContrast.bind(this));
|
this._updateContrast.bind(this));
|
||||||
this._settings.connect('changed::' + CONTRAST_GREEN_KEY,
|
this._settings.connect(`changed::${CONTRAST_GREEN_KEY}`,
|
||||||
this._updateContrast.bind(this));
|
this._updateContrast.bind(this));
|
||||||
this._settings.connect('changed::' + CONTRAST_BLUE_KEY,
|
this._settings.connect(`changed::${CONTRAST_BLUE_KEY}`,
|
||||||
this._updateContrast.bind(this));
|
this._updateContrast.bind(this));
|
||||||
|
|
||||||
this._settings.connect('changed::' + SHOW_CROSS_HAIRS_KEY, () => {
|
this._settings.connect(`changed::${SHOW_CROSS_HAIRS_KEY}`, () => {
|
||||||
this.setCrosshairsVisible(this._settings.get_boolean(SHOW_CROSS_HAIRS_KEY));
|
this.setCrosshairsVisible(this._settings.get_boolean(SHOW_CROSS_HAIRS_KEY));
|
||||||
});
|
});
|
||||||
|
|
||||||
this._settings.connect('changed::' + CROSS_HAIRS_THICKNESS_KEY, () => {
|
this._settings.connect(`changed::${CROSS_HAIRS_THICKNESS_KEY}`, () => {
|
||||||
this.setCrosshairsThickness(this._settings.get_int(CROSS_HAIRS_THICKNESS_KEY));
|
this.setCrosshairsThickness(this._settings.get_int(CROSS_HAIRS_THICKNESS_KEY));
|
||||||
});
|
});
|
||||||
|
|
||||||
this._settings.connect('changed::' + CROSS_HAIRS_COLOR_KEY, () => {
|
this._settings.connect(`changed::${CROSS_HAIRS_COLOR_KEY}`, () => {
|
||||||
this.setCrosshairsColor(this._settings.get_string(CROSS_HAIRS_COLOR_KEY));
|
this.setCrosshairsColor(this._settings.get_string(CROSS_HAIRS_COLOR_KEY));
|
||||||
});
|
});
|
||||||
|
|
||||||
this._settings.connect('changed::' + CROSS_HAIRS_OPACITY_KEY, () => {
|
this._settings.connect(`changed::${CROSS_HAIRS_OPACITY_KEY}`, () => {
|
||||||
this.setCrosshairsOpacity(this._settings.get_double(CROSS_HAIRS_OPACITY_KEY));
|
this.setCrosshairsOpacity(this._settings.get_double(CROSS_HAIRS_OPACITY_KEY));
|
||||||
});
|
});
|
||||||
|
|
||||||
this._settings.connect('changed::' + CROSS_HAIRS_LENGTH_KEY, () => {
|
this._settings.connect(`changed::${CROSS_HAIRS_LENGTH_KEY}`, () => {
|
||||||
this.setCrosshairsLength(this._settings.get_int(CROSS_HAIRS_LENGTH_KEY));
|
this.setCrosshairsLength(this._settings.get_int(CROSS_HAIRS_LENGTH_KEY));
|
||||||
});
|
});
|
||||||
|
|
||||||
this._settings.connect('changed::' + CROSS_HAIRS_CLIP_KEY, () => {
|
this._settings.connect(`changed::${CROSS_HAIRS_CLIP_KEY}`, () => {
|
||||||
this.setCrosshairsClip(this._settings.get_boolean(CROSS_HAIRS_CLIP_KEY));
|
this.setCrosshairsClip(this._settings.get_boolean(CROSS_HAIRS_CLIP_KEY));
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -801,7 +797,7 @@ var ZoomRegion = class ZoomRegion {
|
|||||||
try {
|
try {
|
||||||
extents = component.get_extents(Atspi.CoordType.SCREEN);
|
extents = component.get_extents(Atspi.CoordType.SCREEN);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
log('Failed to read extents of focused component: ' + e.message);
|
log(`Failed to read extents of focused component: ${e.message}`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -818,7 +814,7 @@ var ZoomRegion = class ZoomRegion {
|
|||||||
try {
|
try {
|
||||||
extents = text.get_character_extents(text.get_caret_offset(), 0);
|
extents = text.get_character_extents(text.get_caret_offset(), 0);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
log('Failed to read extents of text caret: ' + e.message);
|
log(`Failed to read extents of text caret: ${e.message}`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1272,7 +1268,7 @@ var ZoomRegion = class ZoomRegion {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* getContrast:
|
* getContrast:
|
||||||
* Retreive the contrast of the magnified view.
|
* Retrieve the contrast of the magnified view.
|
||||||
* @return Object containing the contrast for the red, green,
|
* @return Object containing the contrast for the red, green,
|
||||||
* and blue channels.
|
* and blue channels.
|
||||||
*/
|
*/
|
||||||
@ -1460,11 +1456,9 @@ var ZoomRegion = class ZoomRegion {
|
|||||||
|
|
||||||
if (this._mouseTrackingMode == GDesktopEnums.MagnifierMouseTrackingMode.PROPORTIONAL) {
|
if (this._mouseTrackingMode == GDesktopEnums.MagnifierMouseTrackingMode.PROPORTIONAL) {
|
||||||
return this._centerFromPointProportional(xMouse, yMouse);
|
return this._centerFromPointProportional(xMouse, yMouse);
|
||||||
}
|
} else if (this._mouseTrackingMode == GDesktopEnums.MagnifierMouseTrackingMode.PUSH) {
|
||||||
else if (this._mouseTrackingMode == GDesktopEnums.MagnifierMouseTrackingMode.PUSH) {
|
|
||||||
return this._centerFromPointPush(xMouse, yMouse);
|
return this._centerFromPointPush(xMouse, yMouse);
|
||||||
}
|
} else if (this._mouseTrackingMode == GDesktopEnums.MagnifierMouseTrackingMode.CENTERED) {
|
||||||
else if (this._mouseTrackingMode == GDesktopEnums.MagnifierMouseTrackingMode.CENTERED) {
|
|
||||||
return this._centerFromPointCentered(xMouse, yMouse);
|
return this._centerFromPointCentered(xMouse, yMouse);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1778,8 +1772,7 @@ var Crosshairs = class Crosshairs {
|
|||||||
// mouse.
|
// mouse.
|
||||||
this._clipSize = size;
|
this._clipSize = size;
|
||||||
this.reCenter();
|
this.reCenter();
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
// Restore the missing chunk.
|
// Restore the missing chunk.
|
||||||
this._clipSize = [0, 0];
|
this._clipSize = [0, 0];
|
||||||
this.reCenter();
|
this.reCenter();
|
||||||
@ -1818,9 +1811,7 @@ var Crosshairs = class Crosshairs {
|
|||||||
reCenter(clipSize) {
|
reCenter(clipSize) {
|
||||||
let [groupWidth, groupHeight] = this._actor.get_size();
|
let [groupWidth, groupHeight] = this._actor.get_size();
|
||||||
let leftLength = this._horizLeftHair.get_width();
|
let leftLength = this._horizLeftHair.get_width();
|
||||||
let rightLength = this._horizRightHair.get_width();
|
|
||||||
let topLength = this._vertTopHair.get_height();
|
let topLength = this._vertTopHair.get_height();
|
||||||
let bottomLength = this._vertBottomHair.get_height();
|
|
||||||
let thickness = this._horizLeftHair.get_height();
|
let thickness = this._horizLeftHair.get_height();
|
||||||
|
|
||||||
// Deal with clip rectangle.
|
// Deal with clip rectangle.
|
||||||
|
@ -85,7 +85,7 @@ var ShellMagnifier = class ShellMagnifier {
|
|||||||
let ROI = { x: roi[0], y: roi[1], width: roi[2] - roi[0], height: roi[3] - roi[1] };
|
let ROI = { x: roi[0], y: roi[1], width: roi[2] - roi[0], height: roi[3] - roi[1] };
|
||||||
let viewBox = { x: viewPort[0], y: viewPort[1], width: viewPort[2] - viewPort[0], height: viewPort[3] - viewPort[1] };
|
let viewBox = { x: viewPort[0], y: viewPort[1], width: viewPort[2] - viewPort[0], height: viewPort[3] - viewPort[1] };
|
||||||
let realZoomRegion = Main.magnifier.createZoomRegion(xMagFactor, yMagFactor, ROI, viewBox);
|
let realZoomRegion = Main.magnifier.createZoomRegion(xMagFactor, yMagFactor, ROI, viewBox);
|
||||||
let objectPath = ZOOM_SERVICE_PATH + '/zoomer' + _zoomRegionInstanceCount;
|
let objectPath = `${ZOOM_SERVICE_PATH}/zoomer${_zoomRegionInstanceCount}`;
|
||||||
_zoomRegionInstanceCount++;
|
_zoomRegionInstanceCount++;
|
||||||
|
|
||||||
let zoomRegionProxy = new ShellMagnifierZoomRegion(objectPath, realZoomRegion);
|
let zoomRegionProxy = new ShellMagnifierZoomRegion(objectPath, realZoomRegion);
|
||||||
@ -106,10 +106,10 @@ var ShellMagnifier = class ShellMagnifier {
|
|||||||
if (proxyAndZoomRegion && proxyAndZoomRegion.zoomRegion) {
|
if (proxyAndZoomRegion && proxyAndZoomRegion.zoomRegion) {
|
||||||
Main.magnifier.addZoomRegion(proxyAndZoomRegion.zoomRegion);
|
Main.magnifier.addZoomRegion(proxyAndZoomRegion.zoomRegion);
|
||||||
return true;
|
return true;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* getZoomRegions:
|
* getZoomRegions:
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
|
||||||
const { Clutter, Gio, GLib, Meta, Shell, St } = imports.gi;
|
const { Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi;
|
||||||
const Mainloop = imports.mainloop;
|
const Mainloop = imports.mainloop;
|
||||||
|
|
||||||
const AccessDialog = imports.ui.accessDialog;
|
const AccessDialog = imports.ui.accessDialog;
|
||||||
@ -37,9 +37,12 @@ const WindowManager = imports.ui.windowManager;
|
|||||||
const Magnifier = imports.ui.magnifier;
|
const Magnifier = imports.ui.magnifier;
|
||||||
const XdndHandler = imports.ui.xdndHandler;
|
const XdndHandler = imports.ui.xdndHandler;
|
||||||
const KbdA11yDialog = imports.ui.kbdA11yDialog;
|
const KbdA11yDialog = imports.ui.kbdA11yDialog;
|
||||||
|
const LocatePointer = imports.ui.locatePointer;
|
||||||
|
const PointerA11yTimeout = imports.ui.pointerA11yTimeout;
|
||||||
|
|
||||||
const A11Y_SCHEMA = 'org.gnome.desktop.a11y.keyboard';
|
const A11Y_SCHEMA = 'org.gnome.desktop.a11y.keyboard';
|
||||||
const STICKY_KEYS_ENABLE = 'stickykeys-enable';
|
const STICKY_KEYS_ENABLE = 'stickykeys-enable';
|
||||||
|
const LOG_DOMAIN = 'GNOME Shell';
|
||||||
const GNOMESHELL_STARTED_MESSAGE_ID = 'f3ea493c22934e26811cd62abe8e203a';
|
const GNOMESHELL_STARTED_MESSAGE_ID = 'f3ea493c22934e26811cd62abe8e203a';
|
||||||
|
|
||||||
var componentManager = null;
|
var componentManager = null;
|
||||||
@ -74,6 +77,7 @@ var layoutManager = null;
|
|||||||
var kbdA11yDialog = null;
|
var kbdA11yDialog = null;
|
||||||
var inputMethod = null;
|
var inputMethod = null;
|
||||||
var introspectService = null;
|
var introspectService = null;
|
||||||
|
var locatePointer = null;
|
||||||
let _startDate;
|
let _startDate;
|
||||||
let _defaultCssStylesheet = null;
|
let _defaultCssStylesheet = null;
|
||||||
let _cssStylesheet = null;
|
let _cssStylesheet = null;
|
||||||
@ -92,6 +96,8 @@ function _sessionUpdated() {
|
|||||||
wm.allowKeybinding('overlay-key', Shell.ActionMode.NORMAL |
|
wm.allowKeybinding('overlay-key', Shell.ActionMode.NORMAL |
|
||||||
Shell.ActionMode.OVERVIEW);
|
Shell.ActionMode.OVERVIEW);
|
||||||
|
|
||||||
|
wm.allowKeybinding('locate-pointer-key', Shell.ActionMode.ALL);
|
||||||
|
|
||||||
wm.setCustomKeybindingHandler('panel-run-dialog',
|
wm.setCustomKeybindingHandler('panel-run-dialog',
|
||||||
Shell.ActionMode.NORMAL |
|
Shell.ActionMode.NORMAL |
|
||||||
Shell.ActionMode.OVERVIEW,
|
Shell.ActionMode.OVERVIEW,
|
||||||
@ -150,8 +156,8 @@ function _initializeUI() {
|
|||||||
// Setup the stage hierarchy early
|
// Setup the stage hierarchy early
|
||||||
layoutManager = new Layout.LayoutManager();
|
layoutManager = new Layout.LayoutManager();
|
||||||
|
|
||||||
// Various parts of the codebase still refers to Main.uiGroup
|
// Various parts of the codebase still refer to Main.uiGroup
|
||||||
// instead using the layoutManager. This keeps that code
|
// instead of using the layoutManager. This keeps that code
|
||||||
// working until it's updated.
|
// working until it's updated.
|
||||||
uiGroup = layoutManager.uiGroup;
|
uiGroup = layoutManager.uiGroup;
|
||||||
|
|
||||||
@ -165,6 +171,8 @@ function _initializeUI() {
|
|||||||
kbdA11yDialog = new KbdA11yDialog.KbdA11yDialog();
|
kbdA11yDialog = new KbdA11yDialog.KbdA11yDialog();
|
||||||
wm = new WindowManager.WindowManager();
|
wm = new WindowManager.WindowManager();
|
||||||
magnifier = new Magnifier.Magnifier();
|
magnifier = new Magnifier.Magnifier();
|
||||||
|
locatePointer = new LocatePointer.LocatePointer();
|
||||||
|
|
||||||
if (LoginManager.canLock())
|
if (LoginManager.canLock())
|
||||||
screenShield = new ScreenShield.ScreenShield();
|
screenShield = new ScreenShield.ScreenShield();
|
||||||
|
|
||||||
@ -183,6 +191,8 @@ function _initializeUI() {
|
|||||||
layoutManager.init();
|
layoutManager.init();
|
||||||
overview.init();
|
overview.init();
|
||||||
|
|
||||||
|
(new PointerA11yTimeout.PointerA11yTimeout());
|
||||||
|
|
||||||
_a11ySettings = new Gio.Settings({ schema_id: A11Y_SCHEMA });
|
_a11ySettings = new Gio.Settings({ schema_id: A11Y_SCHEMA });
|
||||||
|
|
||||||
global.display.connect('overlay-key', () => {
|
global.display.connect('overlay-key', () => {
|
||||||
@ -190,6 +200,10 @@ function _initializeUI() {
|
|||||||
overview.toggle();
|
overview.toggle();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
global.connect('locate-pointer', () => {
|
||||||
|
locatePointer.show();
|
||||||
|
});
|
||||||
|
|
||||||
global.display.connect('show-restart-message', (display, message) => {
|
global.display.connect('show-restart-message', (display, message) => {
|
||||||
showRestartMessage(message);
|
showRestartMessage(message);
|
||||||
return true;
|
return true;
|
||||||
@ -229,14 +243,18 @@ function _initializeUI() {
|
|||||||
}
|
}
|
||||||
if (sessionMode.currentMode != 'gdm' &&
|
if (sessionMode.currentMode != 'gdm' &&
|
||||||
sessionMode.currentMode != 'initial-setup') {
|
sessionMode.currentMode != 'initial-setup') {
|
||||||
Shell.Global.log_structured('GNOME Shell started at ' + _startDate,
|
GLib.log_structured(LOG_DOMAIN, GLib.LogLevelFlags.LEVEL_MESSAGE, {
|
||||||
['MESSAGE_ID=' + GNOMESHELL_STARTED_MESSAGE_ID]);
|
'MESSAGE': `GNOME Shell started at ${_startDate}`,
|
||||||
|
'MESSAGE_ID': GNOMESHELL_STARTED_MESSAGE_ID
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LoginManager.registerSessionWithGDM();
|
||||||
|
|
||||||
let perfModuleName = GLib.getenv("SHELL_PERF_MODULE");
|
let perfModuleName = GLib.getenv("SHELL_PERF_MODULE");
|
||||||
if (perfModuleName) {
|
if (perfModuleName) {
|
||||||
let perfOutput = GLib.getenv("SHELL_PERF_OUTPUT");
|
let perfOutput = GLib.getenv("SHELL_PERF_OUTPUT");
|
||||||
let module = eval('imports.perf.' + perfModuleName + ';');
|
let module = eval(`imports.perf.${perfModuleName};`);
|
||||||
Scripting.runPerfScript(module, perfOutput);
|
Scripting.runPerfScript(module, perfOutput);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -372,9 +390,9 @@ function notify(msg, details) {
|
|||||||
function notifyError(msg, details) {
|
function notifyError(msg, details) {
|
||||||
// Also print to stderr so it's logged somewhere
|
// Also print to stderr so it's logged somewhere
|
||||||
if (details)
|
if (details)
|
||||||
log('error: ' + msg + ': ' + details);
|
log(`error: ${msg}: ${details}`);
|
||||||
else
|
else
|
||||||
log('error: ' + msg);
|
log(`error: ${msg}`);
|
||||||
|
|
||||||
notify(msg, details);
|
notify(msg, details);
|
||||||
}
|
}
|
||||||
@ -457,7 +475,7 @@ function pushModal(actor, params) {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* popModal:
|
* popModal:
|
||||||
* @actor: #ClutterActor passed to original invocation of pushModal().
|
* @actor: #ClutterActor passed to original invocation of pushModal()
|
||||||
* @timestamp: optional timestamp
|
* @timestamp: optional timestamp
|
||||||
*
|
*
|
||||||
* Reverse the effect of pushModal(). If this invocation is undoing
|
* Reverse the effect of pushModal(). If this invocation is undoing
|
||||||
@ -636,15 +654,15 @@ function _queueBeforeRedraw(workId) {
|
|||||||
* initialization as well, under the assumption that new actors
|
* initialization as well, under the assumption that new actors
|
||||||
* will need it.
|
* will need it.
|
||||||
*
|
*
|
||||||
* Returns: A string work identifer
|
* Returns: A string work identifier
|
||||||
*/
|
*/
|
||||||
function initializeDeferredWork(actor, callback, props) {
|
function initializeDeferredWork(actor, callback, props) {
|
||||||
// Turn into a string so we can use as an object property
|
// Turn into a string so we can use as an object property
|
||||||
let workId = '' + (++_deferredWorkSequence);
|
let workId = `${(++_deferredWorkSequence)}`;
|
||||||
_deferredWorkData[workId] = { 'actor': actor,
|
_deferredWorkData[workId] = { 'actor': actor,
|
||||||
'callback': callback };
|
'callback': callback };
|
||||||
actor.connect('notify::mapped', () => {
|
actor.connect('notify::mapped', () => {
|
||||||
if (!(actor.mapped && _deferredWorkQueue.indexOf(workId) >= 0))
|
if (!(actor.mapped && _deferredWorkQueue.includes(workId)))
|
||||||
return;
|
return;
|
||||||
_queueBeforeRedraw(workId);
|
_queueBeforeRedraw(workId);
|
||||||
});
|
});
|
||||||
@ -674,7 +692,7 @@ function queueDeferredWork(workId) {
|
|||||||
logError(new Error(message), message);
|
logError(new Error(message), message);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (_deferredWorkQueue.indexOf(workId) < 0)
|
if (!_deferredWorkQueue.includes(workId))
|
||||||
_deferredWorkQueue.push(workId);
|
_deferredWorkQueue.push(workId);
|
||||||
if (data.actor.mapped) {
|
if (data.actor.mapped) {
|
||||||
_queueBeforeRedraw(workId);
|
_queueBeforeRedraw(workId);
|
||||||
@ -689,9 +707,10 @@ function queueDeferredWork(workId) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var RestartMessage = class extends ModalDialog.ModalDialog {
|
var RestartMessage = GObject.registerClass(
|
||||||
constructor(message) {
|
class RestartMessage extends ModalDialog.ModalDialog {
|
||||||
super({ shellReactive: true,
|
_init(message) {
|
||||||
|
super._init({ shellReactive: true,
|
||||||
styleClass: 'restart-message headline',
|
styleClass: 'restart-message headline',
|
||||||
shouldFadeIn: false,
|
shouldFadeIn: false,
|
||||||
destroyOnClose: true });
|
destroyOnClose: true });
|
||||||
@ -704,7 +723,7 @@ var RestartMessage = class extends ModalDialog.ModalDialog {
|
|||||||
y_align: St.Align.MIDDLE });
|
y_align: St.Align.MIDDLE });
|
||||||
this.buttonLayout.hide();
|
this.buttonLayout.hide();
|
||||||
}
|
}
|
||||||
};
|
});
|
||||||
|
|
||||||
function showRestartMessage(message) {
|
function showRestartMessage(message) {
|
||||||
let restartMessage = new RestartMessage(message);
|
let restartMessage = new RestartMessage(message);
|
||||||
|
@ -72,7 +72,7 @@ var URLHighlighter = class URLHighlighter {
|
|||||||
let urlId = this._findUrlAtPos(event);
|
let urlId = this._findUrlAtPos(event);
|
||||||
if (urlId != -1) {
|
if (urlId != -1) {
|
||||||
let url = this._urls[urlId].url;
|
let url = this._urls[urlId].url;
|
||||||
if (url.indexOf(':') == -1)
|
if (!url.includes(':'))
|
||||||
url = 'http://' + url;
|
url = 'http://' + url;
|
||||||
|
|
||||||
Gio.app_info_launch_default_for_uri(url, global.create_app_launch_context(0, -1));
|
Gio.app_info_launch_default_for_uri(url, global.create_app_launch_context(0, -1));
|
||||||
@ -135,17 +135,17 @@ var URLHighlighter = class URLHighlighter {
|
|||||||
let success;
|
let success;
|
||||||
let [x, y] = event.get_coords();
|
let [x, y] = event.get_coords();
|
||||||
[success, x, y] = this.actor.transform_stage_point(x, y);
|
[success, x, y] = this.actor.transform_stage_point(x, y);
|
||||||
let find_pos = -1;
|
let findPos = -1;
|
||||||
for (let i = 0; i < this.actor.clutter_text.text.length; i++) {
|
for (let i = 0; i < this.actor.clutter_text.text.length; i++) {
|
||||||
let [success, px, py, line_height] = this.actor.clutter_text.position_to_coords(i);
|
let [success, px, py, lineHeight] = this.actor.clutter_text.position_to_coords(i);
|
||||||
if (py > y || py + line_height < y || x < px)
|
if (py > y || py + lineHeight < y || x < px)
|
||||||
continue;
|
continue;
|
||||||
find_pos = i;
|
findPos = i;
|
||||||
}
|
}
|
||||||
if (find_pos != -1) {
|
if (findPos != -1) {
|
||||||
for (let i = 0; i < this._urls.length; i++)
|
for (let i = 0; i < this._urls.length; i++)
|
||||||
if (find_pos >= this._urls[i].pos &&
|
if (findPos >= this._urls[i].pos &&
|
||||||
this._urls[i].pos + this._urls[i].url.length > find_pos)
|
this._urls[i].pos + this._urls[i].url.length > findPos)
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
@ -197,12 +197,14 @@ class ScaleLayout extends Clutter.BinLayout {
|
|||||||
});
|
});
|
||||||
|
|
||||||
var LabelExpanderLayout = GObject.registerClass({
|
var LabelExpanderLayout = GObject.registerClass({
|
||||||
Properties: { 'expansion': GObject.ParamSpec.double('expansion',
|
Properties: {
|
||||||
|
'expansion': GObject.ParamSpec.double('expansion',
|
||||||
'Expansion',
|
'Expansion',
|
||||||
'Expansion of the layout, between 0 (collapsed) ' +
|
'Expansion of the layout, between 0 (collapsed) ' +
|
||||||
'and 1 (fully expanded',
|
'and 1 (fully expanded',
|
||||||
GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE,
|
GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE,
|
||||||
0, 1, 0)},
|
0, 1, 0)
|
||||||
|
},
|
||||||
}, class LabelExpanderLayout extends Clutter.LayoutManager {
|
}, class LabelExpanderLayout extends Clutter.LayoutManager {
|
||||||
_init(params) {
|
_init(params) {
|
||||||
this._expansion = 0;
|
this._expansion = 0;
|
||||||
@ -467,8 +469,7 @@ var Message = class Message {
|
|||||||
{ scale_y: 0,
|
{ scale_y: 0,
|
||||||
time: MessageTray.ANIMATION_TIME,
|
time: MessageTray.ANIMATION_TIME,
|
||||||
transition: 'easeOutQuad',
|
transition: 'easeOutQuad',
|
||||||
onCompleteScope: this,
|
onComplete: () => {
|
||||||
onComplete() {
|
|
||||||
this._actionBin.hide();
|
this._actionBin.hide();
|
||||||
this.expanded = false;
|
this.expanded = false;
|
||||||
} });
|
} });
|
||||||
|
@ -218,17 +218,17 @@ class NotificationApplicationPolicy extends NotificationPolicy {
|
|||||||
|
|
||||||
this._masterSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.notifications' });
|
this._masterSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.notifications' });
|
||||||
this._settings = new Gio.Settings({ schema_id: 'org.gnome.desktop.notifications.application',
|
this._settings = new Gio.Settings({ schema_id: 'org.gnome.desktop.notifications.application',
|
||||||
path: '/org/gnome/desktop/notifications/application/' + this._canonicalId + '/' });
|
path: `/org/gnome/desktop/notifications/application/${this._canonicalId}/` });
|
||||||
|
|
||||||
this._masterSettings.connect('changed', this._changed.bind(this));
|
this._masterSettings.connect('changed', this._changed.bind(this));
|
||||||
this._settings.connect('changed', this._changed.bind(this));
|
this._settings.connect('changed', this._changed.bind(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
store() {
|
store() {
|
||||||
this._settings.set_string('application-id', this.id + '.desktop');
|
this._settings.set_string('application-id', `${this.id}.desktop`);
|
||||||
|
|
||||||
let apps = this._masterSettings.get_strv('application-children');
|
let apps = this._masterSettings.get_strv('application-children');
|
||||||
if (apps.indexOf(this._canonicalId) < 0) {
|
if (!apps.includes(this._canonicalId)) {
|
||||||
apps.push(this._canonicalId);
|
apps.push(this._canonicalId);
|
||||||
this._masterSettings.set_strv('application-children', apps);
|
this._masterSettings.set_strv('application-children', apps);
|
||||||
}
|
}
|
||||||
@ -248,7 +248,7 @@ class NotificationApplicationPolicy extends NotificationPolicy {
|
|||||||
_canonicalizeId(id) {
|
_canonicalizeId(id) {
|
||||||
// Keys are restricted to lowercase alphanumeric characters and dash,
|
// Keys are restricted to lowercase alphanumeric characters and dash,
|
||||||
// and two dashes cannot be in succession
|
// and two dashes cannot be in succession
|
||||||
return id.toLowerCase().replace(/[^a-z0-9\-]/g, '-').replace(/--+/g, '-');
|
return id.toLowerCase().replace(/[^a-z0-9-]/g, '-').replace(/--+/g, '-');
|
||||||
}
|
}
|
||||||
|
|
||||||
get enable() {
|
get enable() {
|
||||||
@ -584,18 +584,17 @@ class SourceActor extends St.Widget {
|
|||||||
this._source = source;
|
this._source = source;
|
||||||
this._size = size;
|
this._size = size;
|
||||||
|
|
||||||
this.actor = this;
|
|
||||||
this.connect('destroy', () => {
|
this.connect('destroy', () => {
|
||||||
this._source.disconnect(this._iconUpdatedId);
|
this._source.disconnect(this._iconUpdatedId);
|
||||||
this._actorDestroyed = true;
|
this._actorDestroyed = true;
|
||||||
});
|
});
|
||||||
this._actorDestroyed = false;
|
this._actorDestroyed = false;
|
||||||
|
|
||||||
let scale_factor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
||||||
this._iconBin = new St.Bin({ x_fill: true,
|
this._iconBin = new St.Bin({ x_fill: true,
|
||||||
x_expand: true,
|
x_expand: true,
|
||||||
height: size * scale_factor,
|
height: size * scaleFactor,
|
||||||
width: size * scale_factor });
|
width: size * scaleFactor });
|
||||||
|
|
||||||
this.add_actor(this._iconBin);
|
this.add_actor(this._iconBin);
|
||||||
|
|
||||||
@ -773,7 +772,7 @@ var Source = class Source {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pushNotification(notification) {
|
pushNotification(notification) {
|
||||||
if (this.notifications.indexOf(notification) >= 0)
|
if (this.notifications.includes(notification))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
while (this.notifications.length >= MAX_NOTIFICATIONS_PER_SOURCE)
|
while (this.notifications.length >= MAX_NOTIFICATIONS_PER_SOURCE)
|
||||||
@ -989,7 +988,7 @@ var MessageTray = class MessageTray {
|
|||||||
|
|
||||||
add(source) {
|
add(source) {
|
||||||
if (this.contains(source)) {
|
if (this.contains(source)) {
|
||||||
log('Trying to re-add source ' + source.title);
|
log(`Trying to re-add source ${source.title}`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1070,7 +1069,7 @@ var MessageTray = class MessageTray {
|
|||||||
// If a new notification is updated while it is being hidden,
|
// If a new notification is updated while it is being hidden,
|
||||||
// we stop hiding it and show it again.
|
// we stop hiding it and show it again.
|
||||||
this._updateShowingNotification();
|
this._updateShowingNotification();
|
||||||
} else if (this._notificationQueue.indexOf(notification) < 0) {
|
} else if (!this._notificationQueue.includes(notification)) {
|
||||||
// If the queue is "full", we skip banner mode and just show a small
|
// If the queue is "full", we skip banner mode and just show a small
|
||||||
// indicator in the panel; however do make an exception for CRITICAL
|
// indicator in the panel; however do make an exception for CRITICAL
|
||||||
// notifications, as only banner mode allows expansion.
|
// notifications, as only banner mode allows expansion.
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
|
||||||
const { Atk, Clutter, Shell, St } = imports.gi;
|
const { Atk, Clutter, GObject, Shell, St } = imports.gi;
|
||||||
const Signals = imports.signals;
|
|
||||||
|
|
||||||
const Dialog = imports.ui.dialog;
|
const Dialog = imports.ui.dialog;
|
||||||
const Layout = imports.ui.layout;
|
const Layout = imports.ui.layout;
|
||||||
@ -21,8 +20,22 @@ var State = {
|
|||||||
FADED_OUT: 4
|
FADED_OUT: 4
|
||||||
};
|
};
|
||||||
|
|
||||||
var ModalDialog = class {
|
var ModalDialog = GObject.registerClass({
|
||||||
constructor(params) {
|
Properties: {
|
||||||
|
'state': GObject.ParamSpec.int('state', 'Dialog state', 'state',
|
||||||
|
GObject.ParamFlags.READABLE,
|
||||||
|
Math.min(...Object.values(State)),
|
||||||
|
Math.max(...Object.values(State)),
|
||||||
|
State.CLOSED)
|
||||||
|
},
|
||||||
|
Signals: { 'opened': {}, 'closed': {} }
|
||||||
|
}, class ModalDialog extends St.Widget {
|
||||||
|
_init(params) {
|
||||||
|
super._init({ visible: false,
|
||||||
|
x: 0,
|
||||||
|
y: 0,
|
||||||
|
accessible_role: Atk.Role.DIALOG });
|
||||||
|
|
||||||
params = Params.parse(params, { shellReactive: false,
|
params = Params.parse(params, { shellReactive: false,
|
||||||
styleClass: null,
|
styleClass: null,
|
||||||
actionMode: Shell.ActionMode.SYSTEM_MODAL,
|
actionMode: Shell.ActionMode.SYSTEM_MODAL,
|
||||||
@ -30,7 +43,7 @@ var ModalDialog = class {
|
|||||||
shouldFadeOut: true,
|
shouldFadeOut: true,
|
||||||
destroyOnClose: true });
|
destroyOnClose: true });
|
||||||
|
|
||||||
this.state = State.CLOSED;
|
this._state = State.CLOSED;
|
||||||
this._hasModal = false;
|
this._hasModal = false;
|
||||||
this._actionMode = params.actionMode;
|
this._actionMode = params.actionMode;
|
||||||
this._shellReactive = params.shellReactive;
|
this._shellReactive = params.shellReactive;
|
||||||
@ -38,31 +51,25 @@ var ModalDialog = class {
|
|||||||
this._shouldFadeOut = params.shouldFadeOut;
|
this._shouldFadeOut = params.shouldFadeOut;
|
||||||
this._destroyOnClose = params.destroyOnClose;
|
this._destroyOnClose = params.destroyOnClose;
|
||||||
|
|
||||||
this._group = new St.Widget({ visible: false,
|
Main.layoutManager.modalDialogGroup.add_actor(this);
|
||||||
x: 0,
|
|
||||||
y: 0,
|
|
||||||
accessible_role: Atk.Role.DIALOG });
|
|
||||||
Main.layoutManager.modalDialogGroup.add_actor(this._group);
|
|
||||||
|
|
||||||
let constraint = new Clutter.BindConstraint({ source: global.stage,
|
let constraint = new Clutter.BindConstraint({ source: global.stage,
|
||||||
coordinate: Clutter.BindCoordinate.ALL });
|
coordinate: Clutter.BindCoordinate.ALL });
|
||||||
this._group.add_constraint(constraint);
|
this.add_constraint(constraint);
|
||||||
|
|
||||||
this._group.connect('destroy', this._onGroupDestroy.bind(this));
|
|
||||||
|
|
||||||
this.backgroundStack = new St.Widget({ layout_manager: new Clutter.BinLayout() });
|
this.backgroundStack = new St.Widget({ layout_manager: new Clutter.BinLayout() });
|
||||||
this._backgroundBin = new St.Bin({ child: this.backgroundStack,
|
this._backgroundBin = new St.Bin({ child: this.backgroundStack,
|
||||||
x_fill: true, y_fill: true });
|
x_fill: true, y_fill: true });
|
||||||
this._monitorConstraint = new Layout.MonitorConstraint();
|
this._monitorConstraint = new Layout.MonitorConstraint();
|
||||||
this._backgroundBin.add_constraint(this._monitorConstraint);
|
this._backgroundBin.add_constraint(this._monitorConstraint);
|
||||||
this._group.add_actor(this._backgroundBin);
|
this.add_actor(this._backgroundBin);
|
||||||
|
|
||||||
this.dialogLayout = new Dialog.Dialog(this.backgroundStack, params.styleClass);
|
this.dialogLayout = new Dialog.Dialog(this.backgroundStack, params.styleClass);
|
||||||
this.contentLayout = this.dialogLayout.contentLayout;
|
this.contentLayout = this.dialogLayout.contentLayout;
|
||||||
this.buttonLayout = this.dialogLayout.buttonLayout;
|
this.buttonLayout = this.dialogLayout.buttonLayout;
|
||||||
|
|
||||||
if (!this._shellReactive) {
|
if (!this._shellReactive) {
|
||||||
this._lightbox = new Lightbox.Lightbox(this._group,
|
this._lightbox = new Lightbox.Lightbox(this,
|
||||||
{ inhibitEvents: true,
|
{ inhibitEvents: true,
|
||||||
radialEffect: true });
|
radialEffect: true });
|
||||||
this._lightbox.highlight(this._backgroundBin);
|
this._lightbox.highlight(this._backgroundBin);
|
||||||
@ -77,8 +84,16 @@ var ModalDialog = class {
|
|||||||
this._savedKeyFocus = null;
|
this._savedKeyFocus = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
destroy() {
|
get state() {
|
||||||
this._group.destroy();
|
return this._state;
|
||||||
|
}
|
||||||
|
|
||||||
|
_setState(state) {
|
||||||
|
if (this._state == state)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._state = state;
|
||||||
|
this.notify('state');
|
||||||
}
|
}
|
||||||
|
|
||||||
clearButtons() {
|
clearButtons() {
|
||||||
@ -96,29 +111,25 @@ var ModalDialog = class {
|
|||||||
return this.dialogLayout.addButton(buttonInfo);
|
return this.dialogLayout.addButton(buttonInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
_onGroupDestroy() {
|
|
||||||
this.emit('destroy');
|
|
||||||
}
|
|
||||||
|
|
||||||
_fadeOpen(onPrimary) {
|
_fadeOpen(onPrimary) {
|
||||||
if (onPrimary)
|
if (onPrimary)
|
||||||
this._monitorConstraint.primary = true;
|
this._monitorConstraint.primary = true;
|
||||||
else
|
else
|
||||||
this._monitorConstraint.index = global.display.get_current_monitor();
|
this._monitorConstraint.index = global.display.get_current_monitor();
|
||||||
|
|
||||||
this.state = State.OPENING;
|
this._setState(State.OPENING);
|
||||||
|
|
||||||
this.dialogLayout.opacity = 255;
|
this.dialogLayout.opacity = 255;
|
||||||
if (this._lightbox)
|
if (this._lightbox)
|
||||||
this._lightbox.show();
|
this._lightbox.show();
|
||||||
this._group.opacity = 0;
|
this.opacity = 0;
|
||||||
this._group.show();
|
this.show();
|
||||||
Tweener.addTween(this._group,
|
Tweener.addTween(this,
|
||||||
{ opacity: 255,
|
{ opacity: 255,
|
||||||
time: this._shouldFadeIn ? OPEN_AND_CLOSE_TIME : 0,
|
time: this._shouldFadeIn ? OPEN_AND_CLOSE_TIME : 0,
|
||||||
transition: 'easeOutQuad',
|
transition: 'easeOutQuad',
|
||||||
onComplete: () => {
|
onComplete: () => {
|
||||||
this.state = State.OPENED;
|
this._setState(State.OPENED);
|
||||||
this.emit('opened');
|
this.emit('opened');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -148,8 +159,8 @@ var ModalDialog = class {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_closeComplete() {
|
_closeComplete() {
|
||||||
this.state = State.CLOSED;
|
this._setState(State.CLOSED);
|
||||||
this._group.hide();
|
this.hide();
|
||||||
this.emit('closed');
|
this.emit('closed');
|
||||||
|
|
||||||
if (this._destroyOnClose)
|
if (this._destroyOnClose)
|
||||||
@ -160,17 +171,17 @@ var ModalDialog = class {
|
|||||||
if (this.state == State.CLOSED || this.state == State.CLOSING)
|
if (this.state == State.CLOSED || this.state == State.CLOSING)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
this.state = State.CLOSING;
|
this._setState(State.CLOSING);
|
||||||
this.popModal(timestamp);
|
this.popModal(timestamp);
|
||||||
this._savedKeyFocus = null;
|
this._savedKeyFocus = null;
|
||||||
|
|
||||||
if (this._shouldFadeOut)
|
if (this._shouldFadeOut)
|
||||||
Tweener.addTween(this._group,
|
Tweener.addTween(this,
|
||||||
{ opacity: 0,
|
{ opacity: 0,
|
||||||
time: OPEN_AND_CLOSE_TIME,
|
time: OPEN_AND_CLOSE_TIME,
|
||||||
transition: 'easeOutQuad',
|
transition: 'easeOutQuad',
|
||||||
onComplete: this._closeComplete.bind(this)
|
onComplete: this._closeComplete.bind(this)
|
||||||
})
|
});
|
||||||
else
|
else
|
||||||
this._closeComplete();
|
this._closeComplete();
|
||||||
}
|
}
|
||||||
@ -183,11 +194,11 @@ var ModalDialog = class {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
let focus = global.stage.key_focus;
|
let focus = global.stage.key_focus;
|
||||||
if (focus && this._group.contains(focus))
|
if (focus && this.contains(focus))
|
||||||
this._savedKeyFocus = focus;
|
this._savedKeyFocus = focus;
|
||||||
else
|
else
|
||||||
this._savedKeyFocus = null;
|
this._savedKeyFocus = null;
|
||||||
Main.popModal(this._group, timestamp);
|
Main.popModal(this, timestamp);
|
||||||
this._hasModal = false;
|
this._hasModal = false;
|
||||||
|
|
||||||
if (!this._shellReactive)
|
if (!this._shellReactive)
|
||||||
@ -201,7 +212,7 @@ var ModalDialog = class {
|
|||||||
let params = { actionMode: this._actionMode };
|
let params = { actionMode: this._actionMode };
|
||||||
if (timestamp)
|
if (timestamp)
|
||||||
params['timestamp'] = timestamp;
|
params['timestamp'] = timestamp;
|
||||||
if (!Main.pushModal(this._group, params))
|
if (!Main.pushModal(this, params))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
this._hasModal = true;
|
this._hasModal = true;
|
||||||
@ -224,10 +235,10 @@ var ModalDialog = class {
|
|||||||
// can be dismissed by a close call.
|
// can be dismissed by a close call.
|
||||||
//
|
//
|
||||||
// The main point of this method is to give some indication to the user
|
// 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.
|
// moments before being processed.
|
||||||
// e.g., if a user clicked "Log Out" then the dialog should go away
|
// 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.
|
// complete.
|
||||||
_fadeOutDialog(timestamp) {
|
_fadeOutDialog(timestamp) {
|
||||||
if (this.state == State.CLOSED || this.state == State.CLOSING)
|
if (this.state == State.CLOSED || this.state == State.CLOSING)
|
||||||
@ -242,9 +253,8 @@ var ModalDialog = class {
|
|||||||
time: FADE_OUT_DIALOG_TIME,
|
time: FADE_OUT_DIALOG_TIME,
|
||||||
transition: 'easeOutQuad',
|
transition: 'easeOutQuad',
|
||||||
onComplete: () => {
|
onComplete: () => {
|
||||||
this.state = State.FADED_OUT;
|
this._setState(State.FADED_OUT);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
});
|
||||||
Signals.addSignalMethods(ModalDialog.prototype);
|
|
||||||
|
@ -135,7 +135,7 @@ var MprisPlayer = class MprisPlayer {
|
|||||||
// so prefer activating the app via .desktop file if possible
|
// so prefer activating the app via .desktop file if possible
|
||||||
let app = null;
|
let app = null;
|
||||||
if (this._mprisProxy.DesktopEntry) {
|
if (this._mprisProxy.DesktopEntry) {
|
||||||
let desktopId = this._mprisProxy.DesktopEntry + '.desktop';
|
let desktopId = `${this._mprisProxy.DesktopEntry}.desktop`;
|
||||||
app = Shell.AppSystem.get_default().lookup_app(desktopId);
|
app = Shell.AppSystem.get_default().lookup_app(desktopId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -170,11 +170,11 @@ var FdoNotificationDaemon = class FdoNotificationDaemon {
|
|||||||
// Ignore replacesId since we already sent back a
|
// Ignore replacesId since we already sent back a
|
||||||
// NotificationClosed for that id.
|
// NotificationClosed for that id.
|
||||||
id = this._nextNotificationId++;
|
id = this._nextNotificationId++;
|
||||||
let idle_id = Mainloop.idle_add(() => {
|
let idleId = Mainloop.idle_add(() => {
|
||||||
this._emitNotificationClosed(id, NotificationClosedReason.DISMISSED);
|
this._emitNotificationClosed(id, NotificationClosedReason.DISMISSED);
|
||||||
return GLib.SOURCE_REMOVE;
|
return GLib.SOURCE_REMOVE;
|
||||||
});
|
});
|
||||||
GLib.Source.set_name_by_id(idle_id, '[gnome-shell] this._emitNotificationClosed');
|
GLib.Source.set_name_by_id(idleId, '[gnome-shell] this._emitNotificationClosed');
|
||||||
return invocation.return_value(GLib.Variant.new('(u)', [id]));
|
return invocation.return_value(GLib.Variant.new('(u)', [id]));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -231,7 +231,7 @@ var FdoNotificationDaemon = class FdoNotificationDaemon {
|
|||||||
// There's already a pending call to GetConnectionUnixProcessID,
|
// There's already a pending call to GetConnectionUnixProcessID,
|
||||||
// which will see the new notification data when it finishes,
|
// which will see the new notification data when it finishes,
|
||||||
// so we don't have to do anything.
|
// so we don't have to do anything.
|
||||||
return invocation.return_value(GLib.Variant.new('(u)', [id]));;
|
return invocation.return_value(GLib.Variant.new('(u)', [id]));
|
||||||
}
|
}
|
||||||
|
|
||||||
this._busProxy.GetConnectionUnixProcessIDRemote(sender, (result, excp) => {
|
this._busProxy.GetConnectionUnixProcessIDRemote(sender, (result, excp) => {
|
||||||
@ -474,7 +474,7 @@ class FdoNotificationDaemonSource extends MessageTray.Source {
|
|||||||
return app;
|
return app;
|
||||||
|
|
||||||
if (appId) {
|
if (appId) {
|
||||||
app = Shell.AppSystem.get_default().lookup_app(appId + '.desktop');
|
app = Shell.AppSystem.get_default().lookup_app(`${appId}.desktop`);
|
||||||
if (app != null)
|
if (app != null)
|
||||||
return app;
|
return app;
|
||||||
}
|
}
|
||||||
@ -610,7 +610,7 @@ function objectPathFromAppId(appId) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function getPlatformData() {
|
function getPlatformData() {
|
||||||
let startupId = GLib.Variant.new('s', '_TIME' + global.get_current_time());
|
let startupId = GLib.Variant.new('s', `_TIME${global.get_current_time()}`);
|
||||||
return { "desktop-startup-id": startupId };
|
return { "desktop-startup-id": startupId };
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -623,7 +623,7 @@ class GtkNotificationDaemonAppSource extends MessageTray.Source {
|
|||||||
if (!GLib.Variant.is_object_path(objectPath))
|
if (!GLib.Variant.is_object_path(objectPath))
|
||||||
throw new InvalidAppError();
|
throw new InvalidAppError();
|
||||||
|
|
||||||
let app = Shell.AppSystem.get_default().lookup_app(appId + '.desktop');
|
let app = Shell.AppSystem.get_default().lookup_app(`${appId}.desktop`);
|
||||||
if (!app)
|
if (!app)
|
||||||
throw new InvalidAppError();
|
throw new InvalidAppError();
|
||||||
|
|
||||||
|
@ -4,8 +4,6 @@ const { Clutter, Gio, Meta, St } = imports.gi;
|
|||||||
|
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
|
|
||||||
var FADE_TIME = 0.1;
|
|
||||||
|
|
||||||
var OsdMonitorLabel = class {
|
var OsdMonitorLabel = class {
|
||||||
constructor(monitor, label) {
|
constructor(monitor, label) {
|
||||||
this._actor = new St.Widget({ x_expand: true,
|
this._actor = new St.Widget({ x_expand: true,
|
||||||
|
@ -21,7 +21,7 @@ var LevelBar = class extends BarLevel.BarLevel {
|
|||||||
|
|
||||||
this.actor.accessible_name = _("Volume");
|
this.actor.accessible_name = _("Volume");
|
||||||
|
|
||||||
this.actor.connect('notify::width', () => { this.level = this.level; });
|
this.actor.connect('notify::width', () => this.level = this.level);
|
||||||
}
|
}
|
||||||
|
|
||||||
get level() {
|
get level() {
|
||||||
|
@ -18,7 +18,7 @@ function getRtlSlideDirection(direction, actor) {
|
|||||||
SlideDirection.RIGHT : SlideDirection.LEFT;
|
SlideDirection.RIGHT : SlideDirection.LEFT;
|
||||||
|
|
||||||
return direction;
|
return direction;
|
||||||
};
|
}
|
||||||
|
|
||||||
var SlideDirection = {
|
var SlideDirection = {
|
||||||
LEFT: 0,
|
LEFT: 0,
|
||||||
@ -122,7 +122,7 @@ var SlidingControl = class {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_getSlide() {
|
_getSlide() {
|
||||||
throw new Error('getSlide() must be overridden');
|
throw new GObject.NotImplementedError(`_getSlide in ${this.constructor.name}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
_updateSlide() {
|
_updateSlide() {
|
||||||
@ -133,7 +133,7 @@ var SlidingControl = class {
|
|||||||
|
|
||||||
getVisibleWidth() {
|
getVisibleWidth() {
|
||||||
let child = this.actor.get_first_child();
|
let child = this.actor.get_first_child();
|
||||||
let [, , natWidth, ] = child.get_preferred_size();
|
let [, , natWidth] = child.get_preferred_size();
|
||||||
return natWidth;
|
return natWidth;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -369,17 +369,15 @@ class DashSpacer extends St.Widget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
vfunc_get_preferred_width(forHeight) {
|
vfunc_get_preferred_width(forHeight) {
|
||||||
let box = this.get_allocation_box();
|
if (this._bindConstraint)
|
||||||
let minWidth = super.vfunc_get_preferred_width(forHeight)[0];
|
return this._bindConstraint.source.get_preferred_width(forHeight);
|
||||||
let natWidth = box.x2 - box.x1;
|
return super.vfunc_get_preferred_width(forHeight);
|
||||||
return [minWidth, natWidth];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
vfunc_get_preferred_height(forWidth) {
|
vfunc_get_preferred_height(forWidth) {
|
||||||
let box = this.get_allocation_box();
|
if (this._bindConstraint)
|
||||||
let minHeight = super.vfunc_get_preferred_height(forWidth)[0];
|
return this._bindConstraint.source.get_preferred_height(forWidth);
|
||||||
let natHeight = box.y2 - box.y1;
|
return super.vfunc_get_preferred_height(forWidth);
|
||||||
return [minHeight, natHeight];
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -121,7 +121,7 @@ var ActionComboBox = class {
|
|||||||
this.actor.set_child(box);
|
this.actor.set_child(box);
|
||||||
|
|
||||||
this._label = new St.Label({ style_class: 'combo-box-label' });
|
this._label = new St.Label({ style_class: 'combo-box-label' });
|
||||||
box.add_child(this._label)
|
box.add_child(this._label);
|
||||||
|
|
||||||
let arrow = new St.Icon({ style_class: 'popup-menu-arrow',
|
let arrow = new St.Icon({ style_class: 'popup-menu-arrow',
|
||||||
icon_name: 'pan-down-symbolic',
|
icon_name: 'pan-down-symbolic',
|
||||||
@ -186,7 +186,7 @@ var ActionComboBox = class {
|
|||||||
}
|
}
|
||||||
|
|
||||||
setButtonActionsActive(active) {
|
setButtonActionsActive(active) {
|
||||||
this._buttonItems.forEach(item => { item.setSensitive(active); });
|
this._buttonItems.forEach(item => item.setSensitive(active));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
Signals.addSignalMethods(ActionComboBox.prototype);
|
Signals.addSignalMethods(ActionComboBox.prototype);
|
||||||
@ -275,7 +275,8 @@ var ActionEditor = class {
|
|||||||
Signals.addSignalMethods(ActionEditor.prototype);
|
Signals.addSignalMethods(ActionEditor.prototype);
|
||||||
|
|
||||||
var PadDiagram = GObject.registerClass({
|
var PadDiagram = GObject.registerClass({
|
||||||
Properties: { 'left-handed': GObject.ParamSpec.boolean('left-handed',
|
Properties: {
|
||||||
|
'left-handed': GObject.ParamSpec.boolean('left-handed',
|
||||||
'left-handed', 'Left handed',
|
'left-handed', 'Left handed',
|
||||||
GObject.ParamFlags.READWRITE |
|
GObject.ParamFlags.READWRITE |
|
||||||
GObject.ParamFlags.CONSTRUCT_ONLY,
|
GObject.ParamFlags.CONSTRUCT_ONLY,
|
||||||
@ -289,7 +290,8 @@ var PadDiagram = GObject.registerClass({
|
|||||||
'Editor actor',
|
'Editor actor',
|
||||||
GObject.ParamFlags.READWRITE |
|
GObject.ParamFlags.READWRITE |
|
||||||
GObject.ParamFlags.CONSTRUCT_ONLY,
|
GObject.ParamFlags.CONSTRUCT_ONLY,
|
||||||
Clutter.Actor.$gtype) },
|
Clutter.Actor.$gtype)
|
||||||
|
},
|
||||||
}, class PadDiagram extends St.DrawingArea {
|
}, class PadDiagram extends St.DrawingArea {
|
||||||
_init(params) {
|
_init(params) {
|
||||||
let file = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/pad-osd.css');
|
let file = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/pad-osd.css');
|
||||||
@ -340,7 +342,7 @@ var PadDiagram = GObject.registerClass({
|
|||||||
return ('<?xml version="1.0" encoding="UTF-8" standalone="no"?>' +
|
return ('<?xml version="1.0" encoding="UTF-8" standalone="no"?>' +
|
||||||
'<svg version="1.1" xmlns="http://www.w3.org/2000/svg" ' +
|
'<svg version="1.1" xmlns="http://www.w3.org/2000/svg" ' +
|
||||||
'xmlns:xi="http://www.w3.org/2001/XInclude" ' +
|
'xmlns:xi="http://www.w3.org/2001/XInclude" ' +
|
||||||
'width="' + this._imageWidth + '" height="' + this._imageHeight + '"> ' +
|
`width="${this._imageWidth}" height="${this._imageHeight}"> ` +
|
||||||
'<style type="text/css">');
|
'<style type="text/css">');
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -355,10 +357,10 @@ var PadDiagram = GObject.registerClass({
|
|||||||
|
|
||||||
for (let i = 0; i < this._activeButtons.length; i++) {
|
for (let i = 0; i < this._activeButtons.length; i++) {
|
||||||
let ch = String.fromCharCode('A'.charCodeAt() + this._activeButtons[i]);
|
let ch = String.fromCharCode('A'.charCodeAt() + this._activeButtons[i]);
|
||||||
css += ('.' + ch + ' { ' +
|
css += `.${ch} {
|
||||||
' stroke: ' + ACTIVE_COLOR + ' !important; ' +
|
stroke: ${ACTIVE_COLOR} !important;
|
||||||
' fill: ' + ACTIVE_COLOR + ' !important; ' +
|
fill: ${ACTIVE_COLOR} !important;
|
||||||
'} ');
|
}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
return css;
|
return css;
|
||||||
@ -374,12 +376,12 @@ var PadDiagram = GObject.registerClass({
|
|||||||
svgData += this._cssString();
|
svgData += this._cssString();
|
||||||
svgData += this._wrappingSvgFooter();
|
svgData += this._wrappingSvgFooter();
|
||||||
|
|
||||||
let handle = new Rsvg.Handle();
|
let istream = new Gio.MemoryInputStream();
|
||||||
handle.set_base_uri(GLib.path_get_dirname(this._imagePath));
|
istream.add_bytes(new GLib.Bytes(svgData));
|
||||||
handle.write(svgData);
|
|
||||||
handle.close();
|
|
||||||
|
|
||||||
return handle;
|
return Rsvg.Handle.new_from_stream_sync(istream,
|
||||||
|
Gio.File.new_for_path(this._imagePath),
|
||||||
|
0, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
_updateDiagramScale() {
|
_updateDiagramScale() {
|
||||||
@ -457,7 +459,7 @@ var PadDiagram = GObject.registerClass({
|
|||||||
// I miss Cairo.Matrix
|
// I miss Cairo.Matrix
|
||||||
let dimensions = this._handle.get_dimensions();
|
let dimensions = this._handle.get_dimensions();
|
||||||
x = x * this._scale + this._actorWidth / 2 - dimensions.width / 2 * this._scale;
|
x = x * this._scale + this._actorWidth / 2 - dimensions.width / 2 * this._scale;
|
||||||
y = y * this._scale + this._actorHeight / 2 - dimensions.height / 2 * this._scale;;
|
y = y * this._scale + this._actorHeight / 2 - dimensions.height / 2 * this._scale;
|
||||||
return [Math.round(x), Math.round(y)];
|
return [Math.round(x), Math.round(y)];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -468,12 +470,12 @@ var PadDiagram = GObject.registerClass({
|
|||||||
let leaderPos, leaderSize, pos;
|
let leaderPos, leaderSize, pos;
|
||||||
let found, direction;
|
let found, direction;
|
||||||
|
|
||||||
[found, pos] = this._handle.get_position_sub('#' + labelName);
|
[found, pos] = this._handle.get_position_sub(`#${labelName}`);
|
||||||
if (!found)
|
if (!found)
|
||||||
return [false];
|
return [false];
|
||||||
|
|
||||||
[found, leaderPos] = this._handle.get_position_sub('#' + leaderName);
|
[found, leaderPos] = this._handle.get_position_sub(`#${leaderName}`);
|
||||||
[found, leaderSize] = this._handle.get_dimensions_sub('#' + leaderName);
|
[found, leaderSize] = this._handle.get_dimensions_sub(`#${leaderName}`);
|
||||||
if (!found)
|
if (!found)
|
||||||
return [false];
|
return [false];
|
||||||
|
|
||||||
@ -488,15 +490,15 @@ var PadDiagram = GObject.registerClass({
|
|||||||
pos.y = this._imageHeight - pos.y;
|
pos.y = this._imageHeight - pos.y;
|
||||||
}
|
}
|
||||||
|
|
||||||
let [x, y] = this._transformPoint(pos.x, pos.y)
|
let [x, y] = this._transformPoint(pos.x, pos.y);
|
||||||
|
|
||||||
return [true, x, y, direction];
|
return [true, x, y, direction];
|
||||||
}
|
}
|
||||||
|
|
||||||
getButtonLabelCoords(button) {
|
getButtonLabelCoords(button) {
|
||||||
let ch = String.fromCharCode('A'.charCodeAt() + button);
|
let ch = String.fromCharCode('A'.charCodeAt() + button);
|
||||||
let labelName = 'Label' + ch;
|
let labelName = `Label${ch}`;
|
||||||
let leaderName = 'Leader' + ch;
|
let leaderName = `Leader${ch}`;
|
||||||
|
|
||||||
return this._getItemLabelCoords(labelName, leaderName);
|
return this._getItemLabelCoords(labelName, leaderName);
|
||||||
}
|
}
|
||||||
@ -504,8 +506,8 @@ var PadDiagram = GObject.registerClass({
|
|||||||
getRingLabelCoords(number, dir) {
|
getRingLabelCoords(number, dir) {
|
||||||
let numStr = number > 0 ? (number + 1).toString() : '';
|
let numStr = number > 0 ? (number + 1).toString() : '';
|
||||||
let dirStr = dir == CW ? 'CW' : 'CCW';
|
let dirStr = dir == CW ? 'CW' : 'CCW';
|
||||||
let labelName = 'LabelRing' + numStr + dirStr;
|
let labelName = `LabelRing${numStr}${dirStr}`;
|
||||||
let leaderName = 'LeaderRing' + numStr + dirStr;
|
let leaderName = `LeaderRing${numStr}${dirStr}`;
|
||||||
|
|
||||||
return this._getItemLabelCoords(labelName, leaderName);
|
return this._getItemLabelCoords(labelName, leaderName);
|
||||||
}
|
}
|
||||||
@ -513,8 +515,8 @@ var PadDiagram = GObject.registerClass({
|
|||||||
getStripLabelCoords(number, dir) {
|
getStripLabelCoords(number, dir) {
|
||||||
let numStr = number > 0 ? (number + 1).toString() : '';
|
let numStr = number > 0 ? (number + 1).toString() : '';
|
||||||
let dirStr = dir == UP ? 'Up' : 'Down';
|
let dirStr = dir == UP ? 'Up' : 'Down';
|
||||||
let labelName = 'LabelStrip' + numStr + dirStr;
|
let labelName = `LabelStrip${numStr}${dirStr}`;
|
||||||
let leaderName = 'LeaderStrip' + numStr + dirStr;
|
let leaderName = `LeaderStrip${numStr}${dirStr}`;
|
||||||
|
|
||||||
return this._getItemLabelCoords(labelName, leaderName);
|
return this._getItemLabelCoords(labelName, leaderName);
|
||||||
}
|
}
|
||||||
@ -630,7 +632,7 @@ var PadOsd = class {
|
|||||||
// If the device is being removed, destroy the padOsd.
|
// If the device is being removed, destroy the padOsd.
|
||||||
if (device == this.padDevice) {
|
if (device == this.padDevice) {
|
||||||
this.destroy();
|
this.destroy();
|
||||||
} else if (this._groupPads.indexOf(device) != -1) {
|
} else if (this._groupPads.includes(device)) {
|
||||||
// Or update the pad chooser if the device belongs to
|
// Or update the pad chooser if the device belongs to
|
||||||
// the same group.
|
// the same group.
|
||||||
this._groupPads.splice(this._groupPads.indexOf(device), 1);
|
this._groupPads.splice(this._groupPads.indexOf(device), 1);
|
||||||
@ -734,7 +736,7 @@ var PadOsd = class {
|
|||||||
_updatePadChooser() {
|
_updatePadChooser() {
|
||||||
if (this._groupPads.length > 1) {
|
if (this._groupPads.length > 1) {
|
||||||
if (this._padChooser == null) {
|
if (this._padChooser == null) {
|
||||||
this._padChooser = new PadChooser(this.padDevice, this._groupPads)
|
this._padChooser = new PadChooser(this.padDevice, this._groupPads);
|
||||||
this._padChooser.connect('pad-selected', (chooser, pad) => {
|
this._padChooser.connect('pad-selected', (chooser, pad) => {
|
||||||
this._requestForOtherPad(pad);
|
this._requestForOtherPad(pad);
|
||||||
});
|
});
|
||||||
@ -749,8 +751,7 @@ var PadOsd = class {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_requestForOtherPad(pad) {
|
_requestForOtherPad(pad) {
|
||||||
if (pad == this.padDevice ||
|
if (pad == this.padDevice || !this._groupPads.includes(pad))
|
||||||
this._groupPads.indexOf(pad) == -1)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
let editionMode = this._editionMode;
|
let editionMode = this._editionMode;
|
||||||
@ -801,7 +802,7 @@ var PadOsd = class {
|
|||||||
|
|
||||||
// If the event comes from another pad in the same group,
|
// If the event comes from another pad in the same group,
|
||||||
// show the OSD for it.
|
// show the OSD for it.
|
||||||
if (this._groupPads.indexOf(event.get_source_device()) != -1) {
|
if (this._groupPads.includes(event.get_source_device())) {
|
||||||
this._requestForOtherPad(event.get_source_device());
|
this._requestForOtherPad(event.get_source_device());
|
||||||
return Clutter.EVENT_STOP;
|
return Clutter.EVENT_STOP;
|
||||||
}
|
}
|
||||||
@ -865,7 +866,7 @@ var PadOsd = class {
|
|||||||
if (this._followUpActionEdition(str))
|
if (this._followUpActionEdition(str))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
this._padDiagram.stopEdition(false, str ? str : _("None"))
|
this._padDiagram.stopEdition(false, str ? str : _("None"));
|
||||||
this._editedAction = null;
|
this._editedAction = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -888,7 +889,7 @@ var PadOsd = class {
|
|||||||
|
|
||||||
_startButtonActionEdition(button) {
|
_startButtonActionEdition(button) {
|
||||||
let ch = String.fromCharCode('A'.charCodeAt() + button);
|
let ch = String.fromCharCode('A'.charCodeAt() + button);
|
||||||
let key = 'button' + ch;
|
let key = `button${ch}`;
|
||||||
this._startActionEdition(key, Meta.PadActionType.BUTTON, button);
|
this._startActionEdition(key, Meta.PadActionType.BUTTON, button);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
128
js/ui/panel.js
@ -51,7 +51,7 @@ function _premultiply(color) {
|
|||||||
green: _norm(color.green * color.alpha),
|
green: _norm(color.green * color.alpha),
|
||||||
blue: _norm(color.blue * color.alpha),
|
blue: _norm(color.blue * color.alpha),
|
||||||
alpha: color.alpha });
|
alpha: color.alpha });
|
||||||
};
|
}
|
||||||
|
|
||||||
function _unpremultiply(color) {
|
function _unpremultiply(color) {
|
||||||
if (color.alpha == 0)
|
if (color.alpha == 0)
|
||||||
@ -62,11 +62,11 @@ function _unpremultiply(color) {
|
|||||||
let blue = Math.min((color.blue * 255 + 127) / color.alpha, 255);
|
let blue = Math.min((color.blue * 255 + 127) / color.alpha, 255);
|
||||||
return new Clutter.Color({ red: red, green: green,
|
return new Clutter.Color({ red: red, green: green,
|
||||||
blue: blue, alpha: color.alpha });
|
blue: blue, alpha: color.alpha });
|
||||||
};
|
}
|
||||||
|
|
||||||
class AppMenu extends PopupMenu.PopupMenu {
|
class AppMenu extends PopupMenu.PopupMenu {
|
||||||
constructor(sourceActor) {
|
constructor(sourceActor) {
|
||||||
super(sourceActor, 0.0, St.Side.TOP);
|
super(sourceActor, 0.5, St.Side.TOP);
|
||||||
|
|
||||||
this.actor.add_style_class_name('app-menu');
|
this.actor.add_style_class_name('app-menu');
|
||||||
|
|
||||||
@ -75,6 +75,9 @@ class AppMenu extends PopupMenu.PopupMenu {
|
|||||||
|
|
||||||
this._windowsChangedId = 0;
|
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._windowSection = new PopupMenu.PopupMenuSection();
|
||||||
this.addMenuItem(this._windowSection);
|
this.addMenuItem(this._windowSection);
|
||||||
|
|
||||||
@ -105,6 +108,8 @@ class AppMenu extends PopupMenu.PopupMenu {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||||
|
|
||||||
this.addAction(_("Quit"), () => {
|
this.addAction(_("Quit"), () => {
|
||||||
this._app.request_quit();
|
this._app.request_quit();
|
||||||
});
|
});
|
||||||
@ -117,7 +122,7 @@ class AppMenu extends PopupMenu.PopupMenu {
|
|||||||
|
|
||||||
_updateDetailsVisibility() {
|
_updateDetailsVisibility() {
|
||||||
let sw = this._appSystem.lookup_app('org.gnome.Software.desktop');
|
let sw = this._appSystem.lookup_app('org.gnome.Software.desktop');
|
||||||
this._detailsItem.actor.visible = (sw != null);
|
this._detailsItem.visible = (sw != null);
|
||||||
}
|
}
|
||||||
|
|
||||||
isEmpty() {
|
isEmpty() {
|
||||||
@ -155,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');
|
app && app.can_open_new_window() && !actions.includes('new-window');
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -172,13 +177,6 @@ class AppMenu extends PopupMenu.PopupMenu {
|
|||||||
Main.activateWindow(window, event.get_time());
|
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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -196,7 +194,7 @@ var AppMenuButton = GObject.registerClass({
|
|||||||
_init(panel) {
|
_init(panel) {
|
||||||
super._init(0.0, null, true);
|
super._init(0.0, null, true);
|
||||||
|
|
||||||
this.actor.accessible_role = Atk.Role.MENU;
|
this.accessible_role = Atk.Role.MENU;
|
||||||
|
|
||||||
this._startingApps = [];
|
this._startingApps = [];
|
||||||
|
|
||||||
@ -206,10 +204,10 @@ var AppMenuButton = GObject.registerClass({
|
|||||||
|
|
||||||
let bin = new St.Bin({ name: 'appMenu' });
|
let bin = new St.Bin({ name: 'appMenu' });
|
||||||
bin.connect('style-changed', this._onStyleChanged.bind(this));
|
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.bind_property("reactive", this, "can-focus", 0);
|
||||||
this.actor.reactive = false;
|
this.reactive = false;
|
||||||
|
|
||||||
this._container = new St.BoxLayout({ style_class: 'panel-status-menu-box' });
|
this._container = new St.BoxLayout({ style_class: 'panel-status-menu-box' });
|
||||||
bin.set_child(this._container);
|
bin.set_child(this._container);
|
||||||
@ -265,10 +263,10 @@ var AppMenuButton = GObject.registerClass({
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
this._visible = true;
|
this._visible = true;
|
||||||
this.actor.reactive = true;
|
this.reactive = true;
|
||||||
this.show();
|
this.show();
|
||||||
Tweener.removeTweens(this.actor);
|
Tweener.removeTweens(this);
|
||||||
Tweener.addTween(this.actor,
|
Tweener.addTween(this,
|
||||||
{ opacity: 255,
|
{ opacity: 255,
|
||||||
time: Overview.ANIMATION_TIME,
|
time: Overview.ANIMATION_TIME,
|
||||||
transition: 'easeOutQuad' });
|
transition: 'easeOutQuad' });
|
||||||
@ -279,16 +277,15 @@ var AppMenuButton = GObject.registerClass({
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
this._visible = false;
|
this._visible = false;
|
||||||
this.actor.reactive = false;
|
this.reactive = false;
|
||||||
Tweener.removeTweens(this.actor);
|
Tweener.removeTweens(this);
|
||||||
Tweener.addTween(this.actor,
|
Tweener.addTween(this,
|
||||||
{ opacity: 0,
|
{ opacity: 0,
|
||||||
time: Overview.ANIMATION_TIME,
|
time: Overview.ANIMATION_TIME,
|
||||||
transition: 'easeOutQuad',
|
transition: 'easeOutQuad',
|
||||||
onComplete() {
|
onComplete: () => {
|
||||||
this.hide();
|
this.hide();
|
||||||
},
|
} });
|
||||||
onCompleteScope: this });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_onStyleChanged(actor) {
|
_onStyleChanged(actor) {
|
||||||
@ -330,8 +327,7 @@ var AppMenuButton = GObject.registerClass({
|
|||||||
{ opacity: 0,
|
{ opacity: 0,
|
||||||
time: SPINNER_ANIMATION_TIME,
|
time: SPINNER_ANIMATION_TIME,
|
||||||
transition: "easeOutQuad",
|
transition: "easeOutQuad",
|
||||||
onCompleteScope: this,
|
onComplete: () => {
|
||||||
onComplete() {
|
|
||||||
this._spinner.stop();
|
this._spinner.stop();
|
||||||
this._spinner.actor.opacity = 255;
|
this._spinner.actor.opacity = 255;
|
||||||
this._spinner.actor.hide();
|
this._spinner.actor.hide();
|
||||||
@ -404,7 +400,7 @@ var AppMenuButton = GObject.registerClass({
|
|||||||
if (this._targetApp) {
|
if (this._targetApp) {
|
||||||
this._busyNotifyId = this._targetApp.connect('notify::busy', this._sync.bind(this));
|
this._busyNotifyId = this._targetApp.connect('notify::busy', this._sync.bind(this));
|
||||||
this._label.set_text(this._targetApp.get_name());
|
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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -422,7 +418,7 @@ var AppMenuButton = GObject.registerClass({
|
|||||||
else
|
else
|
||||||
this.stopAnimation();
|
this.stopAnimation();
|
||||||
|
|
||||||
this.actor.reactive = (visible && !isBusy);
|
this.reactive = (visible && !isBusy);
|
||||||
|
|
||||||
this._syncIcon();
|
this._syncIcon();
|
||||||
this.menu.setApp(this._targetApp);
|
this.menu.setApp(this._targetApp);
|
||||||
@ -461,28 +457,28 @@ var ActivitiesButton = GObject.registerClass(
|
|||||||
class ActivitiesButton extends PanelMenu.Button {
|
class ActivitiesButton extends PanelMenu.Button {
|
||||||
_init() {
|
_init() {
|
||||||
super._init(0.0, null, true);
|
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"
|
/* Translators: If there is no suitable word for "Activities"
|
||||||
in your language, you can use the word for "Overview". */
|
in your language, you can use the word for "Overview". */
|
||||||
this._label = new St.Label({ text: _("Activities"),
|
this._label = new St.Label({ text: _("Activities"),
|
||||||
y_align: Clutter.ActorAlign.CENTER });
|
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.connect('captured-event', this._onCapturedEvent.bind(this));
|
||||||
this.actor.connect_after('key-release-event', this._onKeyRelease.bind(this));
|
this.connect_after('key-release-event', this._onKeyRelease.bind(this));
|
||||||
|
|
||||||
Main.overview.connect('showing', () => {
|
Main.overview.connect('showing', () => {
|
||||||
this.actor.add_style_pseudo_class('overview');
|
this.add_style_pseudo_class('overview');
|
||||||
this.actor.add_accessible_state (Atk.StateType.CHECKED);
|
this.add_accessible_state (Atk.StateType.CHECKED);
|
||||||
});
|
});
|
||||||
Main.overview.connect('hiding', () => {
|
Main.overview.connect('hiding', () => {
|
||||||
this.actor.remove_style_pseudo_class('overview');
|
this.remove_style_pseudo_class('overview');
|
||||||
this.actor.remove_accessible_state (Atk.StateType.CHECKED);
|
this.remove_accessible_state (Atk.StateType.CHECKED);
|
||||||
});
|
});
|
||||||
|
|
||||||
this._xdndTimeOut = 0;
|
this._xdndTimeOut = 0;
|
||||||
@ -535,7 +531,7 @@ class ActivitiesButton extends PanelMenu.Button {
|
|||||||
let [x, y, mask] = global.get_pointer();
|
let [x, y, mask] = global.get_pointer();
|
||||||
let pickedActor = global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, x, y);
|
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();
|
Main.overview.toggle();
|
||||||
|
|
||||||
Mainloop.source_remove(this._xdndTimeOut);
|
Mainloop.source_remove(this._xdndTimeOut);
|
||||||
@ -749,7 +745,7 @@ class AggregateMenu extends PanelMenu.Button {
|
|||||||
this.menu.box.set_layout_manager(menuLayout);
|
this.menu.box.set_layout_manager(menuLayout);
|
||||||
|
|
||||||
this._indicators = new St.BoxLayout({ style_class: 'panel-status-indicators-box' });
|
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) {
|
if (Config.HAVE_NETWORKMANAGER) {
|
||||||
this._network = new imports.ui.status.network.NMApplet();
|
this._network = new imports.ui.status.network.NMApplet();
|
||||||
@ -819,6 +815,7 @@ const PANEL_ITEM_IMPLEMENTATIONS = {
|
|||||||
'dateMenu': imports.ui.dateMenu.DateMenuButton,
|
'dateMenu': imports.ui.dateMenu.DateMenuButton,
|
||||||
'a11y': imports.ui.status.accessibility.ATIndicator,
|
'a11y': imports.ui.status.accessibility.ATIndicator,
|
||||||
'keyboard': imports.ui.status.keyboard.InputSourceIndicator,
|
'keyboard': imports.ui.status.keyboard.InputSourceIndicator,
|
||||||
|
'dwellClick': imports.ui.status.dwellClick.DwellClickIndicator,
|
||||||
};
|
};
|
||||||
|
|
||||||
var Panel = GObject.registerClass(
|
var Panel = GObject.registerClass(
|
||||||
@ -827,9 +824,6 @@ class Panel extends St.Widget {
|
|||||||
super._init({ name: 'panel',
|
super._init({ name: 'panel',
|
||||||
reactive: true });
|
reactive: true });
|
||||||
|
|
||||||
// For compatibility with extensions that still use the
|
|
||||||
// this.actor field
|
|
||||||
this.actor = this;
|
|
||||||
this.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS);
|
this.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS);
|
||||||
|
|
||||||
this._sessionStyle = null;
|
this._sessionStyle = null;
|
||||||
@ -868,7 +862,7 @@ class Panel extends St.Widget {
|
|||||||
|
|
||||||
Main.sessionMode.connect('updated', this._updatePanel.bind(this));
|
Main.sessionMode.connect('updated', this._updatePanel.bind(this));
|
||||||
|
|
||||||
global.display.connect('workareas-changed', () => { this.queue_relayout(); });
|
global.display.connect('workareas-changed', () => this.queue_relayout());
|
||||||
this._updatePanel();
|
this._updatePanel();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -882,7 +876,7 @@ class Panel extends St.Widget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
vfunc_allocate(box, flags) {
|
vfunc_allocate(box, flags) {
|
||||||
super.vfunc_allocate(box, flags);
|
this.set_allocation(box, flags);
|
||||||
|
|
||||||
let allocWidth = box.x2 - box.x1;
|
let allocWidth = box.x2 - box.x1;
|
||||||
let allocHeight = box.y2 - box.y1;
|
let allocHeight = box.y2 - box.y1;
|
||||||
@ -976,22 +970,11 @@ class Panel extends St.Widget {
|
|||||||
if (isPress && button != 1)
|
if (isPress && button != 1)
|
||||||
return Clutter.EVENT_PROPAGATE;
|
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 [stageX, stageY] = event.get_coords();
|
||||||
|
|
||||||
let allowDrag = dragWindow.maximized_vertically &&
|
let dragWindow = this._getDraggableWindowForPosition(stageX);
|
||||||
stageX > rect.x && stageX < rect.x + rect.width;
|
|
||||||
|
|
||||||
if (!allowDrag)
|
if (!dragWindow)
|
||||||
return Clutter.EVENT_PROPAGATE;
|
return Clutter.EVENT_PROPAGATE;
|
||||||
|
|
||||||
global.display.begin_grab_op(dragWindow,
|
global.display.begin_grab_op(dragWindow,
|
||||||
@ -1021,7 +1004,7 @@ class Panel extends St.Widget {
|
|||||||
return; // menu not supported by current session mode
|
return; // menu not supported by current session mode
|
||||||
|
|
||||||
let menu = indicator.menu;
|
let menu = indicator.menu;
|
||||||
if (!indicator.actor.reactive)
|
if (!indicator.reactive)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
menu.toggle();
|
menu.toggle();
|
||||||
@ -1043,7 +1026,7 @@ class Panel extends St.Widget {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
let menu = indicator.menu;
|
let menu = indicator.menu;
|
||||||
if (!indicator.actor.reactive)
|
if (!indicator.reactive)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
menu.close();
|
menu.close();
|
||||||
@ -1071,9 +1054,9 @@ class Panel extends St.Widget {
|
|||||||
this._updateBox(panel.center, this._centerBox);
|
this._updateBox(panel.center, this._centerBox);
|
||||||
this._updateBox(panel.right, this._rightBox);
|
this._updateBox(panel.right, this._rightBox);
|
||||||
|
|
||||||
if (panel.left.indexOf('dateMenu') != -1)
|
if (panel.left.includes('dateMenu'))
|
||||||
Main.messageTray.bannerAlignment = Clutter.ActorAlign.START;
|
Main.messageTray.bannerAlignment = Clutter.ActorAlign.START;
|
||||||
else if (panel.right.indexOf('dateMenu') != -1)
|
else if (panel.right.includes('dateMenu'))
|
||||||
Main.messageTray.bannerAlignment = Clutter.ActorAlign.END;
|
Main.messageTray.bannerAlignment = Clutter.ActorAlign.END;
|
||||||
// Default to center if there is no dateMenu
|
// Default to center if there is no dateMenu
|
||||||
else
|
else
|
||||||
@ -1154,7 +1137,7 @@ class Panel extends St.Widget {
|
|||||||
|
|
||||||
addToStatusArea(role, indicator, position, box) {
|
addToStatusArea(role, indicator, position, box) {
|
||||||
if (this.statusArea[role])
|
if (this.statusArea[role])
|
||||||
throw new Error('Extension point conflict: there is already a status indicator for role ' + role);
|
throw new Error(`Extension point conflict: there is already a status indicator for role ${role}`);
|
||||||
|
|
||||||
if (!(indicator instanceof PanelMenu.Button))
|
if (!(indicator instanceof PanelMenu.Button))
|
||||||
throw new TypeError('Status indicator must be an instance of PanelMenu.Button');
|
throw new TypeError('Status indicator must be an instance of PanelMenu.Button');
|
||||||
@ -1201,4 +1184,21 @@ class Panel extends St.Widget {
|
|||||||
Main.messageTray.bannerBlocked = isOpen;
|
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;
|
||||||
|
});
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|