Compare commits

..

1 Commits

Author SHA1 Message Date
6393e90a5a theme: sync OSD colors with gtk 2019-04-16 16:47:59 +02:00
200 changed files with 7156 additions and 10179 deletions

View File

@ -1,6 +0,0 @@
{
"extends": [
"./lint/eslintrc-gjs.json",
"./lint/eslintrc-shell.json"
]
}

View File

@ -15,10 +15,8 @@ variables:
- merge_requests - merge_requests
check_commit_log: check_commit_log:
image: registry.gitlab.gnome.org/gnome/mutter/master:v2 image: registry.gitlab.gnome.org/gnome/mutter/master:v1
stage: review stage: review
variables:
GIT_DEPTH: "100"
script: script:
- ./.gitlab-ci/check-commit-log.sh - ./.gitlab-ci/check-commit-log.sh
only: only:
@ -40,7 +38,7 @@ js_check:
when: on_failure when: on_failure
build: build:
image: registry.gitlab.gnome.org/gnome/mutter/master:v2 image: registry.gitlab.gnome.org/gnome/gnome-shell/master:v1
stage: build stage: build
before_script: before_script:
- .gitlab-ci/checkout-mutter.sh - .gitlab-ci/checkout-mutter.sh
@ -58,7 +56,7 @@ build:
- build - build
test: test:
image: registry.gitlab.gnome.org/gnome/mutter/master:v2 image: registry.gitlab.gnome.org/gnome/gnome-shell/master:v1
stage: test stage: test
before_script: before_script:
- ninja -C mutter/build install - ninja -C mutter/build install
@ -72,7 +70,7 @@ test:
when: on_failure when: on_failure
test-pot: test-pot:
image: registry.gitlab.gnome.org/gnome/mutter/master:v2 image: registry.gitlab.gnome.org/gnome/gnome-shell/master:v1
stage: test stage: test
before_script: before_script:
- ninja -C mutter/build install - ninja -C mutter/build install

19
.gitlab-ci/Dockerfile Normal file
View File

@ -0,0 +1,19 @@
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

View File

@ -17,19 +17,15 @@ 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 -q $merge_request_remote $merge_request_branch 2>/dev/null; then if git fetch $merge_request_remote $merge_request_branch >/dev/null 2>&1; 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 origin/$shell_branch) mutter_target=$(git branch -r -l $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 -q $mutter_target git checkout $mutter_target

104
NEWS
View File

@ -1,107 +1,3 @@
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
======
* Fix avatar scaling on login screen [Florian; #1024]
* Fix distortion of desktop zoom [Florian; #646]
* Fix mouse cursor visibility when using desktop zoom [Florian, Marco; #1020]
* Fix screen dimming after wake-up on lock screen [Xiaoguang; #900]
* Fix Alt+Esc switcher [Florian; #1064]
* Respect struts for popover placement [Andrea; #1102]
* Fix app icons updates after theme changes [Florian; #1117]
* Fix desktop zoom after resolution changes [Marco; #1120]
* Implement stick-to-finger workspace switch overview gestures [Florian; #516]
* Make World Clocks offsets relative to local time [Florian; #1157]
* Fix top app icon disappearing from dash [Florian; #1053]
* Update switch style to match new Adwaita [Jakub; !496]
* Ensure CSS units are pixel-aligned when scaling is used [Carlos; #91]
* Misc. bug fixes and cleanups [Florian, Jakub, Robert, Alex, Carlos, Phil,
Marco, Benjamin, AsciiWolf, Ray, verdre; !444, #1016, #1018, !449, #1036,
!455, #1094, !440, #1023, #624, #1017, !476, !473, !480, #1130, !485, !481,
!490, !489, #1151, !435, #1160, !482, #1150, #1166, !384]
Contributors:
AsciiWolf, Andrea Azzarone, Benjamin Berg, Carlos Garnacho, Victor Ibragimov,
Robert Mader, Alex Monday, Florian Müllner, Jakub Steiner, Ray Strode,
Marco Trevisan (Treviño), verdre, Xiaoguang Wang, Phil Wyett
Translators:
Victor Ibragimov [tg, af, et, ja], Bruce Cowan [en_GB], Piotr Drąg [tg],
Charles Monzat [fr], Khaled Hosny [ar], Goran Vidović [hr],
Cheng-Chia Tseng [zh_TW], Carmen Bianca BAKKER [eo], Daniel Mustieles [es],
Dušan Kazik [sk]
3.32.0 3.32.0
====== ======
* Fix sizing issues in on-screen-keyboard emoji panel [Carlos; !439] * Fix sizing issues in on-screen-keyboard emoji panel [Carlos; !439]

View File

@ -9,7 +9,7 @@
<method name="ShowOSD"> <method name="ShowOSD">
<arg type="a{sv}" direction="in" name="params"/> <arg type="a{sv}" direction="in" name="params"/>
</method> </method>
<method name="ShowMonitorLabels"> <method name="ShowMonitorLabels2">
<arg type="a{sv}" direction="in" name="params"/> <arg type="a{sv}" direction="in" name="params"/>
</method> </method>
<method name="HideMonitorLabels"/> <method name="HideMonitorLabels"/>

View File

@ -20,16 +20,12 @@
<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.svg</file> <file>toggle-off-us.svg</file>
<file>toggle-off-dark.svg</file> <file>toggle-off-intl.svg</file>
<file>toggle-off-hc.svg</file> <file>toggle-off-hc.svg</file>
<file>toggle-on.svg</file> <file>toggle-on-us.svg</file>
<file>toggle-on-dark.svg</file> <file>toggle-on-intl.svg</file>
<file>toggle-on-hc.svg</file> <file>toggle-on-hc.svg</file>
</gresource> </gresource>
</gresources> </gresources>

View File

@ -99,6 +99,7 @@
</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/"
@ -182,6 +183,17 @@
</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@">

View File

@ -1,5 +1,3 @@
$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";

View File

@ -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, darken(desaturate(#3d3846, 100%), 4%)); $bg_color: if($variant == 'light', #f6f5f4, desaturate(#3d3846, 10%));
$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, 10%)); $selected_bg_color: if($variant == 'light', #3584e4, darken(#3584e4, 20%));
$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,15 +21,11 @@ $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_text_color: white; $osd_bg_color: transparentize(darken(desaturate(#3d3846, 100%), 15%),0.3);
$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.84); $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%);

File diff suppressed because it is too large Load Diff

View File

@ -37,13 +37,16 @@
// 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%));
@ -108,7 +111,7 @@
} }
} }
@mixin button($t, $c:$bg_color, $tc:$fg_color, $edge: $borders_edge) { @mixin button($t, $c:opacify(lighten($osd_bg_color, 5%),1.0), $tc:$fg_color, $edge: $borders_edge) {
// //
// Button drawing function // Button drawing function
// //
@ -127,39 +130,43 @@
$_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: $c;
color: $tc; color: $osd_fg_color;
background-color: $c; background-color: $_bg;
border-color: $borders_color; border-color: $osd_borders_color;
box-shadow: $_button_shadow; box-shadow: inset 0 1px lighten($osd_bg_color,10%);
text-shadow: 0 1px black; text-shadow: 0 1px black;
icon-shadow: 0 1px black; icon-shadow: 0 1px black;
} }
@if $t==focus { @if $t==focus {
// //
// focused button // focused button
// //
color: $tc; $_bg: lighten($c,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 2px $selected_bg_color; box-shadow: inset 0px 0px 0px 1px $selected_bg_color;
//border-color: $selected_bg_color;
} }
@else if $t==hover { @else if $t==hover {
// //
// active osd button // active osd button
// //
color: $tc; $_bg: lighten($c,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;
@ -168,18 +175,27 @@
// //
// active osd button // active osd button
// //
color: $tc; $_bg: if($c!=$bg_color, $c, $osd_borders_color);
border-color: $borders_color;
background-color: $c; color: white;
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: $insensitive_borders_color; border-color: $osd_borders_color;
background-color: $insensitive_bg_color; background-color: $_bg;
box-shadow: none; box-shadow: none;
text-shadow: none; text-shadow: none;
icon-shadow: none; icon-shadow: none;

View File

@ -26,7 +26,6 @@ $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%);

View File

@ -1,28 +0,0 @@
<?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>

Before

Width:  |  Height:  |  Size: 2.5 KiB

View File

@ -1,20 +0,0 @@
<?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>

Before

Width:  |  Height:  |  Size: 3.3 KiB

View File

@ -1,26 +0,0 @@
<?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>

Before

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -1,26 +0,0 @@
<?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>

Before

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -1 +0,0 @@
<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>

Before

Width:  |  Height:  |  Size: 725 B

View File

@ -0,0 +1,209 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="65"
height="22"
id="svg2857"
version="1.1"
inkscape:version="0.48.5 r10040"
sodipodi:docname="toggle-off-us.svg">
<defs
id="defs2859">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 526.18109 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="744.09448 : 526.18109 : 1"
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
id="perspective2865" />
<inkscape:perspective
id="perspective2843"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient76469-7-7-4"
id="linearGradient38024"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.0215462,0,0,1.0322581,717.22867,428.68472)"
x1="6"
y1="102.95528"
x2="6"
y2="84.505203" />
<linearGradient
inkscape:collect="always"
id="linearGradient76469-7-7-4">
<stop
style="stop-color:#2e3232;stop-opacity:1"
offset="0"
id="stop76471-7-1-5" />
<stop
style="stop-color:#3e4545;stop-opacity:1"
offset="1"
id="stop76473-9-0-0" />
</linearGradient>
<inkscape:path-effect
effect="spiro"
id="path-effect77541-4"
is_visible="true" />
<inkscape:path-effect
effect="spiro"
id="path-effect77541-4-0"
is_visible="true" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient37802-8"
id="linearGradient12311-3-1-0-5-4"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.5918367,0,0,0.85714285,-256.56122,59.071426)"
x1="610.13782"
y1="501.43866"
x2="610.13782"
y2="492.52756" />
<linearGradient
id="linearGradient37802-8"
inkscape:collect="always">
<stop
id="stop37804-1"
offset="0"
style="stop-color:#2c2c2c;stop-opacity:1" />
<stop
id="stop37806-8"
offset="1"
style="stop-color:#16191a;stop-opacity:1" />
</linearGradient>
<linearGradient
y2="492.52756"
x2="610.13782"
y1="501.43866"
x1="610.13782"
gradientTransform="matrix(1.5918367,0,0,0.85714285,-900.56122,-423.92857)"
gradientUnits="userSpaceOnUse"
id="linearGradient13602"
xlink:href="#linearGradient37802-8"
inkscape:collect="always" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#000000"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="-5.0602834"
inkscape:cy="16.473273"
inkscape:document-units="px"
inkscape:current-layer="g37994"
showgrid="false"
inkscape:window-width="2560"
inkscape:window-height="1375"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
borderlayer="true"
inkscape:showpageshadow="false"
inkscape:snap-nodes="false"
inkscape:snap-bbox="true"
showborder="false">
<inkscape:grid
type="xygrid"
id="grid12954"
empspacing="5"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true" />
</sodipodi:namedview>
<metadata
id="metadata2862">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-444.64286,-781.36218)">
<g
transform="matrix(0.6526046,0,0,0.80554422,99.592644,-636.32172)"
id="g37994">
<g
id="g37996"
transform="translate(-115,1277)">
<rect
style="color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964000000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0.19591837"
id="rect13475"
width="98"
height="25"
x="644.5"
y="484.61118"
rx="4.7429576"
ry="3.8424656" />
<rect
ry="3.8424656"
rx="4.7429576"
y="483.5"
x="644.5"
height="25"
width="98"
id="rect38000"
style="color:#000000;fill:url(#linearGradient12311-3-1-0-5-4);fill-opacity:1;fill-rule:nonzero;stroke:#16191a;stroke-width:1.37920942;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
</g>
<g
transform="translate(-49.946213,-1.890275)"
id="g38002">
<g
transform="translate(-115,1247)"
style="display:inline"
id="g38004">
<rect
ry="3.7972314"
rx="4.6871223"
y="515.5"
x="694.53046"
height="25"
width="45.969578"
id="rect38006"
style="color:#000000;fill:url(#linearGradient38024);fill-opacity:1;fill-rule:nonzero;stroke:#1f2020;stroke-width:1.37920964;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<path
sodipodi:nodetypes="cc"
style="opacity:0.1;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
d="m 699.09675,516.7365 36.86904,0"
id="path38016"
inkscape:path-effect="#path-effect77541-4"
inkscape:original-d="m 699.09675,516.7365 36.86904,0"
inkscape:connector-curvature="0" />
</g>
</g>
<path
sodipodi:type="arc"
style="color:#000000;fill:none;stroke:#ffffff;stroke-width:2.15627193;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
id="path13479"
sodipodi:cx="16.4375"
sodipodi:cy="10.8125"
sodipodi:rx="4.3125"
sodipodi:ry="4.3125"
d="m 20.75,10.8125 a 4.3125,4.3125 0 1 1 -8.625,0 4.3125,4.3125 0 1 1 8.625,0 z"
transform="matrix(1.4212691,0,0,1.1514287,577.38488,1761.1138)" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.5 KiB

View File

@ -0,0 +1,255 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="65"
height="22"
id="svg2857"
version="1.1"
inkscape:version="0.48.5 r10040"
sodipodi:docname="toggle-on-intl.svg">
<defs
id="defs2859">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 526.18109 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="744.09448 : 526.18109 : 1"
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
id="perspective2865" />
<inkscape:perspective
id="perspective2843"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient76469-7-7-4"
id="linearGradient38024"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.0215462,0,0,1.0322581,717.22867,428.68472)"
x1="6"
y1="102.95528"
x2="6"
y2="84.505203" />
<linearGradient
inkscape:collect="always"
id="linearGradient76469-7-7-4">
<stop
style="stop-color:#2e3232;stop-opacity:1"
offset="0"
id="stop76471-7-1-5" />
<stop
style="stop-color:#3e4545;stop-opacity:1"
offset="1"
id="stop76473-9-0-0" />
</linearGradient>
<inkscape:path-effect
effect="spiro"
id="path-effect77541-4"
is_visible="true" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient37802"
id="linearGradient12311-3-1-0-5"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.5918367,0,0,0.85714285,-256.56122,59.071426)"
x1="610.13782"
y1="501.43866"
x2="610.13782"
y2="492.52756" />
<linearGradient
id="linearGradient37802"
inkscape:collect="always">
<stop
id="stop37804"
offset="0"
style="stop-color:#2c2c2c;stop-opacity:1" />
<stop
id="stop37806"
offset="1"
style="stop-color:#16191a;stop-opacity:1" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient76469-7-7-4-3"
id="linearGradient77680"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,1.0322581,717.71949,428.68472)"
x1="6"
y1="102.95528"
x2="6"
y2="84.505203" />
<linearGradient
inkscape:collect="always"
id="linearGradient76469-7-7-4-3">
<stop
style="stop-color:#2e3232;stop-opacity:1"
offset="0"
id="stop76471-7-1-5-7" />
<stop
style="stop-color:#3e4545;stop-opacity:1"
offset="1"
id="stop76473-9-0-0-9" />
</linearGradient>
<inkscape:path-effect
effect="spiro"
id="path-effect77541-4-0"
is_visible="true" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient37802-8"
id="linearGradient12311-3-1-0-5-4"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.5918367,0,0,0.85714285,-256.56122,59.071426)"
x1="610.13782"
y1="501.43866"
x2="610.13782"
y2="492.52756" />
<linearGradient
id="linearGradient37802-8"
inkscape:collect="always">
<stop
id="stop37804-1"
offset="0"
style="stop-color:#2c2c2c;stop-opacity:1" />
<stop
id="stop37806-8"
offset="1"
style="stop-color:#16191a;stop-opacity:1" />
</linearGradient>
<linearGradient
y2="492.52756"
x2="610.13782"
y1="501.43866"
x1="610.13782"
gradientTransform="matrix(1.5918367,0,0,0.85714285,-900.56122,-423.92857)"
gradientUnits="userSpaceOnUse"
id="linearGradient13602"
xlink:href="#linearGradient37802-8"
inkscape:collect="always" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#000000"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="16.760995"
inkscape:cy="21.955673"
inkscape:document-units="px"
inkscape:current-layer="g37994"
showgrid="false"
inkscape:window-width="2560"
inkscape:window-height="1375"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
borderlayer="true"
inkscape:showpageshadow="false"
inkscape:snap-nodes="false"
inkscape:snap-bbox="true"
showborder="false">
<inkscape:grid
type="xygrid"
id="grid12954"
empspacing="5"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true" />
</sodipodi:namedview>
<metadata
id="metadata2862">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-444.64286,-781.36218)">
<g
transform="matrix(0.6526046,0,0,0.80554422,99.592644,-636.32172)"
id="g37994">
<g
id="g37996"
transform="translate(-115,1277)">
<rect
style="color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964000000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0.19591837"
id="rect13475"
width="98"
height="25"
x="644.5"
y="484.61118"
rx="4.7429576"
ry="3.8424656" />
<rect
ry="3.8424656"
rx="4.7429576"
y="483.5"
x="644.5"
height="25"
width="98"
id="rect38000"
style="color:#000000;fill:url(#linearGradient12311-3-1-0-5-4);fill-opacity:1;fill-rule:nonzero;stroke:#16191a;stroke-width:1.37920942;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
</g>
<g
transform="translate(-49.946213,-1.890275)"
id="g38002">
<g
transform="translate(-115,1247)"
style="display:inline"
id="g38004">
<rect
ry="3.7972314"
rx="4.6871223"
y="515.5"
x="694.53046"
height="25"
width="45.969578"
id="rect38006"
style="color:#000000;fill:url(#linearGradient38024);fill-opacity:1;fill-rule:nonzero;stroke:#1f2020;stroke-width:1.37920964;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<path
sodipodi:nodetypes="cc"
style="opacity:0.1;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
d="m 699.09675,516.7365 36.86904,0"
id="path38016"
inkscape:path-effect="#path-effect77541-4"
inkscape:original-d="m 699.09675,516.7365 36.86904,0"
inkscape:connector-curvature="0" />
</g>
</g>
<text
xml:space="preserve"
style="font-size:13.79166794px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Cantarell;-inkscape-font-specification:Cantarell Bold"
x="520.29974"
y="1997.0011"
id="text75614"
sodipodi:linespacing="125%"
transform="scale(1.1236771,0.88993537)"><tspan
sodipodi:role="line"
id="tspan75616"
x="520.29974"
y="1997.0011">OFF</tspan></text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.8 KiB

View File

@ -1 +0,0 @@
<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>

Before

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -1 +0,0 @@
<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>

Before

Width:  |  Height:  |  Size: 707 B

View File

@ -0,0 +1,192 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="65"
height="22"
id="svg2857"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="toggle-on-intl.svg">
<defs
id="defs2859">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 526.18109 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="744.09448 : 526.18109 : 1"
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
id="perspective2865" />
<inkscape:perspective
id="perspective2843"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient77461"
id="linearGradient77551"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.3066667,0,0,1,-841.64667,-483)"
x1="1164.7644"
y1="962.93695"
x2="1164.7644"
y2="970.51404" />
<linearGradient
id="linearGradient77461"
inkscape:collect="always">
<stop
id="stop77463"
offset="0"
style="stop-color:#182f4c;stop-opacity:1" />
<stop
id="stop77465"
offset="1"
style="stop-color:#205b9a;stop-opacity:1" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient76469-7-7-4"
id="linearGradient38024"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.0215462,0,0,1.0322581,717.22867,428.68472)"
x1="6"
y1="102.95528"
x2="6"
y2="84.505203" />
<linearGradient
inkscape:collect="always"
id="linearGradient76469-7-7-4">
<stop
style="stop-color:#2e3232;stop-opacity:1"
offset="0"
id="stop76471-7-1-5" />
<stop
style="stop-color:#3e4545;stop-opacity:1"
offset="1"
id="stop76473-9-0-0" />
</linearGradient>
<inkscape:path-effect
effect="spiro"
id="path-effect77541-4"
is_visible="true" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#000000"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="37.410841"
inkscape:cy="16.009314"
inkscape:document-units="px"
inkscape:current-layer="g37994"
showgrid="false"
inkscape:window-width="2560"
inkscape:window-height="1376"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
borderlayer="true"
inkscape:showpageshadow="false"
inkscape:snap-nodes="false"
inkscape:snap-bbox="true"
showborder="false">
<inkscape:grid
type="xygrid"
id="grid12954"
empspacing="5"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true" />
</sodipodi:namedview>
<metadata
id="metadata2862">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-444.64286,-781.36218)">
<g
transform="matrix(0.6526046,0,0,0.80554422,99.592644,-636.32172)"
id="g37994">
<g
id="g37996"
transform="translate(-115,1277)">
<rect
style="color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964000000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0.19591837"
id="rect13475"
width="98"
height="25"
x="644.5"
y="484.61118"
rx="4.7429576"
ry="3.8424656" />
<rect
ry="3.8424656"
rx="4.7429576"
y="483.5"
x="644.5"
height="25"
width="98"
id="rect38000"
style="color:#000000;fill:url(#linearGradient77551);fill-opacity:1;fill-rule:nonzero;stroke:#182f4c;stroke-width:1.37920964;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
</g>
<g
transform="translate(2.0625,-2)"
id="g38002">
<g
transform="translate(-115,1247)"
style="display:inline"
id="g38004">
<rect
ry="3.7972314"
rx="4.6871223"
y="515.5"
x="694.53046"
height="25"
width="45.969578"
id="rect38006"
style="color:#000000;fill:url(#linearGradient38024);fill-opacity:1;fill-rule:nonzero;stroke:#1f2020;stroke-width:1.37920964;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<path
sodipodi:nodetypes="cc"
style="opacity:0.1;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
d="m 699.09675,516.7365 36.86904,0"
id="path38016"
inkscape:path-effect="#path-effect77541-4"
inkscape:original-d="m 699.09675,516.7365 36.86904,0"
inkscape:connector-curvature="0" />
</g>
</g>
<rect
style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
id="rect13678"
width="3.0646207"
height="12.414008"
x="554.77728"
y="1767.3566" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.8 KiB

207
data/theme/toggle-on-us.svg Normal file
View File

@ -0,0 +1,207 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="65"
height="22"
id="svg2857"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="toggle-on-us.svg">
<defs
id="defs2859">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 526.18109 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="744.09448 : 526.18109 : 1"
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
id="perspective2865" />
<inkscape:perspective
id="perspective2843"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient76469-7-7-4"
id="linearGradient38024"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.0215462,0,0,1.0322581,717.22867,428.68472)"
x1="6"
y1="102.95528"
x2="6"
y2="84.505203" />
<linearGradient
inkscape:collect="always"
id="linearGradient76469-7-7-4">
<stop
style="stop-color:#2e3232;stop-opacity:1"
offset="0"
id="stop76471-7-1-5" />
<stop
style="stop-color:#3e4545;stop-opacity:1"
offset="1"
id="stop76473-9-0-0" />
</linearGradient>
<inkscape:path-effect
effect="spiro"
id="path-effect77541-4"
is_visible="true" />
<linearGradient
id="linearGradient77461-1"
inkscape:collect="always">
<stop
id="stop77463-1"
offset="0"
style="stop-color:#182f4c;stop-opacity:1" />
<stop
id="stop77465-4"
offset="1"
style="stop-color:#205b9a;stop-opacity:1" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient77461-1"
id="linearGradient77551-6-5"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.8527367,0,0,0.80554422,-969.41608,-778.00299)"
x1="1164.7644"
y1="962.93695"
x2="1164.7644"
y2="970.51404" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient77461-1"
id="linearGradient11198"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.3066667,0,0,1,-1066.3709,794.25325)"
x1="1322.5831"
y1="-312.51855"
x2="1322.5831"
y2="-306.53461" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#000000"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="-26.798898"
inkscape:cy="5.3753009"
inkscape:document-units="px"
inkscape:current-layer="g37994"
showgrid="false"
inkscape:window-width="2560"
inkscape:window-height="1376"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
borderlayer="true"
inkscape:showpageshadow="false"
inkscape:snap-nodes="false"
inkscape:snap-bbox="true"
showborder="false">
<inkscape:grid
type="xygrid"
id="grid12954"
empspacing="5"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true" />
</sodipodi:namedview>
<metadata
id="metadata2862">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-444.64286,-781.36218)">
<g
transform="matrix(0.6526046,0,0,0.80554422,99.592644,-636.32172)"
id="g37994">
<g
id="g37996"
transform="translate(-115,1277)">
<rect
style="color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964000000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0.19591837"
id="rect13475"
width="98"
height="25"
x="644.5"
y="484.61118"
rx="4.7429576"
ry="3.8424656" />
<rect
ry="3.8424656"
rx="4.7429576"
y="483.5"
x="644.5"
height="25"
width="98"
id="rect38000"
style="color:#000000;fill:url(#linearGradient11198);fill-opacity:1;fill-rule:nonzero;stroke:#182f4c;stroke-width:1.37920964;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;clip-rule:nonzero;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;filter-blend-mode:normal;filter-gaussianBlur-deviation:0;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto" />
</g>
<g
transform="translate(2.0625,-2)"
id="g38002">
<g
transform="translate(-115,1247)"
style="display:inline"
id="g38004">
<rect
ry="3.7972314"
rx="4.6871223"
y="515.5"
x="694.53046"
height="25"
width="45.969578"
id="rect38006"
style="color:#000000;fill:url(#linearGradient38024);fill-opacity:1;fill-rule:nonzero;stroke:#1f2020;stroke-width:1.37920964;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<path
sodipodi:nodetypes="cc"
style="opacity:0.1;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
d="m 699.09675,516.7365 36.86904,0"
id="path38016"
inkscape:path-effect="#path-effect77541-4"
inkscape:original-d="m 699.09675,516.7365 36.86904,0"
inkscape:connector-curvature="0" />
</g>
</g>
<text
transform="scale(1.1000946,0.90901274)"
sodipodi:linespacing="125%"
id="text38018"
y="1955.5205"
x="495.94223"
style="font-size:13.29953671px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Cantarell;-inkscape-font-specification:Cantarell Bold"
xml:space="preserve"><tspan
y="1955.5205"
x="495.94223"
id="tspan38020"
sodipodi:role="line">ON</tspan></text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.7 KiB

View File

@ -1 +0,0 @@
<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>

Before

Width:  |  Height:  |  Size: 473 B

View File

@ -168,20 +168,13 @@ 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());
// markdown for pasting in gitlab issues let backticks = '```';
let lines = [ clipboard.set_text(
`The settings of extension ${extension.uuid} had an error:`, // markdown for pasting in gitlab issues
'```', `The settings of extension ${extension.uuid} had an error:\n${
`${exc}`, backticks}\n${exc}\n${backticks}\n\nStack trace:\n${
'```', backticks}\n${exc.stack}${backticks}\n`, -1
'', );
'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 });
@ -589,12 +582,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.includes(this.uuid); return extensions.indexOf(this.uuid) != -1;
} }
_enable() { _enable() {
let extensions = this._settings.get_strv('enabled-extensions'); let extensions = this._settings.get_strv('enabled-extensions');
if (extensions.includes(this.uuid)) if (extensions.indexOf(this.uuid) != -1)
return; return;
extensions.push(this.uuid); extensions.push(this.uuid);
@ -618,12 +611,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(...args) { log() {
print(args.join(', ')); print([].join.call(arguments, ', '));
}, },
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'])

View File

@ -59,23 +59,23 @@ var AuthPrompt = class {
this.smartcardDetected = this._userVerifier.smartcardDetected; this.smartcardDetected = this._userVerifier.smartcardDetected;
this.connect('next', () => { this.connect('next', () => {
this.updateSensitivity(false); this.updateSensitivity(false);
this.startSpinning(); this.startSpinning();
if (this._queryingService) { if (this._queryingService) {
this._userVerifier.answerQuery(this._queryingService, this._entry.text); this._userVerifier.answerQuery(this._queryingService, this._entry.text);
} else { } else {
this._preemptiveAnswer = this._entry.text; this._preemptiveAnswer = this._entry.text;
} }
}); });
this.actor = new St.BoxLayout({ style_class: 'login-dialog-prompt-layout', this.actor = new St.BoxLayout({ style_class: 'login-dialog-prompt-layout',
vertical: true }); vertical: true });
this.actor.connect('destroy', this._onDestroy.bind(this)); this.actor.connect('destroy', this._onDestroy.bind(this));
this.actor.connect('key-press-event', (actor, event) => { this.actor.connect('key-press-event', (actor, event) => {
if (event.get_key_symbol() == Clutter.KEY_Escape) if (event.get_key_symbol() == Clutter.KEY_Escape)
this.cancel(); this.cancel();
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}); });
this._userWell = new St.Bin({ x_fill: true, this._userWell = new St.Bin({ x_fill: true,
x_align: St.Align.START }); x_align: St.Align.START });
@ -112,7 +112,7 @@ var AuthPrompt = class {
this._buttonBox = new St.BoxLayout({ style_class: 'login-dialog-button-box', this._buttonBox = new St.BoxLayout({ style_class: 'login-dialog-button-box',
vertical: false }); vertical: false });
this.actor.add(this._buttonBox, this.actor.add(this._buttonBox,
{ expand: true, { expand: true,
x_align: St.Align.MIDDLE, x_align: St.Align.MIDDLE,
y_align: St.Align.END }); y_align: St.Align.END });
@ -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,11 +295,12 @@ 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',
onComplete: () => { onCompleteScope: this,
if (wasSpinner) { onComplete() {
if (this._spinner) if (wasSpinner) {
this._spinner.stop(); if (this._spinner)
} this._spinner.stop();
}
} }
}); });
} }

View File

@ -44,7 +44,6 @@
* 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 {
@ -125,7 +124,7 @@ var Batch = class extends Task {
} }
process() { process() {
throw new GObject.NotImplementedError(`process in ${this.constructor.name}`); throw new Error('Not implemented');
} }
runTask() { runTask() {
@ -177,36 +176,36 @@ Signals.addSignalMethods(Batch.prototype);
var ConcurrentBatch = class extends Batch { var ConcurrentBatch = class extends Batch {
process() { process() {
let hold = this.runTask(); let hold = this.runTask();
if (hold) { if (hold) {
this.hold.acquireUntilAfter(hold); this.hold.acquireUntilAfter(hold);
} }
// Regardless of the state of the just run task, // Regardless of the state of the just run task,
// fire off the next one, so all the tasks can run // fire off the next one, so all the tasks can run
// concurrently. // concurrently.
this.nextTask(); this.nextTask();
} }
}; };
Signals.addSignalMethods(ConcurrentBatch.prototype); Signals.addSignalMethods(ConcurrentBatch.prototype);
var ConsecutiveBatch = class extends Batch { var ConsecutiveBatch = class extends Batch {
process() { process() {
let hold = this.runTask(); let hold = this.runTask();
if (hold && hold.isAcquired()) { if (hold && hold.isAcquired()) {
// This task is inhibiting the batch. Wait on it // This task is inhibiting the batch. Wait on it
// before processing the next one. // before processing the next one.
let signalId = hold.connect('release', () => { let signalId = hold.connect('release', () => {
hold.disconnect(signalId); hold.disconnect(signalId);
this.nextTask(); this.nextTask();
}); });
return; return;
} else { } else {
// This task finished, process the next one // This task finished, process the next one
this.nextTask(); this.nextTask();
} }
} }
}; };
Signals.addSignalMethods(ConsecutiveBatch.prototype); Signals.addSignalMethods(ConsecutiveBatch.prototype);

View File

@ -23,8 +23,8 @@ 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;
} }

View File

@ -43,7 +43,7 @@ var UserListItem = class {
constructor(user) { constructor(user) {
this.user = user; this.user = user;
this._userChangedId = this.user.connect('changed', this._userChangedId = this.user.connect('changed',
this._onUserChanged.bind(this)); this._onUserChanged.bind(this));
let layout = new St.BoxLayout({ vertical: true }); let layout = new St.BoxLayout({ vertical: true });
this.actor = new St.Button({ style_class: 'login-dialog-user-list-item', this.actor = new St.Button({ style_class: 'login-dialog-user-list-item',
@ -150,7 +150,7 @@ Signals.addSignalMethods(UserListItem.prototype);
var UserList = class { var UserList = class {
constructor() { constructor() {
this.actor = new St.ScrollView({ style_class: 'login-dialog-user-list-view' }); this.actor = new St.ScrollView({ style_class: 'login-dialog-user-list-view'});
this.actor.set_policy(St.PolicyType.NEVER, this.actor.set_policy(St.PolicyType.NEVER,
St.PolicyType.AUTOMATIC); St.PolicyType.AUTOMATIC);
@ -187,6 +187,8 @@ 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
@ -242,7 +244,7 @@ var UserList = class {
return; return;
if (user.locked) if (user.locked)
return; return;
let userName = user.get_user_name(); let userName = user.get_user_name();
@ -259,7 +261,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();
@ -317,17 +319,17 @@ var SessionMenuButton = class {
this._menu.actor.hide(); this._menu.actor.hide();
this._menu.connect('open-state-changed', (menu, isOpen) => { this._menu.connect('open-state-changed', (menu, isOpen) => {
if (isOpen) if (isOpen)
this._button.add_style_pseudo_class('active'); this._button.add_style_pseudo_class('active');
else else
this._button.remove_style_pseudo_class('active'); this._button.remove_style_pseudo_class('active');
}); });
this._manager = new PopupMenu.PopupMenuManager(this._button, this._manager = new PopupMenu.PopupMenuManager({ actor: 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;
@ -351,11 +353,11 @@ var SessionMenuButton = class {
} }
setActiveSession(sessionId) { setActiveSession(sessionId) {
if (sessionId == this._activeSessionId) if (sessionId == this._activeSessionId)
return; return;
this._activeSessionId = sessionId; this._activeSessionId = sessionId;
this._updateOrnament(); this._updateOrnament();
} }
close() { close() {
@ -401,18 +403,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();
@ -573,15 +575,19 @@ 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;
} }
@ -613,64 +619,64 @@ var LoginDialog = GObject.registerClass({
let leftOverYSpace = bannerSpace - bannerHeight; let leftOverYSpace = bannerSpace - bannerHeight;
if (leftOverYSpace > 0) { if (leftOverYSpace > 0) {
// First figure out how much left over space is up top // First figure out how much left over space is up top
let leftOverTopSpace = leftOverYSpace / 2; let leftOverTopSpace = leftOverYSpace / 2;
// Then, shift the banner into the middle of that extra space // Then, shift the banner into the middle of that extra space
let yShift = Math.floor(leftOverTopSpace / 2); let yShift = Math.floor(leftOverTopSpace / 2);
bannerAllocation.y1 += yShift; bannerAllocation.y1 += yShift;
bannerAllocation.y2 += yShift; bannerAllocation.y2 += yShift;
} else { } else {
// Then figure out how much space there would be if we switched to a // Then figure out how much space there would be if we switched to a
// wide layout with banner on one side and authprompt on the other. // wide layout with banner on one side and authprompt on the other.
let leftOverXSpace = dialogWidth - authPromptWidth; let leftOverXSpace = dialogWidth - authPromptWidth;
// In a wide view, half of the available space goes to the banner, // In a wide view, half of the available space goes to the banner,
// and the other half goes to the margins. // and the other half goes to the margins.
let wideBannerWidth = leftOverXSpace / 2; let wideBannerWidth = leftOverXSpace / 2;
let wideSpacing = leftOverXSpace - wideBannerWidth; let wideSpacing = leftOverXSpace - wideBannerWidth;
// If we do go with a wide layout, we need there to be at least enough // If we do go with a wide layout, we need there to be at least enough
// space for the banner and the auth prompt to be the same width, // space for the banner and the auth prompt to be the same width,
// so it doesn't look unbalanced. // so it doesn't look unbalanced.
if (authPromptWidth > 0 && wideBannerWidth > authPromptWidth) { if (authPromptWidth > 0 && wideBannerWidth > authPromptWidth) {
let centerX = dialogBox.x1 + dialogWidth / 2; let centerX = dialogBox.x1 + dialogWidth / 2;
let centerY = dialogBox.y1 + dialogHeight / 2; let centerY = dialogBox.y1 + dialogHeight / 2;
// A small portion of the spacing goes down the center of the // A small portion of the spacing goes down the center of the
// screen to help delimit the two columns of the wide view // screen to help delimit the two columns of the wide view
let centerGap = wideSpacing / 8; let centerGap = wideSpacing / 8;
// place the banner along the left edge of the center margin // place the banner along the left edge of the center margin
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 accommodate // figure out how tall it would like to be and try to accomodate
// 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);
let maxWideHeight = dialogHeight - 3 * logoHeight; let maxWideHeight = dialogHeight - 3 * logoHeight;
wideBannerHeight = Math.min(maxWideHeight, wideBannerHeight); wideBannerHeight = Math.min(maxWideHeight, wideBannerHeight);
bannerAllocation.y1 = Math.floor(centerY - wideBannerHeight / 2); bannerAllocation.y1 = Math.floor(centerY - wideBannerHeight / 2);
bannerAllocation.y2 = bannerAllocation.y1 + wideBannerHeight; bannerAllocation.y2 = bannerAllocation.y1 + wideBannerHeight;
// place the auth prompt along the right edge of the center margin // place the auth prompt along the right edge of the center margin
authPromptAllocation.x1 = Math.floor(centerX + centerGap / 2); authPromptAllocation.x1 = Math.floor(centerX + centerGap / 2);
authPromptAllocation.x2 = authPromptAllocation.x1 + authPromptWidth; authPromptAllocation.x2 = authPromptAllocation.x1 + authPromptWidth;
} else { } else {
// If we aren't going to do a wide view, then we need to limit // If we aren't going to do a wide view, then we need to limit
// the height of the banner so it will present scrollbars // the height of the banner so it will present scrollbars
// First figure out how much space there is without the banner // First figure out how much space there is without the banner
leftOverYSpace += bannerHeight; leftOverYSpace += bannerHeight;
// Then figure out how much of that space is up top // Then figure out how much of that space is up top
let availableTopSpace = Math.floor(leftOverYSpace / 2); let availableTopSpace = Math.floor(leftOverYSpace / 2);
// Then give all of that space to the banner // Then give all of that space to the banner
bannerAllocation.y2 = bannerAllocation.y1 + availableTopSpace; bannerAllocation.y2 = bannerAllocation.y1 + availableTopSpace;
} }
} }
} else if (userSelectionAllocation) { } else if (userSelectionAllocation) {
// Grow the user list to fill the space // Grow the user list to fill the space
@ -845,10 +851,10 @@ var LoginDialog = GObject.registerClass({
_shouldShowSessionMenuButton() { _shouldShowSessionMenuButton() {
if (this._authPrompt.verificationStatus != AuthPrompt.AuthPromptStatus.VERIFYING && if (this._authPrompt.verificationStatus != AuthPrompt.AuthPromptStatus.VERIFYING &&
this._authPrompt.verificationStatus != AuthPrompt.AuthPromptStatus.VERIFICATION_FAILED) this._authPrompt.verificationStatus != AuthPrompt.AuthPromptStatus.VERIFICATION_FAILED)
return false; return false;
if (this._user && this._user.is_loaded && this._user.is_logged_in()) if (this._user && this._user.is_loaded && this._user.is_logged_in())
return false; return false;
return true; return true;
} }
@ -913,7 +919,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++) {
@ -921,10 +927,12 @@ var LoginDialog = GObject.registerClass({
children[i].opacity = this.opacity; children[i].opacity = this.opacity;
} }
}, },
onComplete: () => { onUpdateScope: this,
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) {
@ -941,7 +949,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++) {
@ -949,20 +957,22 @@ var LoginDialog = GObject.registerClass({
children[i].opacity = this.opacity; children[i].opacity = this.opacity;
} }
}, },
onComplete: () => { onUpdateScope: this,
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) {
let item = this._userList.getItemFromUserName(userName); let item = this._userList.getItemFromUserName(userName);
if (item) if (item)
return null; return null;
let hold = new Batch.Hold(); let hold = new Batch.Hold();
let signalId = this._userList.connect('item-added', let signalId = this._userList.connect('item-added',
@ -973,7 +983,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;
} }
@ -1037,7 +1047,6 @@ var LoginDialog = GObject.registerClass({
return this._blockTimedLoginUntilIdle(); return this._blockTimedLoginUntilIdle();
} else { } else {
animationTime = delay; animationTime = delay;
return null;
} }
}, },
@ -1073,12 +1082,12 @@ var LoginDialog = GObject.registerClass({
// Restart timed login on user interaction // Restart timed login on user interaction
global.stage.connect('captured-event', (actor, event) => { global.stage.connect('captured-event', (actor, event) => {
if (event.type() == Clutter.EventType.KEY_PRESS || if (event.type() == Clutter.EventType.KEY_PRESS ||
event.type() == Clutter.EventType.BUTTON_PRESS) { event.type() == Clutter.EventType.BUTTON_PRESS) {
this._startTimedLogin(userName, seconds); this._startTimedLogin(userName, seconds);
} }
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}); });
} }

View File

@ -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,10 +36,10 @@ var Manager = class {
return; return;
for (let i = 0; i < realmPaths.length; i++) { for (let i = 0; i < realmPaths.length; i++) {
Realm(Gio.DBus.system, let realm = 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)

View File

@ -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,
@ -342,7 +342,7 @@ var ShellUserVerifier = class {
try { try {
this._clearUserVerifier(); this._clearUserVerifier();
this._userVerifier = client.open_reauthentication_channel_finish(result); this._userVerifier = client.open_reauthentication_channel_finish(result);
} catch (e) { } catch(e) {
if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
return; return;
if (e.matches(Gio.DBusError, Gio.DBusError.ACCESS_DENIED) && if (e.matches(Gio.DBusError, Gio.DBusError.ACCESS_DENIED) &&
@ -369,7 +369,7 @@ var ShellUserVerifier = class {
try { try {
this._clearUserVerifier(); this._clearUserVerifier();
this._userVerifier = client.get_user_verifier_finish(result); this._userVerifier = client.get_user_verifier_finish(result);
} catch (e) { } catch(e) {
if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
return; return;
this._reportInitError('Failed to obtain user verifier', e); this._reportInitError('Failed to obtain user verifier', e);
@ -423,31 +423,36 @@ 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._userName, this._cancellable, (obj, result) => { this._userVerifier.call_begin_verification_for_user(serviceName,
try { this._userName,
obj.call_begin_verification_for_user_finish(result); this._cancellable,
} catch (e) { (obj, result) => {
if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) try {
return; obj.call_begin_verification_for_user_finish(result);
this._reportInitError('Failed to start verification for user', e); } catch(e) {
return; if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
} return;
this._reportInitError('Failed to start verification for user', e);
return;
}
this._hold.release(); this._hold.release();
}); });
} else { } else {
this._userVerifier.call_begin_verification(serviceName, this._cancellable, (obj, result) => { this._userVerifier.call_begin_verification(serviceName,
try { this._cancellable,
obj.call_begin_verification_finish(result); (obj, result) => {
} catch (e) { try {
if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) obj.call_begin_verification_finish(result);
return; } catch(e) {
this._reportInitError('Failed to start verification', e); if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
return; return;
} this._reportInitError('Failed to start verification', e);
return;
}
this._hold.release(); this._hold.release();
}); });
} }
} }

View File

@ -64,7 +64,6 @@
<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>
@ -82,11 +81,9 @@
<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>
@ -123,7 +120,6 @@
<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>

View 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].includes('/gnome-shell/extensions/')) { if (stack[i].indexOf('/gnome-shell/extensions/') > -1) {
extensionStackLine = stack[i]; extensionStackLine = stack[i];
break; break;
} }
@ -162,6 +162,8 @@ 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');
@ -173,25 +175,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 = {};
@ -235,7 +237,7 @@ var ExtensionFinder = class {
: ExtensionType.SYSTEM; : ExtensionType.SYSTEM;
try { try {
extension = createExtensionObject(uuid, extensionDir, type); extension = createExtensionObject(uuid, extensionDir, type);
} catch (e) { } catch(e) {
logError(e, 'Could not load extension %s'.format(uuid)); logError(e, 'Could not load extension %s'.format(uuid));
return; return;
} }

View File

@ -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; let info, child;
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; let info, child;
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;

View File

@ -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 {
@ -66,7 +66,7 @@ var HistoryManager = class {
this._indexChanged(); this._indexChanged();
} }
return this._historyIndex ? this._history[this._historyIndex - 1] : null; return this._historyIndex ? this._history[this._historyIndex -1] : null;
} }
addItem(input) { addItem(input) {

View File

@ -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 = new Map(); this._engines = {};
this._ready = false; this._ready = false;
this._registerPropertiesId = 0; this._registerPropertiesId = 0;
this._currentEngineName = null; this._currentEngineName = null;
@ -62,8 +62,8 @@ var IBusManager = class {
try { try {
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.clear(); this._engines = {};
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.set(name, enginesList[i]); this._engines[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
@ -138,7 +138,7 @@ var IBusManager = class {
engine = this._ibus.get_global_engine_async_finish(result); engine = this._ibus.get_global_engine_async_finish(result);
if (!engine) if (!engine)
return; return;
} catch (e) { } catch(e) {
return; return;
} }
this._engineChanged(this._ibus, engine.get_name()); this._engineChanged(this._ibus, engine.get_name());
@ -150,7 +150,8 @@ var IBusManager = class {
} }
_updateReadiness() { _updateReadiness() {
this._ready = this._engines.size > 0 && this._panelService != null; this._ready = (Object.keys(this._engines).length > 0 &&
this._panelService != null);
this.emit('ready', this._ready); this.emit('ready', this._ready);
} }
@ -188,10 +189,10 @@ var IBusManager = class {
} }
getEngineDesc(id) { getEngineDesc(id) {
if (!this._ready || !this._engines.has(id)) if (!this._ready || !this._engines.hasOwnProperty(id))
return null; return null;
return this._engines.get(id); return this._engines[id];
} }
setEngine(id, callback) { setEngine(id, callback) {

View File

@ -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;

View File

@ -42,20 +42,17 @@ 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);
} }
_isIntrospectEnabled() { _isIntrospectEnabled() {
return this._settings.get_boolean(INTROSPECT_KEY); return this._settings.get_boolean(INTROSPECT_KEY);
} }
_isSenderWhitelisted(sender) { _isSenderWhitelisted(sender) {
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() {
@ -79,10 +76,6 @@ 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;
} }
@ -144,7 +137,6 @@ 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()),
@ -161,10 +153,6 @@ 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]));

View File

@ -51,14 +51,14 @@ 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
function findMatchingQuote(expr, offset) { function findMatchingQuote(expr, offset) {
let quoteChar = expr.charAt(offset); let quoteChar = expr.charAt(offset);
for (let i = offset - 1; i >= 0; --i) { for (let i = offset - 1; i >= 0; --i) {
if (expr.charAt(i) == quoteChar && expr.charAt(i - 1) != '\\') { if (expr.charAt(i) == quoteChar && expr.charAt(i-1) != '\\'){
return i; return i;
} }
} }
@ -68,7 +68,7 @@ function findMatchingQuote(expr, offset) {
// Given the ending position of a regex, find where it starts // Given the ending position of a regex, find where it starts
function findMatchingSlash(expr, offset) { function findMatchingSlash(expr, offset) {
for (let i = offset - 1; i >= 0; --i) { for (let i = offset - 1; i >= 0; --i) {
if (expr.charAt(i) == '/' && expr.charAt(i - 1) != '\\') { if (expr.charAt(i) == '/' && expr.charAt(i-1) != '\\'){
return i; return i;
} }
} }
@ -81,7 +81,7 @@ function findMatchingSlash(expr, offset) {
// findMatchingBrace("[(])", 3) returns 1. // findMatchingBrace("[(])", 3) returns 1.
function findMatchingBrace(expr, offset) { function findMatchingBrace(expr, offset) {
let closeBrace = expr.charAt(offset); let closeBrace = expr.charAt(offset);
let openBrace = ({ ')': '(', ']': '[' })[closeBrace]; let openBrace = ({')': '(', ']': '['})[closeBrace];
function findTheBrace(expr, offset) { function findTheBrace(expr, offset) {
if (offset < 0) { if (offset < 0) {
@ -117,11 +117,11 @@ function getExpressionOffset(expr, offset) {
while (offset >= 0) { while (offset >= 0) {
let currChar = expr.charAt(offset); let currChar = expr.charAt(offset);
if (isStopChar(currChar)) { if (isStopChar(currChar)){
return offset + 1; return offset + 1;
} }
if (currChar.match(/[)\]]/)) { if (currChar.match(/[\)\]]/)) {
offset = findMatchingBrace(expr, offset); offset = findMatchingBrace(expr, offset);
} }
@ -151,11 +151,15 @@ function getAllProps(obj) {
// e.g., expr="({ foo: null, bar: null, 4: null })" will // e.g., expr="({ foo: null, bar: null, 4: null })" will
// return ["foo", "bar", ...] but the list will not include "4", // return ["foo", "bar", ...] but the list will not include "4",
// since methods accessed with '.' notation must star with a letter or _. // since methods accessed with '.' notation must star with a letter or _.
function getPropertyNamesFromExpression(expr, commandHeader = '') { function getPropertyNamesFromExpression(expr, commandHeader) {
if (commandHeader == null) {
commandHeader = '';
}
let obj = {}; let obj = {};
if (!isUnsafeExpression(expr)) { if (!isUnsafeExpression(expr)) {
try { try {
obj = eval(commandHeader + expr); obj = eval(commandHeader + expr);
} catch (e) { } catch (e) {
return []; return [];
} }
@ -164,7 +168,7 @@ function getPropertyNamesFromExpression(expr, commandHeader = '') {
} }
let propsUnique = {}; let propsUnique = {};
if (typeof obj === 'object') { if (typeof obj === 'object'){
let allProps = getAllProps(obj); let allProps = getAllProps(obj);
// Get only things we are allowed to complete following a '.' // Get only things we are allowed to complete following a '.'
allProps = allProps.filter( isValidPropertyName ); allProps = allProps.filter( isValidPropertyName );

View File

@ -60,7 +60,7 @@ var KeyboardManager = class {
this._currentKeymap.options == options) this._currentKeymap.options == options)
return; return;
this._currentKeymap = { layouts, variants, options }; this._currentKeymap = {layouts, variants, options};
Meta.get_backend().set_keymap(layouts, variants, options); Meta.get_backend().set_keymap(layouts, variants, options);
} }
@ -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.includes('_')) if (locale.indexOf('_') == -1)
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);

View File

@ -43,33 +43,11 @@ function canLock() {
let version = result.deep_unpack()[0].deep_unpack(); let version = result.deep_unpack()[0].deep_unpack();
return haveSystemd() && versionCompare('3.5.91', version); return haveSystemd() && versionCompare('3.5.91', version);
} catch (e) { } catch(e) {
return false; return false;
} }
} }
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;
/** /**
@ -185,7 +163,7 @@ var LoginManagerSystemd = class {
let [outVariant, fdList] = proxy.call_with_unix_fd_list_finish(result); let [outVariant, fdList] = proxy.call_with_unix_fd_list_finish(result);
fd = fdList.steal_fds()[0]; fd = fdList.steal_fds()[0];
callback(new Gio.UnixInputStream({ fd: fd })); callback(new Gio.UnixInputStream({ fd: fd }));
} catch (e) { } catch(e) {
logError(e, "Error getting systemd inhibitor"); logError(e, "Error getting systemd inhibitor");
callback(null); callback(null);
} }

View File

@ -26,33 +26,33 @@ function _getMobileProvidersDatabase() {
} }
// _findProviderForMccMnc: // _findProviderForMccMnc:
// @operatorName: operator name // @operator_name: operator name
// @operatorCode: operator code // @operator_code: 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(operatorName, operatorCode) { function _findProviderForMccMnc(operator_name, operator_code) {
if (operatorName) { if (operator_name) {
if (operatorName.length != 0 && if (operator_name.length != 0 &&
(operatorName.length > 6 || operatorName.length < 5)) { (operator_name.length > 6 || operator_name.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 operatorName; return operator_name;
} }
if (isNaN(parseInt(operatorName))) { if (isNaN(parseInt(operator_name))) {
// 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 operatorName; return operator_name;
} }
} }
let needle; let needle;
if ((!operatorName || operatorName.length == 0) && operatorCode) if ((!operator_name || operator_name.length == 0) && operator_code)
needle = operatorCode; needle = operator_code;
else if (operatorName && (operatorName.length == 6 || operatorName.length == 5)) else if (operator_name && (operator_name.length == 6 || operator_name.length == 5))
needle = operatorName; needle = operator_name;
else // nothing to search else // nothing to search
return null; return null;
@ -71,7 +71,7 @@ function _findProviderForMccMnc(operatorName, operatorCode) {
// 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) if (sid == 0)
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 newName = ""; let new_name = "";
if (this.operator_name_3gpp && this.operator_name_3gpp.length > 0) if (this.operator_name_3gpp && this.operator_name_3gpp.length > 0)
newName += this.operator_name_3gpp; new_name += 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 (newName != "") if (new_name != "")
newName += ", "; new_name += ", ";
newName += this.operator_name_cdma; new_name += this.operator_name_cdma;
} }
this.operator_name = newName; this.operator_name = new_name;
this.emit('notify::operator-name'); this.emit('notify::operator-name');
} }

View File

@ -77,51 +77,54 @@ var ObjectManager = class {
let info = this._interfaceInfos[interfaceName]; let info = this._interfaceInfos[interfaceName];
if (!info) { if (!info) {
if (onFinished) if (onFinished)
onFinished(); onFinished();
return; return;
} }
let proxy = new Gio.DBusProxy({ g_connection: this._connection, let proxy = new Gio.DBusProxy({ g_connection: this._connection,
g_name: this._serviceName, g_name: this._serviceName,
g_object_path: objectPath, g_object_path: objectPath,
g_interface_name: interfaceName, g_interface_name: interfaceName,
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, this._cancellable, (initable, result) => { proxy.init_async(GLib.PRIORITY_DEFAULT,
try { this._cancellable,
initable.init_finish(result); (initable, result) => {
} catch (e) { let error = null;
logError(e, `could not initialize proxy for interface ${interfaceName}`); try {
initable.init_finish(result);
} catch(e) {
logError(e, 'could not initialize proxy for interface ' + interfaceName);
if (onFinished) if (onFinished)
onFinished(); onFinished();
return; return;
} }
let isNewObject; let isNewObject;
if (!this._objects[objectPath]) { if (!this._objects[objectPath]) {
this._objects[objectPath] = {}; this._objects[objectPath] = {};
isNewObject = true; isNewObject = true;
} else { } else {
isNewObject = false; isNewObject = false;
} }
this._objects[objectPath][interfaceName] = proxy; this._objects[objectPath][interfaceName] = proxy;
if (!this._interfaces[interfaceName]) if (!this._interfaces[interfaceName])
this._interfaces[interfaceName] = []; this._interfaces[interfaceName] = [];
this._interfaces[interfaceName].push(proxy); this._interfaces[interfaceName].push(proxy);
if (isNewObject) if (isNewObject)
this.emit('object-added', objectPath); this.emit('object-added', objectPath);
this.emit('interface-added', interfaceName, proxy); this.emit('interface-added', interfaceName, proxy);
if (onFinished) if (onFinished)
onFinished(); onFinished();
}); });
} }
@ -152,10 +155,11 @@ 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;
@ -193,7 +197,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();

View File

@ -14,13 +14,22 @@
// //
// 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) {
if (!allowExtras) { let ret = {}, prop;
for (let prop in params)
if (!(prop in defaults)) if (!params)
throw new Error(`Unrecognized parameter "${prop}"`); params = {};
for (prop in params) {
if (!(prop in defaults) && !allowExtras)
throw new Error('Unrecognized parameter "' + prop + '"');
ret[prop] = params[prop];
} }
let defaultsCopy = Object.assign({}, defaults); for (prop in defaults) {
return Object.assign(defaultsCopy, params); if (!(prop in params))
} ret[prop] = defaults[prop];
}
return ret;
}

View File

@ -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);
} };

View File

@ -29,7 +29,7 @@ var SmartcardManager = class {
this._objectManager = new ObjectManager.ObjectManager({ connection: Gio.DBus.session, this._objectManager = new ObjectManager.ObjectManager({ connection: Gio.DBus.session,
name: "org.gnome.SettingsDaemon.Smartcard", name: "org.gnome.SettingsDaemon.Smartcard",
objectPath: '/org/gnome/SettingsDaemon/Smartcard', objectPath: '/org/gnome/SettingsDaemon/Smartcard',
knownInterfaces: [SmartcardTokenIface], knownInterfaces: [ SmartcardTokenIface ],
onLoaded: this._onLoaded.bind(this) }); onLoaded: this._onLoaded.bind(this) });
this._insertedTokens = {}; this._insertedTokens = {};
this._loginToken = null; this._loginToken = null;

View File

@ -83,54 +83,48 @@ 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,
this._actions.set(LOCK_SCREEN_ACTION_ID, { { // Translators: The name of the lock screen action in search
// 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, { name: C_("search-result", "Log Out"),
// Translators: The name of the logout action in search iconName: 'application-exit-symbolic',
name: C_("search-result", "Log Out"), // Translators: A list of keywords that match the logout action, separated by semicolons
iconName: 'application-exit-symbolic', keywords: _("logout;sign off").split(';'),
// Translators: A list of keywords that match the logout action, separated by semicolons available: false });
keywords: _("logout;log out;sign off").split(/[; ]/), this._actions.set(SUSPEND_ACTION_ID,
available: false { // Translators: The name of the suspend action in search
}); name: C_("search-result", "Suspend"),
this._actions.set(SUSPEND_ACTION_ID, { iconName: 'media-playback-pause-symbolic',
// Translators: The name of the suspend action in search // Translators: A list of keywords that match the suspend action, separated by semicolons
name: C_("search-result", "Suspend"), keywords: _("suspend;sleep").split(';'),
iconName: 'media-playback-pause-symbolic', available: false });
// Translators: A list of keywords that match the suspend action, separated by semicolons this._actions.set(SWITCH_USER_ACTION_ID,
keywords: _("suspend;sleep").split(/[; ]/), { // Translators: The name of the switch user action in search
available: false name: C_("search-result", "Switch User"),
}); iconName: 'system-switch-user-symbolic',
this._actions.set(SWITCH_USER_ACTION_ID, { // Translators: A list of keywords that match the switch user action, separated by semicolons
// Translators: The name of the switch user action in search keywords: _("switch user").split(';'),
name: C_("search-result", "Switch User"), available: false });
iconName: 'system-switch-user-symbolic', this._actions.set(LOCK_ORIENTATION_ACTION_ID,
// Translators: A list of keywords that match the switch user action, separated by semicolons { // Translators: The name of the lock orientation action in search
keywords: _("switch user").split(/[; ]/), name: C_("search-result", "Lock Orientation"),
available: false iconName: '',
}); // Translators: A list of keywords that match the lock orientation action, separated by semicolons
this._actions.set(LOCK_ORIENTATION_ACTION_ID, { keywords: _("lock orientation;screen;rotation").split(';'),
// Translators: The name of the lock orientation action in search available: false });
name: C_("search-result", "Lock Orientation"),
iconName: '',
// Translators: A list of keywords that match the lock orientation action, separated by semicolons
keywords: _("lock orientation;screen;rotation").split(/[; ]/),
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 });
@ -143,39 +137,37 @@ 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._updateOrientationLock(); this._updateOrientationLockIcon(); });
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();
@ -183,7 +175,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();
} }
@ -223,7 +215,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();
}); });
} }
@ -265,12 +257,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) => term.toLowerCase()); terms = terms.map((term) => { return 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.startsWith(t)))) if (available && terms.every(t => keywords.some(k => (k.indexOf(t) >= 0))))
results.push(key); results.push(key);
return results; return results;
@ -286,24 +278,24 @@ const SystemActions = GObject.registerClass({
activateAction(id) { activateAction(id) {
switch (id) { switch (id) {
case POWER_OFF_ACTION_ID: case POWER_OFF_ACTION_ID:
this.activatePowerOff(); this.activatePowerOff();
break; break;
case LOCK_SCREEN_ACTION_ID: case LOCK_SCREEN_ACTION_ID:
this.activateLockScreen(); this.activateLockScreen();
break; break;
case LOGOUT_ACTION_ID: case LOGOUT_ACTION_ID:
this.activateLogout(); this.activateLogout();
break; break;
case SUSPEND_ACTION_ID: case SUSPEND_ACTION_ID:
this.activateSuspend(); this.activateSuspend();
break; break;
case SWITCH_USER_ACTION_ID: case SWITCH_USER_ACTION_ID:
this.activateSwitchUser(); this.activateSwitchUser();
break; break;
case LOCK_ORIENTATION_ACTION_ID: case LOCK_ORIENTATION_ACTION_ID:
this.activateLockOrientation(); this.activateLockOrientation();
break; break;
} }
} }

View File

@ -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:
// @commandLine: a command line // @command_line: a command line
// //
// Runs @commandLine in the background, handling any errors that // Runs @command_line 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(commandLine) { function spawnCommandLine(command_line) {
try { try {
let [success, argv] = GLib.shell_parse_argv(commandLine); let [success, argv] = GLib.shell_parse_argv(command_line);
trySpawn(argv); trySpawn(argv);
} catch (err) { } catch (err) {
_handleSpawnError(commandLine, err); _handleSpawnError(command_line, err);
} }
} }
@ -93,7 +93,7 @@ function spawnApp(argv) {
let context = global.create_app_launch_context(0, -1); let context = global.create_app_launch_context(0, -1);
app.launch([], context); app.launch([], context);
} catch (err) { } catch(err) {
_handleSpawnError(argv[0], err); _handleSpawnError(argv[0], err);
} }
} }
@ -103,7 +103,8 @@ 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,
@ -134,19 +135,19 @@ function trySpawn(argv) {
} }
// trySpawnCommandLine: // trySpawnCommandLine:
// @commandLine: a command line // @command_line: a command line
// //
// Runs @commandLine in the background. If launching @commandLine // Runs @command_line in the background. If launching @command_line
// fails, this will throw an error. // fails, this will throw an error.
function trySpawnCommandLine(commandLine) { function trySpawnCommandLine(command_line) {
let success, argv; let success, argv;
try { try {
[success, argv] = GLib.shell_parse_argv(commandLine); [success, argv] = GLib.shell_parse_argv(command_line);
} 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;
} }
@ -221,7 +222,7 @@ function formatTime(time, params) {
/* Translators: Time in 24h format */ /* Translators: Time in 24h format */
format = N_("%H\u2236%M"); format = N_("%H\u2236%M");
// Show the word "Yesterday" and time if date is on yesterday // Show the word "Yesterday" and time if date is on yesterday
else if (daysAgo < 2) else if (daysAgo <2)
/* Translators: this is the word "Yesterday" followed by a /* Translators: this is the word "Yesterday" followed by a
time string in 24h format. i.e. "Yesterday, 14:30" */ time string in 24h format. i.e. "Yesterday, 14:30" */
// xgettext:no-c-format // xgettext:no-c-format
@ -250,7 +251,7 @@ function formatTime(time, params) {
/* Translators: Time in 12h format */ /* Translators: Time in 12h format */
format = N_("%l\u2236%M %p"); format = N_("%l\u2236%M %p");
// Show the word "Yesterday" and time if date is on yesterday // Show the word "Yesterday" and time if date is on yesterday
else if (daysAgo < 2) else if (daysAgo <2)
/* Translators: this is the word "Yesterday" followed by a /* Translators: this is the word "Yesterday" followed by a
time string in 12h format. i.e. "Yesterday, 2:30 pm" */ time string in 12h format. i.e. "Yesterday, 2:30 pm" */
// xgettext:no-c-format // xgettext:no-c-format
@ -288,7 +289,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;
} }
@ -345,7 +346,7 @@ function insertSorted(array, val, cmp) {
var CloseButton = GObject.registerClass( var CloseButton = GObject.registerClass(
class CloseButton extends St.Button { class CloseButton extends St.Button {
_init(boxpointer) { _init(boxpointer) {
super._init({ style_class: 'notification-close' }); super._init({ style_class: 'notification-close'});
// This is a bit tricky. St.Bin has its own x-align/y-align properties // This is a bit tricky. St.Bin has its own x-align/y-align properties
// that compete with Clutter's properties. This should be fixed for // that compete with Clutter's properties. This should be fixed for
@ -365,7 +366,7 @@ class CloseButton extends St.Button {
} }
_computeBoxPointerOffset() { _computeBoxPointerOffset() {
if (!this._boxPointer || !this._boxPointer.get_stage()) if (!this._boxPointer || !this._boxPointer.actor.get_stage())
return 0; return 0;
let side = this._boxPointer.arrowSide; let side = this._boxPointer.arrowSide;
@ -379,7 +380,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;
} }
@ -466,7 +467,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);
} }
@ -492,13 +493,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');

View File

@ -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',
@ -178,8 +178,8 @@ var WeatherClient = class {
(o, res) => { (o, res) => {
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;
} }

View File

@ -19,7 +19,7 @@ var METRICS = {
units: "frames / s" }, units: "frames / s" },
overviewLatencySubsequent: overviewLatencySubsequent:
{ description: "Time to first frame after triggering overview, second time", { description: "Time to first frame after triggering overview, second time",
units: "us" }, units: "us"},
overviewFpsSubsequent: overviewFpsSubsequent:
{ description: "Frames rate when going to the overview, second time", { description: "Frames rate when going to the overview, second time",
units: "frames / s" }, units: "frames / s" },
@ -52,7 +52,7 @@ var METRICS = {
units: "us" }, units: "us" },
applicationsShowTimeSubsequent: applicationsShowTimeSubsequent:
{ description: "Time to switch to applications view, second time", { description: "Time to switch to applications view, second time",
units: "us" } units: "us"}
}; };
let WINDOW_CONFIGS = [ let WINDOW_CONFIGS = [
@ -136,6 +136,7 @@ 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;

View File

@ -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() {
@ -157,7 +157,7 @@ function *run() {
Main.overview.hide(); Main.overview.hide();
yield Scripting.createTestWindow({ maximized: true, yield Scripting.createTestWindow({ maximized: true,
redraws: true }); redraws: true});
yield Scripting.waitTestWindows(); yield Scripting.waitTestWindows();
yield Scripting.sleep(1000); yield Scripting.sleep(1000);
@ -269,11 +269,11 @@ function script_collectTimings(time) {
if (len == 0) if (len == 0)
median = -1; median = -1;
else if (len % 2 == 1) else if (len % 2 == 1)
median = times[(len - 1) / 2]; median = times[(len - 1)/ 2];
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;
} }
} }

View File

@ -19,6 +19,7 @@ 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;
@ -58,7 +59,7 @@ class PortalHeaderBar extends Gtk.HeaderBar {
single_line_mode: true, single_line_mode: true,
ellipsize: Pango.EllipsizeMode.END, ellipsize: Pango.EllipsizeMode.END,
valign: Gtk.Align.BASELINE, valign: Gtk.Align.BASELINE,
selectable: true }); selectable: true});
this.subtitleLabel.get_style_context().add_class('subtitle'); this.subtitleLabel.get_style_context().add_class('subtitle');
hbox.add(this.subtitleLabel); hbox.add(this.subtitleLabel);
@ -264,7 +265,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);
} }

View File

@ -1,4 +1,4 @@
const { Clutter, Gio, GLib, GObject, Shell } = imports.gi; const { Clutter, Gio, GLib, Shell } = imports.gi;
const CheckBox = imports.ui.checkBox; const CheckBox = imports.ui.checkBox;
const Dialog = imports.ui.dialog; const Dialog = imports.ui.dialog;
@ -15,10 +15,9 @@ var DialogResponse = {
CLOSED: 2 CLOSED: 2
}; };
var AccessDialog = GObject.registerClass( var AccessDialog = class extends ModalDialog.ModalDialog {
class AccessDialog extends ModalDialog.ModalDialog { constructor(invocation, handle, title, subtitle, body, options) {
_init(invocation, handle, title, subtitle, body, options) { super({ styleClass: 'access-dialog' });
super._init({ styleClass: 'access-dialog' });
this._invocation = invocation; this._invocation = invocation;
this._handle = handle; this._handle = handle;
@ -69,7 +68,7 @@ class AccessDialog extends ModalDialog.ModalDialog {
this.addButton({ label: grantLabel, this.addButton({ label: grantLabel,
action: () => { action: () => {
this._sendResponse(DialogResponse.OK); this._sendResponse(DialogResponse.OK);
} }); }});
} }
open() { open() {
@ -110,7 +109,7 @@ class AccessDialog extends ModalDialog.ModalDialog {
}); });
this.close(); this.close();
} }
}); };
var AccessDialogDBus = class { var AccessDialogDBus = class {
constructor() { constructor() {
@ -135,7 +134,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');
@ -146,7 +145,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;
} }

View File

@ -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,10 +474,12 @@ var CyclerList = GObject.registerClass({
} }
}); });
var CyclerPopup = GObject.registerClass({ var CyclerPopup = GObject.registerClass(
GTypeFlags: GObject.TypeFlags.ABSTRACT class CyclerPopup extends SwitcherPopup.SwitcherPopup {
}, 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();
@ -663,6 +665,14 @@ 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];
} }
}); });
@ -716,16 +726,15 @@ class AppSwitcher extends SwitcherPopup.SwitcherList {
_setIconSize() { _setIconSize() {
let j = 0; let j = 0;
while (this._items.length > 1 && this._items[j].style_class != 'item-box') { while(this._items.length > 1 && this._items[j].style_class != 'item-box') {
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 [, labelNaturalHeight] = this.icons[j].label.get_preferred_height(-1); let [iconMinHeight, iconNaturalHeight] = this.icons[j].label.get_preferred_height(-1);
let iconSpacing = labelNaturalHeight + iconPadding + iconBorder; let iconSpacing = iconNaturalHeight + 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
@ -738,7 +747,7 @@ class AppSwitcher extends SwitcherPopup.SwitcherList {
let iconSize = baseIconSizes[0]; let iconSize = baseIconSizes[0];
if (this._items.length > 1) { if (this._items.length > 1) {
for (let i = 0; i < baseIconSizes.length; i++) { for(let i = 0; i < baseIconSizes.length; i++) {
iconSize = baseIconSizes[i]; iconSize = baseIconSizes[i];
let height = iconSizes[i] + iconSpacing; let height = iconSizes[i] + iconSpacing;
let w = height * this._items.length + totalSpacing; let w = height * this._items.length + totalSpacing;
@ -749,7 +758,7 @@ class AppSwitcher extends SwitcherPopup.SwitcherList {
this._iconSize = iconSize; this._iconSize = iconSize;
for (let i = 0; i < this.icons.length; i++) { for(let i = 0; i < this.icons.length; i++) {
if (this.icons[i].icon != null) if (this.icons[i].icon != null)
break; break;
this.icons[i].set_size(iconSize); this.icons[i].set_size(iconSize);
@ -795,9 +804,8 @@ 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) {
@ -842,8 +850,9 @@ 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);
@ -984,23 +993,23 @@ class WindowIcon extends St.BoxLayout {
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
switch (mode) { switch (mode) {
case AppIconMode.THUMBNAIL_ONLY: case AppIconMode.THUMBNAIL_ONLY:
size = WINDOW_PREVIEW_SIZE; size = WINDOW_PREVIEW_SIZE;
this._icon.add_actor(_createWindowClone(mutterWindow, size * scaleFactor)); this._icon.add_actor(_createWindowClone(mutterWindow, size * scaleFactor));
break; break;
case AppIconMode.BOTH: case AppIconMode.BOTH:
size = WINDOW_PREVIEW_SIZE; size = WINDOW_PREVIEW_SIZE;
this._icon.add_actor(_createWindowClone(mutterWindow, size * scaleFactor)); this._icon.add_actor(_createWindowClone(mutterWindow, size * scaleFactor));
if (this.app) if (this.app)
this._icon.add_actor(this._createAppIcon(this.app, this._icon.add_actor(this._createAppIcon(this.app,
APP_ICON_SIZE_SMALL)); APP_ICON_SIZE_SMALL));
break; break;
case AppIconMode.APP_ICON_ONLY: case AppIconMode.APP_ICON_ONLY:
size = APP_ICON_SIZE; size = APP_ICON_SIZE;
this._icon.add_actor(this._createAppIcon(this.app, size)); this._icon.add_actor(this._createAppIcon(this.app, size));
} }
this._icon.set_size(size * scaleFactor, size * scaleFactor); this._icon.set_size(size * scaleFactor, size * scaleFactor);
@ -1037,7 +1046,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)
}); });
} }
@ -1073,7 +1082,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;

View File

@ -62,11 +62,11 @@ var Animation = class {
if (!validResourceScale) if (!validResourceScale)
return; return;
let textureCache = St.TextureCache.get_default(); let texture_cache = 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 = textureCache.load_sliced_image(file, width, height, this._animations = texture_cache.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);
} }
@ -123,7 +123,7 @@ var AnimatedIcon = class extends Animation {
}; };
var Spinner = class extends AnimatedIcon { var Spinner = class extends AnimatedIcon {
constructor(size, animate = false) { constructor(size, animate=false) {
let file = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/process-working.svg'); let file = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/process-working.svg');
super(file, size); super(file, size);
@ -162,7 +162,7 @@ var Spinner = class extends AnimatedIcon {
time: SPINNER_ANIMATION_TIME, time: SPINNER_ANIMATION_TIME,
transition: 'linear', transition: 'linear',
onComplete: () => { onComplete: () => {
super.stop(); this.stop(false);
} }
}); });
} else { } else {

View File

@ -20,6 +20,7 @@ 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;
@ -33,9 +34,23 @@ 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';
@ -54,7 +69,7 @@ function _getCategories(info) {
function _listsIntersect(a, b) { function _listsIntersect(a, b) {
for (let itemA of a) for (let itemA of a)
if (b.includes(itemA)) if (b.indexOf(itemA) >= 0)
return true; return true;
return false; return false;
} }
@ -69,7 +84,7 @@ function _getFolderName(folder) {
try { try {
keyfile.load_from_data_dirs(path, GLib.KeyFileFlags.NONE); keyfile.load_from_data_dirs(path, GLib.KeyFileFlags.NONE);
name = keyfile.get_locale_string('Desktop Entry', 'Name', null); name = keyfile.get_locale_string('Desktop Entry', 'Name', null);
} catch (e) { } catch(e) {
return name; return name;
} }
} }
@ -83,8 +98,8 @@ function clamp(value, min, max) {
class BaseAppView { class BaseAppView {
constructor(params, gridParams) { constructor(params, gridParams) {
if (this.constructor === BaseAppView) if (new.target === BaseAppView)
throw new TypeError(`Cannot instantiate abstract class ${this.constructor.name}`); throw new TypeError('Cannot instantiate abstract class ' + new.target.name);
gridParams = Params.parse(gridParams, { xAlign: St.Align.MIDDLE, gridParams = Params.parse(gridParams, { xAlign: St.Align.MIDDLE,
columnLimit: MAX_COLUMNS, columnLimit: MAX_COLUMNS,
@ -94,7 +109,7 @@ class BaseAppView {
padWithSpacing: true }); padWithSpacing: true });
params = Params.parse(params, { usePagination: false }); params = Params.parse(params, { usePagination: false });
if (params.usePagination) if(params.usePagination)
this._grid = new IconGrid.PaginatedIconGrid(gridParams); this._grid = new IconGrid.PaginatedIconGrid(gridParams);
else else
this._grid = new IconGrid.IconGrid(gridParams); this._grid = new IconGrid.IconGrid(gridParams);
@ -143,7 +158,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');
} }
@ -151,7 +166,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) {
@ -212,12 +227,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 {
@ -231,7 +246,7 @@ var AllView = class AllView extends BaseAppView {
reactive: true, reactive: true,
y_align: St.Align.START }); y_align: St.Align.START });
this.actor = new St.Widget({ layout_manager: new Clutter.BinLayout(), this.actor = new St.Widget({ layout_manager: new Clutter.BinLayout(),
x_expand: true, y_expand: true }); x_expand:true, y_expand:true });
this.actor.add_actor(this._scrollView); this.actor.add_actor(this._scrollView);
this._scrollView.set_policy(St.PolicyType.NEVER, this._scrollView.set_policy(St.PolicyType.NEVER,
@ -285,7 +300,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)
@ -358,8 +373,8 @@ 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 {
(appInfo.get_id()); // catch invalid file encodings let id = appInfo.get_id(); // catch invalid file encodings
} catch (e) { } catch(e) {
return false; return false;
} }
return appInfo.should_show(); return appInfo.should_show();
@ -399,7 +414,7 @@ var AllView = class AllView extends BaseAppView {
this._refilterApps(); this._refilterApps();
} }
// Overridden from BaseAppView // Overriden from BaseAppView
animate(animationDirection, onComplete) { animate(animationDirection, onComplete) {
this._scrollView.reactive = false; this._scrollView.reactive = false;
let completionFunc = () => { let completionFunc = () => {
@ -432,7 +447,7 @@ var AllView = class AllView extends BaseAppView {
transition: 'easeOutQuad', transition: 'easeOutQuad',
opacity: 0, opacity: 0,
onComplete() { onComplete() {
this.opacity = 255; this.opacity = 255;
} }); } });
if (animationDirection == IconGrid.AnimationDirection.OUT) if (animationDirection == IconGrid.AnimationDirection.OUT)
@ -531,7 +546,7 @@ var AllView = class AllView extends BaseAppView {
} }
_onPanEnd(action) { _onPanEnd(action) {
if (this._displayingPopup) if (this._displayingPopup)
return; return;
let pageHeight = this._grid.getPageHeight(); let pageHeight = this._grid.getPageHeight();
@ -570,7 +585,7 @@ var AllView = class AllView extends BaseAppView {
this._eventBlocker.reactive = isOpen; this._eventBlocker.reactive = isOpen;
this._currentPopup = isOpen ? popup : null; this._currentPopup = isOpen ? popup : null;
this._updateIconOpacities(isOpen); this._updateIconOpacities(isOpen);
if (!isOpen) if(!isOpen)
this._closeSpaceForPopup(); this._closeSpaceForPopup();
}); });
} }
@ -617,9 +632,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()) {
this._adjustment.value = 0;
this._grid.currentPage = 0;
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => {
this._adjustment.value = 0;
this._grid.currentPage = 0;
this._pageIndicators.setNPages(this._grid.nPages()); this._pageIndicators.setNPages(this._grid.nPages());
this._pageIndicators.setCurrentPage(0); this._pageIndicators.setCurrentPage(0);
}); });
@ -671,7 +686,7 @@ var FrequentView = class FrequentView extends BaseAppView {
let mostUsed = this._usage.get_most_used(); let mostUsed = this._usage.get_most_used();
let hasUsefulData = this.hasUsefulData(); let hasUsefulData = this.hasUsefulData();
this._noFrequentAppsLabel.visible = !hasUsefulData; this._noFrequentAppsLabel.visible = !hasUsefulData;
if (!hasUsefulData) if(!hasUsefulData)
return; return;
// Allow dragging of the icon only if the Dash would accept a drop to // Allow dragging of the icon only if the Dash would accept a drop to
@ -720,11 +735,11 @@ class ControlsBoxLayout extends Clutter.BoxLayout {
let maxMinWidth = 0; let maxMinWidth = 0;
let maxNaturalWidth = 0; let maxNaturalWidth = 0;
for (let child = container.get_first_child(); for (let child = container.get_first_child();
child; child;
child = child.get_next_sibling()) { child = child.get_next_sibling()) {
let [minWidth, natWidth] = child.get_preferred_width(forHeight); let [minWidth, natWidth] = child.get_preferred_width(forHeight);
maxMinWidth = Math.max(maxMinWidth, minWidth); maxMinWidth = Math.max(maxMinWidth, minWidth);
maxNaturalWidth = Math.max(maxNaturalWidth, natWidth); maxNaturalWidth = Math.max(maxNaturalWidth, natWidth);
} }
let childrenCount = container.get_n_children(); let childrenCount = container.get_n_children();
let totalSpacing = this.spacing * (childrenCount - 1); let totalSpacing = this.spacing * (childrenCount - 1);
@ -787,7 +802,7 @@ var AppDisplay = class AppDisplay {
// shown next, so make sure to restore their opacity // shown next, so make sure to restore their opacity
// when they are hidden // when they are hidden
if (this._controls.mapped) if (this._controls.mapped)
return; return;
Tweener.removeTweens(this._controls); Tweener.removeTweens(this._controls);
this._controls.opacity = 255; this._controls.opacity = 255;
@ -852,14 +867,14 @@ 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,
{ time: IconGrid.ANIMATION_TIME_IN, { time: IconGrid.ANIMATION_TIME_IN,
transition: 'easeInOutQuad', transition: 'easeInOutQuad',
opacity: finalOpacity, opacity: finalOpacity,
}); });
currentView.animate(animationDirection, onComplete); currentView.animate(animationDirection, onComplete);
} }
@ -895,7 +910,7 @@ var AppDisplay = class AppDisplay {
_onAllocatedSizeChanged(actor, width, height) { _onAllocatedSizeChanged(actor, width, height) {
let box = new Clutter.ActorBox(); let box = new Clutter.ActorBox();
box.x1 = box.y1 = 0; box.x1 = box.y1 =0;
box.x2 = width; box.x2 = width;
box.y2 = height; box.y2 = height;
box = this._viewStack.get_theme_node().get_content_box(box); box = this._viewStack.get_theme_node().get_content_box(box);
@ -926,7 +941,7 @@ var AppSearchProvider = class AppSearchProvider {
'name': app.get_name(), 'name': app.get_name(),
'createIcon'(size) { 'createIcon'(size) {
return app.create_icon_texture(size); return app.create_icon_texture(size);
} }
}); });
} else { } else {
let name = this._systemActions.getName(id); let name = this._systemActions.getName(id);
@ -1002,7 +1017,7 @@ var FolderView = class FolderView extends BaseAppView {
Util.ensureActorVisibleInScrollView(this.actor, actor); Util.ensureActorVisibleInScrollView(this.actor, actor);
} }
// Overridden from BaseAppView // Overriden from BaseAppView
animate(animationDirection) { animate(animationDirection) {
this._grid.animatePulse(animationDirection); this._grid.animatePulse(animationDirection);
} }
@ -1066,7 +1081,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 subtract the required padding etc of the boxpointer // so we have to substract 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];
} }
@ -1150,7 +1165,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.includes(appId)) if (excludedApps.indexOf(appId) >= 0)
return; return;
let app = appSys.lookup_app(appId); let app = appSys.lookup_app(appId);
@ -1251,7 +1266,7 @@ var FolderIcon = class FolderIcon {
adaptToSize(width, height) { adaptToSize(width, height) {
this._parentAvailableWidth = width; this._parentAvailableWidth = width;
this._parentAvailableHeight = height; this._parentAvailableHeight = height;
if (this._popup) if(this._popup)
this.view.adaptToSize(width, height); this.view.adaptToSize(width, height);
this._popupInvalidated = true; this._popupInvalidated = true;
} }
@ -1286,20 +1301,20 @@ var AppFolderPopup = class AppFolderPopup {
x_expand: true, x_expand: true,
x_align: St.Align.START }); x_align: St.Align.START });
this._boxPointer.style_class = 'app-folder-popup'; this._boxPointer.actor.style_class = 'app-folder-popup';
this.actor.add_actor(this._boxPointer); this.actor.add_actor(this._boxPointer.actor);
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.bind_property('opacity', this.closeButton, 'opacity', this._boxPointer.actor.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
}); });
@ -1331,22 +1346,22 @@ var AppFolderPopup = class AppFolderPopup {
let direction; let direction;
let isLtr = Clutter.get_default_text_direction() == Clutter.TextDirection.LTR; let isLtr = Clutter.get_default_text_direction() == Clutter.TextDirection.LTR;
switch (event.get_key_symbol()) { switch (event.get_key_symbol()) {
case Clutter.Down: case Clutter.Down:
direction = St.DirectionType.TAB_FORWARD; direction = St.DirectionType.TAB_FORWARD;
break; break;
case Clutter.Right: case Clutter.Right:
direction = isLtr ? St.DirectionType.TAB_FORWARD : direction = isLtr ? St.DirectionType.TAB_FORWARD :
St.DirectionType.TAB_BACKWARD; St.DirectionType.TAB_BACKWARD;
break; break;
case Clutter.Up: case Clutter.Up:
direction = St.DirectionType.TAB_BACKWARD; direction = St.DirectionType.TAB_BACKWARD;
break; break;
case Clutter.Left: case Clutter.Left:
direction = isLtr ? St.DirectionType.TAB_BACKWARD : direction = isLtr ? St.DirectionType.TAB_BACKWARD :
St.DirectionType.TAB_FORWARD; St.DirectionType.TAB_FORWARD;
break; break;
default: default:
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
} }
return actor.navigate_focus(null, direction, false); return actor.navigate_focus(null, direction, false);
} }
@ -1378,9 +1393,9 @@ var AppFolderPopup = class AppFolderPopup {
this._boxPointer.open(BoxPointer.PopupAnimation.FADE | this._boxPointer.open(BoxPointer.PopupAnimation.FADE |
BoxPointer.PopupAnimation.SLIDE, BoxPointer.PopupAnimation.SLIDE,
() => { () => {
this._view.actor.opacity = 255; this._view.actor.opacity = 255;
this._view.animate(IconGrid.AnimationDirection.IN); this._view.animate(IconGrid.AnimationDirection.IN);
}); });
this.emit('open-state-changed', true); this.emit('open-state-changed', true);
} }
@ -1416,7 +1431,7 @@ var AppFolderPopup = class AppFolderPopup {
Signals.addSignalMethods(AppFolderPopup.prototype); Signals.addSignalMethods(AppFolderPopup.prototype);
var AppIcon = class AppIcon { var AppIcon = class AppIcon {
constructor(app, iconParams = {}) { constructor(app, iconParams) {
this.app = app; this.app = app;
this.id = app.get_id(); this.id = app.get_id();
this.name = app.get_name(); this.name = app.get_name();
@ -1442,6 +1457,9 @@ var AppIcon = class AppIcon {
this.actor._delegate = this; this.actor._delegate = this;
if (!iconParams)
iconParams = {};
// Get the isDraggable property without passing it on to the BaseIcon: // Get the isDraggable property without passing it on to the BaseIcon:
let appIconParams = Params.parse(iconParams, { isDraggable: true }, true); let appIconParams = Params.parse(iconParams, { isDraggable: true }, true);
let isDraggable = appIconParams['isDraggable']; let isDraggable = appIconParams['isDraggable'];
@ -1461,7 +1479,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.actor); this._menuManager = new PopupMenu.PopupMenuManager(this);
if (isDraggable) { if (isDraggable) {
this._draggable = DND.makeDraggable(this.actor); this._draggable = DND.makeDraggable(this.actor);
@ -1473,7 +1491,7 @@ var AppIcon = class AppIcon {
Main.overview.cancelledItemDrag(this); Main.overview.cancelledItemDrag(this);
}); });
this._draggable.connect('drag-end', () => { this._draggable.connect('drag-end', () => {
Main.overview.endItemDrag(this); Main.overview.endItemDrag(this);
}); });
} }
@ -1689,20 +1707,25 @@ var AppIconMenu = class AppIconMenu extends PopupMenu.PopupMenu {
w => !w.skip_taskbar w => !w.skip_taskbar
); );
if (windows.length > 0) // Display the app windows menu items and the separator between windows
this.addMenuItem( // of the current desktop and other windows.
/* Translators: This is the heading of a list of open windows */ let workspaceManager = global.workspace_manager;
new PopupMenu.PopupSeparatorMenuItem(_("Open Windows")) let activeWorkspace = workspaceManager.get_active_workspace();
); let separatorShown = windows.length > 0 && windows[0].get_workspace() != activeWorkspace;
windows.forEach(window => { for (let i = 0; i < windows.length; i++) {
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();
@ -1710,7 +1733,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.includes('new-window')) { actions.indexOf('new-window') == -1) {
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)
@ -1724,7 +1747,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.includes('activate-discrete-gpu')) { actions.indexOf('activate-discrete-gpu') == -1) {
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)

View File

@ -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;

View File

@ -1,4 +1,4 @@
const { Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi; const { Clutter, Gio, GLib, 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,11 +13,10 @@ var AudioDevice = {
const AudioDeviceSelectionIface = loadInterfaceXML('org.gnome.Shell.AudioDeviceSelection'); const AudioDeviceSelectionIface = loadInterfaceXML('org.gnome.Shell.AudioDeviceSelection');
var AudioDeviceSelectionDialog = GObject.registerClass({ var AudioDeviceSelectionDialog =
Signals: { 'device-selected': { param_types: [GObject.TYPE_UINT] } } class AudioDeviceSelectionDialog extends ModalDialog.ModalDialog {
}, class AudioDeviceSelectionDialog extends ModalDialog.ModalDialog { constructor(devices) {
_init(devices) { super({ styleClass: 'audio-device-selection-dialog' });
super._init({ styleClass: 'audio-device-selection-dialog' });
this._deviceItems = {}; this._deviceItems = {};
@ -34,6 +33,10 @@ var AudioDeviceSelectionDialog = GObject.registerClass({
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"),
@ -54,28 +57,28 @@ var AudioDeviceSelectionDialog = GObject.registerClass({
} }
_getDeviceLabel(device) { _getDeviceLabel(device) {
switch (device) { switch(device) {
case AudioDevice.HEADPHONES: case AudioDevice.HEADPHONES:
return _("Headphones"); return _("Headphones");
case AudioDevice.HEADSET: case AudioDevice.HEADSET:
return _("Headset"); return _("Headset");
case AudioDevice.MICROPHONE: case AudioDevice.MICROPHONE:
return _("Microphone"); return _("Microphone");
default: default:
return null; return null;
} }
} }
_getDeviceIcon(device) { _getDeviceIcon(device) {
switch (device) { switch(device) {
case AudioDevice.HEADPHONES: case AudioDevice.HEADPHONES:
return 'audio-headphones-symbolic'; return 'audio-headphones-symbolic';
case AudioDevice.HEADSET: case AudioDevice.HEADSET:
return 'audio-headset-symbolic'; return 'audio-headset-symbolic';
case AudioDevice.MICROPHONE: case AudioDevice.MICROPHONE:
return 'audio-input-microphone-symbolic'; return 'audio-input-microphone-symbolic';
default: default:
return null; return null;
} }
} }
@ -110,11 +113,11 @@ var AudioDeviceSelectionDialog = GObject.registerClass({
} }
_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;
} }
@ -122,7 +125,7 @@ var AudioDeviceSelectionDialog = GObject.registerClass({
Main.overview.hide(); Main.overview.hide();
app.activate(); app.activate();
} }
}); };
var AudioDeviceSelectionDBus = class AudioDeviceSelectionDBus { var AudioDeviceSelectionDBus = class AudioDeviceSelectionDBus {
constructor() { constructor() {
@ -159,12 +162,12 @@ 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 {
dialog = new AudioDeviceSelectionDialog(devices); dialog = new AudioDeviceSelectionDialog(devices);
} catch (e) { } catch(e) {
invocation.return_value(null); invocation.return_value(null);
return; return;
} }

View File

@ -108,6 +108,7 @@ 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;
@ -256,15 +257,14 @@ var Background = class Background {
this._refreshAnimation(); this._refreshAnimation();
}); });
this._settingsChangedSignalId = this._settingsChangedSignalId = this._settings.connect('changed', () => {
this._settings.connect('changed', this._emitChangedSignal.bind(this)); this.emit('changed');
});
this._load(); this._load();
} }
destroy() { destroy() {
this.background = null;
this._cancellable.cancel(); this._cancellable.cancel();
this._removeAnimationTimeout(); this._removeAnimationTimeout();
@ -288,22 +288,6 @@ 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() {
@ -359,7 +343,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._emitChangedSignal(); this.emit('changed');
} }
}); });
this._fileWatches[key] = signalId; this._fileWatches[key] = signalId;
@ -432,12 +416,12 @@ var Background = class Background {
return; return;
this._updateAnimationTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, this._updateAnimationTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT,
interval, interval,
() => { () => {
this._updateAnimationTimeoutId = 0; this._updateAnimationTimeoutId = 0;
this._updateAnimation(); this._updateAnimation();
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
}); });
GLib.Source.set_name_by_id(this._updateAnimationTimeoutId, '[gnome-shell] this._updateAnimation'); GLib.Source.set_name_by_id(this._updateAnimationTimeoutId, '[gnome-shell] this._updateAnimation');
} }
@ -464,9 +448,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);
@ -715,6 +699,7 @@ 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();
} }
}); });

View File

@ -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._backgroundManager = new PopupMenu.PopupMenuManager({ actor: actor });
actor._backgroundManager.addMenu(actor._backgroundMenu); actor._backgroundManager.addMenu(actor._backgroundMenu);
function openMenu(x, y) { function openMenu(x, y) {

View File

@ -4,7 +4,7 @@ const { Atk, Clutter, St } = imports.gi;
const Signals = imports.signals; const Signals = imports.signals;
var BarLevel = class { var BarLevel = class {
constructor(value, params = {}) { constructor(value, params) {
if (isNaN(value)) if (isNaN(value))
// Avoid spreading NaNs around // Avoid spreading NaNs around
throw TypeError('The bar level value must be a number'); throw TypeError('The bar level value must be a number');
@ -13,6 +13,9 @@ var BarLevel = class {
this._overdriveStart = 1; this._overdriveStart = 1;
this._barLevelWidth = 0; this._barLevelWidth = 0;
if (params == undefined)
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,
reactive: params['reactive'] || false, reactive: params['reactive'] || false,
@ -102,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);
@ -114,12 +117,11 @@ 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);
if (this._value > 0) Clutter.cairo_set_source_color(cr, barLevelActiveColor);
Clutter.cairo_set_source_color(cr, barLevelActiveColor);
cr.fillPreserve(); cr.fillPreserve();
Clutter.cairo_set_source_color(cr, barLevelActiveBorderColor); Clutter.cairo_set_source_color(cr, barLevelActiveBorderColor);
cr.setLineWidth(barLevelBorderWidth); cr.setLineWidth(barLevelBorderWidth);
@ -141,19 +143,17 @@ var BarLevel = class {
} }
/* end progress bar arc */ /* end progress bar arc */
if (this._value > 0) { if (this._value <= this._overdriveStart)
if (this._value <= this._overdriveStart) 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); cr.fillPreserve();
cr.fillPreserve(); cr.setLineWidth(barLevelBorderWidth);
cr.setLineWidth(barLevelBorderWidth); cr.stroke();
cr.stroke();
}
/* draw overdrive separator */ /* draw overdrive separator */
if (overdriveActive) { if (overdriveActive) {

View File

@ -1,6 +1,6 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const { Clutter, GObject, Shell, St } = imports.gi; const { Clutter, GObject, Meta, 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,6 +33,8 @@ 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;
@ -48,15 +50,6 @@ 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() {
@ -76,6 +69,36 @@ 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');
@ -90,18 +113,18 @@ var BoxPointer = GObject.registerClass({
if (animate & PopupAnimation.SLIDE) { if (animate & PopupAnimation.SLIDE) {
switch (this._arrowSide) { switch (this._arrowSide) {
case St.Side.TOP: case St.Side.TOP:
this.translation_y = -rise; this.translation_y = -rise;
break; break;
case St.Side.BOTTOM: case St.Side.BOTTOM:
this.translation_y = rise; this.translation_y = rise;
break; break;
case St.Side.LEFT: case St.Side.LEFT:
this.translation_x = -rise; this.translation_x = -rise;
break; break;
case St.Side.RIGHT: case St.Side.RIGHT:
this.translation_x = rise; this.translation_x = rise;
break; break;
} }
} }
@ -130,18 +153,18 @@ var BoxPointer = GObject.registerClass({
if (animate & PopupAnimation.SLIDE) { if (animate & PopupAnimation.SLIDE) {
switch (this._arrowSide) { switch (this._arrowSide) {
case St.Side.TOP: case St.Side.TOP:
translationY = rise; translationY = rise;
break; break;
case St.Side.BOTTOM: case St.Side.BOTTOM:
translationY = -rise; translationY = -rise;
break; break;
case St.Side.LEFT: case St.Side.LEFT:
translationX = rise; translationX = rise;
break; break;
case St.Side.RIGHT: case St.Side.RIGHT:
translationX = -rise; translationX = -rise;
break; break;
} }
} }
@ -204,10 +227,13 @@ 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, availHeight] = themeNode.get_content_box(box).get_size(); let availWidth = box.x2 - box.x1;
let availHeight = box.y2 - box.y1;
childBox.x1 = 0; childBox.x1 = 0;
childBox.y1 = 0; childBox.y1 = 0;
@ -220,25 +246,24 @@ var BoxPointer = GObject.registerClass({
childBox.x2 = availWidth - borderWidth; childBox.x2 = availWidth - borderWidth;
childBox.y2 = availHeight - borderWidth; childBox.y2 = availHeight - borderWidth;
switch (this._arrowSide) { switch (this._arrowSide) {
case St.Side.TOP: case St.Side.TOP:
childBox.y1 += rise; childBox.y1 += rise;
break; break;
case St.Side.BOTTOM: case St.Side.BOTTOM:
childBox.y2 -= rise; childBox.y2 -= rise;
break; break;
case St.Side.LEFT: case St.Side.LEFT:
childBox.x1 += rise; childBox.x1 += rise;
break; break;
case St.Side.RIGHT: case St.Side.RIGHT:
childBox.x2 -= rise; childBox.x2 -= rise;
break; break;
} }
this.bin.allocate(childBox, flags); this.bin.allocate(childBox, flags);
if (this._sourceActor && this._sourceActor.mapped) { if (this._sourceActor && this._sourceActor.mapped) {
this._reposition(box); this._reposition();
this._updateFlip(box); this._updateFlip();
this.set_allocation(box, flags);
} }
} }
@ -264,7 +289,7 @@ var BoxPointer = GObject.registerClass({
let borderRadius = themeNode.get_length('-arrow-border-radius'); let borderRadius = themeNode.get_length('-arrow-border-radius');
let halfBorder = borderWidth / 2; let halfBorder = borderWidth / 2;
let halfBase = Math.floor(base / 2); let halfBase = Math.floor(base/2);
let backgroundColor = themeNode.get_color('-arrow-background-color'); let backgroundColor = themeNode.get_color('-arrow-background-color');
@ -345,7 +370,7 @@ var BoxPointer = GObject.registerClass({
if (!skipTopRight) { if (!skipTopRight) {
cr.lineTo(x2 - borderRadius, y1); cr.lineTo(x2 - borderRadius, y1);
cr.arc(x2 - borderRadius, y1 + borderRadius, borderRadius, cr.arc(x2 - borderRadius, y1 + borderRadius, borderRadius,
3 * Math.PI / 2, Math.PI * 2); 3*Math.PI/2, Math.PI*2);
} }
if (this._arrowSide == St.Side.RIGHT && rise) { if (this._arrowSide == St.Side.RIGHT && rise) {
@ -366,7 +391,7 @@ var BoxPointer = GObject.registerClass({
if (!skipBottomRight) { if (!skipBottomRight) {
cr.lineTo(x2, y2 - borderRadius); cr.lineTo(x2, y2 - borderRadius);
cr.arc(x2 - borderRadius, y2 - borderRadius, borderRadius, cr.arc(x2 - borderRadius, y2 - borderRadius, borderRadius,
0, Math.PI / 2); 0, Math.PI/2);
} }
if (this._arrowSide == St.Side.BOTTOM && rise) { if (this._arrowSide == St.Side.BOTTOM && rise) {
@ -387,7 +412,7 @@ var BoxPointer = GObject.registerClass({
if (!skipBottomLeft) { if (!skipBottomLeft) {
cr.lineTo(x1 + borderRadius, y2); cr.lineTo(x1 + borderRadius, y2);
cr.arc(x1 + borderRadius, y2 - borderRadius, borderRadius, cr.arc(x1 + borderRadius, y2 - borderRadius, borderRadius,
Math.PI / 2, Math.PI); Math.PI/2, Math.PI);
} }
if (this._arrowSide == St.Side.LEFT && rise) { if (this._arrowSide == St.Side.LEFT && rise) {
@ -396,7 +421,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);
@ -408,7 +433,7 @@ var BoxPointer = GObject.registerClass({
if (!skipTopLeft) { if (!skipTopLeft) {
cr.lineTo(x1, y1 + borderRadius); cr.lineTo(x1, y1 + borderRadius);
cr.arc(x1 + borderRadius, y1 + borderRadius, borderRadius, cr.arc(x1 + borderRadius, y1 + borderRadius, borderRadius,
Math.PI, 3 * Math.PI / 2); Math.PI, 3*Math.PI/2);
} }
Clutter.cairo_set_source_color(cr, backgroundColor); Clutter.cairo_set_source_color(cr, backgroundColor);
@ -425,25 +450,15 @@ var BoxPointer = GObject.registerClass({
} }
setPosition(sourceActor, alignment) { setPosition(sourceActor, alignment) {
if (!this._sourceActor || sourceActor != this._sourceActor) { // We need to show it now to force an allocation,
if (this._sourceActorDestroyId) { // so that we can query the correct size.
this._sourceActor.disconnect(this._sourceActorDestroyId); this.show();
delete this._sourceActorDestroyId;
}
this._sourceActor = sourceActor;
if (this._sourceActor) {
this._sourceActorDestroyId = this._sourceActor.connect('destroy', () => {
this._sourceActor = null;
delete this._sourceActorDestroyId;
});
}
}
this._sourceActor = sourceActor;
this._arrowAlignment = alignment; this._arrowAlignment = alignment;
this.queue_relayout(); this._reposition();
this._updateFlip();
} }
setSourceAlignment(alignment) { setSourceAlignment(alignment) {
@ -455,7 +470,7 @@ var BoxPointer = GObject.registerClass({
this.setPosition(this._sourceActor, this._arrowAlignment); this.setPosition(this._sourceActor, this._arrowAlignment);
} }
_reposition(allocationBox) { _reposition() {
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);
@ -513,7 +528,7 @@ var BoxPointer = GObject.registerClass({
// of the box to maintain the arrow's accuracy. // of the box to maintain the arrow's accuracy.
let arrowOrigin; let arrowOrigin;
let halfBase = Math.floor(arrowBase / 2); let halfBase = Math.floor(arrowBase/2);
let halfBorder = borderWidth / 2; let halfBorder = borderWidth / 2;
let halfMargin = margin / 2; let halfMargin = margin / 2;
let [x1, y1] = [halfBorder, halfBorder]; let [x1, y1] = [halfBorder, halfBorder];
@ -569,7 +584,8 @@ var BoxPointer = GObject.registerClass({
} }
// Actually set the position // Actually set the position
allocationBox.set_origin(Math.floor(x), Math.floor(y)); this.x = Math.floor(x);
this.y = Math.floor(y);
} }
// @origin: Coordinate specifying middle of the arrow, along // @origin: Coordinate specifying middle of the arrow, along
@ -623,11 +639,15 @@ var BoxPointer = GObject.registerClass({
return arrowSide; return arrowSide;
} }
_updateFlip(allocationBox) { _updateFlip() {
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(allocationBox); this._reposition();
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => {
this.queue_relayout();
return false;
});
this.emit('arrow-side-changed'); this.emit('arrow-side-changed');
} }

View File

@ -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.includes(date.getDay().toString()); return days.indexOf(date.getDay().toString()) == -1;
} }
function _getBeginningOfDay(date) { function _getBeginningOfDay(date) {
@ -143,7 +143,8 @@ 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)
@ -167,7 +168,7 @@ var DBusEventSource = class DBusEventSource {
try { try {
this._dbusProxy.init_finish(result); this._dbusProxy.init_finish(result);
loaded = true; loaded = true;
} catch (e) { } catch(e) {
if (e.matches(Gio.DBusError, Gio.DBusError.TIMED_OUT)) { if (e.matches(Gio.DBusError, Gio.DBusError.TIMED_OUT)) {
// Ignore timeouts and install signals as normal, because with high // Ignore timeouts and install signals as normal, because with high
// probability the service will appear later on, and we will get a // probability the service will appear later on, and we will get a
@ -177,7 +178,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;
} }
} }
@ -237,18 +238,20 @@ var DBusEventSource = class DBusEventSource {
_onEventsReceived(results, error) { _onEventsReceived(results, error) {
let newEvents = []; let newEvents = [];
let appointments = results[0] || []; let appointments = results ? results[0] : null;
for (let n = 0; n < appointments.length; n++) { if (appointments != null) {
let a = appointments[n]; for (let n = 0; n < appointments.length; n++) {
let date = new Date(a[4] * 1000); let a = appointments[n];
let end = new Date(a[5] * 1000); let date = new Date(a[4] * 1000);
let id = a[0]; let end = new Date(a[5] * 1000);
let summary = a[1]; let id = a[0];
let allDay = a[3]; let summary = a[1];
let event = new CalendarEvent(id, date, end, summary, allDay); let allDay = a[3];
newEvents.push(event); let event = new CalendarEvent(id, date, end, summary, allDay);
newEvents.push(event);
}
newEvents.sort((ev1, ev2) => ev1.date.getTime() - ev2.date.getTime());
} }
newEvents.sort((ev1, ev2) => ev1.date.getTime() - ev2.date.getTime());
this._events = newEvents; this._events = newEvents;
this.isLoading = false; this.isLoading = false;
@ -260,7 +263,7 @@ var DBusEventSource = class DBusEventSource {
if (!this._initialized) if (!this._initialized)
return; return;
if (this._curRequestBegin && this._curRequestEnd) { if (this._curRequestBegin && this._curRequestEnd){
this._dbusProxy.GetEventsRemote(this._curRequestBegin.getTime() / 1000, this._dbusProxy.GetEventsRemote(this._curRequestBegin.getTime() / 1000,
this._curRequestEnd.getTime() / 1000, this._curRequestEnd.getTime() / 1000,
forceReload, forceReload,
@ -282,7 +285,7 @@ var DBusEventSource = class DBusEventSource {
getEvents(begin, end) { getEvents(begin, end) {
let result = []; let result = [];
for (let n = 0; n < this._events.length; n++) { for(let n = 0; n < this._events.length; n++) {
let event = this._events[n]; let event = this._events[n];
if (_dateIntervalsOverlap (event.date, event.end, begin, end)) { if (_dateIntervalsOverlap (event.date, event.end, begin, end)) {
@ -317,7 +320,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);
/** /**
@ -399,8 +402,8 @@ var Calendar = class Calendar {
this._topBox.add(this._backButton); this._topBox.add(this._backButton);
this._backButton.connect('clicked', this._onPrevMonthButtonClicked.bind(this)); this._backButton.connect('clicked', this._onPrevMonthButtonClicked.bind(this));
this._monthLabel = new St.Label({ style_class: 'calendar-month-label', this._monthLabel = new St.Label({style_class: 'calendar-month-label',
can_focus: true }); can_focus: true });
this._topBox.add(this._monthLabel, { expand: true, x_fill: false, x_align: St.Align.MIDDLE }); this._topBox.add(this._monthLabel, { expand: true, x_fill: false, x_align: St.Align.MIDDLE });
this._forwardButton = new St.Button({ style_class: 'calendar-change-month-forward pager-button', this._forwardButton = new St.Button({ style_class: 'calendar-change-month-forward pager-button',
@ -463,7 +466,8 @@ 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();
@ -486,7 +490,8 @@ 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();
@ -541,6 +546,8 @@ 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;
@ -552,7 +559,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 < nRows) { while (row < 8) {
// 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 });
@ -578,12 +585,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';
@ -641,9 +648,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 {
button.remove_style_pseudo_class('selected');
} }
else
button.remove_style_pseudo_class('selected');
}); });
} }
}; };
@ -1070,7 +1077,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);
@ -1096,7 +1103,7 @@ var CalendarMessageList = class CalendarMessageList {
_addSection(section) { _addSection(section) {
let obj = { let obj = {
destroyId: 0, destroyId: 0,
visibleId: 0, visibleId: 0,
emptyChangedId: 0, emptyChangedId: 0,
canClearChangedId: 0, canClearChangedId: 0,
keyFocusId: 0 keyFocusId: 0

View File

@ -6,12 +6,12 @@ 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({
Implements: [Meta.CloseDialog], Implements: [ Meta.CloseDialog ],
Properties: { Properties: {
'window': GObject.ParamSpec.override('window', Meta.CloseDialog) 'window': GObject.ParamSpec.override('window', Meta.CloseDialog)
}, },
@ -56,12 +56,12 @@ var CloseDialog = GObject.registerClass({
this._dialog.height = windowActor.height; this._dialog.height = windowActor.height;
this._dialog.addContent(this._createDialogContent()); this._dialog.addContent(this._createDialogContent());
this._dialog.addButton({ label: _('Force Quit'), this._dialog.addButton({ label: _('Force Quit'),
action: this._onClose.bind(this), action: this._onClose.bind(this),
default: true }); default: true });
this._dialog.addButton({ label: _('Wait'), this._dialog.addButton({ label: _('Wait'),
action: this._onWait.bind(this), action: this._onWait.bind(this),
key: Clutter.Escape }); key: Clutter.Escape });
global.focus_manager.add_group(this._dialog); global.focus_manager.add_group(this._dialog);
} }
@ -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);

View File

@ -13,13 +13,13 @@ var ComponentManager = class {
let newEnabledComponents = Main.sessionMode.components; let newEnabledComponents = Main.sessionMode.components;
newEnabledComponents.filter( newEnabledComponents.filter(
name => !this._enabledComponents.includes(name) name => this._enabledComponents.indexOf(name) == -1
).forEach(name => { ).forEach(name => {
this._enableComponent(name); this._enableComponent(name);
}); });
this._enabledComponents.filter( this._enabledComponents.filter(
name => !newEnabledComponents.includes(name) name => newEnabledComponents.indexOf(name) == -1
).forEach(name => { ).forEach(name => {
this._disableComponent(name); this._disableComponent(name);
}); });
@ -37,8 +37,8 @@ var ComponentManager = class {
if (component) if (component)
return component; return component;
if (Main.sessionMode.isLocked) if (Main.sessionMode.isLocked)
return null; return null;
let constructor = this._importComponent(name); let constructor = this._importComponent(name);
component = new constructor(); component = new constructor();
@ -48,7 +48,7 @@ var ComponentManager = class {
_enableComponent(name) { _enableComponent(name) {
let component = this._ensureComponent(name); let component = this._ensureComponent(name);
if (component) if (component)
component.enable(); component.enable();
} }

View File

@ -5,7 +5,6 @@ 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;
@ -109,23 +108,25 @@ 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(Gio.MountUnmountFlags.FORCE, null, null, drive.stop
(drive, res) => { (Gio.MountUnmountFlags.FORCE, null, null,
try { (drive, res) => {
drive.stop_finish(res); try {
} catch (e) { drive.stop_finish(res);
log(`Unable to stop the drive after drive-eject-button ${e.toString()}`); } catch (e) {
} 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(Gio.MountUnmountFlags.FORCE, null, null, drive.eject_with_operation
(drive, res) => { (Gio.MountUnmountFlags.FORCE, null, null,
try { (drive, res) => {
drive.eject_with_operation_finish(res); try {
} catch (e) { drive.eject_with_operation_finish(res);
log(`Unable to eject the drive after drive-eject-button ${e.toString()}`); } catch (e) {
} log("Unable to eject the drive after drive-eject-button " + e.toString());
}); }
});
} }
} }
@ -198,20 +199,12 @@ 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)
// libblockdev wrong password opening LUKS device e.message.includes('Error unlocking')) { // udisks (wrong password)
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.message.includes('Compiled against a version of libcryptsetup that does not support the VeraCrypt PIM setting')) {
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)) if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.FAILED_HANDLED))
log(`Unable to mount volume ${volume.get_name()}: ${e.toString()}`); log('Unable to mount volume ' + volume.get_name() + ': ' + e.toString());
this._closeOperation(volume); this._closeOperation(volume);
} }
} }

View File

@ -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.includes('/.')); return (path.indexOf('/.') != -1);
} }
function isMountNonLocal(mount) { function isMountNonLocal(mount) {
@ -65,7 +65,8 @@ 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()}: ${e}`); log('Unable to launch the application ' + app.get_name()
+ ': ' + e.toString());
} }
return retval; return retval;
@ -106,7 +107,8 @@ 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()}: ${e}`); log('Unable to guess content types on added mount ' + mount.get_name()
+ ': ' + e.toString());
} }
if (contentTypes.length) { if (contentTypes.length) {
@ -122,7 +124,10 @@ var ContentTypeDiscoverer = class {
} }
} }
_emitCallback(mount, contentTypes = []) { _emitCallback(mount, contentTypes) {
if (!contentTypes)
contentTypes = [];
// we're not interested in win32 software content types here // we're not interested in win32 software content types here
contentTypes = contentTypes.filter( contentTypes = contentTypes.filter(
type => (type != 'x-content/win32-software') type => (type != 'x-content/win32-software')
@ -187,15 +192,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.includes(contentType)) if (runApp.indexOf(contentType) != -1)
return AutorunSetting.RUN; return AutorunSetting.RUN;
let ignore = this._settings.get_strv(SETTING_IGNORE); let ignore = this._settings.get_strv(SETTING_IGNORE);
if (ignore.includes(contentType)) if (ignore.indexOf(contentType) != -1)
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.includes(contentType)) if (openFiles.indexOf(contentType) != -1)
return AutorunSetting.FILES; return AutorunSetting.FILES;
return AutorunSetting.ASK; return AutorunSetting.ASK;

View File

@ -10,10 +10,9 @@ const CheckBox = imports.ui.checkBox;
var WORK_SPINNER_ICON_SIZE = 16; var WORK_SPINNER_ICON_SIZE = 16;
var KeyringDialog = GObject.registerClass( var KeyringDialog = class extends ModalDialog.ModalDialog {
class KeyringDialog extends ModalDialog.ModalDialog { constructor() {
_init() { super({ styleClass: 'prompt-dialog' });
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));
@ -24,8 +23,20 @@ class KeyringDialog 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;
@ -162,7 +173,7 @@ class KeyringDialog extends ModalDialog.ModalDialog {
// NOTE: ModalDialog.open() is safe to call if the dialog is // NOTE: ModalDialog.open() is safe to call if the dialog is
// already open - it just returns true without side-effects // already open - it just returns true without side-effects
if (this.open()) if (this.open())
return true; return true;
// The above fail if e.g. unable to get input grab // The above fail if e.g. unable to get input grab
// //
@ -172,7 +183,7 @@ class KeyringDialog 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;
} }
@ -213,7 +224,7 @@ class KeyringDialog extends ModalDialog.ModalDialog {
_onCancelButton() { _onCancelButton() {
this.prompt.cancel(); this.prompt.cancel();
} }
}); };
var KeyringDummyDialog = class { var KeyringDummyDialog = class {
constructor() { constructor() {

View File

@ -1,6 +1,6 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const { Clutter, Gio, GLib, GObject, NM, Pango, Shell, St } = imports.gi; const { Clutter, Gio, GLib, 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,10 +12,9 @@ const ShellEntry = imports.ui.shellEntry;
const VPN_UI_GROUP = 'VPN Plugin UI'; const VPN_UI_GROUP = 'VPN Plugin UI';
var NetworkSecretDialog = GObject.registerClass( var NetworkSecretDialog = class extends ModalDialog.ModalDialog {
class NetworkSecretDialog extends ModalDialog.ModalDialog { constructor(agent, requestId, connection, settingName, hints, flags, contentOverride) {
_init(agent, requestId, connection, settingName, hints, flags, contentOverride) { super({ styleClass: 'prompt-dialog' });
super._init({ styleClass: 'prompt-dialog' });
this._agent = agent; this._agent = agent;
this._requestId = requestId; this._requestId = requestId;
@ -80,9 +79,8 @@ class NetworkSecretDialog 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);
@ -106,19 +104,19 @@ class NetworkSecretDialog extends ModalDialog.ModalDialog {
descriptionLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE; descriptionLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
contentBox.messageBox.add(descriptionLabel, contentBox.messageBox.add(descriptionLabel,
{ y_fill: true, { y_fill: true,
y_align: St.Align.START, y_align: St.Align.START,
expand: true }); expand: true });
} }
this._okButton = { label: _("Connect"), this._okButton = { label: _("Connect"),
action: this._onOk.bind(this), action: this._onOk.bind(this),
default: true default: true
}; };
this.setButtons([{ label: _("Cancel"), this.setButtons([{ label: _("Cancel"),
action: this.cancel.bind(this), action: this.cancel.bind(this),
key: Clutter.KEY_Escape, key: Clutter.KEY_Escape,
}, },
this._okButton]); this._okButton]);
@ -177,25 +175,24 @@ class NetworkSecretDialog extends ModalDialog.ModalDialog {
let value = secret.value; let value = secret.value;
if (secret.wep_key_type == NM.WepKeyType.KEY) { if (secret.wep_key_type == NM.WepKeyType.KEY) {
if (value.length == 10 || value.length == 26) { if (value.length == 10 || value.length == 26) {
for (let i = 0; i < value.length; i++) { for (let i = 0; i < value.length; i++) {
if (!((value[i] >= 'a' && value[i] <= 'f') if (!((value[i] >= 'a' && value[i] <= 'f')
|| (value[i] >= 'A' && value[i] <= 'F') || (value[i] >= 'A' && value[i] <= 'F')
|| (value[i] >= '0' && value[i] <= '9'))) || (value[i] >= '0' && value[i] <= '9')))
return false; return false;
} }
} else if (value.length == 5 || value.length == 13) { } else if (value.length == 5 || value.length == 13) {
for (let i = 0; i < value.length; i++) { for (let i = 0; i < value.length; i++) {
if (!((value[i] >= 'a' && value[i] <= 'z') if (!((value[i] >= 'a' && value[i] <= 'z')
|| (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; }
}
return true; return true;
} }
@ -216,7 +213,7 @@ class NetworkSecretDialog 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 });
@ -232,12 +229,13 @@ class NetworkSecretDialog 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) {
@ -274,7 +272,7 @@ class NetworkSecretDialog 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));
} }
} }
@ -305,7 +303,7 @@ class NetworkSecretDialog extends ModalDialog.ModalDialog {
let ssid; let ssid;
let content = { }; let content = { };
content.secrets = []; content.secrets = [ ];
switch (connectionType) { switch (connectionType) {
case '802-11-wireless': case '802-11-wireless':
@ -328,7 +326,7 @@ class NetworkSecretDialog extends ModalDialog.ModalDialog {
this._getPPPoESecrets(content.secrets); this._getPPPoESecrets(content.secrets);
break; break;
case 'gsm': case 'gsm':
if (this._hints.includes('pin')) { if (this._hints.indexOf('pin') != -1) {
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");
@ -344,12 +342,12 @@ class NetworkSecretDialog 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) {
@ -360,15 +358,16 @@ var VPNRequestHandler = class {
this._pluginOutBuffer = []; this._pluginOutBuffer = [];
this._title = null; this._title = null;
this._description = null; this._description = null;
this._content = []; this._content = [ ];
this._shellDialog = null; this._shellDialog = null;
let connectionSetting = connection.get_setting_connection(); let connectionSetting = connection.get_setting_connection();
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)
@ -407,7 +406,7 @@ var VPNRequestHandler = class {
this._vpnChildFinished.bind(this)); this._vpnChildFinished.bind(this));
this._writeConnection(); this._writeConnection();
} catch (e) { } catch(e) {
logError(e, 'error while spawning VPN auth helper'); logError(e, 'error while spawning VPN auth helper');
this._agent.respond(requestId, Shell.NetworkAgentResponse.INTERNAL_ERROR); this._agent.respond(requestId, Shell.NetworkAgentResponse.INTERNAL_ERROR);
@ -424,7 +423,7 @@ var VPNRequestHandler = class {
} else { } else {
try { try {
this._stdin.write('QUIT\n\n', null); this._stdin.write('QUIT\n\n', null);
} catch (e) { /* ignore broken pipe errors */ } } catch(e) { /* ignore broken pipe errors */ }
} }
this.destroy(); this.destroy();
@ -459,9 +458,8 @@ 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();
} }
@ -474,7 +472,7 @@ var VPNRequestHandler = class {
if (line == '' && this._previousLine == '') { if (line == '' && this._previousLine == '') {
try { try {
this._stdin.write('QUIT\n\n', null); this._stdin.write('QUIT\n\n', null);
} catch (e) { /* ignore broken pipe errors */ } } catch(e) { /* ignore broken pipe errors */ }
} else { } else {
this._agent.set_password(this._requestId, this._previousLine, line); this._agent.set_password(this._requestId, this._previousLine, line);
this._previousLine = undefined; this._previousLine = undefined;
@ -562,7 +560,7 @@ var VPNRequestHandler = class {
this._agent.set_password(this._requestId, groups[i], value); this._agent.set_password(this._requestId, groups[i], value);
} }
} }
} catch (e) { } catch(e) {
// No output is a valid case it means "both secrets are stored" // No output is a valid case it means "both secrets are stored"
if (data.length > 0) { if (data.length > 0) {
logError(e, 'error while reading VPN plugin output keyfile'); logError(e, 'error while reading VPN plugin output keyfile');
@ -588,15 +586,15 @@ 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) {
logError(e, 'internal error while writing connection to helper'); logError(e, 'internal error while writing connection to helper');
this._agent.respond(this._requestId, Shell.NetworkAgentResponse.INTERNAL_ERROR); this._agent.respond(this._requestId, Shell.NetworkAgentResponse.INTERNAL_ERROR);
@ -620,9 +618,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));
@ -633,7 +631,7 @@ var NetworkAgent = class {
try { try {
this._native.init_finish(res); this._native.init_finish(res);
this._initialized = true; this._initialized = true;
} catch (e) { } catch(e) {
this._native = null; this._native = null;
logError(e, 'error initializing the NetworkManager Agent'); logError(e, 'error initializing the NetworkManager Agent');
} }
@ -681,13 +679,12 @@ 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()));
@ -697,7 +694,8 @@ 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.includes('pin')) { if (hints.indexOf('pin') != -1) {
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;
@ -709,7 +707,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;
} }

View File

@ -1,7 +1,8 @@
// -*- 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,
GObject, Pango, PolkitAgent, Polkit, Shell, St } = imports.gi; 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;
@ -14,11 +15,9 @@ var DIALOG_ICON_SIZE = 48;
var WORK_SPINNER_ICON_SIZE = 16; var WORK_SPINNER_ICON_SIZE = 16;
var AuthenticationDialog = GObject.registerClass({ var AuthenticationDialog = class extends ModalDialog.ModalDialog {
Signals: { 'done': { param_types: [GObject.TYPE_BOOLEAN] } } constructor(actionId, body, cookie, userNames) {
}, class AuthenticationDialog extends ModalDialog.ModalDialog { super({ styleClass: 'prompt-dialog' });
_init(actionId, body, cookie, userNames) {
super._init({ styleClass: 'prompt-dialog' });
this.actionId = actionId; this.actionId = actionId;
this.message = body; this.message = body;
@ -26,7 +25,7 @@ var AuthenticationDialog = GObject.registerClass({
this._wasDismissed = false; this._wasDismissed = false;
this._sessionUpdatedId = Main.sessionMode.connect('updated', () => { this._sessionUpdatedId = Main.sessionMode.connect('updated', () => {
this.visible = !Main.sessionMode.isLocked; this._group.visible = !Main.sessionMode.isLocked;
}); });
this.connect('closed', this._onDialogClosed.bind(this)); this.connect('closed', this._onDialogClosed.bind(this));
@ -38,19 +37,19 @@ var AuthenticationDialog = GObject.registerClass({
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.includes(userName)) if (userNames.indexOf(userName) < 0)
userName = 'root'; userName = 'root';
if (!userNames.includes(userName)) if (userNames.indexOf(userName) < 0)
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',
@ -77,15 +76,15 @@ var AuthenticationDialog = GObject.registerClass({
styleClass: 'polkit-dialog-user-icon' }); styleClass: 'polkit-dialog-user-icon' });
this._userAvatar.actor.hide(); this._userAvatar.actor.hide();
userBox.add(this._userAvatar.actor, userBox.add(this._userAvatar.actor,
{ x_fill: true, { x_fill: true,
y_fill: false, y_fill: false,
x_align: St.Align.END, x_align: St.Align.END,
y_align: St.Align.START }); y_align: St.Align.START });
let userLabel = new St.Label(({ style_class: 'polkit-dialog-user-label', let userLabel = new St.Label(({ style_class: 'polkit-dialog-user-label',
text: userRealName })); text: userRealName }));
userBox.add(userLabel, userBox.add(userLabel,
{ x_fill: true, { x_fill: true,
y_fill: false, y_fill: false,
x_align: St.Align.END, x_align: St.Align.END,
y_align: St.Align.MIDDLE }); y_align: St.Align.MIDDLE });
} }
@ -98,7 +97,7 @@ var AuthenticationDialog = GObject.registerClass({
this._passwordBox.add(this._passwordLabel, { y_fill: false, y_align: St.Align.MIDDLE }); this._passwordBox.add(this._passwordLabel, { y_fill: false, y_align: St.Align.MIDDLE });
this._passwordEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry', this._passwordEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry',
text: "", text: "",
can_focus: true }); can_focus: true});
ShellEntry.addContextMenu(this._passwordEntry, { isPassword: true }); ShellEntry.addContextMenu(this._passwordEntry, { isPassword: true });
this._passwordEntry.clutter_text.connect('activate', this._onEntryActivate.bind(this)); this._passwordEntry.clutter_text.connect('activate', this._onEntryActivate.bind(this));
this._passwordBox.add(this._passwordEntry, this._passwordBox.add(this._passwordEntry,
@ -127,7 +126,7 @@ var AuthenticationDialog = GObject.registerClass({
* gnome-shell.css sets the color to be transparent * gnome-shell.css sets the color to be transparent
*/ */
this._nullMessageLabel = new St.Label({ style_class: 'prompt-dialog-null-label', this._nullMessageLabel = new St.Label({ style_class: 'prompt-dialog-null-label',
text: 'abc' }); text: 'abc'});
this._nullMessageLabel.add_style_class_name('hidden'); this._nullMessageLabel.add_style_class_name('hidden');
this._nullMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE; this._nullMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
this._nullMessageLabel.clutter_text.line_wrap = true; this._nullMessageLabel.clutter_text.line_wrap = true;
@ -137,7 +136,7 @@ var AuthenticationDialog = GObject.registerClass({
this._cancelButton = this.addButton({ label: _("Cancel"), this._cancelButton = this.addButton({ label: _("Cancel"),
action: this.cancel.bind(this), action: this.cancel.bind(this),
key: Clutter.Escape }); key: Clutter.Escape });
this._okButton = this.addButton({ label: _("Authenticate"), this._okButton = this.addButton({ label: _("Authenticate"),
action: this._onAuthenticateButtonPressed.bind(this), action: this._onAuthenticateButtonPressed.bind(this),
default: true }); default: true });
@ -180,9 +179,9 @@ var AuthenticationDialog = GObject.registerClass({
// //
// 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);
} }
} }
@ -250,14 +249,14 @@ var AuthenticationDialog = GObject.registerClass({
} }
} }
_onSessionRequest(session, request, echoOn) { _onSessionRequest(session, request, echo_on) {
// 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 (echoOn) if (echo_on)
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
@ -327,7 +326,8 @@ var AuthenticationDialog = GObject.registerClass({
this._destroySession(); this._destroySession();
} }
}); };
Signals.addSignalMethods(AuthenticationDialog.prototype);
var AuthenticationAgent = class { var AuthenticationAgent = class {
constructor() { constructor() {
@ -342,7 +342,7 @@ var AuthenticationAgent = class {
enable() { enable() {
try { try {
this._native.register(); this._native.register();
} catch (e) { } catch(e) {
log('Failed to register AuthenticationAgent'); log('Failed to register AuthenticationAgent');
} }
} }
@ -350,7 +350,7 @@ var AuthenticationAgent = class {
disable() { disable() {
try { try {
this._native.unregister(); this._native.unregister();
} catch (e) { } catch(e) {
log('Failed to unregister AuthenticationAgent'); log('Failed to unregister AuthenticationAgent');
} }
} }

View File

@ -8,7 +8,7 @@ var Tpl = null;
var Tp = null; var Tp = null;
try { try {
({ TelepathyGLib: Tp, TelepathyLogger: Tpl } = imports.gi); ({ TelepathyGLib: Tp, TelepathyLogger: Tpl } = imports.gi);
} catch (e) { } catch(e) {
log('Telepathy is not available, chat integration will be disabled.'); log('Telepathy is not available, chat integration will be disabled.');
} }
@ -40,6 +40,8 @@ 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();
@ -87,7 +89,7 @@ var TelepathyComponent = class {
try { try {
this._client.register(); this._client.register();
} catch (e) { } catch (e) {
throw new Error(`Could not register Telepathy client. Error: ${e}`); throw new Error('Couldn\'t register Telepathy client. Error: \n' + 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()))
@ -147,20 +149,20 @@ class TelepathyClient extends Tp.BaseClient {
this._delegatedChannelsCb.bind(this)); this._delegatedChannelsCb.bind(this));
} }
vfunc_observe_channels(...args) { vfunc_observe_channels(account, conn, channels,
let [account, conn, channels, dispatchOp, requests, context] = args; dispatchOp, requests, context) {
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];
let [targetHandle, targetHandleType] = channel.get_handle(); let [targetHandle, targetHandleType] = channel.get_handle();
if (channel.get_invalidated()) if (channel.get_invalidated())
continue; continue;
/* Only observe contact text channels */ /* Only observe contact text channels */
if ((!(channel instanceof Tp.TextChannel)) || if ((!(channel instanceof Tp.TextChannel)) ||
targetHandleType != Tp.HandleType.CONTACT) targetHandleType != Tp.HandleType.CONTACT)
continue; continue;
this._createChatSource(account, conn, channel, channel.get_target_contact()); this._createChatSource(account, conn, channel, channel.get_target_contact());
} }
@ -180,8 +182,8 @@ class TelepathyClient extends Tp.BaseClient {
}); });
} }
vfunc_handle_channels(...args) { vfunc_handle_channels(account, conn, channels, requests,
let [account, conn, channels, requests, userActionTime, context] = args; user_action_time, context) {
this._handlingChannels(account, conn, channels, true); this._handlingChannels(account, conn, channels, true);
context.accept(); context.accept();
} }
@ -198,7 +200,7 @@ class TelepathyClient extends Tp.BaseClient {
} }
if (channel.get_invalidated()) if (channel.get_invalidated())
continue; continue;
// 'notify' will be true when coming from an actual HandleChannels // 'notify' will be true when coming from an actual HandleChannels
// call, and not when from a successful Claim call. The point is // call, and not when from a successful Claim call. The point is
@ -220,8 +222,8 @@ class TelepathyClient extends Tp.BaseClient {
} }
} }
vfunc_add_dispatch_operation(...args) { vfunc_add_dispatch_operation(account, conn, channels,
let [account, conn, channels, dispatchOp, context] = args; dispatchOp, context) {
let channel = channels[0]; let channel = channels[0];
let chanType = channel.get_channel_type(); let chanType = channel.get_channel_type();
@ -253,7 +255,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);
} }
}); });
@ -360,28 +362,28 @@ var ChatSource = class extends MessageTray.Source {
let presenceType = this._contact.get_presence_type(); let presenceType = this._contact.get_presence_type();
switch (presenceType) { switch (presenceType) {
case Tp.ConnectionPresenceType.AVAILABLE: case Tp.ConnectionPresenceType.AVAILABLE:
iconName = 'user-available'; iconName = 'user-available';
break; break;
case Tp.ConnectionPresenceType.BUSY: case Tp.ConnectionPresenceType.BUSY:
iconName = 'user-busy'; iconName = 'user-busy';
break; break;
case Tp.ConnectionPresenceType.OFFLINE: case Tp.ConnectionPresenceType.OFFLINE:
iconName = 'user-offline'; iconName = 'user-offline';
break; break;
case Tp.ConnectionPresenceType.HIDDEN: case Tp.ConnectionPresenceType.HIDDEN:
iconName = 'user-invisible'; iconName = 'user-invisible';
break; break;
case Tp.ConnectionPresenceType.AWAY: case Tp.ConnectionPresenceType.AWAY:
iconName = 'user-away'; iconName = 'user-away';
break; break;
case Tp.ConnectionPresenceType.EXTENDED_AWAY: case Tp.ConnectionPresenceType.EXTENDED_AWAY:
iconName = 'user-idle'; iconName = 'user-idle';
break; break;
default: default:
iconName = 'user-offline'; iconName = 'user-offline';
} }
return new Gio.ThemedIcon({ name: iconName }); return new Gio.ThemedIcon({ name: iconName });
} }
_updateAvatarIcon() { _updateAvatarIcon() {
@ -399,7 +401,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 available - mission control will // We don't check if either app is availble - mission control will
// fallback to something else if activation fails // fallback to something else if activation fails
let target; let target;
@ -595,8 +597,8 @@ var ChatSource = class extends MessageTray.Source {
// keep track of it with the ChatStateChanged signal but it is good // keep track of it with the ChatStateChanged signal but it is good
// enough right now. // enough right now.
if (state != this._chatState) { if (state != this._chatState) {
this._chatState = state; this._chatState = state;
this._channel.set_chat_state_async(state, null); this._channel.set_chat_state_async(state, null);
} }
} }

View File

@ -7,6 +7,7 @@ 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,
@ -32,7 +33,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);
} }

View File

@ -35,7 +35,7 @@ class DashItemContainer extends St.Widget {
x_align: Clutter.ActorAlign.CENTER }); x_align: Clutter.ActorAlign.CENTER });
this._labelText = ""; this._labelText = "";
this.label = new St.Label({ style_class: 'dash-label' }); this.label = new St.Label({ style_class: 'dash-label'});
this.label.hide(); this.label.hide();
Main.layoutManager.addChrome(this.label); Main.layoutManager.addChrome(this.label);
this.label_actor = this.label; this.label_actor = this.label;
@ -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;
@ -198,9 +198,9 @@ class ShowAppsIcon extends DashItemContainer {
toggle_mode: true }); toggle_mode: true });
this._iconActor = null; this._iconActor = null;
this.icon = new IconGrid.BaseIcon(_("Show Applications"), this.icon = new IconGrid.BaseIcon(_("Show Applications"),
{ setSizeManually: true, { setSizeManually: true,
showLabel: false, showLabel: false,
createIcon: this._createIcon.bind(this) }); createIcon: this._createIcon.bind(this) });
this.toggleButton.add_actor(this.icon); this.toggleButton.add_actor(this.icon);
this.toggleButton._delegate = this; this.toggleButton._delegate = this;
@ -321,14 +321,14 @@ 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];
} }
}); });
const baseIconSizes = [16, 22, 24, 32, 48, 64]; const baseIconSizes = [ 16, 22, 24, 32, 48, 64 ];
var Dash = class Dash { var Dash = class Dash {
constructor() { constructor() {
@ -648,10 +648,10 @@ var Dash = class Dash {
let running = this._appSystem.get_running(); let running = this._appSystem.get_running();
let children = this._box.get_children().filter(actor => { let children = this._box.get_children().filter(actor => {
return actor.child && return actor.child &&
actor.child._delegate && actor.child._delegate &&
actor.child._delegate.app; actor.child._delegate.app;
}); });
// Apps currently in the dash // Apps currently in the dash
let oldApps = children.map(actor => actor.child._delegate.app); let oldApps = children.map(actor => actor.child._delegate.app);
// Apps supposed to be in the dash // Apps supposed to be in the dash
@ -700,14 +700,14 @@ var Dash = class Dash {
} }
// App removed at oldIndex // App removed at oldIndex
if (oldApp && !newApps.includes(oldApp)) { if (oldApp && newApps.indexOf(oldApp) == -1) {
removedActors.push(children[oldIndex]); removedActors.push(children[oldIndex]);
oldIndex++; oldIndex++;
continue; continue;
} }
// App added at newIndex // App added at newIndex
if (newApp && !oldApps.includes(newApp)) { if (newApp && oldApps.indexOf(newApp) == -1) {
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 want to favorite the app // No drag placeholder means we don't wan't 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;

View File

@ -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 && l.get_timezone() != null) if (l)
this._locations.push({ location: l }); this._locations.push({ location: l });
} }
@ -217,7 +217,7 @@ var WeatherSection = class WeatherSection {
}); });
let box = new St.BoxLayout({ style_class: 'weather-box', let box = new St.BoxLayout({ style_class: 'weather-box',
vertical: true }); vertical: true });
this.actor.child = box; this.actor.child = box;
@ -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,6 +459,7 @@ 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;
@ -475,9 +476,10 @@ 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.label_actor = this._clockDisplay; this.actor.label_actor = this._clockDisplay;
this.add_actor(box); this.actor.add_actor(box);
this.add_style_class_name ('clock-display'); this.actor.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 });

View File

@ -25,9 +25,9 @@ class Dialog extends St.Widget {
_createDialog() { _createDialog() {
this._dialog = new St.BoxLayout({ style_class: 'modal-dialog', this._dialog = new St.BoxLayout({ style_class: 'modal-dialog',
x_align: Clutter.ActorAlign.CENTER, x_align: Clutter.ActorAlign.CENTER,
y_align: Clutter.ActorAlign.CENTER, y_align: Clutter.ActorAlign.CENTER,
vertical: true }); vertical: true });
// modal dialogs are fixed width and grow vertically; set the request // modal dialogs are fixed width and grow vertically; set the request
// mode accordingly so wrapped labels are handled correctly during // mode accordingly so wrapped labels are handled correctly during
@ -38,13 +38,13 @@ class Dialog extends St.Widget {
this.contentLayout = new St.BoxLayout({ vertical: true, this.contentLayout = new St.BoxLayout({ vertical: true,
style_class: "modal-dialog-content-box" }); style_class: "modal-dialog-content-box" });
this._dialog.add(this.contentLayout, this._dialog.add(this.contentLayout,
{ expand: true, { expand: true,
x_fill: true, x_fill: true,
y_fill: true, y_fill: true,
x_align: St.Align.MIDDLE, x_align: St.Align.MIDDLE,
y_align: St.Align.START }); y_align: St.Align.START });
this.buttonLayout = new St.Widget ({ layout_manager: new Clutter.BoxLayout({ homogeneous: true }) }); this.buttonLayout = new St.Widget ({ layout_manager: new Clutter.BoxLayout({ homogeneous:true }) });
this._dialog.add(this.buttonLayout, this._dialog.add(this.buttonLayout,
{ x_align: St.Align.MIDDLE, { x_align: St.Align.MIDDLE,
y_align: St.Align.START }); y_align: St.Align.START });
@ -116,11 +116,11 @@ class Dialog extends St.Widget {
let button = new St.Button({ style_class: 'modal-dialog-linked-button', let button = new St.Button({ style_class: 'modal-dialog-linked-button',
button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE, button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
reactive: true, reactive: true,
can_focus: true, can_focus: true,
x_expand: true, x_expand: true,
y_expand: true, y_expand: true,
label: label }); label: label });
button.connect('clicked', action); button.connect('clicked', action);
buttonInfo['button'] = button; buttonInfo['button'] = button;
@ -175,13 +175,15 @@ 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: Pango.EllipsizeMode.NONE, let textProps = { ellipsize_mode: Pango.EllipsizeMode.NONE,
line_wrap: true }; line_wrap: true };
this._subtitle.clutter_text.set(textProps); Object.assign(this._subtitle.clutter_text, textProps);
this._body.clutter_text.set(textProps); Object.assign(this._body.clutter_text, textProps);
let defaultParams = { style_class: 'message-dialog-main-layout' }; if (!params.hasOwnProperty('style_class'))
super._init(Object.assign(defaultParams, params)); params.style_class = 'message-dialog-main-layout';
super._init(params);
this.messageBox = new St.BoxLayout({ style_class: 'message-dialog-content', this.messageBox = new St.BoxLayout({ style_class: 'message-dialog-content',
x_expand: true, x_expand: true,
@ -212,10 +214,7 @@ var MessageDialogContent = GObject.registerClass({
} }
set icon(icon) { set icon(icon) {
this._icon.set({ Object.assign(this._icon, { gicon: icon, visible: icon != null });
gicon: icon,
visible: icon != null
});
this.notify('icon'); this.notify('icon');
} }
@ -232,10 +231,7 @@ var MessageDialogContent = GObject.registerClass({
} }
_setLabel(label, prop, value) { _setLabel(label, prop, value) {
label.set({ Object.assign(label, { text: value || '', visible: value != null });
text: value || '',
visible: value != null
});
this.notify(prop); this.notify(prop);
} }

View File

@ -434,13 +434,14 @@ 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 });
} }
} }
} }
@ -560,11 +561,11 @@ var _Draggable = class _Draggable {
let dropFunc = dragMonitors[i].dragDrop; let dropFunc = dragMonitors[i].dragDrop;
if (dropFunc) if (dropFunc)
switch (dropFunc(dropEvent)) { switch (dropFunc(dropEvent)) {
case DragDropResult.FAILURE: case DragDropResult.FAILURE:
case DragDropResult.SUCCESS: case DragDropResult.SUCCESS:
return true; return true;
case DragDropResult.CONTINUE: case DragDropResult.CONTINUE:
continue; continue;
} }
} }
@ -587,9 +588,8 @@ 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;
@ -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)

View File

@ -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) {

View File

@ -19,7 +19,7 @@
const Mainloop = imports.mainloop; const Mainloop = imports.mainloop;
const { AccountsService, Clutter, Gio, const { AccountsService, Clutter, Gio,
GLib, GObject, Pango, Polkit, Shell, St } = imports.gi; GLib, 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,9 +29,13 @@ 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 = {
@ -49,7 +53,7 @@ const logoutDialogContent = {
}, },
showBatteryWarning: false, showBatteryWarning: false,
confirmButtons: [{ signal: 'ConfirmedLogout', confirmButtons: [{ signal: 'ConfirmedLogout',
label: C_("button", "Log Out") }], label: C_("button", "Log Out") }],
iconStyleClass: 'end-session-dialog-logout-icon', iconStyleClass: 'end-session-dialog-logout-icon',
showOtherSessions: false, showOtherSessions: false,
}; };
@ -65,9 +69,9 @@ const shutdownDialogContent = {
checkBoxText: C_("checkbox", "Install pending software updates"), checkBoxText: C_("checkbox", "Install pending software updates"),
showBatteryWarning: true, showBatteryWarning: true,
confirmButtons: [{ signal: 'ConfirmedReboot', confirmButtons: [{ signal: 'ConfirmedReboot',
label: C_("button", "Restart") }, label: C_("button", "Restart") },
{ signal: 'ConfirmedShutdown', { signal: 'ConfirmedShutdown',
label: C_("button", "Power Off") }], label: C_("button", "Power Off") }],
iconName: 'system-shutdown-symbolic', iconName: 'system-shutdown-symbolic',
iconStyleClass: 'end-session-dialog-shutdown-icon', iconStyleClass: 'end-session-dialog-shutdown-icon',
showOtherSessions: true, showOtherSessions: true,
@ -82,7 +86,7 @@ const restartDialogContent = {
}, },
showBatteryWarning: false, showBatteryWarning: false,
confirmButtons: [{ signal: 'ConfirmedReboot', confirmButtons: [{ signal: 'ConfirmedReboot',
label: C_("button", "Restart") }], label: C_("button", "Restart") }],
iconName: 'view-refresh-symbolic', iconName: 'view-refresh-symbolic',
iconStyleClass: 'end-session-dialog-shutdown-icon', iconStyleClass: 'end-session-dialog-shutdown-icon',
showOtherSessions: true, showOtherSessions: true,
@ -98,7 +102,7 @@ const restartUpdateDialogContent = {
}, },
showBatteryWarning: true, showBatteryWarning: true,
confirmButtons: [{ signal: 'ConfirmedReboot', confirmButtons: [{ signal: 'ConfirmedReboot',
label: C_("button", "Restart &amp; Install") }], label: C_("button", "Restart &amp; Install") }],
unusedFutureButtonForTranslation: C_("button", "Install &amp; Power Off"), unusedFutureButtonForTranslation: C_("button", "Install &amp; Power Off"),
unusedFutureCheckBoxForTranslation: C_("checkbox", "Power off after updates are installed"), unusedFutureCheckBoxForTranslation: C_("checkbox", "Power off after updates are installed"),
iconName: 'view-refresh-symbolic', iconName: 'view-refresh-symbolic',
@ -118,18 +122,18 @@ const restartUpgradeDialogContent = {
disableTimer: true, disableTimer: true,
showBatteryWarning: false, showBatteryWarning: false,
confirmButtons: [{ signal: 'ConfirmedReboot', confirmButtons: [{ signal: 'ConfirmedReboot',
label: C_("button", "Restart &amp; Install") }], label: C_("button", "Restart &amp; Install") }],
iconName: 'view-refresh-symbolic', iconName: 'view-refresh-symbolic',
iconStyleClass: 'end-session-dialog-shutdown-icon', iconStyleClass: 'end-session-dialog-shutdown-icon',
showOtherSessions: true, showOtherSessions: true,
}; };
const DialogType = { const DialogType = {
LOGOUT: 0 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_LOGOUT */, LOGOUT: 0 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_LOGOUT */,
SHUTDOWN: 1 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_SHUTDOWN */, SHUTDOWN: 1 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_SHUTDOWN */,
RESTART: 2 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_RESTART */, RESTART: 2 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_RESTART */,
UPDATE_RESTART: 3, UPDATE_RESTART: 3,
UPGRADE_RESTART: 4 UPGRADE_RESTART: 4
}; };
const DialogContent = { const DialogContent = {
@ -155,7 +159,7 @@ function findAppFromInhibitor(inhibitor) {
let desktopFile; let desktopFile;
try { try {
[desktopFile] = inhibitor.GetAppIdSync(); [desktopFile] = inhibitor.GetAppIdSync();
} catch (e) { } catch(e) {
// XXX -- sometimes JIT inhibitors generated by gnome-session // XXX -- sometimes JIT inhibitors generated by gnome-session
// get removed too soon. Don't fail in this case. // get removed too soon. Don't fail in this case.
log('gnome-session gave us a dead inhibitor: %s'.format(inhibitor.get_object_path())); log('gnome-session gave us a dead inhibitor: %s'.format(inhibitor.get_object_path()));
@ -219,25 +223,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.
(new EndSessionDialog()); _endSessionDialog = new EndSessionDialog();
} }
var EndSessionDialog = GObject.registerClass( var EndSessionDialog = class EndSessionDialog extends ModalDialog.ModalDialog {
class EndSessionDialog extends ModalDialog.ModalDialog { constructor() {
_init() { super({ styleClass: 'end-session-dialog',
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',
this._onPkOfflineProxyCreated.bind(this)); (proxy, error) => {
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',
@ -271,8 +275,8 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
this._iconBin = new St.Bin(); this._iconBin = new St.Bin();
mainContentLayout.add(this._iconBin, mainContentLayout.add(this._iconBin,
{ x_fill: true, { x_fill: true,
y_fill: false, y_fill: false,
x_align: St.Align.END, x_align: St.Align.END,
y_align: St.Align.START }); y_align: St.Align.START });
@ -285,7 +289,7 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
messageLayout.add(this._subjectLabel, messageLayout.add(this._subjectLabel,
{ x_fill: false, { x_fill: false,
y_fill: false, y_fill: false,
x_align: St.Align.START, x_align: St.Align.START,
y_align: St.Align.START }); y_align: St.Align.START });
@ -294,7 +298,7 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
this._descriptionLabel.clutter_text.line_wrap = true; this._descriptionLabel.clutter_text.line_wrap = true;
messageLayout.add(this._descriptionLabel, messageLayout.add(this._descriptionLabel,
{ y_fill: true, { y_fill: true,
y_align: St.Align.START }); y_align: St.Align.START });
this._checkBox = new CheckBox.CheckBox(); this._checkBox = new CheckBox.CheckBox();
@ -332,31 +336,14 @@ 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( this._updatesPermission = Polkit.Permission.new_sync("org.freedesktop.packagekit.trigger-offline-update", null, null);
'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() {
@ -403,8 +390,7 @@ 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 the PackageKit proxy is available (i.e. PackageKit is available). if (dialogContent.upgradeDescription) {
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();
@ -441,8 +427,8 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
_updateButtons() { _updateButtons() {
let dialogContent = DialogContent[this._type]; let dialogContent = DialogContent[this._type];
let buttons = [{ action: this.cancel.bind(this), let buttons = [{ action: this.cancel.bind(this),
label: _("Cancel"), label: _("Cancel"),
key: Clutter.Escape }]; key: Clutter.Escape }];
for (let i = 0; i < dialogContent.confirmButtons.length; i++) { for (let i = 0; i < dialogContent.confirmButtons.length; i++) {
let signal = dialogContent.confirmButtons[i].signal; let signal = dialogContent.confirmButtons[i].signal;
@ -489,19 +475,19 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
// Trigger the offline update as requested // Trigger the offline update as requested
if (this._checkBox.actor.checked) { if (this._checkBox.actor.checked) {
switch (signal) { switch (signal) {
case "ConfirmedReboot": case "ConfirmedReboot":
this._triggerOfflineUpdateReboot(callback); this._triggerOfflineUpdateReboot(callback);
break; break;
case "ConfirmedShutdown": case "ConfirmedShutdown":
// To actually trigger the offline update, we need to // To actually trigger the offline update, we need to
// reboot to do the upgrade. When the upgrade is complete, // reboot to do the upgrade. When the upgrade is complete,
// the computer will shut down automatically. // the computer will shut down automatically.
signal = "ConfirmedReboot"; signal = "ConfirmedReboot";
this._triggerOfflineUpdateShutdown(callback); this._triggerOfflineUpdateShutdown(callback);
break; break;
default: default:
callback(); callback();
break; break;
} }
} else { } else {
this._triggerOfflineUpdateCancel(callback); this._triggerOfflineUpdateCancel(callback);
@ -513,12 +499,6 @@ 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);
@ -528,12 +508,6 @@ 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);
@ -543,12 +517,6 @@ 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);
@ -616,7 +584,7 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
} }
_onInhibitorLoaded(inhibitor) { _onInhibitorLoaded(inhibitor) {
if (!this._applications.includes(inhibitor)) { if (this._applications.indexOf(inhibitor) < 0) {
// Stale inhibitor // Stale inhibitor
return; return;
} }
@ -668,7 +636,7 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
this._loginManager.listSessions(result => { this._loginManager.listSessions(result => {
let n = 0; let n = 0;
for (let i = 0; i < result.length; i++) { for (let i = 0; i < result.length; i++) {
let [id, uid, userName, seat, sessionPath] = result[i]; let[id, uid, userName, seat, sessionPath] = result[i];
let proxy = new LogindSession(Gio.DBus.system, 'org.freedesktop.login1', sessionPath); let proxy = new LogindSession(Gio.DBus.system, 'org.freedesktop.login1', sessionPath);
if (proxy.Class != 'user') if (proxy.Class != 'user')
@ -711,8 +679,7 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
this._totalSecondsToStayOpen = totalSecondsToStayOpen; this._totalSecondsToStayOpen = totalSecondsToStayOpen;
this._type = type; this._type = type;
// Only consider updates and upgrades if PackageKit is available. if (this._type == DialogType.RESTART) {
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)
@ -744,9 +711,8 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
if (dialogContent.showOtherSessions) if (dialogContent.showOtherSessions)
this._loadSessions(); this._loadSessions();
// Only consider updates and upgrades if PackageKit is available. let updateTriggered = this._pkOfflineProxy.UpdateTriggered;
let updateTriggered = this._pkOfflineProxy ? this._pkOfflineProxy.UpdateTriggered : false; let updatePrepared = this._pkOfflineProxy.UpdatePrepared;
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 || '');
@ -781,4 +747,4 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
Close(parameters, invocation) { Close(parameters, invocation) {
this.close(); this.close();
} }
}); };

View File

@ -57,8 +57,8 @@ function _patchLayoutClass(layoutClass, styleProps) {
}; };
} }
function _loggingFunc(...args) { function _loggingFunc() {
let fields = { 'MESSAGE': args.join(', ') }; let fields = {'MESSAGE': [].join.call(arguments, ', ')};
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,25 +96,16 @@ 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) {
return base; return base;
} }
}; };

View File

@ -1,18 +1,19 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const { Clutter, Gio, GLib, GObject, Soup } = imports.gi; const { Clutter, Gio, GLib, Soup, St } = 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;
@ -24,7 +25,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;
} }
@ -33,7 +34,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;
} }
@ -127,7 +128,7 @@ function updateExtension(uuid) {
try { try {
extension = ExtensionUtils.createExtensionObject(uuid, extensionDir, ExtensionUtils.ExtensionType.PER_USER); extension = ExtensionUtils.createExtensionObject(uuid, extensionDir, ExtensionUtils.ExtensionType.PER_USER);
ExtensionSystem.loadExtension(extension); ExtensionSystem.loadExtension(extension);
} catch (e) { } catch(e) {
if (extension) if (extension)
ExtensionSystem.unloadExtension(extension); ExtensionSystem.unloadExtension(extension);
@ -175,10 +176,10 @@ function checkForUpdates() {
}); });
} }
var InstallExtensionDialog = GObject.registerClass( var InstallExtensionDialog =
class InstallExtensionDialog extends ModalDialog.ModalDialog { class InstallExtensionDialog extends ModalDialog.ModalDialog {
_init(uuid, info, invocation) { constructor(uuid, info, invocation) {
super._init({ styleClass: 'extension-dialog' }); super({ styleClass: 'extension-dialog' });
this._uuid = uuid; this._uuid = uuid;
this._info = info; this._info = info;
@ -186,21 +187,26 @@ class InstallExtensionDialog extends ModalDialog.ModalDialog {
this.setButtons([{ label: _("Cancel"), this.setButtons([{ label: _("Cancel"),
action: this._onCancelButtonPressed.bind(this), action: this._onCancelButtonPressed.bind(this),
key: Clutter.Escape key: Clutter.Escape
}, },
{ label: _("Install"), { label: _("Install"),
action: this._onInstallButtonPressed.bind(this), action: this._onInstallButtonPressed.bind(this),
default: true default: true
}]); }]);
let content = new Dialog.MessageDialogContent({ let message = _("Download and install “%s” from extensions.gnome.org?").format(info.name);
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}`)
})
});
this.contentLayout.add(content); let box = new St.BoxLayout({ style_class: 'message-dialog-main-layout',
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) {
@ -220,13 +226,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.includes(uuid)) { if (enabledExtensions.indexOf(uuid) == -1) {
enabledExtensions.push(uuid); enabledExtensions.push(uuid);
global.settings.set_strv(ExtensionSystem.ENABLED_EXTENSIONS_KEY, enabledExtensions); global.settings.set_strv(ExtensionSystem.ENABLED_EXTENSIONS_KEY, enabledExtensions);
} }
@ -234,7 +240,7 @@ class InstallExtensionDialog extends ModalDialog.ModalDialog {
try { try {
let extension = ExtensionUtils.createExtensionObject(uuid, dir, ExtensionUtils.ExtensionType.PER_USER); let extension = ExtensionUtils.createExtensionObject(uuid, dir, ExtensionUtils.ExtensionType.PER_USER);
ExtensionSystem.loadExtension(extension); ExtensionSystem.loadExtension(extension);
} catch (e) { } catch(e) {
uninstallExtension(uuid); uninstallExtension(uuid);
errback('LoadExtensionError', e); errback('LoadExtensionError', e);
return; return;
@ -249,7 +255,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 });

View File

@ -64,7 +64,7 @@ function disableExtension(uuid) {
let uuid = orderReversed[i]; let uuid = orderReversed[i];
try { try {
ExtensionUtils.extensions[uuid].stateObj.disable(); ExtensionUtils.extensions[uuid].stateObj.disable();
} catch (e) { } catch(e) {
logExtensionError(uuid, e); logExtensionError(uuid, e);
} }
} }
@ -77,7 +77,7 @@ function disableExtension(uuid) {
try { try {
extension.stateObj.disable(); extension.stateObj.disable();
} catch (e) { } catch(e) {
logExtensionError(uuid, e); logExtensionError(uuid, e);
} }
@ -85,7 +85,7 @@ function disableExtension(uuid) {
let uuid = order[i]; let uuid = order[i];
try { try {
ExtensionUtils.extensions[uuid].stateObj.enable(); ExtensionUtils.extensions[uuid].stateObj.enable();
} catch (e) { } catch(e) {
logExtensionError(uuid, e); logExtensionError(uuid, e);
} }
} }
@ -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 {
@ -132,7 +132,7 @@ function enableExtension(uuid) {
extension.state = ExtensionState.ENABLED; extension.state = ExtensionState.ENABLED;
_signals.emit('extension-state-changed', extension); _signals.emit('extension-state-changed', extension);
return; return;
} catch (e) { } catch(e) {
if (extension.stylesheet) { if (extension.stylesheet) {
theme.unload_stylesheet(extension.stylesheet); theme.unload_stylesheet(extension.stylesheet);
delete extension.stylesheet; delete extension.stylesheet;
@ -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.includes(extension.uuid); let enabled = enabledExtensions.indexOf(extension.uuid) != -1;
if (enabled) { if (enabled) {
if (!initExtension(extension.uuid)) if (!initExtension(extension.uuid))
return; return;
@ -208,7 +208,7 @@ function reloadExtension(oldExtension) {
let newExtension; let newExtension;
try { try {
newExtension = ExtensionUtils.createExtensionObject(uuid, dir, type); newExtension = ExtensionUtils.createExtensionObject(uuid, dir, type);
} catch (e) { } catch(e) {
logExtensionError(uuid, e); logExtensionError(uuid, e);
return; return;
} }
@ -235,7 +235,7 @@ function initExtension(uuid) {
ExtensionUtils.installImporter(extension); ExtensionUtils.installImporter(extension);
try { try {
extensionModule = extension.imports.extension; extensionModule = extension.imports.extension;
} catch (e) { } catch(e) {
logExtensionError(uuid, e); logExtensionError(uuid, e);
return false; return false;
} }
@ -243,7 +243,7 @@ function initExtension(uuid) {
if (extensionModule.init) { if (extensionModule.init) {
try { try {
extensionState = extensionModule.init(extension); extensionState = extensionModule.init(extension);
} catch (e) { } catch(e) {
logExtensionError(uuid, e); logExtensionError(uuid, e);
return false; return false;
} }
@ -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();

View File

@ -49,15 +49,15 @@ var FocusCaretTracker = class FocusCaretTracker {
this._atspiInited = true; this._atspiInited = true;
} }
return this._atspiInited; return this._atspiInited;
} }
registerFocusListener() { registerFocusListener() {
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;
} }

View File

@ -43,9 +43,6 @@ 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;
@ -87,7 +84,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.includes(actor)) if (this._actors.indexOf(actor) != -1)
return true; return true;
if (actor == currentActor) if (actor == currentActor)
return true; return true;

View File

@ -8,8 +8,8 @@ const Main = imports.ui.main;
var MAX_CANDIDATES_PER_PAGE = 16; var MAX_CANDIDATES_PER_PAGE = 16;
var DEFAULT_INDEX_LABELS = ['1', '2', '3', '4', '5', '6', '7', '8', var DEFAULT_INDEX_LABELS = [ '1', '2', '3', '4', '5', '6', '7', '8',
'9', '0', 'a', 'b', 'c', 'd', 'e', 'f']; '9', '0', 'a', 'b', 'c', 'd', 'e', 'f' ];
var CandidateArea = class CandidateArea { var CandidateArea = class CandidateArea {
constructor() { constructor() {
@ -37,14 +37,14 @@ var CandidateArea = class CandidateArea {
this.actor.connect('scroll-event', (actor, event) => { this.actor.connect('scroll-event', (actor, event) => {
let direction = event.get_scroll_direction(); let direction = event.get_scroll_direction();
switch (direction) { switch(direction) {
case Clutter.ScrollDirection.UP: case Clutter.ScrollDirection.UP:
this.emit('cursor-up'); this.emit('cursor-up');
break; break;
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;
}); });
@ -181,7 +181,7 @@ var CandidatePopup = class CandidatePopup {
let window = global.display.focus_window.get_compositor_private(); let window = global.display.focus_window.get_compositor_private();
this._setDummyCursorGeometry(window.x + x, window.y + y, w, h); this._setDummyCursorGeometry(window.x + x, window.y + y, w, h);
}); });
} catch (e) { } catch(e) {
// Only recent IBus versions have support for this signal // Only recent IBus versions have support for this signal
// which is used for wayland clients. In order to work // which is used for wayland clients. In order to work
// with older IBus versions we can silently ignore the // with older IBus versions we can silently ignore the
@ -235,7 +235,7 @@ var CandidatePopup = class CandidatePopup {
let indexes = []; let indexes = [];
let indexLabel; let indexLabel;
for (let i = 0; (indexLabel = lookupTable.get_label(i)); ++i) for (let i = 0; (indexLabel = lookupTable.get_label(i)); ++i)
indexes.push(indexLabel.get_text()); indexes.push(indexLabel.get_text());
Main.keyboard.resetSuggestions(); Main.keyboard.resetSuggestions();
@ -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.visible) if (this._boxPointer.actor.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.raise_top(); this._boxPointer.actor.raise_top();
} else { } else {
this._boxPointer.close(BoxPointer.PopupAnimation.NONE); this._boxPointer.close(BoxPointer.PopupAnimation.NONE);
} }

View File

@ -12,11 +12,11 @@ var MIN_ICON_SIZE = 16;
var EXTRA_SPACE_ANIMATION_TIME = 0.25; var EXTRA_SPACE_ANIMATION_TIME = 0.25;
var ANIMATION_TIME_IN = 0.350; var ANIMATION_TIME_IN = 0.350;
var ANIMATION_TIME_OUT = 1 / 2 * ANIMATION_TIME_IN; var ANIMATION_TIME_OUT = 1/2 * ANIMATION_TIME_IN;
var ANIMATION_MAX_DELAY_FOR_ITEM = 2 / 3 * ANIMATION_TIME_IN; var ANIMATION_MAX_DELAY_FOR_ITEM = 2/3 * ANIMATION_TIME_IN;
var ANIMATION_BASE_DELAY_FOR_ITEM = 1 / 4 * ANIMATION_MAX_DELAY_FOR_ITEM; var ANIMATION_BASE_DELAY_FOR_ITEM = 1/4 * ANIMATION_MAX_DELAY_FOR_ITEM;
var ANIMATION_MAX_DELAY_OUT_FOR_ITEM = 2 / 3 * ANIMATION_TIME_OUT; var ANIMATION_MAX_DELAY_OUT_FOR_ITEM = 2/3 * ANIMATION_TIME_OUT;
var ANIMATION_FADE_IN_TIME_FOR_ITEM = 1 / 4 * ANIMATION_TIME_IN; var ANIMATION_FADE_IN_TIME_FOR_ITEM = 1/4 * ANIMATION_TIME_IN;
var ANIMATION_BOUNCE_ICON_SCALE = 1.1; var ANIMATION_BOUNCE_ICON_SCALE = 1.1;
@ -43,6 +43,8 @@ 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 });
@ -79,7 +81,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 GObject.NotImplementedError(`createIcon in ${this.constructor.name}`); throw new Error('no implementation of createIcon in ' + this);
} }
setIconSize(size) { setIconSize(size) {
@ -141,7 +143,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,
@ -179,13 +181,15 @@ function zoomOutActor(actor) {
} }
var IconGrid = GObject.registerClass({ var IconGrid = GObject.registerClass({
Signals: { 'animation-done': {}, Signals: {'animation-done': {},
'child-focused': { param_types: [Clutter.Actor.$gtype] } }, 'child-focused': { param_types: [Clutter.Actor.$gtype]} },
}, class IconGrid extends St.Widget { }, class IconGrid extends St.Widget {
_init(params) { _init(params) {
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,
@ -276,7 +280,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)
@ -311,18 +315,17 @@ var IconGrid = GObject.registerClass({
let [nColumns, usedWidth] = this._computeLayout(availWidth); let [nColumns, usedWidth] = this._computeLayout(availWidth);
let leftEmptySpace; let leftEmptySpace;
switch (this._xAlign) { switch(this._xAlign) {
case St.Align.START: case St.Align.START:
leftEmptySpace = 0; leftEmptySpace = 0;
break; break;
case St.Align.MIDDLE: case St.Align.MIDDLE:
leftEmptySpace = Math.floor((availWidth - usedWidth) / 2); leftEmptySpace = Math.floor((availWidth - usedWidth) / 2);
break; break;
case St.Align.END: case St.Align.END:
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;
@ -332,11 +335,10 @@ 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].opacity = 0; children[i].hide();
} else { } else {
if (!animating)
children[i].opacity = 255;
children[i].allocate(childBox, flags); children[i].allocate(childBox, flags);
children[i].show();
} }
columnIndex++; columnIndex++;
@ -377,15 +379,15 @@ var IconGrid = GObject.registerClass({
return true; return true;
for (let child = this.get_first_child(); for (let child = this.get_first_child();
child != null; child != null;
child = child.get_next_sibling()) { child = child.get_next_sibling()) {
if (!child.visible || !child.opacity) if (!child.visible)
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);
} }
@ -402,7 +404,7 @@ var IconGrid = GObject.registerClass({
} }
_cancelAnimation() { _cancelAnimation() {
this._clonesAnimating.forEach(clone => clone.destroy()); this._clonesAnimating.forEach(clone => { clone.destroy(); });
this._clonesAnimating = []; this._clonesAnimating = [];
} }
@ -418,8 +420,7 @@ var IconGrid = GObject.registerClass({
animatePulse(animationDirection) { animatePulse(animationDirection) {
if (animationDirection != AnimationDirection.IN) if (animationDirection != AnimationDirection.IN)
throw new GObject.NotImplementedError("Pulse animation only implements " + throw new Error("Pulse animation only implements 'in' animation direction");
"'in' animation direction");
this._cancelAnimation(); this._cancelAnimation();
@ -445,24 +446,24 @@ var IconGrid = GObject.registerClass({
let bounceUpTime = ANIMATION_TIME_IN / 4; let bounceUpTime = ANIMATION_TIME_IN / 4;
let isLastItem = index == actors.length - 1; let isLastItem = index == actors.length - 1;
Tweener.addTween(actor, Tweener.addTween(actor,
{ time: bounceUpTime, { time: bounceUpTime,
transition: 'easeInOutQuad', transition: 'easeInOutQuad',
delay: delay, delay: delay,
scale_x: ANIMATION_BOUNCE_ICON_SCALE, scale_x: ANIMATION_BOUNCE_ICON_SCALE,
scale_y: ANIMATION_BOUNCE_ICON_SCALE, scale_y: ANIMATION_BOUNCE_ICON_SCALE,
onComplete: () => { onComplete: () => {
Tweener.addTween(actor, Tweener.addTween(actor,
{ time: ANIMATION_TIME_IN - bounceUpTime, { time: ANIMATION_TIME_IN - bounceUpTime,
transition: 'easeInOutQuad', transition: 'easeInOutQuad',
scale_x: 1, scale_x: 1,
scale_y: 1, scale_y: 1,
onComplete: () => { onComplete: () => {
if (isLastItem) if (isLastItem)
this._animationDone(); this._animationDone();
} }
}); });
} }
}); });
} }
} }
@ -504,7 +505,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;
@ -531,7 +532,7 @@ var IconGrid = GObject.registerClass({
onComplete: () => { onComplete: () => {
if (isLastItem) if (isLastItem)
this._animationDone(); this._animationDone();
} }; }};
fadeParams = { time: ANIMATION_FADE_IN_TIME_FOR_ITEM, fadeParams = { time: ANIMATION_FADE_IN_TIME_FOR_ITEM,
transition: 'easeInOutQuad', transition: 'easeInOutQuad',
delay: delay, delay: delay,
@ -553,7 +554,7 @@ var IconGrid = GObject.registerClass({
onComplete: () => { onComplete: () => {
if (isLastItem) if (isLastItem)
this._animationDone(); this._animationDone();
} }; }};
fadeParams = { time: ANIMATION_FADE_IN_TIME_FOR_ITEM, fadeParams = { time: ANIMATION_FADE_IN_TIME_FOR_ITEM,
transition: 'easeInOutQuad', transition: 'easeInOutQuad',
delay: ANIMATION_TIME_OUT + delay - ANIMATION_FADE_IN_TIME_FOR_ITEM, delay: ANIMATION_TIME_OUT + delay - ANIMATION_FADE_IN_TIME_FOR_ITEM,
@ -602,8 +603,6 @@ var IconGrid = GObject.registerClass({
} }
_computeLayout(forWidth) { _computeLayout(forWidth) {
this.ensure_style();
let nColumns = 0; let nColumns = 0;
let usedWidth = this.leftPadding + this.rightPadding; let usedWidth = this.leftPadding + this.rightPadding;
let spacing = this._getSpacing(); let spacing = this._getSpacing();
@ -712,8 +711,8 @@ var IconGrid = GObject.registerClass({
if (this._padWithSpacing) { if (this._padWithSpacing) {
// minRows + 1 because we want to put spacing before the first row, so it is like we have one more row // minRows + 1 because we want to put spacing before the first row, so it is like we have one more row
// to divide the empty space // to divide the empty space
maxVSpacing = Math.floor(maxEmptyVArea / (this._minRows + 1)); maxVSpacing = Math.floor(maxEmptyVArea / (this._minRows +1));
maxHSpacing = Math.floor(maxEmptyHArea / (this._minColumns + 1)); maxHSpacing = Math.floor(maxEmptyHArea / (this._minColumns +1));
} else { } else {
if (this._minRows <= 1) if (this._minRows <= 1)
maxVSpacing = maxEmptyVArea; maxVSpacing = maxEmptyVArea;
@ -745,10 +744,11 @@ 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 ;
let neededHeight = this.usedHeightForNRows(this._minRows) - availHeight; let neededHeight = this.usedHeightForNRows(this._minRows) - availHeight ;
let neededSpacePerItem = (neededWidth > neededHeight) ? Math.ceil(neededWidth / this._minColumns) let neededSpacePerItem = (neededWidth > neededHeight) ? Math.ceil(neededWidth / this._minColumns)
: Math.ceil(neededHeight / this._minRows); : Math.ceil(neededHeight / this._minRows);
@ -772,8 +772,8 @@ var IconGrid = GObject.registerClass({
}); });
var PaginatedIconGrid = GObject.registerClass({ var PaginatedIconGrid = GObject.registerClass({
Signals: { 'space-opened': {}, Signals: {'space-opened': {},
'space-closed': {} }, 'space-closed': {} },
}, class PaginatedIconGrid extends IconGrid { }, class PaginatedIconGrid extends IconGrid {
_init(params) { _init(params) {
super._init(params); super._init(params);
@ -790,7 +790,7 @@ var PaginatedIconGrid = GObject.registerClass({
} }
vfunc_allocate(box, flags) { vfunc_allocate(box, flags) {
if (this._childrenPerPage == 0) if (this._childrenPerPage == 0)
log('computePages() must be called before allocate(); pagination will not work.'); log('computePages() must be called before allocate(); pagination will not work.');
this.set_allocation(box, flags); this.set_allocation(box, flags);
@ -803,24 +803,26 @@ 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);
let leftEmptySpace; let leftEmptySpace;
switch (this._xAlign) { switch(this._xAlign) {
case St.Align.START: case St.Align.START:
leftEmptySpace = 0; leftEmptySpace = 0;
break; break;
case St.Align.MIDDLE: case St.Align.MIDDLE:
leftEmptySpace = Math.floor((availWidth - usedWidth) / 2); leftEmptySpace = Math.floor((availWidth - usedWidth) / 2);
break; break;
case St.Align.END: case St.Align.END:
leftEmptySpace = availWidth - usedWidth; leftEmptySpace = availWidth - usedWidth;
} }
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);
@ -830,19 +832,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;
}
} }
} }
// Overridden from IconGrid // Overriden from IconGrid
_getChildrenToAnimate() { _getChildrenToAnimate() {
let children = this._getVisibleChildren(); let children = this._getVisibleChildren();
let firstIndex = this._childrenPerPage * this.currentPage; let firstIndex = this._childrenPerPage * this.currentPage;
@ -862,6 +864,7 @@ 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);
@ -890,7 +893,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;
} }
@ -969,7 +972,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);
} }
} }
@ -987,7 +990,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'); }
}); });
} }
} }

View File

@ -111,7 +111,7 @@ var InhibitShortcutsDialog = GObject.registerClass({
} }
vfunc_show() { vfunc_show() {
if (this._app && APP_WHITELIST.includes(this._app.get_id())) { if (this._app && APP_WHITELIST.indexOf(this._app.get_id()) != -1) {
this._emitResponse(DialogResponse.ALLOW); this._emitResponse(DialogResponse.ALLOW);
return; return;
} }

View File

@ -24,29 +24,29 @@ const SHOW_KEYBOARD = 'screen-keyboard-enabled';
const KEY_SIZE = 2; const KEY_SIZE = 2;
const defaultKeysPre = [ const defaultKeysPre = [
[[], [], [{ width: 1.5, level: 1, extraClassName: 'shift-key-lowercase' }], [{ label: '?123', width: 1.5, level: 2 }]], [ [], [], [{ width: 1.5, level: 1, extraClassName: 'shift-key-lowercase' }], [{ label: '?123', width: 1.5, level: 2 }] ],
[[], [], [{ width: 1.5, level: 0, extraClassName: 'shift-key-uppercase' }], [{ label: '?123', width: 1.5, level: 2 }]], [ [], [], [{ width: 1.5, level: 0, extraClassName: 'shift-key-uppercase' }], [{ label: '?123', width: 1.5, level: 2 }] ],
[[], [], [{ label: '=/<', width: 1.5, level: 3 }], [{ label: 'ABC', width: 1.5, level: 0 }]], [ [], [], [{ label: '=/<', width: 1.5, level: 3 }], [{ label: 'ABC', width: 1.5, level: 0 }] ],
[[], [], [{ label: '?123', width: 1.5, level: 2 }], [{ label: 'ABC', width: 1.5, level: 0 }]], [ [], [], [{ label: '?123', width: 1.5, level: 2 }], [{ label: 'ABC', width: 1.5, level: 0 }] ],
]; ];
const defaultKeysPost = [ const defaultKeysPost = [
[[{ label: '⌫', width: 1.5, keyval: Clutter.KEY_BackSpace }], [ [{ label: '⌫', width: 1.5, keyval: Clutter.KEY_BackSpace }],
[{ width: 2, keyval: Clutter.KEY_Return, extraClassName: 'enter-key' }], [{ width: 2, keyval: Clutter.KEY_Return, extraClassName: 'enter-key' }],
[{ width: 3, level: 1, right: true, extraClassName: 'shift-key-lowercase' }], [{ width: 3, level: 1, right: true, extraClassName: 'shift-key-lowercase' }],
[{ label: '☻', action: 'emoji' }, { action: 'languageMenu', extraClassName: 'layout-key' }, { action: 'hide', extraClassName: 'hide-key' }]], [{ label: '☻', action: 'emoji' }, { action: 'languageMenu', extraClassName: 'layout-key' }, { action: 'hide', extraClassName: 'hide-key' }] ],
[[{ label: '⌫', width: 1.5, keyval: Clutter.KEY_BackSpace }], [ [{ label: '⌫', width: 1.5, keyval: Clutter.KEY_BackSpace }],
[{ width: 2, keyval: Clutter.KEY_Return, extraClassName: 'enter-key' }], [{ width: 2, keyval: Clutter.KEY_Return, extraClassName: 'enter-key' }],
[{ width: 3, level: 0, right: true, extraClassName: 'shift-key-uppercase' }], [{ width: 3, level: 0, right: true, extraClassName: 'shift-key-uppercase' }],
[{ label: '☻', action: 'emoji' }, { action: 'languageMenu', extraClassName: 'layout-key' }, { action: 'hide', extraClassName: 'hide-key' }]], [{ label: '☻', action: 'emoji' }, { action: 'languageMenu', extraClassName: 'layout-key' }, { action: 'hide', extraClassName: 'hide-key' }] ],
[[{ label: '⌫', width: 1.5, keyval: Clutter.KEY_BackSpace }], [ [{ label: '⌫', width: 1.5, keyval: Clutter.KEY_BackSpace }],
[{ width: 2, keyval: Clutter.KEY_Return, extraClassName: 'enter-key' }], [{ width: 2, keyval: Clutter.KEY_Return, extraClassName: 'enter-key' }],
[{ label: '=/<', width: 3, level: 3, right: true }], [{ label: '=/<', width: 3, level: 3, right: true }],
[{ label: '☻', action: 'emoji' }, { action: 'languageMenu', extraClassName: 'layout-key' }, { action: 'hide', extraClassName: 'hide-key' }]], [{ label: '☻', action: 'emoji' }, { action: 'languageMenu', extraClassName: 'layout-key' }, { action: 'hide', extraClassName: 'hide-key' }] ],
[[{ label: '⌫', width: 1.5, keyval: Clutter.KEY_BackSpace }], [ [{ label: '⌫', width: 1.5, keyval: Clutter.KEY_BackSpace }],
[{ width: 2, keyval: Clutter.KEY_Return, extraClassName: 'enter-key' }], [{ width: 2, keyval: Clutter.KEY_Return, extraClassName: 'enter-key' }],
[{ label: '?123', width: 3, level: 2, right: true }], [{ label: '?123', width: 3, level: 2, right: true }],
[{ label: '☻', action: 'emoji' }, { action: 'languageMenu', extraClassName: 'layout-key' }, { action: 'hide', extraClassName: 'hide-key' }]], [{ label: '☻', action: 'emoji' }, { action: 'languageMenu', extraClassName: 'layout-key' }, { action: 'hide', extraClassName: 'hide-key' }] ],
]; ];
var AspectContainer = GObject.registerClass( var AspectContainer = GObject.registerClass(
@ -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.addTopChrome(this._boxPointer); Main.layoutManager.addChrome(this._boxPointer.actor);
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.add_style_class_name('keyboard-subkeys'); this._boxPointer.actor.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,6 +405,9 @@ 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
@ -680,7 +683,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)
@ -862,7 +865,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) => {
@ -910,6 +913,7 @@ 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;
@ -944,14 +948,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;
@ -1045,7 +1049,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 = Meta.is_wayland_compositor(); this._emojiKeyVisible = true;
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));
@ -1070,7 +1074,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().includes('XTEST')) { if (device.get_device_name().indexOf('XTEST') < 0) {
this._lastDeviceId = deviceId; this._lastDeviceId = deviceId;
this._syncEnabled(); this._syncEnabled();
} }
@ -1140,7 +1144,6 @@ 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;
@ -1159,7 +1162,7 @@ var Keyboard = class Keyboard {
this._keyboardController = new KeyboardController(); this._keyboardController = new KeyboardController();
this._groups = {}; this._groups = {};
this._currentPage = null; this._current_page = null;
this._suggestions = new Suggestions(); this._suggestions = new Suggestions();
this.actor.add(this._suggestions.actor, this.actor.add(this._suggestions.actor,
@ -1171,7 +1174,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);
}); });
@ -1199,12 +1202,10 @@ 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();
} }
@ -1224,12 +1225,11 @@ 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.addTopChrome(this._languagePopup.actor); Main.layoutManager.addChrome(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._currentPage, this._latched); this._setCurrentLevelLatched(this._current_page, this._latched);
}); });
} }
@ -1380,8 +1380,8 @@ var Keyboard = class Keyboard {
} }
_updateCurrentPageVisible() { _updateCurrentPageVisible() {
if (this._currentPage) if (this._current_page)
this._currentPage.visible = !this._emojiActive && !this._keypadVisible; this._current_page.visible = !this._emojiActive && !this._keypadVisible;
} }
_setEmojiActive(active) { _setEmojiActive(active) {
@ -1402,6 +1402,8 @@ 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
@ -1438,12 +1440,12 @@ var Keyboard = class Keyboard {
_getGridSlots() { _getGridSlots() {
let numOfHorizSlots = 0, numOfVertSlots; let numOfHorizSlots = 0, numOfVertSlots;
let rows = this._currentPage.get_children(); let rows = this._current_page.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 keyboardRow = rows[i]; let keyboard_row = rows[i];
let keys = keyboardRow.get_children(); let keys = keyboard_row.get_children();
numOfHorizSlots = Math.max(numOfHorizSlots, keys.length); numOfHorizSlots = Math.max(numOfHorizSlots, keys.length);
} }
@ -1468,12 +1470,7 @@ var Keyboard = class Keyboard {
} }
_onKeyboardGroupsChanged(keyboard) { _onKeyboardGroupsChanged(keyboard) {
let nonGroupActors = [this._emojiSelection.actor, this._keypad.actor]; this._groups = [];
this._aspectContainer.get_children().filter(c => !nonGroupActors.includes(c)).forEach(c => {
c.destroy();
});
this._groups = {};
this._onGroupChanged(); this._onGroupChanged();
} }
@ -1515,24 +1512,13 @@ 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._currentPage == currentPage) { if (this._current_page != null) {
this._updateCurrentPageVisible(); this._setCurrentLevelLatched(this._current_page, false);
return; this._current_page.hide();
} }
if (this._currentPage != null) { this._current_page = layers[activeLevel];
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();
} }
@ -1620,6 +1606,18 @@ 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();
@ -1640,7 +1638,8 @@ var Keyboard = class Keyboard {
} }
_windowSlideAnimationComplete(window, delta) { _windowSlideAnimationComplete(window, delta) {
// Synchronize window positions again. // Synchronize window and actor 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);
@ -1681,11 +1680,12 @@ var Keyboard = class Keyboard {
this._animFocusedWindow = window; this._animFocusedWindow = window;
} }
setCursorLocation(window, x, y, w, h) { setCursorLocation(window, x, y , w, h) {
let monitor = Main.layoutManager.keyboardMonitor; let monitor = Main.layoutManager.keyboardMonitor;
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,6 +1736,7 @@ 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;
@ -1750,13 +1751,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];

View File

@ -1,6 +1,6 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const { Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi; const { Clutter, GLib, GObject, Meta, Shell, St } = imports.gi;
const Signals = imports.signals; const Signals = imports.signals;
const Background = imports.ui.background; const Background = imports.ui.background;
@ -11,7 +11,6 @@ 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;
@ -21,7 +20,7 @@ var HOT_CORNER_PRESSURE_THRESHOLD = 100; // pixels
var HOT_CORNER_PRESSURE_TIMEOUT = 1000; // ms var HOT_CORNER_PRESSURE_TIMEOUT = 1000; // ms
function isPopupMetaWindow(actor) { function isPopupMetaWindow(actor) {
switch (actor.meta_window.get_window_type()) { switch(actor.meta_window.get_window_type()) {
case Meta.WindowType.DROPDOWN_MENU: case Meta.WindowType.DROPDOWN_MENU:
case Meta.WindowType.POPUP_MENU: case Meta.WindowType.POPUP_MENU:
case Meta.WindowType.COMBO: case Meta.WindowType.COMBO:
@ -32,20 +31,18 @@ function isPopupMetaWindow(actor) {
} }
var MonitorConstraint = GObject.registerClass({ var MonitorConstraint = GObject.registerClass({
Properties: { Properties: {'primary': GObject.ParamSpec.boolean('primary',
'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), 'index': GObject.ParamSpec.int('index',
'index': GObject.ParamSpec.int('index', 'Monitor index', 'Track specific monitor',
'Monitor index', 'Track specific monitor', GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE,
GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE, -1, 64, -1),
-1, 64, -1), '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;
@ -149,13 +146,13 @@ var MonitorConstraint = GObject.registerClass({
}); });
var Monitor = class Monitor { var Monitor = class Monitor {
constructor(index, geometry, geometryScale) { constructor(index, geometry, geometry_scale) {
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 = geometryScale; this.geometry_scale = geometry_scale;
} }
get inFullscreen() { get inFullscreen() {
@ -219,17 +216,10 @@ 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);
// Using addChrome() to add actors to uiGroup will position actors global.stage.add_child(this.uiGroup);
// 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,
@ -257,7 +247,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.addTopChrome(this.keyboardBox); this.addChrome(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
@ -265,6 +255,9 @@ 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);
@ -274,13 +267,6 @@ var LayoutManager = GObject.registerClass({
this._backgroundGroup.lower_bottom(); this._backgroundGroup.lower_bottom();
this._bgManagers = []; this._bgManagers = [];
this._interfaceSettings = new Gio.Settings({
schema_id: 'org.gnome.desktop.interface'
});
this._interfaceSettings.connect('changed::enable-hot-corners',
this._updateHotCorners.bind(this));
// Need to update struts on new workspaces when they are added // Need to update struts on new workspaces when they are added
let workspaceManager = global.workspace_manager; let workspaceManager = global.workspace_manager;
workspaceManager.connect('notify::n-workspaces', workspaceManager.connect('notify::n-workspaces',
@ -384,11 +370,6 @@ var LayoutManager = GObject.registerClass({
}); });
this.hotCorners = []; this.hotCorners = [];
if (!this._interfaceSettings.get_boolean('enable-hot-corners')) {
this.emit('hot-corners-changed');
return;
}
let size = this.panelBox.height; let size = this.panelBox.height;
// build new hot corners // build new hot corners
@ -821,16 +802,6 @@ 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
@ -841,7 +812,7 @@ var LayoutManager = GObject.registerClass({
// @params can have any of the same values as in addChrome(), // @params can have any of the same values as in addChrome(),
// though some possibilities don't make sense. By default, @actor has // though some possibilities don't make sense. By default, @actor has
// the same params as its chrome ancestor. // the same params as its chrome ancestor.
trackChrome(actor, params = {}) { trackChrome(actor, params) {
let ancestor = actor.get_parent(); let ancestor = actor.get_parent();
let index = this._findActor(ancestor); let index = this._findActor(ancestor);
while (ancestor && index == -1) { while (ancestor && index == -1) {
@ -851,6 +822,8 @@ var LayoutManager = GObject.registerClass({
let ancestorData = ancestor ? this._trackedActors[index] let ancestorData = ancestor ? this._trackedActors[index]
: defaultParams; : defaultParams;
if (!params)
params = {};
// We can't use Params.parse here because we want to drop // We can't use Params.parse here because we want to drop
// the extra values like ancestorData.actor // the extra values like ancestorData.actor
for (let prop in defaultParams) { for (let prop in defaultParams) {
@ -1079,13 +1052,14 @@ var LayoutManager = GObject.registerClass({
else else
continue; continue;
let strutRect = new Meta.Rectangle({ x: x1, y: y1, width: x2 - x1, height: y2 - y1 }); let strutRect = new Meta.Rectangle({ x: x1, y: y1, width: x2 - x1, height: y2 - y1});
let strut = new Meta.Strut({ rect: strutRect, side: side }); let strut = new Meta.Strut({ rect: strutRect, side: side });
struts.push(strut); struts.push(strut);
} }
} }
global.set_stage_input_region(rects); if (!Meta.is_wayland_compositor())
global.set_stage_input_region(rects);
this._isPopupWindowVisible = isPopupMenuVisible; this._isPopupWindowVisible = isPopupMenuVisible;
let workspaceManager = global.workspace_manager; let workspaceManager = global.workspace_manager;
@ -1130,15 +1104,14 @@ 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));
let px = 0.0; // Cache the three ripples instead of dynamically creating and destroying them.
let py = 0.0; this._ripple1 = new St.BoxLayout({ style_class: 'ripple-box', opacity: 0, visible: false });
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) { this._ripple2 = new St.BoxLayout({ style_class: 'ripple-box', opacity: 0, visible: false });
px = 1.0; this._ripple3 = new St.BoxLayout({ style_class: 'ripple-box', opacity: 0, visible: false });
py = 0.0;
}
this._ripples = new Ripples.Ripples(px, py, 'ripple-box'); layoutManager.uiGroup.add_actor(this._ripple1);
this._ripples.addTo(layoutManager.uiGroup); layoutManager.uiGroup.add_actor(this._ripple2);
layoutManager.uiGroup.add_actor(this._ripple3);
} }
setBarrierSize(size) { setBarrierSize(size) {
@ -1220,12 +1193,53 @@ 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._ripples.playAnimation(this._x, this._y); this._rippleAnimation();
Main.overview.toggle(); Main.overview.toggle();
} }
} }

View File

@ -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.2; var VIGNETTE_BRIGHTNESS = 0.8;
var VIGNETTE_SHARPNESS = 0.7; var VIGNETTE_SHARPNESS = 0.7;
const VIGNETTE_DECLARATIONS = '\ const VIGNETTE_DECLARATIONS = '\

View File

@ -1,24 +0,0 @@
// -*- 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);
}
};

View File

@ -68,10 +68,10 @@ var AutoComplete = class AutoComplete {
if (commonPrefix.length > 0) { if (commonPrefix.length > 0) {
this.additionalCompletionText(commonPrefix, event.attrHead); this.additionalCompletionText(commonPrefix, event.attrHead);
this.emit('completion', { completion: commonPrefix, type: 'prefix' }); this.emit('completion', { completion: commonPrefix, type: 'prefix' });
this.emit('suggest', { completions: event.completions }); this.emit('suggest', { completions: event.completions});
} }
} else if (event.completions.length > 1 && event.tabType === 'double') { } else if (event.completions.length > 1 && event.tabType === 'double') {
this.emit('suggest', { completions: event.completions }); this.emit('suggest', { completions: event.completions});
} }
} }
@ -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,6 +394,7 @@ 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];
@ -402,7 +403,8 @@ 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();
hbox.add(new St.Label({ text: `${propName}: ` })); let propText = propName + ': ' + valueStr;
hbox.add(new St.Label({ text: propName + ': ' }));
hbox.add(link); hbox.add(link);
this._container.add_actor(hbox); this._container.add_actor(hbox);
} }
@ -491,13 +493,8 @@ 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);
let dm = Clutter.DeviceManager.get_default(); Clutter.grab_keyboard(eventHandler);
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.
@ -530,8 +527,8 @@ var Inspector = GObject.registerClass({
} }
_close() { _close() {
this._pointerDevice.ungrab(); Clutter.ungrab_pointer();
this._keyboardDevice.ungrab(); Clutter.ungrab_keyboard();
this._eventHandler.destroy(); this._eventHandler.destroy();
this._eventHandler = null; this._eventHandler = null;
this.emit('closed'); this.emit('closed');
@ -554,7 +551,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) {
@ -562,7 +559,6 @@ var Inspector = GObject.registerClass({
this._update(event); this._update(event);
} }
break; break;
}
case Clutter.ScrollDirection.DOWN: case Clutter.ScrollDirection.DOWN:
// select child // select child
@ -602,9 +598,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);
} }
@ -616,7 +612,7 @@ var Extensions = class Extensions {
this.actor = new St.BoxLayout({ vertical: true, this.actor = new St.BoxLayout({ vertical: true,
name: 'lookingGlassExtensions' }); name: 'lookingGlassExtensions' });
this._noExtensions = new St.Label({ style_class: 'lg-extensions-none', this._noExtensions = new St.Label({ style_class: 'lg-extensions-none',
text: _("No extensions installed") }); text: _("No extensions installed") });
this._numExtensions = 0; this._numExtensions = 0;
this._extensionsList = new St.BoxLayout({ vertical: true, this._extensionsList = new St.BoxLayout({ vertical: true,
style_class: 'lg-extensions-list' }); style_class: 'lg-extensions-list' });
@ -688,17 +684,17 @@ var Extensions = class Extensions {
_stateToString(extensionState) { _stateToString(extensionState) {
switch (extensionState) { switch (extensionState) {
case ExtensionSystem.ExtensionState.ENABLED: case ExtensionSystem.ExtensionState.ENABLED:
return _("Enabled"); return _("Enabled");
case ExtensionSystem.ExtensionState.DISABLED: case ExtensionSystem.ExtensionState.DISABLED:
case ExtensionSystem.ExtensionState.INITIALIZED: case ExtensionSystem.ExtensionState.INITIALIZED:
return _("Disabled"); return _("Disabled");
case ExtensionSystem.ExtensionState.ERROR: case ExtensionSystem.ExtensionState.ERROR:
return _("Error"); return _("Error");
case ExtensionSystem.ExtensionState.OUT_OF_DATE: case ExtensionSystem.ExtensionState.OUT_OF_DATE:
return _("Out of date"); return _("Out of date");
case ExtensionSystem.ExtensionState.DOWNLOADING: case ExtensionSystem.ExtensionState.DOWNLOADING:
return _("Downloading"); return _("Downloading");
} }
return 'Unknown'; // Not translated, shouldn't appear return 'Unknown'; // Not translated, shouldn't appear
} }
@ -706,7 +702,7 @@ var Extensions = class Extensions {
_createExtensionDisplay(extension) { _createExtensionDisplay(extension) {
let box = new St.BoxLayout({ style_class: 'lg-extension', vertical: true }); let box = new St.BoxLayout({ style_class: 'lg-extension', vertical: true });
let name = new St.Label({ style_class: 'lg-extension-name', let name = new St.Label({ style_class: 'lg-extension-name',
text: extension.metadata.name }); text: extension.metadata.name });
box.add(name, { expand: true }); box.add(name, { expand: true });
let description = new St.Label({ style_class: 'lg-extension-description', let description = new St.Label({ style_class: 'lg-extension-description',
text: extension.metadata.description || 'No description' }); text: extension.metadata.description || 'No description' });
@ -714,6 +710,7 @@ 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);
@ -798,7 +795,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();
@ -813,15 +810,15 @@ var LookingGlass = class LookingGlass {
toolbar.add_actor(gcIcon); toolbar.add_actor(gcIcon);
gcIcon.reactive = true; gcIcon.reactive = true;
gcIcon.connect('button-press-event', () => { gcIcon.connect('button-press-event', () => {
gcIcon.icon_name = 'user-trash'; gcIcon.icon_name = 'user-trash';
System.gc(); System.gc();
this._timeoutId = Mainloop.timeout_add(500, () => { this._timeoutId = Mainloop.timeout_add(500, () => {
gcIcon.icon_name = 'user-trash-full'; gcIcon.icon_name = 'user-trash-full';
this._timeoutId = 0; this._timeoutId = 0;
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
}); });
GLib.Source.set_name_by_id(this._timeoutId, '[gnome-shell] gcIcon.icon_name = \'user-trash-full\''); GLib.Source.set_name_by_id(this._timeoutId, '[gnome-shell] gcIcon.icon_name = \'user-trash-full\'');
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}); });
let notebook = new Notebook(); let notebook = new Notebook();
@ -892,11 +889,9 @@ 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.
let size = fontDesc.get_size() / 1024.; this.actor.style =
let unit = fontDesc.get_size_is_absolute() ? 'px' : 'pt'; 'font-size: ' + fontDesc.get_size() / 1024. + (fontDesc.get_size_is_absolute() ? 'px' : 'pt') + ';'
this.actor.style = ` + 'font-family: "' + fontDesc.get_family() + '";';
font-size: ${size}${unit};
font-family: "${fontDesc.get_family()}";`;
} }
setBorderPaintTarget(obj) { setBorderPaintTarget(obj) {
@ -982,7 +977,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);
@ -1009,7 +1004,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() {

View File

@ -41,8 +41,10 @@ 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 {
_init() { _init() {
super._init(); super._init();
@ -120,7 +122,7 @@ var Magnifier = class Magnifier {
}); });
// Export to dbus. // Export to dbus.
(new MagnifierDBus.ShellMagnifier()); magDBusService = new MagnifierDBus.ShellMagnifier();
this.setActive(St.Settings.get().magnifier_active); this.setActive(St.Settings.get().magnifier_active);
} }
@ -148,7 +150,7 @@ var Magnifier = class Magnifier {
setActive(activate) { setActive(activate) {
let isActive = this.isActive(); let isActive = this.isActive();
this._zoomRegions.forEach((zoomRegion, index, array) => { this._zoomRegions.forEach ((zoomRegion, index, array) => {
zoomRegion.setActive(activate); zoomRegion.setActive(activate);
}); });
@ -282,7 +284,7 @@ var Magnifier = class Magnifier {
* @zoomRegion: The zoomRegion to add. * @zoomRegion: The zoomRegion to add.
*/ */
addZoomRegion(zoomRegion) { addZoomRegion(zoomRegion) {
if (zoomRegion) { if(zoomRegion) {
this._zoomRegions.push(zoomRegion); this._zoomRegions.push(zoomRegion);
if (!this.isTrackingMouse()) if (!this.isTrackingMouse())
this.startTrackingMouse(); this.startTrackingMouse();
@ -347,7 +349,8 @@ 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();
} }
@ -374,9 +377,9 @@ 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 {
return '#00000000';
} }
else
return '#00000000';
} }
/** /**
@ -456,7 +459,8 @@ 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)
@ -469,14 +473,14 @@ var Magnifier = class Magnifier {
* Get whether the crosshairs are clipped by the mouse image. * Get whether the crosshairs are clipped by the mouse image.
* @return: Whether the crosshairs are clipped. * @return: Whether the crosshairs are clipped.
*/ */
getCrosshairsClip() { getCrosshairsClip() {
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 {
return false;
} }
} else
return false;
}
//// Private methods //// //// Private methods ////
@ -500,61 +504,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));
}); });
@ -606,7 +610,7 @@ var Magnifier = class Magnifier {
let showCrosshairs = this._settings.get_boolean(SHOW_CROSS_HAIRS_KEY); let showCrosshairs = this._settings.get_boolean(SHOW_CROSS_HAIRS_KEY);
this.addCrosshairs(); this.addCrosshairs();
this.setCrosshairsVisible(showCrosshairs); this.setCrosshairsVisible(showCrosshairs);
} }
_updateScreenPosition() { _updateScreenPosition() {
// Applies only to the first zoom region. // Applies only to the first zoom region.
@ -796,8 +800,8 @@ var ZoomRegion = class ZoomRegion {
let extents; let extents;
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;
} }
@ -813,8 +817,8 @@ var ZoomRegion = class ZoomRegion {
let extents; let extents;
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;
} }
@ -1026,7 +1030,7 @@ var ZoomRegion = class ZoomRegion {
viewPort.x = 0; viewPort.x = 0;
viewPort.y = 0; viewPort.y = 0;
viewPort.width = global.screen_width; viewPort.width = global.screen_width;
viewPort.height = global.screen_height / 2; viewPort.height = global.screen_height/2;
this._setViewPort(viewPort); this._setViewPort(viewPort);
this._screenPosition = GDesktopEnums.MagnifierScreenPosition.TOP_HALF; this._screenPosition = GDesktopEnums.MagnifierScreenPosition.TOP_HALF;
} }
@ -1038,9 +1042,9 @@ var ZoomRegion = class ZoomRegion {
setBottomHalf() { setBottomHalf() {
let viewPort = {}; let viewPort = {};
viewPort.x = 0; viewPort.x = 0;
viewPort.y = global.screen_height / 2; viewPort.y = global.screen_height/2;
viewPort.width = global.screen_width; viewPort.width = global.screen_width;
viewPort.height = global.screen_height / 2; viewPort.height = global.screen_height/2;
this._setViewPort(viewPort); this._setViewPort(viewPort);
this._screenPosition = GDesktopEnums.MagnifierScreenPosition.BOTTOM_HALF; this._screenPosition = GDesktopEnums.MagnifierScreenPosition.BOTTOM_HALF;
} }
@ -1053,7 +1057,7 @@ var ZoomRegion = class ZoomRegion {
let viewPort = {}; let viewPort = {};
viewPort.x = 0; viewPort.x = 0;
viewPort.y = 0; viewPort.y = 0;
viewPort.width = global.screen_width / 2; viewPort.width = global.screen_width/2;
viewPort.height = global.screen_height; viewPort.height = global.screen_height;
this._setViewPort(viewPort); this._setViewPort(viewPort);
this._screenPosition = GDesktopEnums.MagnifierScreenPosition.LEFT_HALF; this._screenPosition = GDesktopEnums.MagnifierScreenPosition.LEFT_HALF;
@ -1065,9 +1069,9 @@ var ZoomRegion = class ZoomRegion {
*/ */
setRightHalf() { setRightHalf() {
let viewPort = {}; let viewPort = {};
viewPort.x = global.screen_width / 2; viewPort.x = global.screen_width/2;
viewPort.y = 0; viewPort.y = 0;
viewPort.width = global.screen_width / 2; viewPort.width = global.screen_width/2;
viewPort.height = global.screen_height; viewPort.height = global.screen_height;
this._setViewPort(viewPort); this._setViewPort(viewPort);
this._screenPosition = GDesktopEnums.MagnifierScreenPosition.RIGHT_HALF; this._screenPosition = GDesktopEnums.MagnifierScreenPosition.RIGHT_HALF;
@ -1099,21 +1103,21 @@ var ZoomRegion = class ZoomRegion {
*/ */
setScreenPosition(inPosition) { setScreenPosition(inPosition) {
switch (inPosition) { switch (inPosition) {
case GDesktopEnums.MagnifierScreenPosition.FULL_SCREEN: case GDesktopEnums.MagnifierScreenPosition.FULL_SCREEN:
this.setFullScreenMode(); this.setFullScreenMode();
break; break;
case GDesktopEnums.MagnifierScreenPosition.TOP_HALF: case GDesktopEnums.MagnifierScreenPosition.TOP_HALF:
this.setTopHalf(); this.setTopHalf();
break; break;
case GDesktopEnums.MagnifierScreenPosition.BOTTOM_HALF: case GDesktopEnums.MagnifierScreenPosition.BOTTOM_HALF:
this.setBottomHalf(); this.setBottomHalf();
break; break;
case GDesktopEnums.MagnifierScreenPosition.LEFT_HALF: case GDesktopEnums.MagnifierScreenPosition.LEFT_HALF:
this.setLeftHalf(); this.setLeftHalf();
break; break;
case GDesktopEnums.MagnifierScreenPosition.RIGHT_HALF: case GDesktopEnums.MagnifierScreenPosition.RIGHT_HALF:
this.setRightHalf(); this.setRightHalf();
break; break;
} }
} }
@ -1268,7 +1272,7 @@ var ZoomRegion = class ZoomRegion {
/** /**
* getContrast: * getContrast:
* Retrieve the contrast of the magnified view. * Retreive 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.
*/ */
@ -1456,9 +1460,11 @@ 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);
} }
@ -1526,7 +1532,7 @@ var ZoomRegion = class ZoomRegion {
let xProportion = (xPoint - halfScreenWidth) / halfScreenWidth; // -1 ... 1 let xProportion = (xPoint - halfScreenWidth) / halfScreenWidth; // -1 ... 1
let yProportion = (yPoint - halfScreenHeight) / halfScreenHeight; // -1 ... 1 let yProportion = (yPoint - halfScreenHeight) / halfScreenHeight; // -1 ... 1
let xPos = xPoint - xProportion * (widthRoi / 2 - xPadding); let xPos = xPoint - xProportion * (widthRoi / 2 - xPadding);
let yPos = yPoint - yProportion * (heightRoi / 2 - yPadding); let yPos = yPoint - yProportion * (heightRoi /2 - yPadding);
return [xPos, yPos]; return [xPos, yPos];
} }
@ -1628,7 +1634,7 @@ var Crosshairs = class Crosshairs {
this.reCenter(); this.reCenter();
} }
/** /**
* addToZoomRegion * addToZoomRegion
* Either add the crosshairs actor to the given ZoomRegion, or, if it is * Either add the crosshairs actor to the given ZoomRegion, or, if it is
* already part of some other ZoomRegion, create a clone of the crosshairs * already part of some other ZoomRegion, create a clone of the crosshairs
@ -1656,7 +1662,7 @@ var Crosshairs = class Crosshairs {
container.raise_child(magnifiedMouse, crosshairsActor); container.raise_child(magnifiedMouse, crosshairsActor);
let [xMouse, yMouse] = magnifiedMouse.get_position(); let [xMouse, yMouse] = magnifiedMouse.get_position();
let [crosshairsWidth, crosshairsHeight] = crosshairsActor.get_size(); let [crosshairsWidth, crosshairsHeight] = crosshairsActor.get_size();
crosshairsActor.set_position(xMouse - crosshairsWidth / 2, yMouse - crosshairsHeight / 2); crosshairsActor.set_position(xMouse - crosshairsWidth / 2 , yMouse - crosshairsHeight / 2);
} }
} }
return crosshairsActor; return crosshairsActor;
@ -1772,12 +1778,13 @@ 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();
} }
} }
/** /**
* show: * show:
@ -1811,7 +1818,9 @@ 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.
@ -1918,8 +1927,8 @@ var MagShaderEffects = class MagShaderEffects {
// a null first argument. // a null first argument.
let [bRed, bGreen, bBlue] = this._brightnessContrast.get_brightness(); let [bRed, bGreen, bBlue] = this._brightnessContrast.get_brightness();
this._brightnessContrast.set_enabled( this._brightnessContrast.set_enabled(
cRed != NO_CHANGE || cGreen != NO_CHANGE || cBlue != NO_CHANGE || cRed != NO_CHANGE || cGreen != NO_CHANGE || cBlue != NO_CHANGE ||
bRed != NO_CHANGE || bGreen != NO_CHANGE || bBlue != NO_CHANGE bRed != NO_CHANGE || bGreen != NO_CHANGE || bBlue != NO_CHANGE
); );
} }
}; };

View File

@ -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,9 +106,9 @@ 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 {
return false;
} }
else
return false;
} }
/** /**
@ -179,74 +179,74 @@ var ShellMagnifier = class ShellMagnifier {
* Set the crosswire size of all ZoomRegions. * Set the crosswire size of all ZoomRegions.
* @size: The thickness of each line in the cross wire. * @size: The thickness of each line in the cross wire.
*/ */
setCrosswireSize(size) { setCrosswireSize(size) {
Main.magnifier.setCrosshairsThickness(size); Main.magnifier.setCrosshairsThickness(size);
} }
/** /**
* getCrosswireSize: * getCrosswireSize:
* Get the crosswire size of all ZoomRegions. * Get the crosswire size of all ZoomRegions.
* @return: The thickness of each line in the cross wire. * @return: The thickness of each line in the cross wire.
*/ */
getCrosswireSize() { getCrosswireSize() {
return Main.magnifier.getCrosshairsThickness(); return Main.magnifier.getCrosshairsThickness();
} }
/** /**
* setCrosswireLength: * setCrosswireLength:
* Set the crosswire length of all zoom-regions.. * Set the crosswire length of all zoom-regions..
* @size: The length of each line in the cross wire. * @size: The length of each line in the cross wire.
*/ */
setCrosswireLength(length) { setCrosswireLength(length) {
Main.magnifier.setCrosshairsLength(length); Main.magnifier.setCrosshairsLength(length);
} }
/** /**
* setCrosswireSize: * setCrosswireSize:
* Set the crosswire size of all zoom-regions. * Set the crosswire size of all zoom-regions.
* @size: The thickness of each line in the cross wire. * @size: The thickness of each line in the cross wire.
*/ */
getCrosswireLength() { getCrosswireLength() {
return Main.magnifier.getCrosshairsLength(); return Main.magnifier.getCrosshairsLength();
} }
/** /**
* setCrosswireClip: * setCrosswireClip:
* Set if the crosswire will be clipped by the cursor image.. * Set if the crosswire will be clipped by the cursor image..
* @clip: Flag to indicate whether to clip the crosswire. * @clip: Flag to indicate whether to clip the crosswire.
*/ */
setCrosswireClip(clip) { setCrosswireClip(clip) {
Main.magnifier.setCrosshairsClip(clip); Main.magnifier.setCrosshairsClip(clip);
} }
/** /**
* getCrosswireClip: * getCrosswireClip:
* Get the crosswire clip value. * Get the crosswire clip value.
* @return: Whether the crosswire is clipped by the cursor image. * @return: Whether the crosswire is clipped by the cursor image.
*/ */
getCrosswireClip() { getCrosswireClip() {
return Main.magnifier.getCrosshairsClip(); return Main.magnifier.getCrosshairsClip();
} }
/** /**
* setCrosswireColor: * setCrosswireColor:
* Set the crosswire color of all ZoomRegions. * Set the crosswire color of all ZoomRegions.
* @color: Unsigned int of the form rrggbbaa. * @color: Unsigned int of the form rrggbbaa.
*/ */
setCrosswireColor(color) { setCrosswireColor(color) {
Main.magnifier.setCrosshairsColor('#%08x'.format(color)); Main.magnifier.setCrosshairsColor('#%08x'.format(color));
} }
/** /**
* getCrosswireClip: * getCrosswireClip:
* Get the crosswire color of all ZoomRegions. * Get the crosswire color of all ZoomRegions.
* @return: The crosswire color as an unsigned int in the form rrggbbaa. * @return: The crosswire color as an unsigned int in the form rrggbbaa.
*/ */
getCrosswireColor() { getCrosswireColor() {
let colorString = Main.magnifier.getCrosshairsColor(); let colorString = Main.magnifier.getCrosshairsColor();
// Drop the leading '#'. // Drop the leading '#'.
return parseInt(colorString.slice(1), 16); return parseInt(colorString.slice(1), 16);
} }
}; };
/** /**

View File

@ -1,6 +1,6 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const { Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi; const { Clutter, Gio, GLib, Meta, Shell, St } = imports.gi;
const Mainloop = imports.mainloop; const Mainloop = imports.mainloop;
const AccessDialog = imports.ui.accessDialog; const AccessDialog = imports.ui.accessDialog;
@ -37,12 +37,9 @@ 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;
@ -77,7 +74,6 @@ 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;
@ -96,8 +92,6 @@ 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,
@ -139,12 +133,12 @@ function start() {
function _initializeUI() { function _initializeUI() {
// Ensure ShellWindowTracker and ShellAppUsage are initialized; this will // Ensure ShellWindowTracker and ShellAppUsage are initialized; this will
// also initialize ShellAppSystem first. ShellAppSystem // also initialize ShellAppSystem first. ShellAppSystem
// needs to load all the .desktop files, and ShellWindowTracker // needs to load all the .desktop files, and ShellWindowTracker
// will use those to associate with windows. Right now // will use those to associate with windows. Right now
// the Monitor doesn't listen for installed app changes // the Monitor doesn't listen for installed app changes
// and recalculate application associations, so to avoid // and recalculate application associations, so to avoid
// races for now we initialize it here. It's better to // races for now we initialize it here. It's better to
// be predictable anyways. // be predictable anyways.
Shell.WindowTracker.get_default(); Shell.WindowTracker.get_default();
Shell.AppUsage.get_default(); Shell.AppUsage.get_default();
@ -156,8 +150,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 refer to Main.uiGroup // Various parts of the codebase still refers to Main.uiGroup
// instead of using the layoutManager. This keeps that code // instead using the layoutManager. This keeps that code
// working until it's updated. // working until it's updated.
uiGroup = layoutManager.uiGroup; uiGroup = layoutManager.uiGroup;
@ -171,8 +165,6 @@ 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();
@ -191,8 +183,6 @@ 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', () => {
@ -200,10 +190,6 @@ 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;
@ -243,18 +229,14 @@ function _initializeUI() {
} }
if (sessionMode.currentMode != 'gdm' && if (sessionMode.currentMode != 'gdm' &&
sessionMode.currentMode != 'initial-setup') { sessionMode.currentMode != 'initial-setup') {
GLib.log_structured(LOG_DOMAIN, GLib.LogLevelFlags.LEVEL_MESSAGE, { Shell.Global.log_structured('GNOME Shell started at ' + _startDate,
'MESSAGE': `GNOME Shell started at ${_startDate}`, ['MESSAGE_ID=' + GNOMESHELL_STARTED_MESSAGE_ID]);
'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);
} }
}); });
@ -321,7 +303,7 @@ function getThemeStylesheet() {
/** /**
* setThemeStylesheet: * setThemeStylesheet:
* @cssStylesheet: A file path that contains the theme CSS, * @cssStylesheet: A file path that contains the theme CSS,
* set it to null to use the default * set it to null to use the default
* *
* Set the theme CSS file that the shell will load * Set the theme CSS file that the shell will load
*/ */
@ -390,9 +372,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);
} }
@ -421,15 +403,15 @@ function _findModal(actor) {
* *
* @params may be used to provide the following parameters: * @params may be used to provide the following parameters:
* - timestamp: used to associate the call with a specific user initiated * - timestamp: used to associate the call with a specific user initiated
* event. If not provided then the value of * event. If not provided then the value of
* global.get_current_time() is assumed. * global.get_current_time() is assumed.
* *
* - options: Meta.ModalOptions flags to indicate that the pointer is * - options: Meta.ModalOptions flags to indicate that the pointer is
* already grabbed * already grabbed
* *
* - actionMode: used to set the current Shell.ActionMode to filter * - actionMode: used to set the current Shell.ActionMode to filter
* global keybindings; the default of NONE will filter * global keybindings; the default of NONE will filter
* out all keybindings * out all keybindings
* *
* Returns: true iff we successfully acquired a grab or already had one * Returns: true iff we successfully acquired a grab or already had one
*/ */
@ -475,15 +457,15 @@ 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
* the topmost invocation, then the focus will be restored to the * the topmost invocation, then the focus will be restored to the
* previous focus at the time when pushModal() was invoked. * previous focus at the time when pushModal() was invoked.
* *
* @timestamp is optionally used to associate the call with a specific user * @timestamp is optionally used to associate the call with a specific user
* initiated event. If not provided then the value of * initiated event. If not provided then the value of
* global.get_current_time() is assumed. * global.get_current_time() is assumed.
*/ */
function popModal(actor, timestamp) { function popModal(actor, timestamp) {
@ -645,7 +627,7 @@ function _queueBeforeRedraw(workId) {
* *
* This function sets up a callback to be invoked when either the * This function sets up a callback to be invoked when either the
* given actor is mapped, or after some period of time when the machine * given actor is mapped, or after some period of time when the machine
* is idle. This is useful if your actor isn't always visible on the * is idle. This is useful if your actor isn't always visible on the
* screen (for example, all actors in the overview), and you don't want * screen (for example, all actors in the overview), and you don't want
* to consume resources updating if the actor isn't actually going to be * to consume resources updating if the actor isn't actually going to be
* displaying to the user. * displaying to the user.
@ -654,15 +636,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 identifier * Returns: A string work identifer
*/ */
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.includes(workId))) if (!(actor.mapped && _deferredWorkQueue.indexOf(workId) >= 0))
return; return;
_queueBeforeRedraw(workId); _queueBeforeRedraw(workId);
}); });
@ -681,7 +663,7 @@ function initializeDeferredWork(actor, callback, props) {
* @workId: work identifier * @workId: work identifier
* *
* Ensure that the work identified by @workId will be * Ensure that the work identified by @workId will be
* run on map or timeout. You should call this function * run on map or timeout. You should call this function
* for example when data being displayed by the actor has * for example when data being displayed by the actor has
* changed. * changed.
*/ */
@ -692,7 +674,7 @@ function queueDeferredWork(workId) {
logError(new Error(message), message); logError(new Error(message), message);
return; return;
} }
if (!_deferredWorkQueue.includes(workId)) if (_deferredWorkQueue.indexOf(workId) < 0)
_deferredWorkQueue.push(workId); _deferredWorkQueue.push(workId);
if (data.actor.mapped) { if (data.actor.mapped) {
_queueBeforeRedraw(workId); _queueBeforeRedraw(workId);
@ -707,13 +689,12 @@ function queueDeferredWork(workId) {
} }
} }
var RestartMessage = GObject.registerClass( var RestartMessage = class extends ModalDialog.ModalDialog {
class RestartMessage extends ModalDialog.ModalDialog { constructor(message) {
_init(message) { super({ shellReactive: true,
super._init({ shellReactive: true, styleClass: 'restart-message headline',
styleClass: 'restart-message headline', shouldFadeIn: false,
shouldFadeIn: false, destroyOnClose: true });
destroyOnClose: true });
let label = new St.Label({ text: message }); let label = new St.Label({ text: message });
@ -723,7 +704,7 @@ class RestartMessage 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);

View File

@ -33,7 +33,9 @@ function _fixMarkup(text, allowMarkup) {
} }
var URLHighlighter = class URLHighlighter { var URLHighlighter = class URLHighlighter {
constructor(text = '', lineWrap, allowMarkup) { constructor(text, lineWrap, allowMarkup) {
if (!text)
text = '';
this.actor = new St.Label({ reactive: true, style_class: 'url-highlighter', this.actor = new St.Label({ reactive: true, style_class: 'url-highlighter',
x_expand: true, x_align: Clutter.ActorAlign.START }); x_expand: true, x_align: Clutter.ActorAlign.START });
this._linkColor = '#ccccff'; this._linkColor = '#ccccff';
@ -70,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.includes(':')) if (url.indexOf(':') == -1)
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));
@ -133,18 +135,18 @@ 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 findPos = -1; let find_pos = -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, lineHeight] = this.actor.clutter_text.position_to_coords(i); let [success, px, py, line_height] = this.actor.clutter_text.position_to_coords(i);
if (py > y || py + lineHeight < y || x < px) if (py > y || py + line_height < y || x < px)
continue; continue;
findPos = i; find_pos = i;
} }
if (findPos != -1) { if (find_pos != -1) {
for (let i = 0; i < this._urls.length; i++) for (let i = 0; i < this._urls.length; i++)
if (findPos >= this._urls[i].pos && if (find_pos >= this._urls[i].pos &&
this._urls[i].pos + this._urls[i].url.length > findPos) this._urls[i].pos + this._urls[i].url.length > find_pos)
return i; return i;
} }
return -1; return -1;
} }
@ -195,14 +197,12 @@ class ScaleLayout extends Clutter.BinLayout {
}); });
var LabelExpanderLayout = GObject.registerClass({ var LabelExpanderLayout = GObject.registerClass({
Properties: { Properties: { 'expansion': GObject.ParamSpec.double('expansion',
'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,10 +467,11 @@ var Message = class Message {
{ scale_y: 0, { scale_y: 0,
time: MessageTray.ANIMATION_TIME, time: MessageTray.ANIMATION_TIME,
transition: 'easeOutQuad', transition: 'easeOutQuad',
onComplete: () => { onCompleteScope: this,
onComplete() {
this._actionBin.hide(); this._actionBin.hide();
this.expanded = false; this.expanded = false;
} }); }});
} else { } else {
this._bodyStack.layout_manager.expansion = 0; this._bodyStack.layout_manager.expansion = 0;
this._actionBin.scale_y = 0; this._actionBin.scale_y = 0;
@ -625,7 +626,7 @@ var MessageListSection = class MessageListSection {
onComplete() { onComplete() {
obj.container.destroy(); obj.container.destroy();
global.sync_pointer(); global.sync_pointer();
} }); }});
} else { } else {
obj.container.destroy(); obj.container.destroy();
global.sync_pointer(); global.sync_pointer();
@ -655,7 +656,7 @@ var MessageListSection = class MessageListSection {
transition: 'easeOutQuad', transition: 'easeOutQuad',
onComplete() { onComplete() {
message.close(); message.close();
} }); }});
} }
} }
} }

View File

@ -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.includes(this._canonicalId)) { if (apps.indexOf(this._canonicalId) < 0) {
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() {
@ -473,7 +473,9 @@ var Notification = class Notification {
this.destroy(); this.destroy();
} }
destroy(reason = NotificationDestroyedReason.DISMISSED) { destroy(reason) {
if (!reason)
reason = NotificationDestroyedReason.DISMISSED;
this.emit('destroy', reason); this.emit('destroy', reason);
} }
}; };
@ -582,17 +584,18 @@ 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 scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; let scale_factor = 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 * scaleFactor, height: size * scale_factor,
width: size * scaleFactor }); width: size * scale_factor });
this.add_actor(this._iconBin); this.add_actor(this._iconBin);
@ -770,7 +773,7 @@ var Source = class Source {
} }
pushNotification(notification) { pushNotification(notification) {
if (this.notifications.includes(notification)) if (this.notifications.indexOf(notification) >= 0)
return; return;
while (this.notifications.length >= MAX_NOTIFICATIONS_PER_SOURCE) while (this.notifications.length >= MAX_NOTIFICATIONS_PER_SOURCE)
@ -986,7 +989,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;
} }
@ -1067,7 +1070,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.includes(notification)) { } else if (this._notificationQueue.indexOf(notification) < 0) {
// 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.
@ -1165,7 +1168,7 @@ var MessageTray = class MessageTray {
x > this._notificationLeftMouseX - MOUSE_LEFT_ACTOR_THRESHOLD) { x > this._notificationLeftMouseX - MOUSE_LEFT_ACTOR_THRESHOLD) {
this._notificationLeftMouseX = -1; this._notificationLeftMouseX = -1;
this._notificationLeftTimeoutId = Mainloop.timeout_add(LONGER_HIDE_TIMEOUT * 1000, this._notificationLeftTimeoutId = Mainloop.timeout_add(LONGER_HIDE_TIMEOUT * 1000,
this._onNotificationLeftTimeout.bind(this)); this._onNotificationLeftTimeout.bind(this));
GLib.Source.set_name_by_id(this._notificationLeftTimeoutId, '[gnome-shell] this._onNotificationLeftTimeout'); GLib.Source.set_name_by_id(this._notificationLeftTimeoutId, '[gnome-shell] this._onNotificationLeftTimeout');
} else { } else {
this._notificationLeftTimeoutId = 0; this._notificationLeftTimeoutId = 0;

View File

@ -1,6 +1,7 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const { Atk, Clutter, GObject, Shell, St } = imports.gi; const { Atk, Clutter, 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;
@ -20,22 +21,8 @@ var State = {
FADED_OUT: 4 FADED_OUT: 4
}; };
var ModalDialog = GObject.registerClass({ var ModalDialog = class {
Properties: { constructor(params) {
'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,
@ -43,7 +30,7 @@ var ModalDialog = GObject.registerClass({
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;
@ -51,25 +38,31 @@ var ModalDialog = GObject.registerClass({
this._shouldFadeOut = params.shouldFadeOut; this._shouldFadeOut = params.shouldFadeOut;
this._destroyOnClose = params.destroyOnClose; this._destroyOnClose = params.destroyOnClose;
Main.layoutManager.modalDialogGroup.add_actor(this); this._group = new St.Widget({ visible: false,
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.add_constraint(constraint); this._group.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.add_actor(this._backgroundBin); this._group.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, this._lightbox = new Lightbox.Lightbox(this._group,
{ inhibitEvents: true, { inhibitEvents: true,
radialEffect: true }); radialEffect: true });
this._lightbox.highlight(this._backgroundBin); this._lightbox.highlight(this._backgroundBin);
@ -84,16 +77,8 @@ var ModalDialog = GObject.registerClass({
this._savedKeyFocus = null; this._savedKeyFocus = null;
} }
get state() { destroy() {
return this._state; this._group.destroy();
}
_setState(state) {
if (this._state == state)
return;
this._state = state;
this.notify('state');
} }
clearButtons() { clearButtons() {
@ -111,25 +96,29 @@ var ModalDialog = GObject.registerClass({
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._setState(State.OPENING); this.state = State.OPENING;
this.dialogLayout.opacity = 255; this.dialogLayout.opacity = 255;
if (this._lightbox) if (this._lightbox)
this._lightbox.show(); this._lightbox.show();
this.opacity = 0; this._group.opacity = 0;
this.show(); this._group.show();
Tweener.addTween(this, Tweener.addTween(this._group,
{ 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._setState(State.OPENED); this.state = State.OPENED;
this.emit('opened'); this.emit('opened');
} }
}); });
@ -159,8 +148,8 @@ var ModalDialog = GObject.registerClass({
} }
_closeComplete() { _closeComplete() {
this._setState(State.CLOSED); this.state = State.CLOSED;
this.hide(); this._group.hide();
this.emit('closed'); this.emit('closed');
if (this._destroyOnClose) if (this._destroyOnClose)
@ -171,17 +160,17 @@ var ModalDialog = GObject.registerClass({
if (this.state == State.CLOSED || this.state == State.CLOSING) if (this.state == State.CLOSED || this.state == State.CLOSING)
return; return;
this._setState(State.CLOSING); this.state = State.CLOSING;
this.popModal(timestamp); this.popModal(timestamp);
this._savedKeyFocus = null; this._savedKeyFocus = null;
if (this._shouldFadeOut) if (this._shouldFadeOut)
Tweener.addTween(this, Tweener.addTween(this._group,
{ 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();
} }
@ -194,11 +183,11 @@ var ModalDialog = GObject.registerClass({
return; return;
let focus = global.stage.key_focus; let focus = global.stage.key_focus;
if (focus && this.contains(focus)) if (focus && this._group.contains(focus))
this._savedKeyFocus = focus; this._savedKeyFocus = focus;
else else
this._savedKeyFocus = null; this._savedKeyFocus = null;
Main.popModal(this, timestamp); Main.popModal(this._group, timestamp);
this._hasModal = false; this._hasModal = false;
if (!this._shellReactive) if (!this._shellReactive)
@ -212,7 +201,7 @@ var ModalDialog = GObject.registerClass({
let params = { actionMode: this._actionMode }; let params = { actionMode: this._actionMode };
if (timestamp) if (timestamp)
params['timestamp'] = timestamp; params['timestamp'] = timestamp;
if (!Main.pushModal(this, params)) if (!Main.pushModal(this._group, params))
return false; return false;
this._hasModal = true; this._hasModal = true;
@ -235,10 +224,10 @@ var ModalDialog = GObject.registerClass({
// 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 response has been acknowledged but will take a few // that the dialog reponse 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
// immediately, but the lightbox should remain until the logout is // imediately, 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)
@ -250,11 +239,12 @@ var ModalDialog = GObject.registerClass({
this.popModal(timestamp); this.popModal(timestamp);
Tweener.addTween(this.dialogLayout, Tweener.addTween(this.dialogLayout,
{ opacity: 0, { opacity: 0,
time: FADE_OUT_DIALOG_TIME, time: FADE_OUT_DIALOG_TIME,
transition: 'easeOutQuad', transition: 'easeOutQuad',
onComplete: () => { onComplete: () => {
this._setState(State.FADED_OUT); this.state = State.FADED_OUT;
} }
}); });
} }
}); };
Signals.addSignalMethods(ModalDialog.prototype);

View File

@ -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);
} }

View File

@ -76,13 +76,13 @@ var FdoNotificationDaemon = class FdoNotificationDaemon {
_fallbackIconForNotificationData(hints) { _fallbackIconForNotificationData(hints) {
let stockIcon; let stockIcon;
switch (hints.urgency) { switch (hints.urgency) {
case Urgency.LOW: case Urgency.LOW:
case Urgency.NORMAL: case Urgency.NORMAL:
stockIcon = 'dialog-information'; stockIcon = 'dialog-information';
break; break;
case Urgency.CRITICAL: case Urgency.CRITICAL:
stockIcon = 'dialog-error'; stockIcon = 'dialog-error';
break; break;
} }
return new Gio.ThemedIcon({ name: stockIcon }); return new Gio.ThemedIcon({ name: stockIcon });
} }
@ -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 idleId = Mainloop.idle_add(() => { let idle_id = 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(idleId, '[gnome-shell] this._emitNotificationClosed'); GLib.Source.set_name_by_id(idle_id, '[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) => {
@ -270,15 +270,15 @@ var FdoNotificationDaemon = class FdoNotificationDaemon {
delete this._notifications[ndata.id]; delete this._notifications[ndata.id];
let notificationClosedReason; let notificationClosedReason;
switch (reason) { switch (reason) {
case MessageTray.NotificationDestroyedReason.EXPIRED: case MessageTray.NotificationDestroyedReason.EXPIRED:
notificationClosedReason = NotificationClosedReason.EXPIRED; notificationClosedReason = NotificationClosedReason.EXPIRED;
break; break;
case MessageTray.NotificationDestroyedReason.DISMISSED: case MessageTray.NotificationDestroyedReason.DISMISSED:
notificationClosedReason = NotificationClosedReason.DISMISSED; notificationClosedReason = NotificationClosedReason.DISMISSED;
break; break;
case MessageTray.NotificationDestroyedReason.SOURCE_CLOSED: case MessageTray.NotificationDestroyedReason.SOURCE_CLOSED:
notificationClosedReason = NotificationClosedReason.APP_CLOSED; notificationClosedReason = NotificationClosedReason.APP_CLOSED;
break; break;
} }
this._emitNotificationClosed(ndata.id, notificationClosedReason); this._emitNotificationClosed(ndata.id, notificationClosedReason);
}); });
@ -309,7 +309,7 @@ var FdoNotificationDaemon = class FdoNotificationDaemon {
if (actions.length) { if (actions.length) {
for (let i = 0; i < actions.length - 1; i += 2) { for (let i = 0; i < actions.length - 1; i += 2) {
let [actionId, label] = [actions[i], actions[i + 1]]; let [actionId, label] = [actions[i], actions[i+1]];
if (actionId == 'default') if (actionId == 'default')
hasDefaultAction = true; hasDefaultAction = true;
else else
@ -330,15 +330,15 @@ var FdoNotificationDaemon = class FdoNotificationDaemon {
} }
switch (hints.urgency) { switch (hints.urgency) {
case Urgency.LOW: case Urgency.LOW:
notification.setUrgency(MessageTray.Urgency.LOW); notification.setUrgency(MessageTray.Urgency.LOW);
break; break;
case Urgency.NORMAL: case Urgency.NORMAL:
notification.setUrgency(MessageTray.Urgency.NORMAL); notification.setUrgency(MessageTray.Urgency.NORMAL);
break; break;
case Urgency.CRITICAL: case Urgency.CRITICAL:
notification.setUrgency(MessageTray.Urgency.CRITICAL); notification.setUrgency(MessageTray.Urgency.CRITICAL);
break; break;
} }
notification.setResident(!!hints.resident); notification.setResident(!!hints.resident);
// 'transient' is a reserved keyword in JS, so we have to retrieve the value // 'transient' is a reserved keyword in JS, so we have to retrieve the value
@ -437,7 +437,7 @@ class FdoNotificationDaemonSource extends MessageTray.Source {
_createPolicy() { _createPolicy() {
if (this.app && this.app.get_app_info()) { if (this.app && this.app.get_app_info()) {
let id = this.app.get_id().replace(/\.desktop$/, ''); let id = this.app.get_id().replace(/\.desktop$/,'');
return new MessageTray.NotificationApplicationPolicy(id); return new MessageTray.NotificationApplicationPolicy(id);
} else { } else {
return new MessageTray.NotificationGenericPolicy(); return new MessageTray.NotificationGenericPolicy();
@ -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;
} }
@ -573,7 +573,7 @@ class GtkNotificationDaemonNotification extends MessageTray.Notification {
this.update(title.unpack(), body ? body.unpack() : null, this.update(title.unpack(), body ? body.unpack() : null,
{ gicon: gicon ? Gio.icon_deserialize(gicon) : null, { gicon: gicon ? Gio.icon_deserialize(gicon) : null,
datetime: time ? GLib.DateTime.new_from_unix_local(time.unpack()) : null }); datetime : time ? GLib.DateTime.new_from_unix_local(time.unpack()) : null });
} }
_activateAction(namespacedActionId, target) { _activateAction(namespacedActionId, target) {
@ -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();
@ -759,7 +759,7 @@ var GtkNotificationDaemon = class GtkNotificationDaemon {
let source; let source;
try { try {
source = this._ensureAppSource(appId); source = this._ensureAppSource(appId);
} catch (e) { } catch(e) {
if (e instanceof InvalidAppError) if (e instanceof InvalidAppError)
return; return;
throw e; throw e;
@ -793,7 +793,7 @@ var GtkNotificationDaemon = class GtkNotificationDaemon {
let source; let source;
try { try {
source = this._ensureAppSource(appId); source = this._ensureAppSource(appId);
} catch (e) { } catch(e) {
if (e instanceof InvalidAppError) { if (e instanceof InvalidAppError) {
invocation.return_dbus_error('org.gtk.Notifications.InvalidApp', 'The app by ID "%s" could not be found'.format(appId)); invocation.return_dbus_error('org.gtk.Notifications.InvalidApp', 'The app by ID "%s" could not be found'.format(appId));
return; return;

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