Compare commits
	
		
			1 Commits
		
	
	
		
			issue369
			...
			wip/jimmac
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					6393e90a5a | 
@@ -15,10 +15,8 @@ variables:
 | 
			
		||||
        - merge_requests
 | 
			
		||||
 | 
			
		||||
check_commit_log:
 | 
			
		||||
    image: registry.gitlab.gnome.org/gnome/mutter/master:v2
 | 
			
		||||
    image: registry.gitlab.gnome.org/gnome/mutter/master:v1
 | 
			
		||||
    stage: review
 | 
			
		||||
    variables:
 | 
			
		||||
        GIT_DEPTH: "100"
 | 
			
		||||
    script:
 | 
			
		||||
        - ./.gitlab-ci/check-commit-log.sh
 | 
			
		||||
    only:
 | 
			
		||||
@@ -40,7 +38,7 @@ js_check:
 | 
			
		||||
        when: on_failure
 | 
			
		||||
 | 
			
		||||
build:
 | 
			
		||||
    image: registry.gitlab.gnome.org/gnome/mutter/master:v2
 | 
			
		||||
    image: registry.gitlab.gnome.org/gnome/gnome-shell/master:v1
 | 
			
		||||
    stage: build
 | 
			
		||||
    before_script:
 | 
			
		||||
        - .gitlab-ci/checkout-mutter.sh
 | 
			
		||||
@@ -58,7 +56,7 @@ build:
 | 
			
		||||
            - build
 | 
			
		||||
 | 
			
		||||
test:
 | 
			
		||||
    image: registry.gitlab.gnome.org/gnome/mutter/master:v2
 | 
			
		||||
    image: registry.gitlab.gnome.org/gnome/gnome-shell/master:v1
 | 
			
		||||
    stage: test
 | 
			
		||||
    before_script:
 | 
			
		||||
        - ninja -C mutter/build install
 | 
			
		||||
@@ -72,7 +70,7 @@ test:
 | 
			
		||||
        when: on_failure
 | 
			
		||||
 | 
			
		||||
test-pot:
 | 
			
		||||
    image: registry.gitlab.gnome.org/gnome/mutter/master:v2
 | 
			
		||||
    image: registry.gitlab.gnome.org/gnome/gnome-shell/master:v1
 | 
			
		||||
    stage: test
 | 
			
		||||
    before_script:
 | 
			
		||||
        - ninja -C mutter/build install
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										19
									
								
								.gitlab-ci/Dockerfile
									
									
									
									
									
										Normal 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
 | 
			
		||||
@@ -17,19 +17,15 @@ if [ "$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" ]; then
 | 
			
		||||
  merge_request_branch=$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME
 | 
			
		||||
 | 
			
		||||
  echo Looking for $merge_request_branch on remote ...
 | 
			
		||||
  if git fetch -q $merge_request_remote $merge_request_branch 2>/dev/null; then
 | 
			
		||||
  if git fetch $merge_request_remote $merge_request_branch >/dev/null 2>&1; then
 | 
			
		||||
    mutter_target=FETCH_HEAD
 | 
			
		||||
  else
 | 
			
		||||
    mutter_target=origin/$CI_MERGE_REQUEST_TARGET_BRANCH_NAME
 | 
			
		||||
    echo Using $mutter_target instead
 | 
			
		||||
  fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ -z "$mutter_target" ]; then
 | 
			
		||||
  mutter_target=$(git branch -r -l origin/$shell_branch)
 | 
			
		||||
  mutter_target=${mutter_target:-$(git branch -r -l ${shell_branch#remotes/})}
 | 
			
		||||
  mutter_target=$(git branch -r -l $shell_branch)
 | 
			
		||||
  mutter_target=${mutter_target:-origin/master}
 | 
			
		||||
  echo Using $mutter_target instead
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
git checkout -q $mutter_target
 | 
			
		||||
git checkout $mutter_target
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										104
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						@@ -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
 | 
			
		||||
======
 | 
			
		||||
* Fix sizing issues in on-screen-keyboard emoji panel [Carlos; !439]
 | 
			
		||||
 
 | 
			
		||||
@@ -20,16 +20,12 @@
 | 
			
		||||
    <file>no-notifications.svg</file>
 | 
			
		||||
    <file>noise-texture.png</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>toggle-off.svg</file>
 | 
			
		||||
    <file>toggle-off-dark.svg</file>
 | 
			
		||||
    <file>toggle-off-us.svg</file>
 | 
			
		||||
    <file>toggle-off-intl.svg</file>
 | 
			
		||||
    <file>toggle-off-hc.svg</file>
 | 
			
		||||
    <file>toggle-on.svg</file>
 | 
			
		||||
    <file>toggle-on-dark.svg</file>
 | 
			
		||||
    <file>toggle-on-us.svg</file>
 | 
			
		||||
    <file>toggle-on-intl.svg</file>
 | 
			
		||||
    <file>toggle-on-hc.svg</file>
 | 
			
		||||
  </gresource>
 | 
			
		||||
</gresources>
 | 
			
		||||
 
 | 
			
		||||
@@ -99,6 +99,7 @@
 | 
			
		||||
      </description>
 | 
			
		||||
    </key>
 | 
			
		||||
    <child name="keybindings" schema="org.gnome.shell.keybindings"/>
 | 
			
		||||
    <child name="keyboard" schema="org.gnome.shell.keyboard"/>
 | 
			
		||||
  </schema>
 | 
			
		||||
 | 
			
		||||
  <schema id="org.gnome.shell.keybindings" path="/org/gnome/shell/keybindings/"
 | 
			
		||||
@@ -182,6 +183,17 @@
 | 
			
		||||
    </key>
 | 
			
		||||
  </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"
 | 
			
		||||
          path="/org/gnome/shell/app-switcher/"
 | 
			
		||||
          gettext-domain="@GETTEXT_PACKAGE@">
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,3 @@
 | 
			
		||||
$variant: 'light';
 | 
			
		||||
 | 
			
		||||
@import "gnome-shell-sass/_high-contrast-colors"; //use gtk colors
 | 
			
		||||
@import "gnome-shell-sass/_drawing";
 | 
			
		||||
@import "gnome-shell-sass/_common";
 | 
			
		||||
 
 | 
			
		||||
@@ -3,11 +3,11 @@
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
$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);
 | 
			
		||||
 | 
			
		||||
$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%));
 | 
			
		||||
$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));
 | 
			
		||||
@@ -21,15 +21,11 @@ $success_color: if($variant == 'light', #33d17a, darken(#33d17a, 10%));
 | 
			
		||||
$destructive_color: if($variant == 'light', #e01b24, darken(#e01b24, 10%));
 | 
			
		||||
 | 
			
		||||
$osd_fg_color: #eeeeec;
 | 
			
		||||
$osd_text_color: white;
 | 
			
		||||
$osd_bg_color: transparentize(darken(desaturate(#3d3846, 100%), 12%),0.04);
 | 
			
		||||
$osd_insensitive_bg_color: transparentize(mix($osd_fg_color, opacify($osd_bg_color, 1), 10%), 0.5);
 | 
			
		||||
$osd_insensitive_fg_color: mix($osd_fg_color, opacify($osd_bg_color, 1), 50%);
 | 
			
		||||
$osd_bg_color: transparentize(darken(desaturate(#3d3846, 100%), 15%),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;
 | 
			
		||||
$shadow_color: transparentize(black, 0.9);
 | 
			
		||||
 | 
			
		||||
//insensitive state derived colors
 | 
			
		||||
$insensitive_fg_color: mix($fg_color, $bg_color, 50%);
 | 
			
		||||
 
 | 
			
		||||
@@ -37,13 +37,16 @@
 | 
			
		||||
// possible $t values:
 | 
			
		||||
// normal, focus, insensitive
 | 
			
		||||
//
 | 
			
		||||
  $_inner_shadows: inset 0 2px 4px transparentize(black, 0.6);
 | 
			
		||||
 | 
			
		||||
  @if $t==normal {
 | 
			
		||||
    background-color: $base_color;
 | 
			
		||||
    border-color: $borders_color;
 | 
			
		||||
    @include _shadows($_inner_shadows);
 | 
			
		||||
 | 
			
		||||
  }
 | 
			
		||||
  @if $t==focus {
 | 
			
		||||
    @include _shadows($_inner_shadows);
 | 
			
		||||
    border-color: if($fc==$selected_bg_color,
 | 
			
		||||
                     $selected_borders_color,
 | 
			
		||||
                     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
 | 
			
		||||
//
 | 
			
		||||
@@ -127,39 +130,43 @@
 | 
			
		||||
  $_hilight_color: _button_hilight_color($c);
 | 
			
		||||
  $_button_edge: if($edge == none, none, _widget_edge($edge));
 | 
			
		||||
  $_blank_edge: if($edge == none, none, _widget_edge(transparentize($edge,1)));
 | 
			
		||||
  $_button_shadow: 0 1px 2px transparentize($shadow_color, 0.03);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  @if $t==normal {
 | 
			
		||||
  //
 | 
			
		||||
  // normal button
 | 
			
		||||
  //
 | 
			
		||||
    $_bg: $c;
 | 
			
		||||
 | 
			
		||||
    color: $tc;
 | 
			
		||||
    background-color: $c;
 | 
			
		||||
    border-color: $borders_color;
 | 
			
		||||
    box-shadow: $_button_shadow;
 | 
			
		||||
    color: $osd_fg_color;
 | 
			
		||||
    background-color: $_bg;
 | 
			
		||||
    border-color: $osd_borders_color;
 | 
			
		||||
    box-shadow: inset 0 1px lighten($osd_bg_color,10%);
 | 
			
		||||
    text-shadow: 0 1px black;
 | 
			
		||||
    icon-shadow: 0 1px black;
 | 
			
		||||
  }
 | 
			
		||||
  @if $t==focus {
 | 
			
		||||
  //
 | 
			
		||||
  // focused button
 | 
			
		||||
  //  
 | 
			
		||||
    color: $tc;
 | 
			
		||||
  //
 | 
			
		||||
    $_bg: lighten($c,3%);
 | 
			
		||||
 | 
			
		||||
    color: $osd_fg_color;
 | 
			
		||||
    text-shadow: 0 1px black;
 | 
			
		||||
    icon-shadow: 0 1px black;
 | 
			
		||||
    box-shadow: inset 0px 0px 0px 2px $selected_bg_color;
 | 
			
		||||
    //border-color: $selected_bg_color;
 | 
			
		||||
    box-shadow: inset 0px 0px 0px 1px $selected_bg_color;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @else if $t==hover {
 | 
			
		||||
  //
 | 
			
		||||
  // active osd button
 | 
			
		||||
  //
 | 
			
		||||
    color: $tc;
 | 
			
		||||
    border-color: $borders_color;
 | 
			
		||||
    background-color: $c;
 | 
			
		||||
    box-shadow: $_button_shadow;
 | 
			
		||||
    $_bg: lighten($c,3%);
 | 
			
		||||
 | 
			
		||||
    color: white;
 | 
			
		||||
    border-color: $osd_borders_color;
 | 
			
		||||
    background-color: $_bg;
 | 
			
		||||
    box-shadow: inset 0 1px lighten($osd_bg_color,20%);
 | 
			
		||||
    text-shadow: 0 1px black;
 | 
			
		||||
    icon-shadow: 0 1px black;
 | 
			
		||||
 | 
			
		||||
@@ -168,18 +175,27 @@
 | 
			
		||||
  //
 | 
			
		||||
  // active osd button
 | 
			
		||||
  //
 | 
			
		||||
    color: $tc;
 | 
			
		||||
    border-color: $borders_color;
 | 
			
		||||
    background-color: $c;
 | 
			
		||||
    $_bg: if($c!=$bg_color, $c, $osd_borders_color);
 | 
			
		||||
 | 
			
		||||
    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;
 | 
			
		||||
    icon-shadow: none;
 | 
			
		||||
    box-shadow: none;
 | 
			
		||||
  }
 | 
			
		||||
  @else if $t==insensitive {
 | 
			
		||||
  //
 | 
			
		||||
  // insensitive osd button
 | 
			
		||||
  //
 | 
			
		||||
    $_bg: transparentize(mix($insensitive_fg_color,$osd_bg_color,20%),0.3);
 | 
			
		||||
 | 
			
		||||
    color: $insensitive_fg_color;
 | 
			
		||||
    border-color: $insensitive_borders_color;
 | 
			
		||||
    background-color: $insensitive_bg_color;
 | 
			
		||||
    border-color: $osd_borders_color;
 | 
			
		||||
    background-color: $_bg;
 | 
			
		||||
    box-shadow: none;
 | 
			
		||||
    text-shadow: none;
 | 
			
		||||
    icon-shadow: none;
 | 
			
		||||
 
 | 
			
		||||
@@ -26,7 +26,6 @@ $osd_borders_color: transparentize(black, 0.3);
 | 
			
		||||
$osd_outer_borders_color: transparentize(white, 0.9);
 | 
			
		||||
 | 
			
		||||
$tooltip_borders_color: $osd_outer_borders_color;
 | 
			
		||||
$shadow_color: transparentize(black, 0.9);
 | 
			
		||||
 | 
			
		||||
//insensitive state derived colors
 | 
			
		||||
$insensitive_fg_color: mix($fg_color, $bg_color, 50%);
 | 
			
		||||
 
 | 
			
		||||
@@ -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  | 
@@ -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  | 
@@ -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  | 
@@ -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  | 
@@ -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  | 
							
								
								
									
										209
									
								
								data/theme/toggle-off-intl.svg
									
									
									
									
									
										Normal 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  | 
							
								
								
									
										255
									
								
								data/theme/toggle-off-us.svg
									
									
									
									
									
										Normal 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  | 
@@ -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  | 
@@ -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  | 
							
								
								
									
										192
									
								
								data/theme/toggle-on-intl.svg
									
									
									
									
									
										Normal 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
									
								
							
							
						
						@@ -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  | 
@@ -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  | 
@@ -168,20 +168,13 @@ var Application = class {
 | 
			
		||||
 | 
			
		||||
        copyButton.connect('clicked', w => {
 | 
			
		||||
            let clipboard = Gtk.Clipboard.get_default(w.get_display());
 | 
			
		||||
            // markdown for pasting in gitlab issues
 | 
			
		||||
            let lines = [
 | 
			
		||||
                `The settings of extension ${extension.uuid} had an error:`,
 | 
			
		||||
                '```',
 | 
			
		||||
                `${exc}`,
 | 
			
		||||
                '```',
 | 
			
		||||
                '',
 | 
			
		||||
                'Stack trace:',
 | 
			
		||||
                '```',
 | 
			
		||||
                exc.stack.replace(/\n$/, ''), // stack without trailing newline
 | 
			
		||||
                '```',
 | 
			
		||||
                ''
 | 
			
		||||
            ];
 | 
			
		||||
            clipboard.set_text(lines.join('\n'), -1);
 | 
			
		||||
            let backticks = '```';
 | 
			
		||||
            clipboard.set_text(
 | 
			
		||||
                // markdown for pasting in gitlab issues
 | 
			
		||||
                `The settings of extension ${extension.uuid} had an error:\n${
 | 
			
		||||
                backticks}\n${exc}\n${backticks}\n\nStack trace:\n${
 | 
			
		||||
                backticks}\n${exc.stack}${backticks}\n`, -1
 | 
			
		||||
            );
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        let spacing = new Gtk.SeparatorToolItem({ draw: false });
 | 
			
		||||
@@ -589,12 +582,12 @@ class ExtensionRow extends Gtk.ListBoxRow {
 | 
			
		||||
 | 
			
		||||
    _isEnabled() {
 | 
			
		||||
        let extensions = this._settings.get_strv('enabled-extensions');
 | 
			
		||||
        return extensions.includes(this.uuid);
 | 
			
		||||
        return extensions.indexOf(this.uuid) != -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _enable() {
 | 
			
		||||
        let extensions = this._settings.get_strv('enabled-extensions');
 | 
			
		||||
        if (extensions.includes(this.uuid))
 | 
			
		||||
        if (extensions.indexOf(this.uuid) != -1)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        extensions.push(this.uuid);
 | 
			
		||||
@@ -618,12 +611,12 @@ function initEnvironment() {
 | 
			
		||||
    // Monkey-patch in a "global" object that fakes some Shell utilities
 | 
			
		||||
    // that ExtensionUtils depends on.
 | 
			
		||||
    window.global = {
 | 
			
		||||
        log(...args) {
 | 
			
		||||
            print(args.join(', '));
 | 
			
		||||
        log() {
 | 
			
		||||
            print([].join.call(arguments, ', '));
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
        logError(s) {
 | 
			
		||||
            log(`ERROR: ${s}`);
 | 
			
		||||
            log('ERROR: ' + s);
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
        userdatadir: GLib.build_filenamev([GLib.get_user_data_dir(), 'gnome-shell'])
 | 
			
		||||
 
 | 
			
		||||
@@ -59,23 +59,23 @@ var AuthPrompt = class {
 | 
			
		||||
        this.smartcardDetected = this._userVerifier.smartcardDetected;
 | 
			
		||||
 | 
			
		||||
        this.connect('next', () => {
 | 
			
		||||
            this.updateSensitivity(false);
 | 
			
		||||
            this.startSpinning();
 | 
			
		||||
            if (this._queryingService) {
 | 
			
		||||
                this._userVerifier.answerQuery(this._queryingService, this._entry.text);
 | 
			
		||||
            } else {
 | 
			
		||||
                this._preemptiveAnswer = this._entry.text;
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
                this.updateSensitivity(false);
 | 
			
		||||
                this.startSpinning();
 | 
			
		||||
                if (this._queryingService) {
 | 
			
		||||
                    this._userVerifier.answerQuery(this._queryingService, this._entry.text);
 | 
			
		||||
                } else {
 | 
			
		||||
                    this._preemptiveAnswer = this._entry.text;
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
        this.actor = new St.BoxLayout({ style_class: 'login-dialog-prompt-layout',
 | 
			
		||||
                                        vertical: true });
 | 
			
		||||
        this.actor.connect('destroy', this._onDestroy.bind(this));
 | 
			
		||||
        this.actor.connect('key-press-event', (actor, event) => {
 | 
			
		||||
            if (event.get_key_symbol() == Clutter.KEY_Escape)
 | 
			
		||||
                this.cancel();
 | 
			
		||||
            return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
        });
 | 
			
		||||
                if (event.get_key_symbol() == Clutter.KEY_Escape)
 | 
			
		||||
                    this.cancel();
 | 
			
		||||
                return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
        this._userWell = new St.Bin({ x_fill: true,
 | 
			
		||||
                                      x_align: St.Align.START });
 | 
			
		||||
@@ -112,7 +112,7 @@ var AuthPrompt = class {
 | 
			
		||||
        this._buttonBox = new St.BoxLayout({ style_class: 'login-dialog-button-box',
 | 
			
		||||
                                             vertical: false });
 | 
			
		||||
        this.actor.add(this._buttonBox,
 | 
			
		||||
                       { expand: true,
 | 
			
		||||
                       { expand:  true,
 | 
			
		||||
                         x_align: St.Align.MIDDLE,
 | 
			
		||||
                         y_align: St.Align.END });
 | 
			
		||||
 | 
			
		||||
@@ -138,7 +138,7 @@ var AuthPrompt = class {
 | 
			
		||||
                                            reactive: true,
 | 
			
		||||
                                            can_focus: true,
 | 
			
		||||
                                            label: _("Cancel") });
 | 
			
		||||
        this.cancelButton.connect('clicked', () => this.cancel());
 | 
			
		||||
        this.cancelButton.connect('clicked', () => { this.cancel(); });
 | 
			
		||||
        this._buttonBox.add(this.cancelButton,
 | 
			
		||||
                            { expand: false,
 | 
			
		||||
                              x_fill: false,
 | 
			
		||||
@@ -157,7 +157,7 @@ var AuthPrompt = class {
 | 
			
		||||
                                          reactive: true,
 | 
			
		||||
                                          can_focus: true,
 | 
			
		||||
                                          label: _("Next") });
 | 
			
		||||
        this.nextButton.connect('clicked', () => this.emit('next'));
 | 
			
		||||
        this.nextButton.connect('clicked', () => { this.emit('next'); });
 | 
			
		||||
        this.nextButton.add_style_pseudo_class('default');
 | 
			
		||||
        this._buttonBox.add(this.nextButton,
 | 
			
		||||
                            { expand: false,
 | 
			
		||||
@@ -295,11 +295,12 @@ var AuthPrompt = class {
 | 
			
		||||
                                   time: DEFAULT_BUTTON_WELL_ANIMATION_TIME,
 | 
			
		||||
                                   delay: DEFAULT_BUTTON_WELL_ANIMATION_DELAY,
 | 
			
		||||
                                   transition: 'linear',
 | 
			
		||||
                                   onComplete: () => {
 | 
			
		||||
                                       if (wasSpinner) {
 | 
			
		||||
                                           if (this._spinner)
 | 
			
		||||
                                               this._spinner.stop();
 | 
			
		||||
                                       }
 | 
			
		||||
                                   onCompleteScope: this,
 | 
			
		||||
                                   onComplete() {
 | 
			
		||||
                                      if (wasSpinner) {
 | 
			
		||||
                                          if (this._spinner)
 | 
			
		||||
                                              this._spinner.stop();
 | 
			
		||||
                                      }
 | 
			
		||||
                                   }
 | 
			
		||||
                                 });
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
@@ -44,7 +44,6 @@
 | 
			
		||||
 * replaced by something else.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
const { GObject } = imports.gi;
 | 
			
		||||
const Signals = imports.signals;
 | 
			
		||||
 | 
			
		||||
var Task = class {
 | 
			
		||||
@@ -125,7 +124,7 @@ var Batch = class extends Task {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    process() {
 | 
			
		||||
        throw new GObject.NotImplementedError(`process in ${this.constructor.name}`);
 | 
			
		||||
        throw new Error('Not implemented');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    runTask() {
 | 
			
		||||
@@ -177,36 +176,36 @@ Signals.addSignalMethods(Batch.prototype);
 | 
			
		||||
 | 
			
		||||
var ConcurrentBatch = class extends Batch {
 | 
			
		||||
    process() {
 | 
			
		||||
        let hold = this.runTask();
 | 
			
		||||
       let hold = this.runTask();
 | 
			
		||||
 | 
			
		||||
        if (hold) {
 | 
			
		||||
            this.hold.acquireUntilAfter(hold);
 | 
			
		||||
        }
 | 
			
		||||
       if (hold) {
 | 
			
		||||
           this.hold.acquireUntilAfter(hold);
 | 
			
		||||
       }
 | 
			
		||||
 | 
			
		||||
        // Regardless of the state of the just run task,
 | 
			
		||||
        // fire off the next one, so all the tasks can run
 | 
			
		||||
        // concurrently.
 | 
			
		||||
        this.nextTask();
 | 
			
		||||
       // Regardless of the state of the just run task,
 | 
			
		||||
       // fire off the next one, so all the tasks can run
 | 
			
		||||
       // concurrently.
 | 
			
		||||
       this.nextTask();
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
Signals.addSignalMethods(ConcurrentBatch.prototype);
 | 
			
		||||
 | 
			
		||||
var ConsecutiveBatch = class extends Batch {
 | 
			
		||||
    process() {
 | 
			
		||||
        let hold = this.runTask();
 | 
			
		||||
       let hold = this.runTask();
 | 
			
		||||
 | 
			
		||||
        if (hold && hold.isAcquired()) {
 | 
			
		||||
            // This task is inhibiting the batch. Wait on it
 | 
			
		||||
            // before processing the next one.
 | 
			
		||||
            let signalId = hold.connect('release', () => {
 | 
			
		||||
                hold.disconnect(signalId);
 | 
			
		||||
                this.nextTask();
 | 
			
		||||
            });
 | 
			
		||||
            return;
 | 
			
		||||
        } else {
 | 
			
		||||
            // This task finished, process the next one
 | 
			
		||||
            this.nextTask();
 | 
			
		||||
        }
 | 
			
		||||
       if (hold && hold.isAcquired()) {
 | 
			
		||||
           // This task is inhibiting the batch. Wait on it
 | 
			
		||||
           // before processing the next one.
 | 
			
		||||
           let signalId = hold.connect('release', () => {
 | 
			
		||||
               hold.disconnect(signalId);
 | 
			
		||||
               this.nextTask();
 | 
			
		||||
           });
 | 
			
		||||
           return;
 | 
			
		||||
       } else {
 | 
			
		||||
           // This task finished, process the next one
 | 
			
		||||
           this.nextTask();
 | 
			
		||||
       }
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
Signals.addSignalMethods(ConsecutiveBatch.prototype);
 | 
			
		||||
 
 | 
			
		||||
@@ -23,8 +23,8 @@ function FprintManager() {
 | 
			
		||||
 | 
			
		||||
    try {
 | 
			
		||||
        self.init(null);
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
        log(`Failed to connect to Fprint service: ${e.message}`);
 | 
			
		||||
    } catch(e) {
 | 
			
		||||
        log('Failed to connect to Fprint service: ' + e.message);
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -43,7 +43,7 @@ var UserListItem = class {
 | 
			
		||||
    constructor(user) {
 | 
			
		||||
        this.user = user;
 | 
			
		||||
        this._userChangedId = this.user.connect('changed',
 | 
			
		||||
                                                this._onUserChanged.bind(this));
 | 
			
		||||
                                                 this._onUserChanged.bind(this));
 | 
			
		||||
 | 
			
		||||
        let layout = new St.BoxLayout({ vertical: true });
 | 
			
		||||
        this.actor = new St.Button({ style_class: 'login-dialog-user-list-item',
 | 
			
		||||
@@ -150,7 +150,7 @@ Signals.addSignalMethods(UserListItem.prototype);
 | 
			
		||||
 | 
			
		||||
var UserList = class {
 | 
			
		||||
    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,
 | 
			
		||||
                              St.PolicyType.AUTOMATIC);
 | 
			
		||||
 | 
			
		||||
@@ -187,6 +187,8 @@ var UserList = class {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    updateStyle(isExpanded) {
 | 
			
		||||
        let tasks = [];
 | 
			
		||||
 | 
			
		||||
        if (isExpanded)
 | 
			
		||||
            this._box.add_style_pseudo_class('expanded');
 | 
			
		||||
        else
 | 
			
		||||
@@ -242,7 +244,7 @@ var UserList = class {
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        if (user.locked)
 | 
			
		||||
            return;
 | 
			
		||||
           return;
 | 
			
		||||
 | 
			
		||||
        let userName = user.get_user_name();
 | 
			
		||||
 | 
			
		||||
@@ -259,7 +261,7 @@ var UserList = class {
 | 
			
		||||
        item.connect('activate', this._onItemActivated.bind(this));
 | 
			
		||||
 | 
			
		||||
        // 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();
 | 
			
		||||
 | 
			
		||||
@@ -317,17 +319,17 @@ var SessionMenuButton = class {
 | 
			
		||||
        this._menu.actor.hide();
 | 
			
		||||
 | 
			
		||||
        this._menu.connect('open-state-changed', (menu, isOpen) => {
 | 
			
		||||
            if (isOpen)
 | 
			
		||||
                this._button.add_style_pseudo_class('active');
 | 
			
		||||
            else
 | 
			
		||||
                this._button.remove_style_pseudo_class('active');
 | 
			
		||||
             if (isOpen)
 | 
			
		||||
                 this._button.add_style_pseudo_class('active');
 | 
			
		||||
             else
 | 
			
		||||
                 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 });
 | 
			
		||||
        this._manager.addMenu(this._menu);
 | 
			
		||||
 | 
			
		||||
        this._button.connect('clicked', () => this._menu.toggle());
 | 
			
		||||
        this._button.connect('clicked', () => { this._menu.toggle(); });
 | 
			
		||||
 | 
			
		||||
        this._items = {};
 | 
			
		||||
        this._activeSessionId = null;
 | 
			
		||||
@@ -351,11 +353,11 @@ var SessionMenuButton = class {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    setActiveSession(sessionId) {
 | 
			
		||||
        if (sessionId == this._activeSessionId)
 | 
			
		||||
            return;
 | 
			
		||||
         if (sessionId == this._activeSessionId)
 | 
			
		||||
             return;
 | 
			
		||||
 | 
			
		||||
        this._activeSessionId = sessionId;
 | 
			
		||||
        this._updateOrnament();
 | 
			
		||||
         this._activeSessionId = sessionId;
 | 
			
		||||
         this._updateOrnament();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    close() {
 | 
			
		||||
@@ -401,18 +403,18 @@ var LoginDialog = GObject.registerClass({
 | 
			
		||||
        this.connect('destroy', this._onDestroy.bind(this));
 | 
			
		||||
        parentActor.add_child(this);
 | 
			
		||||
 | 
			
		||||
        this._userManager = AccountsService.UserManager.get_default();
 | 
			
		||||
        this._userManager = AccountsService.UserManager.get_default()
 | 
			
		||||
        this._gdmClient = new Gdm.Client();
 | 
			
		||||
 | 
			
		||||
        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._settings.connect(`changed::${GdmUtil.BANNER_MESSAGE_TEXT_KEY}`,
 | 
			
		||||
        this._settings.connect('changed::' + GdmUtil.BANNER_MESSAGE_TEXT_KEY,
 | 
			
		||||
                               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._settings.connect(`changed::${GdmUtil.LOGO_KEY}`,
 | 
			
		||||
        this._settings.connect('changed::' + GdmUtil.LOGO_KEY,
 | 
			
		||||
                               this._updateLogo.bind(this));
 | 
			
		||||
 | 
			
		||||
        this._textureCache = St.TextureCache.get_default();
 | 
			
		||||
@@ -573,15 +575,19 @@ var LoginDialog = GObject.registerClass({
 | 
			
		||||
        // First find out what space the children require
 | 
			
		||||
        let bannerAllocation = null;
 | 
			
		||||
        let bannerHeight = 0;
 | 
			
		||||
        let bannerWidth = 0;
 | 
			
		||||
        if (this._bannerView.visible) {
 | 
			
		||||
            bannerAllocation = this._getBannerAllocation(dialogBox, this._bannerView);
 | 
			
		||||
            bannerHeight = bannerAllocation.y2 - bannerAllocation.y1;
 | 
			
		||||
            bannerWidth = bannerAllocation.x2 - bannerAllocation.x1;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let authPromptAllocation = null;
 | 
			
		||||
        let authPromptHeight = 0;
 | 
			
		||||
        let authPromptWidth = 0;
 | 
			
		||||
        if (this._authPrompt.actor.visible) {
 | 
			
		||||
            authPromptAllocation = this._getCenterActorAllocation(dialogBox, this._authPrompt.actor);
 | 
			
		||||
            authPromptHeight = authPromptAllocation.y2 - authPromptAllocation.y1;
 | 
			
		||||
            authPromptWidth = authPromptAllocation.x2 - authPromptAllocation.x1;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -613,64 +619,64 @@ var LoginDialog = GObject.registerClass({
 | 
			
		||||
            let leftOverYSpace = bannerSpace - bannerHeight;
 | 
			
		||||
 | 
			
		||||
            if (leftOverYSpace > 0) {
 | 
			
		||||
                // First figure out how much left over space is up top
 | 
			
		||||
                let leftOverTopSpace = leftOverYSpace / 2;
 | 
			
		||||
                 // First figure out how much left over space is up top
 | 
			
		||||
                 let leftOverTopSpace = leftOverYSpace / 2;
 | 
			
		||||
 | 
			
		||||
                // Then, shift the banner into the middle of that extra space
 | 
			
		||||
                let yShift = Math.floor(leftOverTopSpace / 2);
 | 
			
		||||
                 // Then, shift the banner into the middle of that extra space
 | 
			
		||||
                 let yShift = Math.floor(leftOverTopSpace / 2);
 | 
			
		||||
 | 
			
		||||
                bannerAllocation.y1 += yShift;
 | 
			
		||||
                bannerAllocation.y2 += yShift;
 | 
			
		||||
                 bannerAllocation.y1 += yShift;
 | 
			
		||||
                 bannerAllocation.y2 += yShift;
 | 
			
		||||
            } else {
 | 
			
		||||
                // 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.
 | 
			
		||||
                let leftOverXSpace = dialogWidth - authPromptWidth;
 | 
			
		||||
                 // 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.
 | 
			
		||||
                 let leftOverXSpace = dialogWidth - authPromptWidth;
 | 
			
		||||
 | 
			
		||||
                // In a wide view, half of the available space goes to the banner,
 | 
			
		||||
                // and the other half goes to the margins.
 | 
			
		||||
                let wideBannerWidth = leftOverXSpace / 2;
 | 
			
		||||
                let wideSpacing  = leftOverXSpace - wideBannerWidth;
 | 
			
		||||
                 // In a wide view, half of the available space goes to the banner,
 | 
			
		||||
                 // and the other half goes to the margins.
 | 
			
		||||
                 let wideBannerWidth = leftOverXSpace / 2;
 | 
			
		||||
                 let wideSpacing  = leftOverXSpace - wideBannerWidth;
 | 
			
		||||
 | 
			
		||||
                // 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,
 | 
			
		||||
                // so it doesn't look unbalanced.
 | 
			
		||||
                if (authPromptWidth > 0 && wideBannerWidth > authPromptWidth) {
 | 
			
		||||
                    let centerX = dialogBox.x1 + dialogWidth / 2;
 | 
			
		||||
                    let centerY = dialogBox.y1 + dialogHeight / 2;
 | 
			
		||||
                 // 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,
 | 
			
		||||
                 // so it doesn't look unbalanced.
 | 
			
		||||
                 if (authPromptWidth > 0 && wideBannerWidth > authPromptWidth) {
 | 
			
		||||
                     let centerX = dialogBox.x1 + dialogWidth / 2;
 | 
			
		||||
                     let centerY = dialogBox.y1 + dialogHeight / 2;
 | 
			
		||||
 | 
			
		||||
                    // A small portion of the spacing goes down the center of the
 | 
			
		||||
                    // screen to help delimit the two columns of the wide view
 | 
			
		||||
                    let centerGap = wideSpacing / 8;
 | 
			
		||||
                     // A small portion of the spacing goes down the center of the
 | 
			
		||||
                     // screen to help delimit the two columns of the wide view
 | 
			
		||||
                     let centerGap = wideSpacing / 8;
 | 
			
		||||
 | 
			
		||||
                    // place the banner along the left edge of the center margin
 | 
			
		||||
                    bannerAllocation.x2 = Math.floor(centerX - centerGap / 2);
 | 
			
		||||
                    bannerAllocation.x1 = Math.floor(bannerAllocation.x2 - wideBannerWidth);
 | 
			
		||||
                     // place the banner along the left edge of the center margin
 | 
			
		||||
                     bannerAllocation.x2 = Math.floor(centerX - centerGap / 2);
 | 
			
		||||
                     bannerAllocation.x1 = Math.floor(bannerAllocation.x2 - wideBannerWidth);
 | 
			
		||||
 | 
			
		||||
                    // figure out how tall it would like to be and try to accommodate
 | 
			
		||||
                    // but don't let it get too close to the logo
 | 
			
		||||
                    let [wideMinHeight, wideBannerHeight] = this._bannerView.get_preferred_height(wideBannerWidth);
 | 
			
		||||
                     // figure out how tall it would like to be and try to accomodate
 | 
			
		||||
                     // but don't let it get too close to the logo
 | 
			
		||||
                     let [wideMinHeight, wideBannerHeight] = this._bannerView.get_preferred_height(wideBannerWidth);
 | 
			
		||||
 | 
			
		||||
                    let maxWideHeight = dialogHeight - 3 * logoHeight;
 | 
			
		||||
                    wideBannerHeight = Math.min(maxWideHeight, wideBannerHeight);
 | 
			
		||||
                    bannerAllocation.y1 = Math.floor(centerY - wideBannerHeight / 2);
 | 
			
		||||
                    bannerAllocation.y2 = bannerAllocation.y1 + wideBannerHeight;
 | 
			
		||||
                     let maxWideHeight = dialogHeight - 3 * logoHeight;
 | 
			
		||||
                     wideBannerHeight = Math.min(maxWideHeight, wideBannerHeight);
 | 
			
		||||
                     bannerAllocation.y1 = Math.floor(centerY - wideBannerHeight / 2);
 | 
			
		||||
                     bannerAllocation.y2 = bannerAllocation.y1 + wideBannerHeight;
 | 
			
		||||
 | 
			
		||||
                    // place the auth prompt along the right edge of the center margin
 | 
			
		||||
                    authPromptAllocation.x1 = Math.floor(centerX + centerGap / 2);
 | 
			
		||||
                    authPromptAllocation.x2 = authPromptAllocation.x1 + authPromptWidth;
 | 
			
		||||
                } else {
 | 
			
		||||
                    // 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
 | 
			
		||||
                     // place the auth prompt along the right edge of the center margin
 | 
			
		||||
                     authPromptAllocation.x1 = Math.floor(centerX + centerGap / 2);
 | 
			
		||||
                     authPromptAllocation.x2 = authPromptAllocation.x1 + authPromptWidth;
 | 
			
		||||
                 } else {
 | 
			
		||||
                     // 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
 | 
			
		||||
 | 
			
		||||
                    // First figure out how much space there is without the banner
 | 
			
		||||
                    leftOverYSpace += bannerHeight;
 | 
			
		||||
                     // First figure out how much space there is without the banner
 | 
			
		||||
                     leftOverYSpace += bannerHeight;
 | 
			
		||||
 | 
			
		||||
                    // Then figure out how much of that space is up top
 | 
			
		||||
                    let availableTopSpace = Math.floor(leftOverYSpace / 2);
 | 
			
		||||
                     // Then figure out how much of that space is up top
 | 
			
		||||
                     let availableTopSpace = Math.floor(leftOverYSpace / 2);
 | 
			
		||||
 | 
			
		||||
                    // Then give all of that space to the banner
 | 
			
		||||
                    bannerAllocation.y2 = bannerAllocation.y1 + availableTopSpace;
 | 
			
		||||
                }
 | 
			
		||||
                     // Then give all of that space to the banner
 | 
			
		||||
                     bannerAllocation.y2 = bannerAllocation.y1 + availableTopSpace;
 | 
			
		||||
                 }
 | 
			
		||||
            }
 | 
			
		||||
        } else if (userSelectionAllocation) {
 | 
			
		||||
            // Grow the user list to fill the space
 | 
			
		||||
@@ -845,10 +851,10 @@ var LoginDialog = GObject.registerClass({
 | 
			
		||||
    _shouldShowSessionMenuButton() {
 | 
			
		||||
        if (this._authPrompt.verificationStatus != AuthPrompt.AuthPromptStatus.VERIFYING &&
 | 
			
		||||
            this._authPrompt.verificationStatus != AuthPrompt.AuthPromptStatus.VERIFICATION_FAILED)
 | 
			
		||||
            return false;
 | 
			
		||||
          return false;
 | 
			
		||||
 | 
			
		||||
        if (this._user && this._user.is_loaded && this._user.is_logged_in())
 | 
			
		||||
            return false;
 | 
			
		||||
          return false;
 | 
			
		||||
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
@@ -913,7 +919,7 @@ var LoginDialog = GObject.registerClass({
 | 
			
		||||
                         { opacity: 255,
 | 
			
		||||
                           time: _FADE_ANIMATION_TIME,
 | 
			
		||||
                           transition: 'easeOutQuad',
 | 
			
		||||
                           onUpdate: () => {
 | 
			
		||||
                           onUpdate() {
 | 
			
		||||
                               let children = Main.layoutManager.uiGroup.get_children();
 | 
			
		||||
 | 
			
		||||
                               for (let i = 0; i < children.length; i++) {
 | 
			
		||||
@@ -921,10 +927,12 @@ var LoginDialog = GObject.registerClass({
 | 
			
		||||
                                       children[i].opacity = this.opacity;
 | 
			
		||||
                               }
 | 
			
		||||
                           },
 | 
			
		||||
                           onComplete: () => {
 | 
			
		||||
                           onUpdateScope: this,
 | 
			
		||||
                           onComplete() {
 | 
			
		||||
                               if (this._authPrompt.verificationStatus != AuthPrompt.AuthPromptStatus.NOT_VERIFYING)
 | 
			
		||||
                                   this._authPrompt.reset();
 | 
			
		||||
                           } });
 | 
			
		||||
                           },
 | 
			
		||||
                           onCompleteScope: this });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _gotGreeterSessionProxy(proxy) {
 | 
			
		||||
@@ -941,7 +949,7 @@ var LoginDialog = GObject.registerClass({
 | 
			
		||||
                         { opacity: 0,
 | 
			
		||||
                           time: _FADE_ANIMATION_TIME,
 | 
			
		||||
                           transition: 'easeOutQuad',
 | 
			
		||||
                           onUpdate: () => {
 | 
			
		||||
                           onUpdate() {
 | 
			
		||||
                               let children = Main.layoutManager.uiGroup.get_children();
 | 
			
		||||
 | 
			
		||||
                               for (let i = 0; i < children.length; i++) {
 | 
			
		||||
@@ -949,20 +957,22 @@ var LoginDialog = GObject.registerClass({
 | 
			
		||||
                                       children[i].opacity = this.opacity;
 | 
			
		||||
                               }
 | 
			
		||||
                           },
 | 
			
		||||
                           onComplete: () => {
 | 
			
		||||
                           onUpdateScope: this,
 | 
			
		||||
                           onComplete() {
 | 
			
		||||
                               this._greeter.call_start_session_when_ready_sync(serviceName, true, null);
 | 
			
		||||
                           } });
 | 
			
		||||
                           },
 | 
			
		||||
                           onCompleteScope: this });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _onSessionOpened(client, serviceName) {
 | 
			
		||||
        this._authPrompt.finish(() => this._startSession(serviceName));
 | 
			
		||||
        this._authPrompt.finish(() => { this._startSession(serviceName); });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _waitForItemForUser(userName) {
 | 
			
		||||
        let item = this._userList.getItemFromUserName(userName);
 | 
			
		||||
 | 
			
		||||
        if (item)
 | 
			
		||||
            return null;
 | 
			
		||||
          return null;
 | 
			
		||||
 | 
			
		||||
        let hold = new Batch.Hold();
 | 
			
		||||
        let signalId = this._userList.connect('item-added',
 | 
			
		||||
@@ -973,7 +983,7 @@ var LoginDialog = GObject.registerClass({
 | 
			
		||||
                    hold.release();
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
        hold.connect('release', () => this._userList.disconnect(signalId));
 | 
			
		||||
        hold.connect('release', () => { this._userList.disconnect(signalId); });
 | 
			
		||||
 | 
			
		||||
        return hold;
 | 
			
		||||
    }
 | 
			
		||||
@@ -1037,7 +1047,6 @@ var LoginDialog = GObject.registerClass({
 | 
			
		||||
                             return this._blockTimedLoginUntilIdle();
 | 
			
		||||
                         } else {
 | 
			
		||||
                             animationTime = delay;
 | 
			
		||||
                             return null;
 | 
			
		||||
                         }
 | 
			
		||||
                     },
 | 
			
		||||
 | 
			
		||||
@@ -1073,12 +1082,12 @@ var LoginDialog = GObject.registerClass({
 | 
			
		||||
 | 
			
		||||
        // Restart timed login on user interaction
 | 
			
		||||
        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) {
 | 
			
		||||
                this._startTimedLogin(userName, seconds);
 | 
			
		||||
            }
 | 
			
		||||
               this._startTimedLogin(userName, seconds);
 | 
			
		||||
           }
 | 
			
		||||
 | 
			
		||||
            return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
           return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -19,7 +19,7 @@ var Manager = class {
 | 
			
		||||
        this._aggregateProvider = Provider(Gio.DBus.system,
 | 
			
		||||
                                           'org.freedesktop.realmd',
 | 
			
		||||
                                           '/org/freedesktop/realmd',
 | 
			
		||||
                                           this._reloadRealms.bind(this));
 | 
			
		||||
                                           this._reloadRealms.bind(this))
 | 
			
		||||
        this._realms = {};
 | 
			
		||||
 | 
			
		||||
        this._signalId = this._aggregateProvider.connect('g-properties-changed',
 | 
			
		||||
@@ -36,10 +36,10 @@ var Manager = class {
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        for (let i = 0; i < realmPaths.length; i++) {
 | 
			
		||||
            Realm(Gio.DBus.system,
 | 
			
		||||
                  'org.freedesktop.realmd',
 | 
			
		||||
                  realmPaths[i],
 | 
			
		||||
                  this._onRealmLoaded.bind(this));
 | 
			
		||||
            let realm = Realm(Gio.DBus.system,
 | 
			
		||||
                              'org.freedesktop.realmd',
 | 
			
		||||
                              realmPaths[i],
 | 
			
		||||
                              this._onRealmLoaded.bind(this));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -98,10 +98,10 @@ var Manager = class {
 | 
			
		||||
        Service(Gio.DBus.system,
 | 
			
		||||
                'org.freedesktop.realmd',
 | 
			
		||||
                '/org/freedesktop/realmd',
 | 
			
		||||
                service => service.ReleaseRemote());
 | 
			
		||||
                service => { service.ReleaseRemote(); });
 | 
			
		||||
        this._aggregateProvider.disconnect(this._signalId);
 | 
			
		||||
        this._realms = { };
 | 
			
		||||
        this._updateLoginFormat();
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
Signals.addSignalMethods(Manager.prototype);
 | 
			
		||||
Signals.addSignalMethods(Manager.prototype)
 | 
			
		||||
 
 | 
			
		||||
@@ -30,7 +30,7 @@ var LOGO_KEY = 'logo';
 | 
			
		||||
var DISABLE_USER_LIST_KEY = 'disable-user-list';
 | 
			
		||||
 | 
			
		||||
// Give user 48ms to read each character of a PAM message
 | 
			
		||||
var USER_READ_TIME = 48;
 | 
			
		||||
var USER_READ_TIME = 48
 | 
			
		||||
 | 
			
		||||
var MessageType = {
 | 
			
		||||
    NONE: 0,
 | 
			
		||||
@@ -342,7 +342,7 @@ var ShellUserVerifier = class {
 | 
			
		||||
        try {
 | 
			
		||||
            this._clearUserVerifier();
 | 
			
		||||
            this._userVerifier = client.open_reauthentication_channel_finish(result);
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
            if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
 | 
			
		||||
                return;
 | 
			
		||||
            if (e.matches(Gio.DBusError, Gio.DBusError.ACCESS_DENIED) &&
 | 
			
		||||
@@ -369,7 +369,7 @@ var ShellUserVerifier = class {
 | 
			
		||||
        try {
 | 
			
		||||
            this._clearUserVerifier();
 | 
			
		||||
            this._userVerifier = client.get_user_verifier_finish(result);
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
            if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
 | 
			
		||||
                return;
 | 
			
		||||
            this._reportInitError('Failed to obtain user verifier', e);
 | 
			
		||||
@@ -423,31 +423,36 @@ var ShellUserVerifier = class {
 | 
			
		||||
    _startService(serviceName) {
 | 
			
		||||
        this._hold.acquire();
 | 
			
		||||
        if (this._userName) {
 | 
			
		||||
            this._userVerifier.call_begin_verification_for_user(serviceName, this._userName, this._cancellable, (obj, result) => {
 | 
			
		||||
                try {
 | 
			
		||||
                    obj.call_begin_verification_for_user_finish(result);
 | 
			
		||||
                } catch (e) {
 | 
			
		||||
                    if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
 | 
			
		||||
                        return;
 | 
			
		||||
                    this._reportInitError('Failed to start verification for user', e);
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
           this._userVerifier.call_begin_verification_for_user(serviceName,
 | 
			
		||||
                                                               this._userName,
 | 
			
		||||
                                                               this._cancellable,
 | 
			
		||||
                                                               (obj, result) => {
 | 
			
		||||
               try {
 | 
			
		||||
                   obj.call_begin_verification_for_user_finish(result);
 | 
			
		||||
               } catch(e) {
 | 
			
		||||
                   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 {
 | 
			
		||||
            this._userVerifier.call_begin_verification(serviceName, this._cancellable, (obj, result) => {
 | 
			
		||||
                try {
 | 
			
		||||
                    obj.call_begin_verification_finish(result);
 | 
			
		||||
                } catch (e) {
 | 
			
		||||
                    if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
 | 
			
		||||
                        return;
 | 
			
		||||
                    this._reportInitError('Failed to start verification', e);
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
           this._userVerifier.call_begin_verification(serviceName,
 | 
			
		||||
                                                      this._cancellable,
 | 
			
		||||
                                                      (obj, result) => {
 | 
			
		||||
               try {
 | 
			
		||||
                   obj.call_begin_verification_finish(result);
 | 
			
		||||
               } catch(e) {
 | 
			
		||||
                   if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
 | 
			
		||||
                       return;
 | 
			
		||||
                   this._reportInitError('Failed to start verification', e);
 | 
			
		||||
                   return;
 | 
			
		||||
               }
 | 
			
		||||
 | 
			
		||||
                this._hold.release();
 | 
			
		||||
            });
 | 
			
		||||
               this._hold.release();
 | 
			
		||||
           });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -64,7 +64,6 @@
 | 
			
		||||
    <file>ui/keyboard.js</file>
 | 
			
		||||
    <file>ui/layout.js</file>
 | 
			
		||||
    <file>ui/lightbox.js</file>
 | 
			
		||||
    <file>ui/locatePointer.js</file>
 | 
			
		||||
    <file>ui/lookingGlass.js</file>
 | 
			
		||||
    <file>ui/magnifier.js</file>
 | 
			
		||||
    <file>ui/magnifierDBus.js</file>
 | 
			
		||||
@@ -82,11 +81,9 @@
 | 
			
		||||
    <file>ui/pageIndicators.js</file>
 | 
			
		||||
    <file>ui/panel.js</file>
 | 
			
		||||
    <file>ui/panelMenu.js</file>
 | 
			
		||||
    <file>ui/pointerA11yTimeout.js</file>
 | 
			
		||||
    <file>ui/pointerWatcher.js</file>
 | 
			
		||||
    <file>ui/popupMenu.js</file>
 | 
			
		||||
    <file>ui/remoteSearch.js</file>
 | 
			
		||||
    <file>ui/ripples.js</file>
 | 
			
		||||
    <file>ui/runDialog.js</file>
 | 
			
		||||
    <file>ui/screenShield.js</file>
 | 
			
		||||
    <file>ui/screencast.js</file>
 | 
			
		||||
@@ -123,7 +120,6 @@
 | 
			
		||||
 | 
			
		||||
    <file>ui/status/accessibility.js</file>
 | 
			
		||||
    <file>ui/status/brightness.js</file>
 | 
			
		||||
    <file>ui/status/dwellClick.js</file>
 | 
			
		||||
    <file>ui/status/location.js</file>
 | 
			
		||||
    <file>ui/status/keyboard.js</file>
 | 
			
		||||
    <file>ui/status/nightLight.js</file>
 | 
			
		||||
 
 | 
			
		||||
@@ -31,7 +31,7 @@ function getCurrentExtension() {
 | 
			
		||||
    // Search for an occurrence of an extension stack frame
 | 
			
		||||
    // Start at 1 because 0 is the stack frame of this function
 | 
			
		||||
    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];
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
@@ -162,6 +162,8 @@ function isOutOfDate(extension) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function createExtensionObject(uuid, dir, type) {
 | 
			
		||||
    let info;
 | 
			
		||||
 | 
			
		||||
    let metadataFile = dir.get_child('metadata.json');
 | 
			
		||||
    if (!metadataFile.query_exists(null)) {
 | 
			
		||||
        throw new Error('Missing metadata.json');
 | 
			
		||||
@@ -173,25 +175,25 @@ function createExtensionObject(uuid, dir, type) {
 | 
			
		||||
        if (metadataContents instanceof Uint8Array)
 | 
			
		||||
            metadataContents = imports.byteArray.toString(metadataContents);
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
        throw new Error(`Failed to load metadata.json: ${e}`);
 | 
			
		||||
        throw new Error('Failed to load metadata.json: ' + e);
 | 
			
		||||
    }
 | 
			
		||||
    let meta;
 | 
			
		||||
    try {
 | 
			
		||||
        meta = JSON.parse(metadataContents);
 | 
			
		||||
    } 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'];
 | 
			
		||||
    for (let i = 0; i < requiredProperties.length; i++) {
 | 
			
		||||
        let prop = requiredProperties[i];
 | 
			
		||||
        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) {
 | 
			
		||||
        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 = {};
 | 
			
		||||
@@ -235,7 +237,7 @@ var ExtensionFinder = class {
 | 
			
		||||
                                                       : ExtensionType.SYSTEM;
 | 
			
		||||
        try {
 | 
			
		||||
            extension = createExtensionObject(uuid, extensionDir, type);
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
            logError(e, 'Could not load extension %s'.format(uuid));
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -36,7 +36,7 @@ function recursivelyDeleteDir(dir, deleteParent) {
 | 
			
		||||
    let children = dir.enumerate_children('standard::name,standard::type',
 | 
			
		||||
                                          Gio.FileQueryInfoFlags.NONE, null);
 | 
			
		||||
 | 
			
		||||
    let info;
 | 
			
		||||
    let info, child;
 | 
			
		||||
    while ((info = children.next_file(null)) != null) {
 | 
			
		||||
        let type = info.get_file_type();
 | 
			
		||||
        let child = dir.get_child(info.get_name());
 | 
			
		||||
@@ -57,7 +57,7 @@ function recursivelyMoveDir(srcDir, destDir) {
 | 
			
		||||
    if (!destDir.query_exists(null))
 | 
			
		||||
        destDir.make_directory_with_parents(null);
 | 
			
		||||
 | 
			
		||||
    let info;
 | 
			
		||||
    let info, child;
 | 
			
		||||
    while ((info = children.next_file(null)) != null) {
 | 
			
		||||
        let type = info.get_file_type();
 | 
			
		||||
        let srcChild = srcDir.get_child(info.get_name());
 | 
			
		||||
@@ -86,11 +86,11 @@ function loadInterfaceXML(iface) {
 | 
			
		||||
    try {
 | 
			
		||||
        let [ok, bytes] = f.load_contents(null);
 | 
			
		||||
        if (bytes instanceof Uint8Array)
 | 
			
		||||
            xml = imports.byteArray.toString(bytes);
 | 
			
		||||
            xml = imports.byteArray.toString(bytes)
 | 
			
		||||
        else
 | 
			
		||||
            xml = bytes.toString();
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
        log(`Failed to load D-Bus interface ${iface}`);
 | 
			
		||||
        log('Failed to load D-Bus interface ' + iface);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return xml;
 | 
			
		||||
 
 | 
			
		||||
@@ -18,7 +18,7 @@ var HistoryManager = class {
 | 
			
		||||
        this._historyIndex = 0;
 | 
			
		||||
        if (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));
 | 
			
		||||
 | 
			
		||||
        } else {
 | 
			
		||||
@@ -66,7 +66,7 @@ var HistoryManager = class {
 | 
			
		||||
            this._indexChanged();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return this._historyIndex ? this._history[this._historyIndex - 1] : null;
 | 
			
		||||
        return this._historyIndex ? this._history[this._historyIndex -1] : null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    addItem(input) {
 | 
			
		||||
 
 | 
			
		||||
@@ -42,7 +42,7 @@ var IBusManager = class {
 | 
			
		||||
        this._candidatePopup = new IBusCandidatePopup.CandidatePopup();
 | 
			
		||||
 | 
			
		||||
        this._panelService = null;
 | 
			
		||||
        this._engines = new Map();
 | 
			
		||||
        this._engines = {};
 | 
			
		||||
        this._ready = false;
 | 
			
		||||
        this._registerPropertiesId = 0;
 | 
			
		||||
        this._currentEngineName = null;
 | 
			
		||||
@@ -62,8 +62,8 @@ var IBusManager = class {
 | 
			
		||||
        try {
 | 
			
		||||
            Gio.Subprocess.new(['ibus-daemon', '--xim', '--panel', 'disable'],
 | 
			
		||||
                               Gio.SubprocessFlags.NONE);
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
            log(`Failed to launch ibus-daemon: ${e.message}`);
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
            log('Failed to launch ibus-daemon: ' + e.message);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -73,7 +73,7 @@ var IBusManager = class {
 | 
			
		||||
 | 
			
		||||
        this._panelService = null;
 | 
			
		||||
        this._candidatePopup.setPanelService(null);
 | 
			
		||||
        this._engines.clear();
 | 
			
		||||
        this._engines = {};
 | 
			
		||||
        this._ready = false;
 | 
			
		||||
        this._registerPropertiesId = 0;
 | 
			
		||||
        this._currentEngineName = null;
 | 
			
		||||
@@ -96,7 +96,7 @@ var IBusManager = class {
 | 
			
		||||
        if (enginesList) {
 | 
			
		||||
            for (let i = 0; i < enginesList.length; ++i) {
 | 
			
		||||
                let name = enginesList[i].get_name();
 | 
			
		||||
                this._engines.set(name, enginesList[i]);
 | 
			
		||||
                this._engines[name] = enginesList[i];
 | 
			
		||||
            }
 | 
			
		||||
            this._updateReadiness();
 | 
			
		||||
        } else {
 | 
			
		||||
@@ -119,7 +119,7 @@ var IBusManager = class {
 | 
			
		||||
                if (!GLib.str_has_suffix(path, '/InputContext_1'))
 | 
			
		||||
                    this.emit ('focus-in');
 | 
			
		||||
            });
 | 
			
		||||
            this._panelService.connect('focus-out', () => this.emit('focus-out'));
 | 
			
		||||
            this._panelService.connect('focus-out', () => { this.emit('focus-out'); });
 | 
			
		||||
 | 
			
		||||
            try {
 | 
			
		||||
                // 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);
 | 
			
		||||
                    if (!engine)
 | 
			
		||||
                        return;
 | 
			
		||||
                } catch (e) {
 | 
			
		||||
                } catch(e) {
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
                this._engineChanged(this._ibus, engine.get_name());
 | 
			
		||||
@@ -150,7 +150,8 @@ var IBusManager = class {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _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);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -188,10 +189,10 @@ var IBusManager = class {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    getEngineDesc(id) {
 | 
			
		||||
        if (!this._ready || !this._engines.has(id))
 | 
			
		||||
        if (!this._ready || !this._engines.hasOwnProperty(id))
 | 
			
		||||
            return null;
 | 
			
		||||
 | 
			
		||||
        return this._engines.get(id);
 | 
			
		||||
        return this._engines[id];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    setEngine(id, callback) {
 | 
			
		||||
 
 | 
			
		||||
@@ -74,7 +74,7 @@ class InputMethod extends Clutter.InputMethod {
 | 
			
		||||
        this._context = null;
 | 
			
		||||
        this._hints = 0;
 | 
			
		||||
        this._purpose = 0;
 | 
			
		||||
        this._preeditStr = '';
 | 
			
		||||
        this._preeditStr = ''
 | 
			
		||||
        this._preeditPos = 0;
 | 
			
		||||
        this._preeditVisible = false;
 | 
			
		||||
    }
 | 
			
		||||
@@ -262,7 +262,7 @@ class InputMethod extends Clutter.InputMethod {
 | 
			
		||||
                                                      let retval = context.process_key_event_async_finish(res);
 | 
			
		||||
                                                      this.notify_key_event(event, retval);
 | 
			
		||||
                                                  } catch (e) {
 | 
			
		||||
                                                      log(`Error processing key on IM: ${e.message}`);
 | 
			
		||||
                                                      log('Error processing key on IM: ' + e.message);
 | 
			
		||||
                                                  }
 | 
			
		||||
                                              });
 | 
			
		||||
        return true;
 | 
			
		||||
 
 | 
			
		||||
@@ -42,20 +42,17 @@ var IntrospectService = class {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _isStandaloneApp(app) {
 | 
			
		||||
        let windows = app.get_windows();
 | 
			
		||||
 | 
			
		||||
        return app.get_windows().some(w => w.transient_for == null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _isIntrospectEnabled() {
 | 
			
		||||
        return this._settings.get_boolean(INTROSPECT_KEY);
 | 
			
		||||
       return this._settings.get_boolean(INTROSPECT_KEY);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _isSenderWhitelisted(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);
 | 
			
		||||
       return APP_WHITELIST.includes(sender);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _syncRunningApplications() {
 | 
			
		||||
@@ -79,10 +76,6 @@ var IntrospectService = class {
 | 
			
		||||
                newActiveApplication = app.get_id();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            let sandboxedAppId = this._getSandboxedAppId(app);
 | 
			
		||||
            if (sandboxedAppId)
 | 
			
		||||
                appInfo['sandboxed-app-id'] = new GLib.Variant('s', sandboxedAppId);
 | 
			
		||||
 | 
			
		||||
            newRunningApplications[app.get_id()] = appInfo;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -144,7 +137,6 @@ var IntrospectService = class {
 | 
			
		||||
                let frameRect = window.get_frame_rect();
 | 
			
		||||
                let title = window.get_title();
 | 
			
		||||
                let wmClass = window.get_wm_class();
 | 
			
		||||
                let sandboxedAppId = window.get_sandboxed_app_id();
 | 
			
		||||
 | 
			
		||||
                windowsList[windowId] = {
 | 
			
		||||
                    'app-id': GLib.Variant.new('s', app.get_id()),
 | 
			
		||||
@@ -161,10 +153,6 @@ var IntrospectService = class {
 | 
			
		||||
 | 
			
		||||
                if (wmClass != null)
 | 
			
		||||
                    windowsList[windowId]['wm-class'] = GLib.Variant.new('s', wmClass);
 | 
			
		||||
 | 
			
		||||
                if (sandboxedAppId != null)
 | 
			
		||||
                    windowsList[windowId]['sandboxed-app-id'] =
 | 
			
		||||
                        GLib.Variant.new('s', sandboxedAppId);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        invocation.return_value(new GLib.Variant('(a{ta{sv}})', [windowsList]));
 | 
			
		||||
 
 | 
			
		||||
@@ -51,14 +51,14 @@ function getCompletions(text, commandHeader, globalCompletionList) {
 | 
			
		||||
// if we encounter anything that isn't a letter, '.', ')', or ']',
 | 
			
		||||
// we should stop parsing.
 | 
			
		||||
function isStopChar(c) {
 | 
			
		||||
    return !c.match(/[\w.)\]]/);
 | 
			
		||||
    return !c.match(/[\w\.\)\]]/);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Given the ending position of a quoted string, find where it starts
 | 
			
		||||
function findMatchingQuote(expr, offset) {
 | 
			
		||||
    let quoteChar = expr.charAt(offset);
 | 
			
		||||
    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;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -68,7 +68,7 @@ function findMatchingQuote(expr, offset) {
 | 
			
		||||
// Given the ending position of a regex, find where it starts
 | 
			
		||||
function findMatchingSlash(expr, offset) {
 | 
			
		||||
    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;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -81,7 +81,7 @@ function findMatchingSlash(expr, offset) {
 | 
			
		||||
// findMatchingBrace("[(])", 3) returns 1.
 | 
			
		||||
function findMatchingBrace(expr, offset) {
 | 
			
		||||
    let closeBrace = expr.charAt(offset);
 | 
			
		||||
    let openBrace = ({ ')': '(', ']': '[' })[closeBrace];
 | 
			
		||||
    let openBrace = ({')': '(', ']': '['})[closeBrace];
 | 
			
		||||
 | 
			
		||||
    function findTheBrace(expr, offset) {
 | 
			
		||||
        if (offset < 0) {
 | 
			
		||||
@@ -117,11 +117,11 @@ function getExpressionOffset(expr, offset) {
 | 
			
		||||
    while (offset >= 0) {
 | 
			
		||||
        let currChar = expr.charAt(offset);
 | 
			
		||||
 | 
			
		||||
        if (isStopChar(currChar)) {
 | 
			
		||||
        if (isStopChar(currChar)){
 | 
			
		||||
            return offset + 1;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (currChar.match(/[)\]]/)) {
 | 
			
		||||
        if (currChar.match(/[\)\]]/)) {
 | 
			
		||||
            offset = findMatchingBrace(expr, offset);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -159,7 +159,7 @@ function getPropertyNamesFromExpression(expr, commandHeader) {
 | 
			
		||||
    let obj = {};
 | 
			
		||||
    if (!isUnsafeExpression(expr)) {
 | 
			
		||||
        try {
 | 
			
		||||
            obj = eval(commandHeader + expr);
 | 
			
		||||
                obj = eval(commandHeader + expr);
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
            return [];
 | 
			
		||||
        }
 | 
			
		||||
@@ -168,7 +168,7 @@ function getPropertyNamesFromExpression(expr, commandHeader) {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let propsUnique = {};
 | 
			
		||||
    if (typeof obj === 'object') {
 | 
			
		||||
    if (typeof obj === 'object'){
 | 
			
		||||
        let allProps = getAllProps(obj);
 | 
			
		||||
        // Get only things we are allowed to complete following a '.'
 | 
			
		||||
        allProps = allProps.filter( isValidPropertyName );
 | 
			
		||||
 
 | 
			
		||||
@@ -60,7 +60,7 @@ var KeyboardManager = class {
 | 
			
		||||
            this._currentKeymap.options == options)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        this._currentKeymap = { layouts, variants, options };
 | 
			
		||||
        this._currentKeymap = {layouts, variants, options};
 | 
			
		||||
        Meta.get_backend().set_keymap(layouts, variants, options);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -125,7 +125,7 @@ var KeyboardManager = class {
 | 
			
		||||
 | 
			
		||||
    _getLocaleLayout() {
 | 
			
		||||
        let locale = GLib.get_language_names()[0];
 | 
			
		||||
        if (!locale.includes('_'))
 | 
			
		||||
        if (locale.indexOf('_') == -1)
 | 
			
		||||
            locale = DEFAULT_LOCALE;
 | 
			
		||||
 | 
			
		||||
        let [found, , id] = GnomeDesktop.get_input_source_from_locale(locale);
 | 
			
		||||
 
 | 
			
		||||
@@ -43,33 +43,11 @@ function canLock() {
 | 
			
		||||
 | 
			
		||||
        let version = result.deep_unpack()[0].deep_unpack();
 | 
			
		||||
        return haveSystemd() && versionCompare('3.5.91', version);
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
    } catch(e) {
 | 
			
		||||
        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;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -185,7 +163,7 @@ var LoginManagerSystemd = class {
 | 
			
		||||
                    let [outVariant, fdList] = proxy.call_with_unix_fd_list_finish(result);
 | 
			
		||||
                    fd = fdList.steal_fds()[0];
 | 
			
		||||
                    callback(new Gio.UnixInputStream({ fd: fd }));
 | 
			
		||||
                } catch (e) {
 | 
			
		||||
                } catch(e) {
 | 
			
		||||
                    logError(e, "Error getting systemd inhibitor");
 | 
			
		||||
                    callback(null);
 | 
			
		||||
                }
 | 
			
		||||
 
 | 
			
		||||
@@ -26,33 +26,33 @@ function _getMobileProvidersDatabase() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// _findProviderForMccMnc:
 | 
			
		||||
// @operatorName: operator name
 | 
			
		||||
// @operatorCode: operator code
 | 
			
		||||
// @operator_name: operator name
 | 
			
		||||
// @operator_code: operator code
 | 
			
		||||
//
 | 
			
		||||
// 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.
 | 
			
		||||
//
 | 
			
		||||
function _findProviderForMccMnc(operatorName, operatorCode) {
 | 
			
		||||
    if (operatorName) {
 | 
			
		||||
        if (operatorName.length != 0 &&
 | 
			
		||||
            (operatorName.length > 6 || operatorName.length < 5)) {
 | 
			
		||||
function _findProviderForMccMnc(operator_name, operator_code) {
 | 
			
		||||
    if (operator_name) {
 | 
			
		||||
        if (operator_name.length != 0 &&
 | 
			
		||||
            (operator_name.length > 6 || operator_name.length < 5)) {
 | 
			
		||||
            // this looks like a valid name, i.e. not an MCCMNC (that some
 | 
			
		||||
            // 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
 | 
			
		||||
            // after all; return that
 | 
			
		||||
            return operatorName;
 | 
			
		||||
            return operator_name;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let needle;
 | 
			
		||||
    if ((!operatorName || operatorName.length == 0) && operatorCode)
 | 
			
		||||
        needle = operatorCode;
 | 
			
		||||
    else if (operatorName && (operatorName.length == 6 || operatorName.length == 5))
 | 
			
		||||
        needle = operatorName;
 | 
			
		||||
    if ((!operator_name || operator_name.length == 0) && operator_code)
 | 
			
		||||
        needle = operator_code;
 | 
			
		||||
    else if (operator_name && (operator_name.length == 6 || operator_name.length == 5))
 | 
			
		||||
        needle = operator_name;
 | 
			
		||||
    else // nothing to search
 | 
			
		||||
        return null;
 | 
			
		||||
 | 
			
		||||
@@ -71,7 +71,7 @@ function _findProviderForMccMnc(operatorName, operatorCode) {
 | 
			
		||||
// Tries to find the operator name corresponding to the given SID
 | 
			
		||||
//
 | 
			
		||||
function _findProviderForSid(sid) {
 | 
			
		||||
    if (!sid)
 | 
			
		||||
    if (sid == 0)
 | 
			
		||||
        return null;
 | 
			
		||||
 | 
			
		||||
    let mpd = _getMobileProvidersDatabase();
 | 
			
		||||
@@ -173,7 +173,7 @@ var ModemCdma = class {
 | 
			
		||||
            } else {
 | 
			
		||||
                let [bandClass, band, sid] = result;
 | 
			
		||||
 | 
			
		||||
                this.operator_name = _findProviderForSid(sid);
 | 
			
		||||
                this.operator_name = _findProviderForSid(sid)
 | 
			
		||||
            }
 | 
			
		||||
            this.emit('notify::operator-name');
 | 
			
		||||
        });
 | 
			
		||||
@@ -230,17 +230,17 @@ var BroadbandModem = class {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _reloadOperatorName() {
 | 
			
		||||
        let newName = "";
 | 
			
		||||
        let new_name = "";
 | 
			
		||||
        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 (newName != "")
 | 
			
		||||
                newName += ", ";
 | 
			
		||||
            newName += this.operator_name_cdma;
 | 
			
		||||
            if (new_name != "")
 | 
			
		||||
                new_name += ", ";
 | 
			
		||||
            new_name += this.operator_name_cdma;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this.operator_name = newName;
 | 
			
		||||
        this.operator_name = new_name;
 | 
			
		||||
        this.emit('notify::operator-name');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -77,51 +77,54 @@ var ObjectManager = class {
 | 
			
		||||
        let info = this._interfaceInfos[interfaceName];
 | 
			
		||||
 | 
			
		||||
        if (!info) {
 | 
			
		||||
            if (onFinished)
 | 
			
		||||
                onFinished();
 | 
			
		||||
            return;
 | 
			
		||||
           if (onFinished)
 | 
			
		||||
               onFinished();
 | 
			
		||||
           return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let proxy = new Gio.DBusProxy({ g_connection: this._connection,
 | 
			
		||||
                                        g_name: this._serviceName,
 | 
			
		||||
                                        g_object_path: objectPath,
 | 
			
		||||
                                        g_interface_name: interfaceName,
 | 
			
		||||
                                        g_interface_info: info,
 | 
			
		||||
                                        g_flags: Gio.DBusProxyFlags.DO_NOT_AUTO_START });
 | 
			
		||||
                                       g_name: this._serviceName,
 | 
			
		||||
                                       g_object_path: objectPath,
 | 
			
		||||
                                       g_interface_name: interfaceName,
 | 
			
		||||
                                       g_interface_info: info,
 | 
			
		||||
                                       g_flags: Gio.DBusProxyFlags.DO_NOT_AUTO_START });
 | 
			
		||||
 | 
			
		||||
        proxy.init_async(GLib.PRIORITY_DEFAULT, this._cancellable, (initable, result) => {
 | 
			
		||||
            try {
 | 
			
		||||
                initable.init_finish(result);
 | 
			
		||||
            } catch (e) {
 | 
			
		||||
                logError(e, `could not initialize proxy for interface ${interfaceName}`);
 | 
			
		||||
        proxy.init_async(GLib.PRIORITY_DEFAULT,
 | 
			
		||||
                         this._cancellable,
 | 
			
		||||
                         (initable, result) => {
 | 
			
		||||
               let error = null;
 | 
			
		||||
               try {
 | 
			
		||||
                   initable.init_finish(result);
 | 
			
		||||
               } catch(e) {
 | 
			
		||||
                   logError(e, 'could not initialize proxy for interface ' + interfaceName);
 | 
			
		||||
 | 
			
		||||
                if (onFinished)
 | 
			
		||||
                    onFinished();
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
                   if (onFinished)
 | 
			
		||||
                       onFinished();
 | 
			
		||||
                   return;
 | 
			
		||||
               }
 | 
			
		||||
 | 
			
		||||
            let isNewObject;
 | 
			
		||||
            if (!this._objects[objectPath]) {
 | 
			
		||||
                this._objects[objectPath] = {};
 | 
			
		||||
                isNewObject = true;
 | 
			
		||||
            } else {
 | 
			
		||||
                isNewObject = false;
 | 
			
		||||
            }
 | 
			
		||||
               let isNewObject;
 | 
			
		||||
               if (!this._objects[objectPath]) {
 | 
			
		||||
                   this._objects[objectPath] = {};
 | 
			
		||||
                   isNewObject = true;
 | 
			
		||||
               } else {
 | 
			
		||||
                   isNewObject = false;
 | 
			
		||||
               }
 | 
			
		||||
 | 
			
		||||
            this._objects[objectPath][interfaceName] = proxy;
 | 
			
		||||
               this._objects[objectPath][interfaceName] = proxy;
 | 
			
		||||
 | 
			
		||||
            if (!this._interfaces[interfaceName])
 | 
			
		||||
                this._interfaces[interfaceName] = [];
 | 
			
		||||
               if (!this._interfaces[interfaceName])
 | 
			
		||||
                   this._interfaces[interfaceName] = [];
 | 
			
		||||
 | 
			
		||||
            this._interfaces[interfaceName].push(proxy);
 | 
			
		||||
               this._interfaces[interfaceName].push(proxy);
 | 
			
		||||
 | 
			
		||||
            if (isNewObject)
 | 
			
		||||
                this.emit('object-added', objectPath);
 | 
			
		||||
               if (isNewObject)
 | 
			
		||||
                   this.emit('object-added', objectPath);
 | 
			
		||||
 | 
			
		||||
            this.emit('interface-added', interfaceName, proxy);
 | 
			
		||||
               this.emit('interface-added', interfaceName, proxy);
 | 
			
		||||
 | 
			
		||||
            if (onFinished)
 | 
			
		||||
                onFinished();
 | 
			
		||||
               if (onFinished)
 | 
			
		||||
                   onFinished();
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -152,10 +155,11 @@ var ObjectManager = class {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _onManagerProxyLoaded(initable, result) {
 | 
			
		||||
        let error = null;
 | 
			
		||||
        try {
 | 
			
		||||
            initable.init_finish(result);
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
            logError(e, `could not initialize object manager for object ${this._serviceName}`);
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
            logError(e, 'could not initialize object manager for object ' + this._serviceName);
 | 
			
		||||
 | 
			
		||||
            this._tryToCompleteLoad();
 | 
			
		||||
            return;
 | 
			
		||||
@@ -193,7 +197,7 @@ var ObjectManager = class {
 | 
			
		||||
        this._managerProxy.GetManagedObjectsRemote((result, error) => {
 | 
			
		||||
            if (!result) {
 | 
			
		||||
                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();
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,5 @@
 | 
			
		||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 | 
			
		||||
 | 
			
		||||
const Lang = imports.lang;
 | 
			
		||||
 | 
			
		||||
// parse:
 | 
			
		||||
// @params: caller-provided parameter object, or %null
 | 
			
		||||
// @defaults-provided defaults object
 | 
			
		||||
@@ -16,14 +14,22 @@ const Lang = imports.lang;
 | 
			
		||||
//
 | 
			
		||||
// Return value: a new object, containing the merged parameters from
 | 
			
		||||
// @params and @defaults
 | 
			
		||||
function parse(params = {}, defaults, allowExtras) {
 | 
			
		||||
    if (!allowExtras) {
 | 
			
		||||
        for (let prop in params)
 | 
			
		||||
            if (!(prop in defaults))
 | 
			
		||||
                throw new Error(`Unrecognized parameter "${prop}"`);
 | 
			
		||||
function parse(params, defaults, allowExtras) {
 | 
			
		||||
    let ret = {}, prop;
 | 
			
		||||
 | 
			
		||||
    if (!params)
 | 
			
		||||
        params = {};
 | 
			
		||||
 | 
			
		||||
    for (prop in params) {
 | 
			
		||||
        if (!(prop in defaults) && !allowExtras)
 | 
			
		||||
            throw new Error('Unrecognized parameter "' + prop + '"');
 | 
			
		||||
        ret[prop] = params[prop];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let defaultsCopy = {};
 | 
			
		||||
    Lang.copyProperties(defaults, defaultsCopy);
 | 
			
		||||
    return Object.assign(defaultsCopy, params);
 | 
			
		||||
}
 | 
			
		||||
    for (prop in defaults) {
 | 
			
		||||
        if (!(prop in params))
 | 
			
		||||
            ret[prop] = defaults[prop];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
@@ -12,4 +12,4 @@ function PermissionStore(initCallback, cancellable) {
 | 
			
		||||
                                    'org.freedesktop.impl.portal.PermissionStore',
 | 
			
		||||
                                    '/org/freedesktop/impl/portal/PermissionStore',
 | 
			
		||||
                                    initCallback, cancellable);
 | 
			
		||||
}
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -29,7 +29,7 @@ var SmartcardManager = class {
 | 
			
		||||
        this._objectManager = new ObjectManager.ObjectManager({ connection: Gio.DBus.session,
 | 
			
		||||
                                                                name: "org.gnome.SettingsDaemon.Smartcard",
 | 
			
		||||
                                                                objectPath: '/org/gnome/SettingsDaemon/Smartcard',
 | 
			
		||||
                                                                knownInterfaces: [SmartcardTokenIface],
 | 
			
		||||
                                                                knownInterfaces: [ SmartcardTokenIface ],
 | 
			
		||||
                                                                onLoaded: this._onLoaded.bind(this) });
 | 
			
		||||
        this._insertedTokens = {};
 | 
			
		||||
        this._loginToken = null;
 | 
			
		||||
 
 | 
			
		||||
@@ -83,54 +83,48 @@ const SystemActions = GObject.registerClass({
 | 
			
		||||
        this._canHaveSuspend = true;
 | 
			
		||||
 | 
			
		||||
        this._actions = new Map();
 | 
			
		||||
        this._actions.set(POWER_OFF_ACTION_ID, {
 | 
			
		||||
            // Translators: The name of the power-off action in search
 | 
			
		||||
            name: C_("search-result", "Power Off"),
 | 
			
		||||
            iconName: 'system-shutdown-symbolic',
 | 
			
		||||
            // Translators: A list of keywords that match the power-off action, separated by semicolons
 | 
			
		||||
            keywords: _("power off;shutdown;reboot;restart").split(/[; ]/),
 | 
			
		||||
            available: false
 | 
			
		||||
        });
 | 
			
		||||
        this._actions.set(LOCK_SCREEN_ACTION_ID, {
 | 
			
		||||
            // Translators: The name of the lock screen action in search
 | 
			
		||||
            name: C_("search-result", "Lock Screen"),
 | 
			
		||||
            iconName: 'system-lock-screen-symbolic',
 | 
			
		||||
            // Translators: A list of keywords that match the lock screen action, separated by semicolons
 | 
			
		||||
            keywords: _("lock screen").split(/[; ]/),
 | 
			
		||||
            available: false
 | 
			
		||||
        });
 | 
			
		||||
        this._actions.set(LOGOUT_ACTION_ID, {
 | 
			
		||||
            // Translators: The name of the logout action in search
 | 
			
		||||
            name: C_("search-result", "Log Out"),
 | 
			
		||||
            iconName: 'application-exit-symbolic',
 | 
			
		||||
            // Translators: A list of keywords that match the logout action, separated by semicolons
 | 
			
		||||
            keywords: _("logout;log out;sign off").split(/[; ]/),
 | 
			
		||||
            available: false
 | 
			
		||||
        });
 | 
			
		||||
        this._actions.set(SUSPEND_ACTION_ID, {
 | 
			
		||||
            // Translators: The name of the suspend action in search
 | 
			
		||||
            name: C_("search-result", "Suspend"),
 | 
			
		||||
            iconName: 'media-playback-pause-symbolic',
 | 
			
		||||
            // Translators: A list of keywords that match the suspend action, separated by semicolons
 | 
			
		||||
            keywords: _("suspend;sleep").split(/[; ]/),
 | 
			
		||||
            available: false
 | 
			
		||||
        });
 | 
			
		||||
        this._actions.set(SWITCH_USER_ACTION_ID, {
 | 
			
		||||
            // Translators: The name of the switch user action in search
 | 
			
		||||
            name: C_("search-result", "Switch User"),
 | 
			
		||||
            iconName: 'system-switch-user-symbolic',
 | 
			
		||||
            // Translators: A list of keywords that match the switch user action, separated by semicolons
 | 
			
		||||
            keywords: _("switch user").split(/[; ]/),
 | 
			
		||||
            available: false
 | 
			
		||||
        });
 | 
			
		||||
        this._actions.set(LOCK_ORIENTATION_ACTION_ID, {
 | 
			
		||||
            // Translators: The name of the lock orientation action in search
 | 
			
		||||
            name: C_("search-result", "Lock Orientation"),
 | 
			
		||||
            iconName: '',
 | 
			
		||||
            // Translators: A list of keywords that match the lock orientation action, separated by semicolons
 | 
			
		||||
            keywords: _("lock orientation;screen;rotation").split(/[; ]/),
 | 
			
		||||
            available: false
 | 
			
		||||
        });
 | 
			
		||||
        this._actions.set(POWER_OFF_ACTION_ID,
 | 
			
		||||
                          { // Translators: The name of the power-off action in search
 | 
			
		||||
                            name: C_("search-result", "Power Off"),
 | 
			
		||||
                            iconName: 'system-shutdown-symbolic',
 | 
			
		||||
                            // Translators: A list of keywords that match the power-off action, separated by semicolons
 | 
			
		||||
                            keywords: _("power off;shutdown;reboot;restart").split(';'),
 | 
			
		||||
                            available: false });
 | 
			
		||||
        this._actions.set(LOCK_SCREEN_ACTION_ID,
 | 
			
		||||
                          { // Translators: The name of the lock screen action in search
 | 
			
		||||
                            name: C_("search-result", "Lock Screen"),
 | 
			
		||||
                            iconName: 'system-lock-screen-symbolic',
 | 
			
		||||
                            // Translators: A list of keywords that match the lock screen action, separated by semicolons
 | 
			
		||||
                            keywords: _("lock screen").split(';'),
 | 
			
		||||
                            available: false });
 | 
			
		||||
        this._actions.set(LOGOUT_ACTION_ID,
 | 
			
		||||
                          { // Translators: The name of the logout action in search
 | 
			
		||||
                            name: C_("search-result", "Log Out"),
 | 
			
		||||
                            iconName: 'application-exit-symbolic',
 | 
			
		||||
                            // Translators: A list of keywords that match the logout action, separated by semicolons
 | 
			
		||||
                            keywords: _("logout;sign off").split(';'),
 | 
			
		||||
                            available: false });
 | 
			
		||||
        this._actions.set(SUSPEND_ACTION_ID,
 | 
			
		||||
                          { // Translators: The name of the suspend action in search
 | 
			
		||||
                            name: C_("search-result", "Suspend"),
 | 
			
		||||
                            iconName: 'media-playback-pause-symbolic',
 | 
			
		||||
                            // Translators: A list of keywords that match the suspend action, separated by semicolons
 | 
			
		||||
                            keywords: _("suspend;sleep").split(';'),
 | 
			
		||||
                            available: false });
 | 
			
		||||
        this._actions.set(SWITCH_USER_ACTION_ID,
 | 
			
		||||
                          { // Translators: The name of the switch user action in search
 | 
			
		||||
                            name: C_("search-result", "Switch User"),
 | 
			
		||||
                            iconName: 'system-switch-user-symbolic',
 | 
			
		||||
                            // Translators: A list of keywords that match the switch user action, separated by semicolons
 | 
			
		||||
                            keywords: _("switch user").split(';'),
 | 
			
		||||
                            available: false });
 | 
			
		||||
        this._actions.set(LOCK_ORIENTATION_ACTION_ID,
 | 
			
		||||
                          { // Translators: The name of the lock orientation action in search
 | 
			
		||||
                            name: C_("search-result", "Lock Orientation"),
 | 
			
		||||
                            iconName: '',
 | 
			
		||||
                            // Translators: A list of keywords that match the lock orientation action, separated by semicolons
 | 
			
		||||
                            keywords: _("lock orientation;screen;rotation").split(';'),
 | 
			
		||||
                            available: false });
 | 
			
		||||
 | 
			
		||||
        this._loginScreenSettings = new Gio.Settings({ schema_id: LOGIN_SCREEN_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.connect('notify::is-loaded',
 | 
			
		||||
                                  () => this._updateMultiUser());
 | 
			
		||||
                                  () => { this._updateMultiUser(); });
 | 
			
		||||
        this._userManager.connect('notify::has-multiple-users',
 | 
			
		||||
                                  () => this._updateMultiUser());
 | 
			
		||||
                                  () => { this._updateMultiUser(); });
 | 
			
		||||
        this._userManager.connect('user-added',
 | 
			
		||||
                                  () => this._updateMultiUser());
 | 
			
		||||
                                  () => { this._updateMultiUser(); });
 | 
			
		||||
        this._userManager.connect('user-removed',
 | 
			
		||||
                                  () => this._updateMultiUser());
 | 
			
		||||
                                  () => { this._updateMultiUser(); });
 | 
			
		||||
 | 
			
		||||
        this._lockdownSettings.connect(`changed::${DISABLE_USER_SWITCH_KEY}`,
 | 
			
		||||
                                       () => this._updateSwitchUser());
 | 
			
		||||
        this._lockdownSettings.connect(`changed::${DISABLE_LOG_OUT_KEY}`,
 | 
			
		||||
                                       () => this._updateLogout());
 | 
			
		||||
        global.settings.connect(`changed::${ALWAYS_SHOW_LOG_OUT_KEY}`,
 | 
			
		||||
                                () => this._updateLogout());
 | 
			
		||||
        this._lockdownSettings.connect('changed::' + DISABLE_USER_SWITCH_KEY,
 | 
			
		||||
                                       () => { this._updateSwitchUser(); });
 | 
			
		||||
        this._lockdownSettings.connect('changed::' + DISABLE_LOG_OUT_KEY,
 | 
			
		||||
                                       () => { this._updateLogout(); });
 | 
			
		||||
        global.settings.connect('changed::' + ALWAYS_SHOW_LOG_OUT_KEY,
 | 
			
		||||
                                () => { this._updateLogout(); });
 | 
			
		||||
 | 
			
		||||
        this._lockdownSettings.connect(`changed::${DISABLE_LOCK_SCREEN_KEY}`,
 | 
			
		||||
                                       () => this._updateLockScreen());
 | 
			
		||||
        this._lockdownSettings.connect('changed::' + DISABLE_LOCK_SCREEN_KEY,
 | 
			
		||||
                                       () => { this._updateLockScreen(); });
 | 
			
		||||
 | 
			
		||||
        this._lockdownSettings.connect(`changed::${DISABLE_LOG_OUT_KEY}`,
 | 
			
		||||
                                       () => this._updateHaveShutdown());
 | 
			
		||||
        this._lockdownSettings.connect('changed::' + DISABLE_LOG_OUT_KEY,
 | 
			
		||||
                                       () => { this._updateHaveShutdown(); });
 | 
			
		||||
 | 
			
		||||
        this.forceUpdate();
 | 
			
		||||
 | 
			
		||||
        this._orientationSettings.connect('changed::orientation-lock',
 | 
			
		||||
                                          () => {
 | 
			
		||||
                                              this._updateOrientationLock();
 | 
			
		||||
                                              this._updateOrientationLockIcon();
 | 
			
		||||
                                          });
 | 
			
		||||
                                          () => { this._updateOrientationLock();
 | 
			
		||||
                                                  this._updateOrientationLockIcon(); });
 | 
			
		||||
        Main.layoutManager.connect('monitors-changed',
 | 
			
		||||
                                   () => this._updateOrientationLock());
 | 
			
		||||
                                   () => { this._updateOrientationLock(); });
 | 
			
		||||
        Gio.DBus.system.watch_name(SENSOR_BUS_NAME,
 | 
			
		||||
                                   Gio.BusNameWatcherFlags.NONE,
 | 
			
		||||
                                   () => this._sensorProxyAppeared(),
 | 
			
		||||
                                   () => { this._sensorProxyAppeared(); },
 | 
			
		||||
                                   () => {
 | 
			
		||||
                                       this._sensorProxy = null;
 | 
			
		||||
                                       this._updateOrientationLock();
 | 
			
		||||
@@ -183,7 +175,7 @@ const SystemActions = GObject.registerClass({
 | 
			
		||||
        this._updateOrientationLock();
 | 
			
		||||
        this._updateOrientationLockIcon();
 | 
			
		||||
 | 
			
		||||
        Main.sessionMode.connect('updated', () => this._sessionUpdated());
 | 
			
		||||
        Main.sessionMode.connect('updated', () => { this._sessionUpdated(); });
 | 
			
		||||
        this._sessionUpdated();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -223,7 +215,7 @@ const SystemActions = GObject.registerClass({
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
                this._sensorProxy.connect('g-properties-changed',
 | 
			
		||||
                                          () => this._updateOrientationLock());
 | 
			
		||||
                                          () => { this._updateOrientationLock(); });
 | 
			
		||||
                this._updateOrientationLock();
 | 
			
		||||
            });
 | 
			
		||||
    }
 | 
			
		||||
@@ -265,12 +257,12 @@ const SystemActions = GObject.registerClass({
 | 
			
		||||
 | 
			
		||||
    getMatchingActions(terms) {
 | 
			
		||||
        // terms is a list of strings
 | 
			
		||||
        terms = terms.map((term) => term.toLowerCase());
 | 
			
		||||
        terms = terms.map((term) => { return term.toLowerCase(); });
 | 
			
		||||
 | 
			
		||||
        let results = [];
 | 
			
		||||
 | 
			
		||||
        for (let [key, { available, keywords }] of this._actions)
 | 
			
		||||
            if (available && terms.every(t => keywords.some(k => k.startsWith(t))))
 | 
			
		||||
        for (let [key, {available, keywords}] of this._actions)
 | 
			
		||||
            if (available && terms.every(t => keywords.some(k => (k.indexOf(t) >= 0))))
 | 
			
		||||
                results.push(key);
 | 
			
		||||
 | 
			
		||||
        return results;
 | 
			
		||||
@@ -286,24 +278,24 @@ const SystemActions = GObject.registerClass({
 | 
			
		||||
 | 
			
		||||
    activateAction(id) {
 | 
			
		||||
        switch (id) {
 | 
			
		||||
        case POWER_OFF_ACTION_ID:
 | 
			
		||||
            this.activatePowerOff();
 | 
			
		||||
            break;
 | 
			
		||||
        case LOCK_SCREEN_ACTION_ID:
 | 
			
		||||
            this.activateLockScreen();
 | 
			
		||||
            break;
 | 
			
		||||
        case LOGOUT_ACTION_ID:
 | 
			
		||||
            this.activateLogout();
 | 
			
		||||
            break;
 | 
			
		||||
        case SUSPEND_ACTION_ID:
 | 
			
		||||
            this.activateSuspend();
 | 
			
		||||
            break;
 | 
			
		||||
        case SWITCH_USER_ACTION_ID:
 | 
			
		||||
            this.activateSwitchUser();
 | 
			
		||||
            break;
 | 
			
		||||
        case LOCK_ORIENTATION_ACTION_ID:
 | 
			
		||||
            this.activateLockOrientation();
 | 
			
		||||
            break;
 | 
			
		||||
            case POWER_OFF_ACTION_ID:
 | 
			
		||||
                this.activatePowerOff();
 | 
			
		||||
                break;
 | 
			
		||||
            case LOCK_SCREEN_ACTION_ID:
 | 
			
		||||
                this.activateLockScreen();
 | 
			
		||||
                break;
 | 
			
		||||
            case LOGOUT_ACTION_ID:
 | 
			
		||||
                this.activateLogout();
 | 
			
		||||
                break;
 | 
			
		||||
            case SUSPEND_ACTION_ID:
 | 
			
		||||
                this.activateSuspend();
 | 
			
		||||
                break;
 | 
			
		||||
            case SWITCH_USER_ACTION_ID:
 | 
			
		||||
                this.activateSwitchUser();
 | 
			
		||||
                break;
 | 
			
		||||
            case LOCK_ORIENTATION_ACTION_ID:
 | 
			
		||||
                this.activateLockOrientation();
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -17,7 +17,7 @@ const _leadingJunk = '[\\s`(\\[{\'\\"<\u00AB\u201C\u2018]';
 | 
			
		||||
const _notTrailingJunk = '[^\\s`!()\\[\\]{};:\'\\".,<>?\u00AB\u00BB\u201C\u201D\u2018\u2019]';
 | 
			
		||||
 | 
			
		||||
const _urlRegexp = new RegExp(
 | 
			
		||||
    `(^|${_leadingJunk})` +
 | 
			
		||||
    '(^|' + _leadingJunk + ')' +
 | 
			
		||||
    '(' +
 | 
			
		||||
        '(?:' +
 | 
			
		||||
            '(?:http|https|ftp)://' +             // scheme://
 | 
			
		||||
@@ -29,12 +29,12 @@ const _urlRegexp = new RegExp(
 | 
			
		||||
        '(?:' +                                   // one or more:
 | 
			
		||||
            '[^\\s()<>]+' +                       // run of non-space non-()
 | 
			
		||||
            '|' +                                 // or
 | 
			
		||||
            `${_balancedParens}` +                // balanced parens
 | 
			
		||||
            _balancedParens +                     // balanced parens
 | 
			
		||||
        ')+' +
 | 
			
		||||
        '(?:' +                                   // end with:
 | 
			
		||||
            `${_balancedParens}` +                // balanced parens
 | 
			
		||||
            _balancedParens +                     // balanced parens
 | 
			
		||||
            '|' +                                 // or
 | 
			
		||||
            `${_notTrailingJunk}` +               // last non-junk char
 | 
			
		||||
            _notTrailingJunk +                    // last non-junk char
 | 
			
		||||
        ')' +
 | 
			
		||||
    ')', 'gi');
 | 
			
		||||
 | 
			
		||||
@@ -69,16 +69,16 @@ function spawn(argv) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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.
 | 
			
		||||
function spawnCommandLine(commandLine) {
 | 
			
		||||
function spawnCommandLine(command_line) {
 | 
			
		||||
    try {
 | 
			
		||||
        let [success, argv] = GLib.shell_parse_argv(commandLine);
 | 
			
		||||
        let [success, argv] = GLib.shell_parse_argv(command_line);
 | 
			
		||||
        trySpawn(argv);
 | 
			
		||||
    } 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);
 | 
			
		||||
        app.launch([], context);
 | 
			
		||||
    } catch (err) {
 | 
			
		||||
    } catch(err) {
 | 
			
		||||
        _handleSpawnError(argv[0], err);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -103,7 +103,8 @@ function spawnApp(argv) {
 | 
			
		||||
//
 | 
			
		||||
// Runs @argv in the background. If launching @argv fails,
 | 
			
		||||
// this will throw an error.
 | 
			
		||||
function trySpawn(argv) {
 | 
			
		||||
function trySpawn(argv)
 | 
			
		||||
{
 | 
			
		||||
    var success, pid;
 | 
			
		||||
    try {
 | 
			
		||||
        [success, pid] = GLib.spawn_async(null, argv, null,
 | 
			
		||||
@@ -134,19 +135,19 @@ function trySpawn(argv) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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.
 | 
			
		||||
function trySpawnCommandLine(commandLine) {
 | 
			
		||||
function trySpawnCommandLine(command_line) {
 | 
			
		||||
    let success, argv;
 | 
			
		||||
 | 
			
		||||
    try {
 | 
			
		||||
        [success, argv] = GLib.shell_parse_argv(commandLine);
 | 
			
		||||
        [success, argv] = GLib.shell_parse_argv(command_line);
 | 
			
		||||
    } catch (err) {
 | 
			
		||||
        // Replace "Error invoking GLib.shell_parse_argv: " with
 | 
			
		||||
        // something nicer
 | 
			
		||||
        err.message = err.message.replace(/[^:]*: /, `${_("Could not parse command:")}\n`);
 | 
			
		||||
        err.message = err.message.replace(/[^:]*: /, _("Could not parse command:") + "\n");
 | 
			
		||||
        throw err;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -221,7 +222,7 @@ function formatTime(time, params) {
 | 
			
		||||
            /* Translators: Time in 24h format */
 | 
			
		||||
            format = N_("%H\u2236%M");
 | 
			
		||||
        // 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
 | 
			
		||||
             time string in 24h format. i.e. "Yesterday, 14:30" */
 | 
			
		||||
            // xgettext:no-c-format
 | 
			
		||||
@@ -250,7 +251,7 @@ function formatTime(time, params) {
 | 
			
		||||
            /* Translators: Time in 12h format */
 | 
			
		||||
            format = N_("%l\u2236%M %p");
 | 
			
		||||
        // 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
 | 
			
		||||
             time string in 12h format. i.e. "Yesterday, 2:30 pm" */
 | 
			
		||||
            // xgettext:no-c-format
 | 
			
		||||
@@ -288,7 +289,7 @@ function createTimeLabel(date, params) {
 | 
			
		||||
    let id = _desktopSettings.connect('changed::clock-format', () => {
 | 
			
		||||
        label.text = formatTime(date, params);
 | 
			
		||||
    });
 | 
			
		||||
    label.connect('destroy', () => _desktopSettings.disconnect(id));
 | 
			
		||||
    label.connect('destroy', () => { _desktopSettings.disconnect(id); });
 | 
			
		||||
    return label;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -345,7 +346,7 @@ function insertSorted(array, val, cmp) {
 | 
			
		||||
var CloseButton = GObject.registerClass(
 | 
			
		||||
class CloseButton extends St.Button {
 | 
			
		||||
    _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
 | 
			
		||||
        // that compete with Clutter's properties. This should be fixed for
 | 
			
		||||
@@ -365,7 +366,7 @@ class CloseButton extends St.Button {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _computeBoxPointerOffset() {
 | 
			
		||||
        if (!this._boxPointer || !this._boxPointer.get_stage())
 | 
			
		||||
        if (!this._boxPointer || !this._boxPointer.actor.get_stage())
 | 
			
		||||
            return 0;
 | 
			
		||||
 | 
			
		||||
        let side = this._boxPointer.arrowSide;
 | 
			
		||||
@@ -379,7 +380,7 @@ class CloseButton extends St.Button {
 | 
			
		||||
        let themeNode = this.get_theme_node();
 | 
			
		||||
 | 
			
		||||
        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;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -466,7 +467,7 @@ var AppSettingsMonitor = class {
 | 
			
		||||
        if (!this._settings || handler.id > 0)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        handler.id = this._settings.connect(`changed::${handler.key}`,
 | 
			
		||||
        handler.id = this._settings.connect('changed::' + handler.key,
 | 
			
		||||
                                            handler.callback);
 | 
			
		||||
        handler.callback(this._settings, handler.key);
 | 
			
		||||
    }
 | 
			
		||||
@@ -492,13 +493,13 @@ var AppSettingsMonitor = class {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _setSettings(settings) {
 | 
			
		||||
        this._handlers.forEach((handler) => this._disconnectHandler(handler));
 | 
			
		||||
        this._handlers.forEach((handler) => { this._disconnectHandler(handler); });
 | 
			
		||||
 | 
			
		||||
        let hadSettings = (this._settings != null);
 | 
			
		||||
        this._settings = settings;
 | 
			
		||||
        let haveSettings = (this._settings != null);
 | 
			
		||||
 | 
			
		||||
        this._handlers.forEach((handler) => this._connectHandler(handler));
 | 
			
		||||
        this._handlers.forEach((handler) => { this._connectHandler(handler); });
 | 
			
		||||
 | 
			
		||||
        if (hadSettings != haveSettings)
 | 
			
		||||
            this.emit('available-changed');
 | 
			
		||||
 
 | 
			
		||||
@@ -26,7 +26,7 @@ var WeatherClient = class {
 | 
			
		||||
        this._weatherAuthorized = false;
 | 
			
		||||
        this._permStore = new PermissionStore.PermissionStore((proxy, error) => {
 | 
			
		||||
            if (error) {
 | 
			
		||||
                log(`Failed to connect to permissionStore: ${error.message}`);
 | 
			
		||||
                log('Failed to connect to permissionStore: ' + error.message);
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
@@ -40,7 +40,7 @@ var WeatherClient = class {
 | 
			
		||||
 | 
			
		||||
            this._permStore.LookupRemote('gnome', 'geolocation', (res, error) => {
 | 
			
		||||
                if (error)
 | 
			
		||||
                    log(`Error looking up permission: ${error.message}`);
 | 
			
		||||
                    log('Error looking up permission: ' + error.message);
 | 
			
		||||
 | 
			
		||||
                let [perms, data] = error ? [{}, null] : res;
 | 
			
		||||
                let  params = ['gnome', 'geolocation', false, data, perms];
 | 
			
		||||
@@ -68,7 +68,7 @@ var WeatherClient = class {
 | 
			
		||||
 | 
			
		||||
        this._weatherAppMon = new Util.AppSettingsMonitor('org.gnome.Weather.desktop',
 | 
			
		||||
                                                          '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._onAutomaticLocationChanged.bind(this));
 | 
			
		||||
        this._weatherAppMon.watchSetting('locations',
 | 
			
		||||
@@ -178,8 +178,8 @@ var WeatherClient = class {
 | 
			
		||||
            (o, res) => {
 | 
			
		||||
                try {
 | 
			
		||||
                    this._gclueService = Geoclue.Simple.new_finish(res);
 | 
			
		||||
                } catch (e) {
 | 
			
		||||
                    log(`Failed to connect to Geoclue2 service: ${e.message}`);
 | 
			
		||||
                } catch(e) {
 | 
			
		||||
                    log('Failed to connect to Geoclue2 service: ' + e.message);
 | 
			
		||||
                    this._setLocation(this._mostRecentLocation);
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
 
 | 
			
		||||
@@ -19,7 +19,7 @@ var METRICS = {
 | 
			
		||||
      units: "frames / s" },
 | 
			
		||||
    overviewLatencySubsequent:
 | 
			
		||||
    { description: "Time to first frame after triggering overview, second time",
 | 
			
		||||
      units: "us" },
 | 
			
		||||
      units: "us"},
 | 
			
		||||
    overviewFpsSubsequent:
 | 
			
		||||
    { description: "Frames rate when going to the overview, second time",
 | 
			
		||||
      units: "frames / s" },
 | 
			
		||||
@@ -52,7 +52,7 @@ var METRICS = {
 | 
			
		||||
      units: "us" },
 | 
			
		||||
    applicationsShowTimeSubsequent:
 | 
			
		||||
    { description: "Time to switch to applications view, second time",
 | 
			
		||||
      units: "us" }
 | 
			
		||||
      units: "us"}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
let WINDOW_CONFIGS = [
 | 
			
		||||
@@ -136,6 +136,7 @@ let overviewFrames;
 | 
			
		||||
let overviewLatency;
 | 
			
		||||
let mallocUsedSize = 0;
 | 
			
		||||
let overviewShowCount = 0;
 | 
			
		||||
let firstOverviewUsedSize;
 | 
			
		||||
let haveSwapComplete = false;
 | 
			
		||||
let applicationsShowStart;
 | 
			
		||||
let applicationsShowCount = 0;
 | 
			
		||||
 
 | 
			
		||||
@@ -30,7 +30,7 @@ var METRICS = {
 | 
			
		||||
    geditStartTime:
 | 
			
		||||
    { description: "Time from gedit launch to window drawn",
 | 
			
		||||
      units: "us" },
 | 
			
		||||
};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function waitAndDraw(milliseconds) {
 | 
			
		||||
    let cb;
 | 
			
		||||
@@ -48,7 +48,7 @@ function waitAndDraw(milliseconds) {
 | 
			
		||||
            cb();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    return callback => cb = callback;
 | 
			
		||||
    return callback => { cb = callback; };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function waitSignal(object, signal) {
 | 
			
		||||
@@ -60,7 +60,7 @@ function waitSignal(object, signal) {
 | 
			
		||||
            cb();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    return callback => cb = callback;
 | 
			
		||||
    return callback => { cb = callback; };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function extractBootTimestamp() {
 | 
			
		||||
@@ -157,7 +157,7 @@ function *run() {
 | 
			
		||||
    Main.overview.hide();
 | 
			
		||||
 | 
			
		||||
    yield Scripting.createTestWindow({ maximized: true,
 | 
			
		||||
                                       redraws: true });
 | 
			
		||||
                                       redraws: true});
 | 
			
		||||
    yield Scripting.waitTestWindows();
 | 
			
		||||
 | 
			
		||||
    yield Scripting.sleep(1000);
 | 
			
		||||
@@ -269,11 +269,11 @@ function script_collectTimings(time) {
 | 
			
		||||
        if (len == 0)
 | 
			
		||||
            median = -1;
 | 
			
		||||
        else if (len % 2 == 1)
 | 
			
		||||
            median = times[(len - 1) / 2];
 | 
			
		||||
            median = times[(len - 1)/ 2];
 | 
			
		||||
        else
 | 
			
		||||
            median = Math.round((times[len / 2 - 1] + times[len / 2]) / 2);
 | 
			
		||||
 | 
			
		||||
        METRICS[`${timing}RedrawTime`].value = median;
 | 
			
		||||
        METRICS[timing + 'RedrawTime'].value = median;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -19,6 +19,7 @@ const PortalHelperSecurityLevel = {
 | 
			
		||||
    INSECURE: 2
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const INACTIVITY_TIMEOUT = 30000; //ms
 | 
			
		||||
const CONNECTIVITY_CHECK_HOST = 'nmcheck.gnome.org';
 | 
			
		||||
const CONNECTIVITY_CHECK_URI = 'http://' + CONNECTIVITY_CHECK_HOST;
 | 
			
		||||
const CONNECTIVITY_RECHECK_RATELIMIT_TIMEOUT = 30 * GLib.USEC_PER_SEC;
 | 
			
		||||
@@ -58,7 +59,7 @@ class PortalHeaderBar extends Gtk.HeaderBar {
 | 
			
		||||
                                             single_line_mode: true,
 | 
			
		||||
                                             ellipsize: Pango.EllipsizeMode.END,
 | 
			
		||||
                                             valign: Gtk.Align.BASELINE,
 | 
			
		||||
                                             selectable: true });
 | 
			
		||||
                                             selectable: true});
 | 
			
		||||
        this.subtitleLabel.get_style_context().add_class('subtitle');
 | 
			
		||||
        hbox.add(this.subtitleLabel);
 | 
			
		||||
 | 
			
		||||
@@ -264,7 +265,7 @@ class WebPortalHelper extends Gtk.Application {
 | 
			
		||||
        this._queue = [];
 | 
			
		||||
 | 
			
		||||
        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);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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 Dialog = imports.ui.dialog;
 | 
			
		||||
@@ -15,10 +15,9 @@ var DialogResponse = {
 | 
			
		||||
    CLOSED: 2
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var AccessDialog = GObject.registerClass(
 | 
			
		||||
class AccessDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
    _init(invocation, handle, title, subtitle, body, options) {
 | 
			
		||||
        super._init({ styleClass: 'access-dialog' });
 | 
			
		||||
var AccessDialog = class extends ModalDialog.ModalDialog {
 | 
			
		||||
    constructor(invocation, handle, title, subtitle, body, options) {
 | 
			
		||||
        super({ styleClass: 'access-dialog' });
 | 
			
		||||
 | 
			
		||||
        this._invocation = invocation;
 | 
			
		||||
        this._handle = handle;
 | 
			
		||||
@@ -69,7 +68,7 @@ class AccessDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
        this.addButton({ label: grantLabel,
 | 
			
		||||
                         action: () => {
 | 
			
		||||
                             this._sendResponse(DialogResponse.OK);
 | 
			
		||||
                         } });
 | 
			
		||||
                         }});
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    open() {
 | 
			
		||||
@@ -110,7 +109,7 @@ class AccessDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
        });
 | 
			
		||||
        this.close();
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var AccessDialogDBus = class {
 | 
			
		||||
    constructor() {
 | 
			
		||||
@@ -135,7 +134,7 @@ var AccessDialogDBus = class {
 | 
			
		||||
        let [handle, appId, parentWindow, title, subtitle, body, options] = params;
 | 
			
		||||
        // We probably want to use parentWindow and global.display.focus_window
 | 
			
		||||
        // 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,
 | 
			
		||||
                                            Gio.DBusError.ACCESS_DENIED,
 | 
			
		||||
                                            'Only the focused app is allowed to show a system access dialog');
 | 
			
		||||
@@ -146,7 +145,7 @@ var AccessDialogDBus = class {
 | 
			
		||||
                                      subtitle, body, options);
 | 
			
		||||
        dialog.open();
 | 
			
		||||
 | 
			
		||||
        dialog.connect('closed', () => this._accessDialog = null);
 | 
			
		||||
        dialog.connect('closed', () => { this._accessDialog = null; });
 | 
			
		||||
 | 
			
		||||
        this._accessDialog = dialog;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -36,7 +36,7 @@ function _createWindowClone(window, size) {
 | 
			
		||||
                               // usual hack for the usual bug in ClutterBinLayout...
 | 
			
		||||
                               x_expand: true,
 | 
			
		||||
                               y_expand: true });
 | 
			
		||||
}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
function getWindows(workspace) {
 | 
			
		||||
    // We ignore skip-taskbar windows in switchers, but if they are attached
 | 
			
		||||
@@ -395,7 +395,7 @@ class AppSwitcherPopup extends SwitcherPopup.SwitcherPopup {
 | 
			
		||||
                         { opacity: 255,
 | 
			
		||||
                           time: THUMBNAIL_FADE_TIME,
 | 
			
		||||
                           transition: 'easeOutQuad',
 | 
			
		||||
                           onComplete: () => this.thumbnailsVisible = true
 | 
			
		||||
                           onComplete: () => { this.thumbnailsVisible = true; }
 | 
			
		||||
                         });
 | 
			
		||||
 | 
			
		||||
        this._switcherList._items[this._selectedIndex].add_accessible_state (Atk.StateType.EXPANDED);
 | 
			
		||||
@@ -459,7 +459,7 @@ class CyclerHighlight {
 | 
			
		||||
    _onDestroy() {
 | 
			
		||||
        this.window = null;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// We don't show an actual popup, so just provide what SwitcherPopup
 | 
			
		||||
// expects instead of inheriting from SwitcherList
 | 
			
		||||
@@ -474,10 +474,12 @@ var CyclerList = GObject.registerClass({
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
var CyclerPopup = GObject.registerClass({
 | 
			
		||||
    GTypeFlags: GObject.TypeFlags.ABSTRACT
 | 
			
		||||
}, class CyclerPopup extends SwitcherPopup.SwitcherPopup {
 | 
			
		||||
var CyclerPopup = GObject.registerClass(
 | 
			
		||||
class CyclerPopup extends SwitcherPopup.SwitcherPopup {
 | 
			
		||||
    _init() {
 | 
			
		||||
        if (new.target === CyclerPopup)
 | 
			
		||||
            throw new TypeError('Cannot instantiate abstract class ' + new.target.name);
 | 
			
		||||
 | 
			
		||||
        super._init();
 | 
			
		||||
 | 
			
		||||
        this._items = this._getWindows();
 | 
			
		||||
@@ -663,6 +665,14 @@ class AppIcon extends St.BoxLayout {
 | 
			
		||||
    set_size(size) {
 | 
			
		||||
        this.icon = this.app.create_icon_texture(size);
 | 
			
		||||
        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() {
 | 
			
		||||
        let j = 0;
 | 
			
		||||
        while (this._items.length > 1 && this._items[j].style_class != 'item-box') {
 | 
			
		||||
            j++;
 | 
			
		||||
        while(this._items.length > 1 && this._items[j].style_class != 'item-box') {
 | 
			
		||||
                j++;
 | 
			
		||||
        }
 | 
			
		||||
        let themeNode = this._items[j].get_theme_node();
 | 
			
		||||
        this._list.ensure_style();
 | 
			
		||||
 | 
			
		||||
        let iconPadding = themeNode.get_horizontal_padding();
 | 
			
		||||
        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 iconSpacing = labelNaturalHeight + iconPadding + iconBorder;
 | 
			
		||||
        let [iconMinHeight, iconNaturalHeight] = this.icons[j].label.get_preferred_height(-1);
 | 
			
		||||
        let iconSpacing = iconNaturalHeight + iconPadding + iconBorder;
 | 
			
		||||
        let totalSpacing = this._list.spacing * (this._items.length - 1);
 | 
			
		||||
 | 
			
		||||
        // 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];
 | 
			
		||||
 | 
			
		||||
        if (this._items.length > 1) {
 | 
			
		||||
            for (let i =  0; i < baseIconSizes.length; i++) {
 | 
			
		||||
            for(let i =  0; i < baseIconSizes.length; i++) {
 | 
			
		||||
                iconSize = baseIconSizes[i];
 | 
			
		||||
                let height = iconSizes[i] + iconSpacing;
 | 
			
		||||
                let w = height * this._items.length + totalSpacing;
 | 
			
		||||
@@ -749,7 +758,7 @@ class AppSwitcher extends SwitcherPopup.SwitcherList {
 | 
			
		||||
 | 
			
		||||
        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)
 | 
			
		||||
                break;
 | 
			
		||||
            this.icons[i].set_size(iconSize);
 | 
			
		||||
@@ -795,9 +804,8 @@ class AppSwitcher extends SwitcherPopup.SwitcherList {
 | 
			
		||||
                                                            return GLib.SOURCE_REMOVE;
 | 
			
		||||
                                                        });
 | 
			
		||||
            GLib.Source.set_name_by_id(this._mouseTimeOutId, '[gnome-shell] this._enterItem');
 | 
			
		||||
        } else {
 | 
			
		||||
            this._itemEntered(index);
 | 
			
		||||
        }
 | 
			
		||||
        } else
 | 
			
		||||
           this._itemEntered(index);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _enterItem(index) {
 | 
			
		||||
@@ -842,8 +850,9 @@ class AppSwitcher extends SwitcherPopup.SwitcherList {
 | 
			
		||||
                this._removeIcon(app);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        let n = this._arrows.length;
 | 
			
		||||
        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._arrows.push(arrow);
 | 
			
		||||
 | 
			
		||||
@@ -984,23 +993,23 @@ class WindowIcon extends St.BoxLayout {
 | 
			
		||||
        let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
 | 
			
		||||
 | 
			
		||||
        switch (mode) {
 | 
			
		||||
        case AppIconMode.THUMBNAIL_ONLY:
 | 
			
		||||
            size = WINDOW_PREVIEW_SIZE;
 | 
			
		||||
            this._icon.add_actor(_createWindowClone(mutterWindow, size * scaleFactor));
 | 
			
		||||
            break;
 | 
			
		||||
            case AppIconMode.THUMBNAIL_ONLY:
 | 
			
		||||
                size = WINDOW_PREVIEW_SIZE;
 | 
			
		||||
                this._icon.add_actor(_createWindowClone(mutterWindow, size * scaleFactor));
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
        case AppIconMode.BOTH:
 | 
			
		||||
            size = WINDOW_PREVIEW_SIZE;
 | 
			
		||||
            this._icon.add_actor(_createWindowClone(mutterWindow, size * scaleFactor));
 | 
			
		||||
            case AppIconMode.BOTH:
 | 
			
		||||
                size = WINDOW_PREVIEW_SIZE;
 | 
			
		||||
                this._icon.add_actor(_createWindowClone(mutterWindow, size * scaleFactor));
 | 
			
		||||
 | 
			
		||||
            if (this.app)
 | 
			
		||||
                this._icon.add_actor(this._createAppIcon(this.app,
 | 
			
		||||
                                                         APP_ICON_SIZE_SMALL));
 | 
			
		||||
            break;
 | 
			
		||||
                if (this.app)
 | 
			
		||||
                    this._icon.add_actor(this._createAppIcon(this.app,
 | 
			
		||||
                                                             APP_ICON_SIZE_SMALL));
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
        case AppIconMode.APP_ICON_ONLY:
 | 
			
		||||
            size = APP_ICON_SIZE;
 | 
			
		||||
            this._icon.add_actor(this._createAppIcon(this.app, size));
 | 
			
		||||
            case AppIconMode.APP_ICON_ONLY:
 | 
			
		||||
                size = APP_ICON_SIZE;
 | 
			
		||||
                this._icon.add_actor(this._createAppIcon(this.app, size));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._icon.set_size(size * scaleFactor, size * scaleFactor);
 | 
			
		||||
@@ -1037,7 +1046,7 @@ class WindowList extends SwitcherPopup.SwitcherList {
 | 
			
		||||
            this.icons.push(icon);
 | 
			
		||||
 | 
			
		||||
            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;
 | 
			
		||||
        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.x2 = box.x2;
 | 
			
		||||
        childBox.y1 = box.y1;
 | 
			
		||||
 
 | 
			
		||||
@@ -62,11 +62,11 @@ var Animation = class {
 | 
			
		||||
        if (!validResourceScale)
 | 
			
		||||
            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;
 | 
			
		||||
        this._animations = textureCache.load_sliced_image(file, width, height,
 | 
			
		||||
                                                          scaleFactor, resourceScale,
 | 
			
		||||
                                                          this._animationsLoaded.bind(this));
 | 
			
		||||
        this._animations = texture_cache.load_sliced_image(file, width, height,
 | 
			
		||||
                                                           scaleFactor, resourceScale,
 | 
			
		||||
                                                           this._animationsLoaded.bind(this));
 | 
			
		||||
        this.actor.set_child(this._animations);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -123,7 +123,7 @@ var AnimatedIcon = class extends Animation {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
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');
 | 
			
		||||
        super(file, size);
 | 
			
		||||
 | 
			
		||||
@@ -162,7 +162,7 @@ var Spinner = class extends AnimatedIcon {
 | 
			
		||||
                time: SPINNER_ANIMATION_TIME,
 | 
			
		||||
                transition: 'linear',
 | 
			
		||||
                onComplete: () => {
 | 
			
		||||
                    super.stop();
 | 
			
		||||
                    this.stop(false);
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
        } else {
 | 
			
		||||
 
 | 
			
		||||
@@ -20,6 +20,7 @@ const SystemActions = imports.misc.systemActions;
 | 
			
		||||
 | 
			
		||||
const { loadInterfaceXML } = imports.misc.fileUtils;
 | 
			
		||||
 | 
			
		||||
var MAX_APPLICATION_WORK_MILLIS = 75;
 | 
			
		||||
var MENU_POPUP_TIMEOUT = 600;
 | 
			
		||||
var MAX_COLUMNS = 6;
 | 
			
		||||
var MIN_COLUMNS = 4;
 | 
			
		||||
@@ -33,9 +34,23 @@ var FOLDER_SUBICON_FRACTION = .4;
 | 
			
		||||
 | 
			
		||||
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_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;
 | 
			
		||||
 | 
			
		||||
const SWITCHEROO_BUS_NAME = 'net.hadess.SwitcherooControl';
 | 
			
		||||
@@ -54,7 +69,7 @@ function _getCategories(info) {
 | 
			
		||||
 | 
			
		||||
function _listsIntersect(a, b) {
 | 
			
		||||
    for (let itemA of a)
 | 
			
		||||
        if (b.includes(itemA))
 | 
			
		||||
        if (b.indexOf(itemA) >= 0)
 | 
			
		||||
            return true;
 | 
			
		||||
    return false;
 | 
			
		||||
}
 | 
			
		||||
@@ -69,7 +84,7 @@ function _getFolderName(folder) {
 | 
			
		||||
        try {
 | 
			
		||||
            keyfile.load_from_data_dirs(path, GLib.KeyFileFlags.NONE);
 | 
			
		||||
            name = keyfile.get_locale_string('Desktop Entry', 'Name', null);
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
            return name;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -83,8 +98,8 @@ function clamp(value, min, max) {
 | 
			
		||||
 | 
			
		||||
class BaseAppView {
 | 
			
		||||
    constructor(params, gridParams) {
 | 
			
		||||
        if (this.constructor === BaseAppView)
 | 
			
		||||
            throw new TypeError(`Cannot instantiate abstract class ${this.constructor.name}`);
 | 
			
		||||
        if (new.target === BaseAppView)
 | 
			
		||||
            throw new TypeError('Cannot instantiate abstract class ' + new.target.name);
 | 
			
		||||
 | 
			
		||||
        gridParams = Params.parse(gridParams, { xAlign: St.Align.MIDDLE,
 | 
			
		||||
                                                columnLimit: MAX_COLUMNS,
 | 
			
		||||
@@ -94,7 +109,7 @@ class BaseAppView {
 | 
			
		||||
                                                padWithSpacing: true });
 | 
			
		||||
        params = Params.parse(params, { usePagination: false });
 | 
			
		||||
 | 
			
		||||
        if (params.usePagination)
 | 
			
		||||
        if(params.usePagination)
 | 
			
		||||
            this._grid = new IconGrid.PaginatedIconGrid(gridParams);
 | 
			
		||||
        else
 | 
			
		||||
            this._grid = new IconGrid.IconGrid(gridParams);
 | 
			
		||||
@@ -143,7 +158,7 @@ class BaseAppView {
 | 
			
		||||
 | 
			
		||||
    loadGrid() {
 | 
			
		||||
        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');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -151,7 +166,7 @@ class BaseAppView {
 | 
			
		||||
        if (this._items[id])
 | 
			
		||||
            this._items[id].actor.navigate_focus(null, St.DirectionType.TAB_FORWARD, false);
 | 
			
		||||
        else
 | 
			
		||||
            log(`No such application ${id}`);
 | 
			
		||||
            log('No such application ' + id);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    selectApp(id) {
 | 
			
		||||
@@ -212,12 +227,12 @@ class BaseAppView {
 | 
			
		||||
        } else {
 | 
			
		||||
            params.opacity = 0;
 | 
			
		||||
            params.delay = 0;
 | 
			
		||||
            params.onComplete = () => this.actor.hide();
 | 
			
		||||
            params.onComplete = () => { this.actor.hide(); };
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Tweener.addTween(this._grid, params);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
};
 | 
			
		||||
Signals.addSignalMethods(BaseAppView.prototype);
 | 
			
		||||
 | 
			
		||||
var AllView = class AllView extends BaseAppView {
 | 
			
		||||
@@ -231,7 +246,7 @@ var AllView = class AllView extends BaseAppView {
 | 
			
		||||
                                               reactive: true,
 | 
			
		||||
                                               y_align: St.Align.START });
 | 
			
		||||
        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._scrollView.set_policy(St.PolicyType.NEVER,
 | 
			
		||||
@@ -285,7 +300,7 @@ var AllView = class AllView extends BaseAppView {
 | 
			
		||||
        this._availWidth = 0;
 | 
			
		||||
        this._availHeight = 0;
 | 
			
		||||
 | 
			
		||||
        Main.overview.connect('hidden', () => this.goToPage(0));
 | 
			
		||||
        Main.overview.connect('hidden', () => { this.goToPage(0); });
 | 
			
		||||
        this._grid.connect('space-opened', () => {
 | 
			
		||||
            let fadeEffect = this._scrollView.get_effect('fade');
 | 
			
		||||
            if (fadeEffect)
 | 
			
		||||
@@ -358,8 +373,8 @@ var AllView = class AllView extends BaseAppView {
 | 
			
		||||
    _loadApps() {
 | 
			
		||||
        this._appInfoList = Shell.AppSystem.get_default().get_installed().filter(appInfo => {
 | 
			
		||||
            try {
 | 
			
		||||
                (appInfo.get_id()); // catch invalid file encodings
 | 
			
		||||
            } catch (e) {
 | 
			
		||||
                let id = appInfo.get_id(); // catch invalid file encodings
 | 
			
		||||
            } catch(e) {
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
            return appInfo.should_show();
 | 
			
		||||
@@ -399,7 +414,7 @@ var AllView = class AllView extends BaseAppView {
 | 
			
		||||
        this._refilterApps();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Overridden from BaseAppView
 | 
			
		||||
    // Overriden from BaseAppView
 | 
			
		||||
    animate(animationDirection, onComplete) {
 | 
			
		||||
        this._scrollView.reactive = false;
 | 
			
		||||
        let completionFunc = () => {
 | 
			
		||||
@@ -432,7 +447,7 @@ var AllView = class AllView extends BaseAppView {
 | 
			
		||||
                               transition: 'easeOutQuad',
 | 
			
		||||
                               opacity: 0,
 | 
			
		||||
                               onComplete() {
 | 
			
		||||
                                   this.opacity = 255;
 | 
			
		||||
                                  this.opacity = 255;
 | 
			
		||||
                               } });
 | 
			
		||||
 | 
			
		||||
        if (animationDirection == IconGrid.AnimationDirection.OUT)
 | 
			
		||||
@@ -531,7 +546,7 @@ var AllView = class AllView extends BaseAppView {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _onPanEnd(action) {
 | 
			
		||||
        if (this._displayingPopup)
 | 
			
		||||
         if (this._displayingPopup)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        let pageHeight = this._grid.getPageHeight();
 | 
			
		||||
@@ -570,7 +585,7 @@ var AllView = class AllView extends BaseAppView {
 | 
			
		||||
            this._eventBlocker.reactive = isOpen;
 | 
			
		||||
            this._currentPopup = isOpen ? popup : null;
 | 
			
		||||
            this._updateIconOpacities(isOpen);
 | 
			
		||||
            if (!isOpen)
 | 
			
		||||
            if(!isOpen)
 | 
			
		||||
                this._closeSpaceForPopup();
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
@@ -617,9 +632,9 @@ var AllView = class AllView extends BaseAppView {
 | 
			
		||||
            this._scrollView.get_effect('fade').fade_edges = true;
 | 
			
		||||
 | 
			
		||||
        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, () => {
 | 
			
		||||
                this._adjustment.value = 0;
 | 
			
		||||
                this._grid.currentPage = 0;
 | 
			
		||||
                this._pageIndicators.setNPages(this._grid.nPages());
 | 
			
		||||
                this._pageIndicators.setCurrentPage(0);
 | 
			
		||||
            });
 | 
			
		||||
@@ -671,7 +686,7 @@ var FrequentView = class FrequentView extends BaseAppView {
 | 
			
		||||
        let mostUsed = this._usage.get_most_used();
 | 
			
		||||
        let hasUsefulData = this.hasUsefulData();
 | 
			
		||||
        this._noFrequentAppsLabel.visible = !hasUsefulData;
 | 
			
		||||
        if (!hasUsefulData)
 | 
			
		||||
        if(!hasUsefulData)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        // 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 maxNaturalWidth = 0;
 | 
			
		||||
        for (let child = container.get_first_child();
 | 
			
		||||
            child;
 | 
			
		||||
            child = child.get_next_sibling()) {
 | 
			
		||||
            let [minWidth, natWidth] = child.get_preferred_width(forHeight);
 | 
			
		||||
            maxMinWidth = Math.max(maxMinWidth, minWidth);
 | 
			
		||||
            maxNaturalWidth = Math.max(maxNaturalWidth, natWidth);
 | 
			
		||||
             child;
 | 
			
		||||
             child = child.get_next_sibling()) {
 | 
			
		||||
             let [minWidth, natWidth] = child.get_preferred_width(forHeight);
 | 
			
		||||
             maxMinWidth = Math.max(maxMinWidth, minWidth);
 | 
			
		||||
             maxNaturalWidth = Math.max(maxNaturalWidth, natWidth);
 | 
			
		||||
        }
 | 
			
		||||
        let childrenCount = container.get_n_children();
 | 
			
		||||
        let totalSpacing = this.spacing * (childrenCount - 1);
 | 
			
		||||
@@ -787,7 +802,7 @@ var AppDisplay = class AppDisplay {
 | 
			
		||||
            // shown next, so make sure to restore their opacity
 | 
			
		||||
            // when they are hidden
 | 
			
		||||
            if (this._controls.mapped)
 | 
			
		||||
                return;
 | 
			
		||||
              return;
 | 
			
		||||
 | 
			
		||||
            Tweener.removeTweens(this._controls);
 | 
			
		||||
            this._controls.opacity = 255;
 | 
			
		||||
@@ -852,14 +867,14 @@ var AppDisplay = class AppDisplay {
 | 
			
		||||
            this._controls.opacity = 0;
 | 
			
		||||
            finalOpacity = 255;
 | 
			
		||||
        } else {
 | 
			
		||||
            finalOpacity = 0;
 | 
			
		||||
            finalOpacity = 0
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Tweener.addTween(this._controls,
 | 
			
		||||
                         { time: IconGrid.ANIMATION_TIME_IN,
 | 
			
		||||
                           transition: 'easeInOutQuad',
 | 
			
		||||
                           opacity: finalOpacity,
 | 
			
		||||
                         });
 | 
			
		||||
                          });
 | 
			
		||||
 | 
			
		||||
        currentView.animate(animationDirection, onComplete);
 | 
			
		||||
    }
 | 
			
		||||
@@ -895,7 +910,7 @@ var AppDisplay = class AppDisplay {
 | 
			
		||||
 | 
			
		||||
    _onAllocatedSizeChanged(actor, width, height) {
 | 
			
		||||
        let box = new Clutter.ActorBox();
 | 
			
		||||
        box.x1 = box.y1 = 0;
 | 
			
		||||
        box.x1 = box.y1 =0;
 | 
			
		||||
        box.x2 = width;
 | 
			
		||||
        box.y2 = height;
 | 
			
		||||
        box = this._viewStack.get_theme_node().get_content_box(box);
 | 
			
		||||
@@ -926,7 +941,7 @@ var AppSearchProvider = class AppSearchProvider {
 | 
			
		||||
                             'name': app.get_name(),
 | 
			
		||||
                             'createIcon'(size) {
 | 
			
		||||
                                 return app.create_icon_texture(size);
 | 
			
		||||
                             }
 | 
			
		||||
                           }
 | 
			
		||||
                });
 | 
			
		||||
            } else {
 | 
			
		||||
                let name = this._systemActions.getName(id);
 | 
			
		||||
@@ -1002,7 +1017,7 @@ var FolderView = class FolderView extends BaseAppView {
 | 
			
		||||
        Util.ensureActorVisibleInScrollView(this.actor, actor);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Overridden from BaseAppView
 | 
			
		||||
    // Overriden from BaseAppView
 | 
			
		||||
    animate(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);
 | 
			
		||||
        // 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];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -1150,7 +1165,7 @@ var FolderIcon = class FolderIcon {
 | 
			
		||||
        let excludedApps = this._folder.get_strv('excluded-apps');
 | 
			
		||||
        let appSys = Shell.AppSystem.get_default();
 | 
			
		||||
        let addAppId = appId => {
 | 
			
		||||
            if (excludedApps.includes(appId))
 | 
			
		||||
            if (excludedApps.indexOf(appId) >= 0)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            let app = appSys.lookup_app(appId);
 | 
			
		||||
@@ -1251,7 +1266,7 @@ var FolderIcon = class FolderIcon {
 | 
			
		||||
    adaptToSize(width, height) {
 | 
			
		||||
        this._parentAvailableWidth = width;
 | 
			
		||||
        this._parentAvailableHeight = height;
 | 
			
		||||
        if (this._popup)
 | 
			
		||||
        if(this._popup)
 | 
			
		||||
            this.view.adaptToSize(width, height);
 | 
			
		||||
        this._popupInvalidated = true;
 | 
			
		||||
    }
 | 
			
		||||
@@ -1286,20 +1301,20 @@ var AppFolderPopup = class AppFolderPopup {
 | 
			
		||||
                                                       x_expand: true,
 | 
			
		||||
                                                       x_align: St.Align.START });
 | 
			
		||||
 | 
			
		||||
        this._boxPointer.style_class = 'app-folder-popup';
 | 
			
		||||
        this.actor.add_actor(this._boxPointer);
 | 
			
		||||
        this._boxPointer.actor.style_class = 'app-folder-popup';
 | 
			
		||||
        this.actor.add_actor(this._boxPointer.actor);
 | 
			
		||||
        this._boxPointer.bin.set_child(this._view.actor);
 | 
			
		||||
 | 
			
		||||
        this.closeButton = Util.makeCloseButton(this._boxPointer);
 | 
			
		||||
        this.closeButton.connect('clicked', this.popdown.bind(this));
 | 
			
		||||
        this.actor.add_actor(this.closeButton);
 | 
			
		||||
 | 
			
		||||
        this._boxPointer.bind_property('opacity', this.closeButton, 'opacity',
 | 
			
		||||
                                       GObject.BindingFlags.SYNC_CREATE);
 | 
			
		||||
        this._boxPointer.actor.bind_property('opacity', this.closeButton, 'opacity',
 | 
			
		||||
                                             GObject.BindingFlags.SYNC_CREATE);
 | 
			
		||||
 | 
			
		||||
        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, {
 | 
			
		||||
            actionMode: Shell.ActionMode.POPUP
 | 
			
		||||
        });
 | 
			
		||||
@@ -1331,22 +1346,22 @@ var AppFolderPopup = class AppFolderPopup {
 | 
			
		||||
        let direction;
 | 
			
		||||
        let isLtr = Clutter.get_default_text_direction() == Clutter.TextDirection.LTR;
 | 
			
		||||
        switch (event.get_key_symbol()) {
 | 
			
		||||
        case Clutter.Down:
 | 
			
		||||
            direction = St.DirectionType.TAB_FORWARD;
 | 
			
		||||
            break;
 | 
			
		||||
        case Clutter.Right:
 | 
			
		||||
            direction = isLtr ? St.DirectionType.TAB_FORWARD :
 | 
			
		||||
            case Clutter.Down:
 | 
			
		||||
                direction = St.DirectionType.TAB_FORWARD;
 | 
			
		||||
                break;
 | 
			
		||||
            case Clutter.Right:
 | 
			
		||||
                direction = isLtr ? St.DirectionType.TAB_FORWARD :
 | 
			
		||||
                                    St.DirectionType.TAB_BACKWARD;
 | 
			
		||||
            break;
 | 
			
		||||
        case Clutter.Up:
 | 
			
		||||
            direction = St.DirectionType.TAB_BACKWARD;
 | 
			
		||||
            break;
 | 
			
		||||
        case Clutter.Left:
 | 
			
		||||
            direction = isLtr ? St.DirectionType.TAB_BACKWARD :
 | 
			
		||||
                break;
 | 
			
		||||
            case Clutter.Up:
 | 
			
		||||
                direction = St.DirectionType.TAB_BACKWARD;
 | 
			
		||||
                break;
 | 
			
		||||
            case Clutter.Left:
 | 
			
		||||
                direction = isLtr ? St.DirectionType.TAB_BACKWARD :
 | 
			
		||||
                                    St.DirectionType.TAB_FORWARD;
 | 
			
		||||
            break;
 | 
			
		||||
        default:
 | 
			
		||||
            return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
                break;
 | 
			
		||||
            default:
 | 
			
		||||
                return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
        }
 | 
			
		||||
        return actor.navigate_focus(null, direction, false);
 | 
			
		||||
    }
 | 
			
		||||
@@ -1378,9 +1393,9 @@ var AppFolderPopup = class AppFolderPopup {
 | 
			
		||||
        this._boxPointer.open(BoxPointer.PopupAnimation.FADE |
 | 
			
		||||
                              BoxPointer.PopupAnimation.SLIDE,
 | 
			
		||||
                              () => {
 | 
			
		||||
                                  this._view.actor.opacity = 255;
 | 
			
		||||
                                  this._view.animate(IconGrid.AnimationDirection.IN);
 | 
			
		||||
                              });
 | 
			
		||||
                this._view.actor.opacity = 255;
 | 
			
		||||
                this._view.animate(IconGrid.AnimationDirection.IN);
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
        this.emit('open-state-changed', true);
 | 
			
		||||
    }
 | 
			
		||||
@@ -1464,7 +1479,7 @@ var AppIcon = class AppIcon {
 | 
			
		||||
        this.actor.connect('popup-menu', this._onKeyboardPopupMenu.bind(this));
 | 
			
		||||
 | 
			
		||||
        this._menu = null;
 | 
			
		||||
        this._menuManager = new PopupMenu.PopupMenuManager(this.actor);
 | 
			
		||||
        this._menuManager = new PopupMenu.PopupMenuManager(this);
 | 
			
		||||
 | 
			
		||||
        if (isDraggable) {
 | 
			
		||||
            this._draggable = DND.makeDraggable(this.actor);
 | 
			
		||||
@@ -1476,7 +1491,7 @@ var AppIcon = class AppIcon {
 | 
			
		||||
                Main.overview.cancelledItemDrag(this);
 | 
			
		||||
            });
 | 
			
		||||
            this._draggable.connect('drag-end', () => {
 | 
			
		||||
                Main.overview.endItemDrag(this);
 | 
			
		||||
               Main.overview.endItemDrag(this);
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -1692,20 +1707,25 @@ var AppIconMenu = class AppIconMenu extends PopupMenu.PopupMenu {
 | 
			
		||||
            w => !w.skip_taskbar
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        if (windows.length > 0)
 | 
			
		||||
            this.addMenuItem(
 | 
			
		||||
                /* Translators: This is the heading of a list of open windows */
 | 
			
		||||
                new PopupMenu.PopupSeparatorMenuItem(_("Open Windows"))
 | 
			
		||||
            );
 | 
			
		||||
        // Display the app windows menu items and the separator between windows
 | 
			
		||||
        // of the current desktop and other windows.
 | 
			
		||||
        let workspaceManager = global.workspace_manager;
 | 
			
		||||
        let activeWorkspace = workspaceManager.get_active_workspace();
 | 
			
		||||
        let separatorShown = windows.length > 0 && windows[0].get_workspace() != activeWorkspace;
 | 
			
		||||
 | 
			
		||||
        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
 | 
			
		||||
                                     : this._source.app.get_name();
 | 
			
		||||
            let item = this._appendMenuItem(title);
 | 
			
		||||
            item.connect('activate', () => {
 | 
			
		||||
                this.emit('activate-window', window);
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (!this._source.app.is_window_backed()) {
 | 
			
		||||
            this._appendSeparator();
 | 
			
		||||
@@ -1713,7 +1733,7 @@ var AppIconMenu = class AppIconMenu extends PopupMenu.PopupMenu {
 | 
			
		||||
            let appInfo = this._source.app.get_app_info();
 | 
			
		||||
            let actions = appInfo.list_actions();
 | 
			
		||||
            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.connect('activate', () => {
 | 
			
		||||
                    if (this._source.app.state == Shell.AppState.STOPPED)
 | 
			
		||||
@@ -1727,7 +1747,7 @@ var AppIconMenu = class AppIconMenu extends PopupMenu.PopupMenu {
 | 
			
		||||
 | 
			
		||||
            if (discreteGpuAvailable &&
 | 
			
		||||
                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.connect('activate', () => {
 | 
			
		||||
                    if (this._source.app.state == Shell.AppState.STOPPED)
 | 
			
		||||
 
 | 
			
		||||
@@ -63,7 +63,7 @@ class AppFavorites {
 | 
			
		||||
    constructor() {
 | 
			
		||||
        this.FAVORITE_APPS_KEY = 'favorite-apps';
 | 
			
		||||
        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();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -187,7 +187,7 @@ class AppFavorites {
 | 
			
		||||
                                   }
 | 
			
		||||
                                 });
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
};
 | 
			
		||||
Signals.addSignalMethods(AppFavorites.prototype);
 | 
			
		||||
 | 
			
		||||
var appFavoritesInstance = null;
 | 
			
		||||
 
 | 
			
		||||
@@ -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 ModalDialog = imports.ui.modalDialog;
 | 
			
		||||
@@ -13,11 +13,10 @@ var AudioDevice = {
 | 
			
		||||
 | 
			
		||||
const AudioDeviceSelectionIface = loadInterfaceXML('org.gnome.Shell.AudioDeviceSelection');
 | 
			
		||||
 | 
			
		||||
var AudioDeviceSelectionDialog = GObject.registerClass({
 | 
			
		||||
    Signals: { 'device-selected': { param_types: [GObject.TYPE_UINT] } }
 | 
			
		||||
}, class AudioDeviceSelectionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
    _init(devices) {
 | 
			
		||||
        super._init({ styleClass: 'audio-device-selection-dialog' });
 | 
			
		||||
var AudioDeviceSelectionDialog =
 | 
			
		||||
class AudioDeviceSelectionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
    constructor(devices) {
 | 
			
		||||
        super({ styleClass: 'audio-device-selection-dialog' });
 | 
			
		||||
 | 
			
		||||
        this._deviceItems = {};
 | 
			
		||||
 | 
			
		||||
@@ -34,6 +33,10 @@ var AudioDeviceSelectionDialog = GObject.registerClass({
 | 
			
		||||
            throw new Error('Too few devices for a selection');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    destroy() {
 | 
			
		||||
        super.destroy();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _buildLayout(devices) {
 | 
			
		||||
        let title = new St.Label({ style_class: 'audio-selection-title',
 | 
			
		||||
                                   text: _("Select Audio Device"),
 | 
			
		||||
@@ -54,28 +57,28 @@ var AudioDeviceSelectionDialog = GObject.registerClass({
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _getDeviceLabel(device) {
 | 
			
		||||
        switch (device) {
 | 
			
		||||
        case AudioDevice.HEADPHONES:
 | 
			
		||||
            return _("Headphones");
 | 
			
		||||
        case AudioDevice.HEADSET:
 | 
			
		||||
            return _("Headset");
 | 
			
		||||
        case AudioDevice.MICROPHONE:
 | 
			
		||||
            return _("Microphone");
 | 
			
		||||
        default:
 | 
			
		||||
            return null;
 | 
			
		||||
        switch(device) {
 | 
			
		||||
            case AudioDevice.HEADPHONES:
 | 
			
		||||
                return _("Headphones");
 | 
			
		||||
            case AudioDevice.HEADSET:
 | 
			
		||||
                return _("Headset");
 | 
			
		||||
            case AudioDevice.MICROPHONE:
 | 
			
		||||
                return _("Microphone");
 | 
			
		||||
            default:
 | 
			
		||||
                return null;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _getDeviceIcon(device) {
 | 
			
		||||
        switch (device) {
 | 
			
		||||
        case AudioDevice.HEADPHONES:
 | 
			
		||||
            return 'audio-headphones-symbolic';
 | 
			
		||||
        case AudioDevice.HEADSET:
 | 
			
		||||
            return 'audio-headset-symbolic';
 | 
			
		||||
        case AudioDevice.MICROPHONE:
 | 
			
		||||
            return 'audio-input-microphone-symbolic';
 | 
			
		||||
        default:
 | 
			
		||||
            return null;
 | 
			
		||||
        switch(device) {
 | 
			
		||||
            case AudioDevice.HEADPHONES:
 | 
			
		||||
                return 'audio-headphones-symbolic';
 | 
			
		||||
            case AudioDevice.HEADSET:
 | 
			
		||||
                return 'audio-headset-symbolic';
 | 
			
		||||
            case AudioDevice.MICROPHONE:
 | 
			
		||||
                return 'audio-input-microphone-symbolic';
 | 
			
		||||
            default:
 | 
			
		||||
                return null;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -110,11 +113,11 @@ var AudioDeviceSelectionDialog = GObject.registerClass({
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _openSettings() {
 | 
			
		||||
        let desktopFile = 'gnome-sound-panel.desktop';
 | 
			
		||||
        let desktopFile = 'gnome-sound-panel.desktop'
 | 
			
		||||
        let app = Shell.AppSystem.get_default().lookup_app(desktopFile);
 | 
			
		||||
 | 
			
		||||
        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;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -122,7 +125,7 @@ var AudioDeviceSelectionDialog = GObject.registerClass({
 | 
			
		||||
        Main.overview.hide();
 | 
			
		||||
        app.activate();
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var AudioDeviceSelectionDBus = class AudioDeviceSelectionDBus {
 | 
			
		||||
    constructor() {
 | 
			
		||||
@@ -159,12 +162,12 @@ var AudioDeviceSelectionDBus = class AudioDeviceSelectionDBus {
 | 
			
		||||
 | 
			
		||||
        let [deviceNames] = params;
 | 
			
		||||
        let devices = 0;
 | 
			
		||||
        deviceNames.forEach(n => devices |= AudioDevice[n.toUpperCase()]);
 | 
			
		||||
        deviceNames.forEach(n => { devices |= AudioDevice[n.toUpperCase()]; });
 | 
			
		||||
 | 
			
		||||
        let dialog;
 | 
			
		||||
        try {
 | 
			
		||||
            dialog = new AudioDeviceSelectionDialog(devices);
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
            invocation.return_value(null);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -108,6 +108,7 @@ const PRIMARY_COLOR_KEY = 'primary-color';
 | 
			
		||||
const SECONDARY_COLOR_KEY = 'secondary-color';
 | 
			
		||||
const COLOR_SHADING_TYPE_KEY = 'color-shading-type';
 | 
			
		||||
const BACKGROUND_STYLE_KEY = 'picture-options';
 | 
			
		||||
const PICTURE_OPACITY_KEY = 'picture-opacity';
 | 
			
		||||
const PICTURE_URI_KEY = 'picture-uri';
 | 
			
		||||
 | 
			
		||||
var FADE_ANIMATION_TIME = 1.0;
 | 
			
		||||
@@ -256,15 +257,14 @@ var Background = class Background {
 | 
			
		||||
                this._refreshAnimation();
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
        this._settingsChangedSignalId =
 | 
			
		||||
            this._settings.connect('changed', this._emitChangedSignal.bind(this));
 | 
			
		||||
        this._settingsChangedSignalId = this._settings.connect('changed', () => {
 | 
			
		||||
            this.emit('changed');
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        this._load();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    destroy() {
 | 
			
		||||
        this.background = null;
 | 
			
		||||
 | 
			
		||||
        this._cancellable.cancel();
 | 
			
		||||
        this._removeAnimationTimeout();
 | 
			
		||||
 | 
			
		||||
@@ -288,22 +288,6 @@ var Background = class Background {
 | 
			
		||||
        if (this._settingsChangedSignalId != 0)
 | 
			
		||||
            this._settings.disconnect(this._settingsChangedSignalId);
 | 
			
		||||
        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() {
 | 
			
		||||
@@ -359,7 +343,7 @@ var Background = class Background {
 | 
			
		||||
                                               if (changedFile.equal(file)) {
 | 
			
		||||
                                                   let imageCache = Meta.BackgroundImageCache.get_default();
 | 
			
		||||
                                                   imageCache.purge(changedFile);
 | 
			
		||||
                                                   this._emitChangedSignal();
 | 
			
		||||
                                                   this.emit('changed');
 | 
			
		||||
                                               }
 | 
			
		||||
                                           });
 | 
			
		||||
        this._fileWatches[key] = signalId;
 | 
			
		||||
@@ -432,12 +416,12 @@ var Background = class Background {
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        this._updateAnimationTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT,
 | 
			
		||||
                                                          interval,
 | 
			
		||||
                                                          () => {
 | 
			
		||||
                                                              this._updateAnimationTimeoutId = 0;
 | 
			
		||||
                                                              this._updateAnimation();
 | 
			
		||||
                                                              return GLib.SOURCE_REMOVE;
 | 
			
		||||
                                                          });
 | 
			
		||||
                                                      interval,
 | 
			
		||||
                                                      () => {
 | 
			
		||||
                                                          this._updateAnimationTimeoutId = 0;
 | 
			
		||||
                                                          this._updateAnimation();
 | 
			
		||||
                                                          return GLib.SOURCE_REMOVE;
 | 
			
		||||
                                                      });
 | 
			
		||||
        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 image = cache.load(file);
 | 
			
		||||
        if (image.is_loaded()) {
 | 
			
		||||
        if (image.is_loaded())
 | 
			
		||||
            this._setLoaded();
 | 
			
		||||
        } else {
 | 
			
		||||
        else {
 | 
			
		||||
            let id = image.connect('loaded', () => {
 | 
			
		||||
                this._setLoaded();
 | 
			
		||||
                image.disconnect(id);
 | 
			
		||||
@@ -715,6 +699,7 @@ var BackgroundManager = class BackgroundManager {
 | 
			
		||||
                           time: FADE_ANIMATION_TIME,
 | 
			
		||||
                           transition: 'easeOutQuad',
 | 
			
		||||
                           onComplete() {
 | 
			
		||||
                               oldBackgroundActor.background.run_dispose();
 | 
			
		||||
                               oldBackgroundActor.destroy();
 | 
			
		||||
                           }
 | 
			
		||||
                         });
 | 
			
		||||
 
 | 
			
		||||
@@ -25,7 +25,7 @@ var BackgroundMenu = class BackgroundMenu extends PopupMenu.PopupMenu {
 | 
			
		||||
function addBackgroundMenu(actor, layoutManager) {
 | 
			
		||||
    actor.reactive = true;
 | 
			
		||||
    actor._backgroundMenu = new BackgroundMenu(layoutManager);
 | 
			
		||||
    actor._backgroundManager = new PopupMenu.PopupMenuManager(actor);
 | 
			
		||||
    actor._backgroundManager = new PopupMenu.PopupMenuManager({ actor: actor });
 | 
			
		||||
    actor._backgroundManager.addMenu(actor._backgroundMenu);
 | 
			
		||||
 | 
			
		||||
    function openMenu(x, y) {
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,7 @@ var BarLevel = class {
 | 
			
		||||
        this._barLevelWidth = 0;
 | 
			
		||||
 | 
			
		||||
        if (params == undefined)
 | 
			
		||||
            params = {};
 | 
			
		||||
            params = {}
 | 
			
		||||
 | 
			
		||||
        this.actor = new St.DrawingArea({ styleClass: params['styleClass'] || 'barlevel',
 | 
			
		||||
                                          can_focus: params['canFocus'] || false,
 | 
			
		||||
@@ -105,7 +105,7 @@ var BarLevel = class {
 | 
			
		||||
            overdriveSeparatorWidth = themeNode.get_length('-barlevel-overdrive-separator-width');
 | 
			
		||||
 | 
			
		||||
        /* 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(width - barLevelBorderRadius - barLevelBorderWidth, (height - barLevelHeight) / 2);
 | 
			
		||||
@@ -117,12 +117,11 @@ var BarLevel = class {
 | 
			
		||||
 | 
			
		||||
        /* normal progress bar */
 | 
			
		||||
        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(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();
 | 
			
		||||
        Clutter.cairo_set_source_color(cr, barLevelActiveBorderColor);
 | 
			
		||||
        cr.setLineWidth(barLevelBorderWidth);
 | 
			
		||||
@@ -144,19 +143,17 @@ var BarLevel = class {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /* end progress bar arc */
 | 
			
		||||
        if (this._value > 0) {
 | 
			
		||||
            if (this._value <= this._overdriveStart)
 | 
			
		||||
                Clutter.cairo_set_source_color(cr, barLevelActiveColor);
 | 
			
		||||
            else
 | 
			
		||||
                Clutter.cairo_set_source_color(cr, barLevelOverdriveColor);
 | 
			
		||||
            cr.arc(endX, height / 2, barLevelBorderRadius, TAU * (3 / 4), TAU * (1 / 4));
 | 
			
		||||
            cr.lineTo(Math.floor(endX), (height + barLevelHeight) / 2);
 | 
			
		||||
            cr.lineTo(Math.floor(endX), (height - barLevelHeight) / 2);
 | 
			
		||||
            cr.lineTo(endX, (height - barLevelHeight) / 2);
 | 
			
		||||
            cr.fillPreserve();
 | 
			
		||||
            cr.setLineWidth(barLevelBorderWidth);
 | 
			
		||||
            cr.stroke();
 | 
			
		||||
        }
 | 
			
		||||
        if (this._value <= this._overdriveStart)
 | 
			
		||||
            Clutter.cairo_set_source_color(cr, barLevelActiveColor);
 | 
			
		||||
        else
 | 
			
		||||
            Clutter.cairo_set_source_color(cr, barLevelOverdriveColor);
 | 
			
		||||
        cr.arc(endX, height / 2, barLevelBorderRadius, TAU * 3 / 4, TAU * 1 / 4);
 | 
			
		||||
        cr.lineTo(Math.floor(endX), (height + barLevelHeight) / 2);
 | 
			
		||||
        cr.lineTo(Math.floor(endX), (height - barLevelHeight) / 2);
 | 
			
		||||
        cr.lineTo(endX, (height - barLevelHeight) / 2);
 | 
			
		||||
        cr.fillPreserve();
 | 
			
		||||
        cr.setLineWidth(barLevelBorderWidth);
 | 
			
		||||
        cr.stroke();
 | 
			
		||||
 | 
			
		||||
        /* draw overdrive separator */
 | 
			
		||||
        if (overdriveActive) {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
// -*- 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 Tweener = imports.ui.tweener;
 | 
			
		||||
@@ -33,6 +33,8 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
    _init(arrowSide, binProperties) {
 | 
			
		||||
        super._init();
 | 
			
		||||
 | 
			
		||||
        this.actor = this;
 | 
			
		||||
 | 
			
		||||
        this.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS);
 | 
			
		||||
 | 
			
		||||
        this._arrowSide = arrowSide;
 | 
			
		||||
@@ -48,15 +50,6 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
        this._sourceAlignment = 0.5;
 | 
			
		||||
        this._capturedEventId = 0;
 | 
			
		||||
        this._muteInput();
 | 
			
		||||
 | 
			
		||||
        this.connect('destroy', this._onDestroy.bind(this));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _onDestroy() {
 | 
			
		||||
        if (this._sourceActorDestroyId) {
 | 
			
		||||
            this._sourceActor.disconnect(this._sourceActorDestroyId);
 | 
			
		||||
            delete this._sourceActorDestroyId;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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) {
 | 
			
		||||
        let themeNode = this.get_theme_node();
 | 
			
		||||
        let rise = themeNode.get_length('-arrow-rise');
 | 
			
		||||
@@ -90,18 +113,18 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
 | 
			
		||||
        if (animate & PopupAnimation.SLIDE) {
 | 
			
		||||
            switch (this._arrowSide) {
 | 
			
		||||
            case St.Side.TOP:
 | 
			
		||||
                this.translation_y = -rise;
 | 
			
		||||
                break;
 | 
			
		||||
            case St.Side.BOTTOM:
 | 
			
		||||
                this.translation_y = rise;
 | 
			
		||||
                break;
 | 
			
		||||
            case St.Side.LEFT:
 | 
			
		||||
                this.translation_x = -rise;
 | 
			
		||||
                break;
 | 
			
		||||
            case St.Side.RIGHT:
 | 
			
		||||
                this.translation_x = rise;
 | 
			
		||||
                break;
 | 
			
		||||
                case St.Side.TOP:
 | 
			
		||||
                    this.translation_y = -rise;
 | 
			
		||||
                    break;
 | 
			
		||||
                case St.Side.BOTTOM:
 | 
			
		||||
                    this.translation_y = rise;
 | 
			
		||||
                    break;
 | 
			
		||||
                case St.Side.LEFT:
 | 
			
		||||
                    this.translation_x = -rise;
 | 
			
		||||
                    break;
 | 
			
		||||
                case St.Side.RIGHT:
 | 
			
		||||
                    this.translation_x = rise;
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -130,18 +153,18 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
 | 
			
		||||
        if (animate & PopupAnimation.SLIDE) {
 | 
			
		||||
            switch (this._arrowSide) {
 | 
			
		||||
            case St.Side.TOP:
 | 
			
		||||
                translationY = rise;
 | 
			
		||||
                break;
 | 
			
		||||
            case St.Side.BOTTOM:
 | 
			
		||||
                translationY = -rise;
 | 
			
		||||
                break;
 | 
			
		||||
            case St.Side.LEFT:
 | 
			
		||||
                translationX = rise;
 | 
			
		||||
                break;
 | 
			
		||||
            case St.Side.RIGHT:
 | 
			
		||||
                translationX = -rise;
 | 
			
		||||
                break;
 | 
			
		||||
                case St.Side.TOP:
 | 
			
		||||
                    translationY = rise;
 | 
			
		||||
                    break;
 | 
			
		||||
                case St.Side.BOTTOM:
 | 
			
		||||
                    translationY = -rise;
 | 
			
		||||
                    break;
 | 
			
		||||
                case St.Side.LEFT:
 | 
			
		||||
                    translationX = rise;
 | 
			
		||||
                    break;
 | 
			
		||||
                case St.Side.RIGHT:
 | 
			
		||||
                    translationX = -rise;
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -204,10 +227,13 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
        this.set_allocation(box, flags);
 | 
			
		||||
 | 
			
		||||
        let themeNode = this.get_theme_node();
 | 
			
		||||
        box = themeNode.get_content_box(box);
 | 
			
		||||
 | 
			
		||||
        let borderWidth = themeNode.get_length('-arrow-border-width');
 | 
			
		||||
        let rise = themeNode.get_length('-arrow-rise');
 | 
			
		||||
        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.y1 = 0;
 | 
			
		||||
@@ -220,25 +246,24 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
        childBox.x2 = availWidth - borderWidth;
 | 
			
		||||
        childBox.y2 = availHeight - borderWidth;
 | 
			
		||||
        switch (this._arrowSide) {
 | 
			
		||||
        case St.Side.TOP:
 | 
			
		||||
            childBox.y1 += rise;
 | 
			
		||||
            break;
 | 
			
		||||
        case St.Side.BOTTOM:
 | 
			
		||||
            childBox.y2 -= rise;
 | 
			
		||||
            break;
 | 
			
		||||
        case St.Side.LEFT:
 | 
			
		||||
            childBox.x1 += rise;
 | 
			
		||||
            break;
 | 
			
		||||
        case St.Side.RIGHT:
 | 
			
		||||
            childBox.x2 -= rise;
 | 
			
		||||
            break;
 | 
			
		||||
            case St.Side.TOP:
 | 
			
		||||
                childBox.y1 += rise;
 | 
			
		||||
                break;
 | 
			
		||||
            case St.Side.BOTTOM:
 | 
			
		||||
                childBox.y2 -= rise;
 | 
			
		||||
                break;
 | 
			
		||||
            case St.Side.LEFT:
 | 
			
		||||
                childBox.x1 += rise;
 | 
			
		||||
                break;
 | 
			
		||||
            case St.Side.RIGHT:
 | 
			
		||||
                childBox.x2 -= rise;
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
        this.bin.allocate(childBox, flags);
 | 
			
		||||
 | 
			
		||||
        if (this._sourceActor && this._sourceActor.mapped) {
 | 
			
		||||
            this._reposition(box);
 | 
			
		||||
            this._updateFlip(box);
 | 
			
		||||
            this.set_allocation(box, flags);
 | 
			
		||||
            this._reposition();
 | 
			
		||||
            this._updateFlip();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -264,7 +289,7 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
        let borderRadius = themeNode.get_length('-arrow-border-radius');
 | 
			
		||||
 | 
			
		||||
        let halfBorder = borderWidth / 2;
 | 
			
		||||
        let halfBase = Math.floor(base / 2);
 | 
			
		||||
        let halfBase = Math.floor(base/2);
 | 
			
		||||
 | 
			
		||||
        let backgroundColor = themeNode.get_color('-arrow-background-color');
 | 
			
		||||
 | 
			
		||||
@@ -345,7 +370,7 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
        if (!skipTopRight) {
 | 
			
		||||
            cr.lineTo(x2 - borderRadius, y1);
 | 
			
		||||
            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) {
 | 
			
		||||
@@ -366,7 +391,7 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
        if (!skipBottomRight) {
 | 
			
		||||
            cr.lineTo(x2, y2 - borderRadius);
 | 
			
		||||
            cr.arc(x2 - borderRadius, y2 - borderRadius, borderRadius,
 | 
			
		||||
                   0, Math.PI / 2);
 | 
			
		||||
                   0, Math.PI/2);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (this._arrowSide == St.Side.BOTTOM && rise) {
 | 
			
		||||
@@ -387,7 +412,7 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
        if (!skipBottomLeft) {
 | 
			
		||||
            cr.lineTo(x1 + borderRadius, y2);
 | 
			
		||||
            cr.arc(x1 + borderRadius, y2 - borderRadius, borderRadius,
 | 
			
		||||
                   Math.PI / 2, Math.PI);
 | 
			
		||||
                   Math.PI/2, Math.PI);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (this._arrowSide == St.Side.LEFT && rise) {
 | 
			
		||||
@@ -396,7 +421,7 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
                cr.lineTo(x1 - rise, y1);
 | 
			
		||||
                cr.lineTo(x1 + borderRadius, y1);
 | 
			
		||||
            } else if (skipBottomLeft) {
 | 
			
		||||
                cr.lineTo(x1 - rise, y2);
 | 
			
		||||
                cr.lineTo(x1 - rise, y2)
 | 
			
		||||
                cr.lineTo(x1 - rise, y2 - halfBase);
 | 
			
		||||
            } else {
 | 
			
		||||
                cr.lineTo(x1, this._arrowOrigin + halfBase);
 | 
			
		||||
@@ -408,7 +433,7 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
        if (!skipTopLeft) {
 | 
			
		||||
            cr.lineTo(x1, y1 + 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);
 | 
			
		||||
@@ -425,25 +450,15 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    setPosition(sourceActor, alignment) {
 | 
			
		||||
        if (!this._sourceActor || sourceActor != this._sourceActor) {
 | 
			
		||||
            if (this._sourceActorDestroyId) {
 | 
			
		||||
                this._sourceActor.disconnect(this._sourceActorDestroyId);
 | 
			
		||||
                delete this._sourceActorDestroyId;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            this._sourceActor = sourceActor;
 | 
			
		||||
 | 
			
		||||
            if (this._sourceActor) {
 | 
			
		||||
                this._sourceActorDestroyId = this._sourceActor.connect('destroy', () => {
 | 
			
		||||
                    this._sourceActor = null;
 | 
			
		||||
                    delete this._sourceActorDestroyId;
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        // We need to show it now to force an allocation,
 | 
			
		||||
        // so that we can query the correct size.
 | 
			
		||||
        this.show();
 | 
			
		||||
 | 
			
		||||
        this._sourceActor = sourceActor;
 | 
			
		||||
        this._arrowAlignment = alignment;
 | 
			
		||||
 | 
			
		||||
        this.queue_relayout();
 | 
			
		||||
        this._reposition();
 | 
			
		||||
        this._updateFlip();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    setSourceAlignment(alignment) {
 | 
			
		||||
@@ -455,7 +470,7 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
        this.setPosition(this._sourceActor, this._arrowAlignment);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _reposition(allocationBox) {
 | 
			
		||||
    _reposition() {
 | 
			
		||||
        let sourceActor = this._sourceActor;
 | 
			
		||||
        let alignment = this._arrowAlignment;
 | 
			
		||||
        let monitorIndex = Main.layoutManager.findIndexForActor(sourceActor);
 | 
			
		||||
@@ -513,7 +528,7 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
        //     of the box to maintain the arrow's accuracy.
 | 
			
		||||
 | 
			
		||||
        let arrowOrigin;
 | 
			
		||||
        let halfBase = Math.floor(arrowBase / 2);
 | 
			
		||||
        let halfBase = Math.floor(arrowBase/2);
 | 
			
		||||
        let halfBorder = borderWidth / 2;
 | 
			
		||||
        let halfMargin = margin / 2;
 | 
			
		||||
        let [x1, y1] = [halfBorder, halfBorder];
 | 
			
		||||
@@ -569,7 +584,8 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 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
 | 
			
		||||
@@ -623,11 +639,15 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
        return arrowSide;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _updateFlip(allocationBox) {
 | 
			
		||||
    _updateFlip() {
 | 
			
		||||
        let arrowSide = this._calculateArrowSide(this._userArrowSide);
 | 
			
		||||
        if (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');
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -17,7 +17,7 @@ var ELLIPSIS_CHAR = '\u2026';
 | 
			
		||||
 | 
			
		||||
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) {
 | 
			
		||||
    return (dateA.getYear() == dateB.getYear());
 | 
			
		||||
@@ -38,7 +38,7 @@ function isToday(date) {
 | 
			
		||||
function _isWorkDay(date) {
 | 
			
		||||
    /* 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");
 | 
			
		||||
    return !days.includes(date.getDay().toString());
 | 
			
		||||
    return days.indexOf(date.getDay().toString()) == -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function _getBeginningOfDay(date) {
 | 
			
		||||
@@ -143,7 +143,8 @@ function _datesEqual(a, b) {
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function _dateIntervalsOverlap(a0, a1, b0, b1) {
 | 
			
		||||
function _dateIntervalsOverlap(a0, a1, b0, b1)
 | 
			
		||||
{
 | 
			
		||||
    if (a1 <= b0)
 | 
			
		||||
        return false;
 | 
			
		||||
    else if (b1 <= a0)
 | 
			
		||||
@@ -167,7 +168,7 @@ var DBusEventSource = class DBusEventSource {
 | 
			
		||||
            try {
 | 
			
		||||
                this._dbusProxy.init_finish(result);
 | 
			
		||||
                loaded = true;
 | 
			
		||||
            } catch (e) {
 | 
			
		||||
            } catch(e) {
 | 
			
		||||
                if (e.matches(Gio.DBusError, Gio.DBusError.TIMED_OUT)) {
 | 
			
		||||
                    // Ignore timeouts and install signals as normal, because with high
 | 
			
		||||
                    // 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
 | 
			
		||||
                    // to read it)
 | 
			
		||||
                } else {
 | 
			
		||||
                    log(`Error loading calendars: ${e.message}`);
 | 
			
		||||
                    log('Error loading calendars: ' + e.message);
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
@@ -262,7 +263,7 @@ var DBusEventSource = class DBusEventSource {
 | 
			
		||||
        if (!this._initialized)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        if (this._curRequestBegin && this._curRequestEnd) {
 | 
			
		||||
        if (this._curRequestBegin && this._curRequestEnd){
 | 
			
		||||
            this._dbusProxy.GetEventsRemote(this._curRequestBegin.getTime() / 1000,
 | 
			
		||||
                                            this._curRequestEnd.getTime() / 1000,
 | 
			
		||||
                                            forceReload,
 | 
			
		||||
@@ -284,7 +285,7 @@ var DBusEventSource = class DBusEventSource {
 | 
			
		||||
 | 
			
		||||
    getEvents(begin, end) {
 | 
			
		||||
        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];
 | 
			
		||||
 | 
			
		||||
            if (_dateIntervalsOverlap (event.date, event.end, begin, end)) {
 | 
			
		||||
@@ -319,7 +320,7 @@ var Calendar = class Calendar {
 | 
			
		||||
        this._weekStart = Shell.util_get_week_start();
 | 
			
		||||
        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);
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
@@ -401,8 +402,8 @@ var Calendar = class Calendar {
 | 
			
		||||
        this._topBox.add(this._backButton);
 | 
			
		||||
        this._backButton.connect('clicked', this._onPrevMonthButtonClicked.bind(this));
 | 
			
		||||
 | 
			
		||||
        this._monthLabel = new St.Label({ style_class: 'calendar-month-label',
 | 
			
		||||
                                          can_focus: true });
 | 
			
		||||
        this._monthLabel = new St.Label({style_class: 'calendar-month-label',
 | 
			
		||||
                                         can_focus: true });
 | 
			
		||||
        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',
 | 
			
		||||
@@ -465,7 +466,8 @@ var Calendar = class Calendar {
 | 
			
		||||
                let day = 32 - new Date(newDate.getFullYear() - 1, 11, 32).getDate();
 | 
			
		||||
                newDate = new Date(newDate.getFullYear() - 1, 11, day);
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            newDate.setMonth(oldMonth - 1);
 | 
			
		||||
            if (newDate.getMonth() != oldMonth - 1) {
 | 
			
		||||
                let day = 32 - new Date(newDate.getFullYear(), oldMonth - 1, 32).getDate();
 | 
			
		||||
@@ -488,7 +490,8 @@ var Calendar = class Calendar {
 | 
			
		||||
                let day = 32 - new Date(newDate.getFullYear() + 1, 0, 32).getDate();
 | 
			
		||||
                newDate = new Date(newDate.getFullYear() + 1, 0, day);
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            newDate.setMonth(oldMonth + 1);
 | 
			
		||||
            if (newDate.getMonth() != oldMonth + 1) {
 | 
			
		||||
                let day = 32 - new Date(newDate.getFullYear(), oldMonth + 1, 32).getDate();
 | 
			
		||||
@@ -543,6 +546,8 @@ var Calendar = class Calendar {
 | 
			
		||||
        this._calendarBegin = new Date(beginDate);
 | 
			
		||||
        this._markedAsToday = now;
 | 
			
		||||
 | 
			
		||||
        let year = beginDate.getYear();
 | 
			
		||||
 | 
			
		||||
        let daysToWeekStart = (7 + beginDate.getDay() - this._weekStart) % 7;
 | 
			
		||||
        let startsOnWeekStart = daysToWeekStart == 0;
 | 
			
		||||
        let weekPadding = startsOnWeekStart ? 7 : 0;
 | 
			
		||||
@@ -554,7 +559,7 @@ var Calendar = class Calendar {
 | 
			
		||||
        let row = 2;
 | 
			
		||||
        // nRows here means 6 weeks + one header + one navbar
 | 
			
		||||
        let nRows = 8;
 | 
			
		||||
        while (row < nRows) {
 | 
			
		||||
        while (row < 8) {
 | 
			
		||||
            // xgettext:no-javascript-format
 | 
			
		||||
            let button = new St.Button({ label: iter.toLocaleFormat(C_("date day number format", "%d")),
 | 
			
		||||
                                         can_focus: true });
 | 
			
		||||
@@ -580,12 +585,12 @@ var Calendar = class Calendar {
 | 
			
		||||
 | 
			
		||||
            // Hack used in lieu of border-collapse - see gnome-shell.css
 | 
			
		||||
            if (row == 2)
 | 
			
		||||
                styleClass = `calendar-day-top ${styleClass}`;
 | 
			
		||||
                styleClass = 'calendar-day-top ' + styleClass;
 | 
			
		||||
 | 
			
		||||
            let leftMost = rtl ? iter.getDay() == (this._weekStart + 6) % 7
 | 
			
		||||
                               : iter.getDay() == this._weekStart;
 | 
			
		||||
            if (leftMost)
 | 
			
		||||
                styleClass = `calendar-day-left ${styleClass}`;
 | 
			
		||||
                styleClass = 'calendar-day-left ' + styleClass;
 | 
			
		||||
 | 
			
		||||
            if (sameDay(now, iter))
 | 
			
		||||
                styleClass += ' calendar-today';
 | 
			
		||||
@@ -643,9 +648,9 @@ var Calendar = class Calendar {
 | 
			
		||||
                button.add_style_pseudo_class('selected');
 | 
			
		||||
                if (this._shouldDateGrabFocus)
 | 
			
		||||
                    button.grab_key_focus();
 | 
			
		||||
            } else {
 | 
			
		||||
                button.remove_style_pseudo_class('selected');
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
                button.remove_style_pseudo_class('selected');
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
@@ -1072,7 +1077,7 @@ var CalendarMessageList = class CalendarMessageList {
 | 
			
		||||
        this._clearButton.set_x_align(Clutter.ActorAlign.END);
 | 
			
		||||
        this._clearButton.connect('clicked', () => {
 | 
			
		||||
            let sections = [...this._sections.keys()];
 | 
			
		||||
            sections.forEach((s) => s.clear());
 | 
			
		||||
            sections.forEach((s) => { s.clear(); });
 | 
			
		||||
        });
 | 
			
		||||
        box.add_actor(this._clearButton);
 | 
			
		||||
 | 
			
		||||
@@ -1098,7 +1103,7 @@ var CalendarMessageList = class CalendarMessageList {
 | 
			
		||||
    _addSection(section) {
 | 
			
		||||
        let obj = {
 | 
			
		||||
            destroyId: 0,
 | 
			
		||||
            visibleId: 0,
 | 
			
		||||
            visibleId:  0,
 | 
			
		||||
            emptyChangedId: 0,
 | 
			
		||||
            canClearChangedId: 0,
 | 
			
		||||
            keyFocusId: 0
 | 
			
		||||
 
 | 
			
		||||
@@ -6,12 +6,12 @@ const Dialog = imports.ui.dialog;
 | 
			
		||||
const Main = imports.ui.main;
 | 
			
		||||
const Tweener = imports.ui.tweener;
 | 
			
		||||
 | 
			
		||||
var FROZEN_WINDOW_BRIGHTNESS = -0.3;
 | 
			
		||||
var DIALOG_TRANSITION_TIME = 0.15;
 | 
			
		||||
var FROZEN_WINDOW_BRIGHTNESS = -0.3
 | 
			
		||||
var DIALOG_TRANSITION_TIME = 0.15
 | 
			
		||||
var ALIVE_TIMEOUT = 5000;
 | 
			
		||||
 | 
			
		||||
var CloseDialog = GObject.registerClass({
 | 
			
		||||
    Implements: [Meta.CloseDialog],
 | 
			
		||||
    Implements: [ Meta.CloseDialog ],
 | 
			
		||||
    Properties: {
 | 
			
		||||
        'window': GObject.ParamSpec.override('window', Meta.CloseDialog)
 | 
			
		||||
    },
 | 
			
		||||
@@ -56,12 +56,12 @@ var CloseDialog = GObject.registerClass({
 | 
			
		||||
        this._dialog.height = windowActor.height;
 | 
			
		||||
 | 
			
		||||
        this._dialog.addContent(this._createDialogContent());
 | 
			
		||||
        this._dialog.addButton({ label: _('Force Quit'),
 | 
			
		||||
                                 action: this._onClose.bind(this),
 | 
			
		||||
        this._dialog.addButton({ label:   _('Force Quit'),
 | 
			
		||||
                                 action:  this._onClose.bind(this),
 | 
			
		||||
                                 default: true });
 | 
			
		||||
        this._dialog.addButton({ label: _('Wait'),
 | 
			
		||||
        this._dialog.addButton({ label:  _('Wait'),
 | 
			
		||||
                                 action: this._onWait.bind(this),
 | 
			
		||||
                                 key: Clutter.Escape });
 | 
			
		||||
                                 key:    Clutter.Escape });
 | 
			
		||||
 | 
			
		||||
        global.focus_manager.add_group(this._dialog);
 | 
			
		||||
    }
 | 
			
		||||
@@ -165,7 +165,7 @@ var CloseDialog = GObject.registerClass({
 | 
			
		||||
        GLib.source_remove(this._timeoutId);
 | 
			
		||||
        this._timeoutId = 0;
 | 
			
		||||
 | 
			
		||||
        global.display.disconnect(this._windowFocusChangedId);
 | 
			
		||||
        global.display.disconnect(this._windowFocusChangedId)
 | 
			
		||||
        this._windowFocusChangedId = 0;
 | 
			
		||||
 | 
			
		||||
        global.stage.disconnect(this._keyFocusChangedId);
 | 
			
		||||
 
 | 
			
		||||
@@ -13,13 +13,13 @@ var ComponentManager = class {
 | 
			
		||||
        let newEnabledComponents = Main.sessionMode.components;
 | 
			
		||||
 | 
			
		||||
        newEnabledComponents.filter(
 | 
			
		||||
            name => !this._enabledComponents.includes(name)
 | 
			
		||||
            name => this._enabledComponents.indexOf(name) == -1
 | 
			
		||||
        ).forEach(name => {
 | 
			
		||||
            this._enableComponent(name);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        this._enabledComponents.filter(
 | 
			
		||||
            name => !newEnabledComponents.includes(name)
 | 
			
		||||
            name => newEnabledComponents.indexOf(name) == -1
 | 
			
		||||
        ).forEach(name => {
 | 
			
		||||
            this._disableComponent(name);
 | 
			
		||||
        });
 | 
			
		||||
@@ -37,8 +37,8 @@ var ComponentManager = class {
 | 
			
		||||
        if (component)
 | 
			
		||||
            return component;
 | 
			
		||||
 | 
			
		||||
        if (Main.sessionMode.isLocked)
 | 
			
		||||
            return null;
 | 
			
		||||
	if (Main.sessionMode.isLocked)
 | 
			
		||||
	    return null;
 | 
			
		||||
 | 
			
		||||
        let constructor = this._importComponent(name);
 | 
			
		||||
        component = new constructor();
 | 
			
		||||
@@ -48,7 +48,7 @@ var ComponentManager = class {
 | 
			
		||||
 | 
			
		||||
    _enableComponent(name) {
 | 
			
		||||
        let component = this._ensureComponent(name);
 | 
			
		||||
        if (component)
 | 
			
		||||
	if (component)
 | 
			
		||||
            component.enable();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,6 @@ const Mainloop = imports.mainloop;
 | 
			
		||||
const Params = imports.misc.params;
 | 
			
		||||
 | 
			
		||||
const GnomeSession = imports.misc.gnomeSession;
 | 
			
		||||
const Main = imports.ui.main;
 | 
			
		||||
const ShellMountOperation = imports.ui.shellMountOperation;
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
        // mount operation object
 | 
			
		||||
        if (drive.can_stop()) {
 | 
			
		||||
            drive.stop(Gio.MountUnmountFlags.FORCE, null, null,
 | 
			
		||||
                (drive, res) => {
 | 
			
		||||
                    try {
 | 
			
		||||
                        drive.stop_finish(res);
 | 
			
		||||
                    } catch (e) {
 | 
			
		||||
                        log(`Unable to stop the drive after drive-eject-button ${e.toString()}`);
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
            drive.stop
 | 
			
		||||
                (Gio.MountUnmountFlags.FORCE, null, null,
 | 
			
		||||
                 (drive, res) => {
 | 
			
		||||
                     try {
 | 
			
		||||
                         drive.stop_finish(res);
 | 
			
		||||
                     } catch (e) {
 | 
			
		||||
                         log("Unable to stop the drive after drive-eject-button " + e.toString());
 | 
			
		||||
                     }
 | 
			
		||||
                 });
 | 
			
		||||
        } else if (drive.can_eject()) {
 | 
			
		||||
            drive.eject_with_operation(Gio.MountUnmountFlags.FORCE, null, null,
 | 
			
		||||
                (drive, res) => {
 | 
			
		||||
                    try {
 | 
			
		||||
                        drive.eject_with_operation_finish(res);
 | 
			
		||||
                    } catch (e) {
 | 
			
		||||
                        log(`Unable to eject the drive after drive-eject-button ${e.toString()}`);
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
            drive.eject_with_operation 
 | 
			
		||||
                (Gio.MountUnmountFlags.FORCE, null, null,
 | 
			
		||||
                 (drive, res) => {
 | 
			
		||||
                     try {
 | 
			
		||||
                         drive.eject_with_operation_finish(res);
 | 
			
		||||
                     } 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.
 | 
			
		||||
            if (e.message.includes('No key available with this passphrase') || // cryptsetup
 | 
			
		||||
                e.message.includes('No key available to unlock device') ||     // udisks (no password)
 | 
			
		||||
                // libblockdev wrong password opening LUKS device
 | 
			
		||||
                e.message.includes('Failed to activate device: Incorrect passphrase') ||
 | 
			
		||||
                // cryptsetup returns EINVAL in many cases, including wrong TCRYPT password/parameters
 | 
			
		||||
                e.message.includes('Failed to load device\'s parameters: Invalid argument')) {
 | 
			
		||||
 | 
			
		||||
                e.message.includes('Error unlocking')) {                       // udisks (wrong password)
 | 
			
		||||
                this._reaskPassword(volume);
 | 
			
		||||
            } 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))
 | 
			
		||||
                    log(`Unable to mount volume ${volume.get_name()}: ${e.toString()}`);
 | 
			
		||||
                    log('Unable to mount volume ' + volume.get_name() + ': ' + e.toString());
 | 
			
		||||
 | 
			
		||||
                this._closeOperation(volume);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -40,7 +40,7 @@ function isMountRootHidden(root) {
 | 
			
		||||
    let path = root.get_path();
 | 
			
		||||
 | 
			
		||||
    // skip any mounts in hidden directory hierarchies
 | 
			
		||||
    return (path.includes('/.'));
 | 
			
		||||
    return (path.indexOf('/.') != -1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function isMountNonLocal(mount) {
 | 
			
		||||
@@ -65,7 +65,8 @@ function startAppForMount(app, mount) {
 | 
			
		||||
        retval = app.launch(files, 
 | 
			
		||||
                            global.create_app_launch_context(0, -1));
 | 
			
		||||
    } 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;
 | 
			
		||||
@@ -106,7 +107,8 @@ var ContentTypeDiscoverer = class {
 | 
			
		||||
        try {
 | 
			
		||||
            contentTypes = mount.guess_content_type_finish(res);
 | 
			
		||||
        } 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) {
 | 
			
		||||
@@ -190,15 +192,15 @@ var AutorunDispatcher = class {
 | 
			
		||||
 | 
			
		||||
    _getAutorunSettingForType(contentType) {
 | 
			
		||||
        let runApp = this._settings.get_strv(SETTING_START_APP);
 | 
			
		||||
        if (runApp.includes(contentType))
 | 
			
		||||
        if (runApp.indexOf(contentType) != -1)
 | 
			
		||||
            return AutorunSetting.RUN;
 | 
			
		||||
 | 
			
		||||
        let ignore = this._settings.get_strv(SETTING_IGNORE);
 | 
			
		||||
        if (ignore.includes(contentType))
 | 
			
		||||
        if (ignore.indexOf(contentType) != -1)
 | 
			
		||||
            return AutorunSetting.IGNORE;
 | 
			
		||||
 | 
			
		||||
        let openFiles = this._settings.get_strv(SETTING_OPEN_FOLDER);
 | 
			
		||||
        if (openFiles.includes(contentType))
 | 
			
		||||
        if (openFiles.indexOf(contentType) != -1)
 | 
			
		||||
            return AutorunSetting.FILES;
 | 
			
		||||
 | 
			
		||||
        return AutorunSetting.ASK;
 | 
			
		||||
 
 | 
			
		||||
@@ -10,10 +10,9 @@ const CheckBox = imports.ui.checkBox;
 | 
			
		||||
 | 
			
		||||
var WORK_SPINNER_ICON_SIZE = 16;
 | 
			
		||||
 | 
			
		||||
var KeyringDialog = GObject.registerClass(
 | 
			
		||||
class KeyringDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
    _init() {
 | 
			
		||||
        super._init({ styleClass: 'prompt-dialog' });
 | 
			
		||||
var KeyringDialog = class extends ModalDialog.ModalDialog {
 | 
			
		||||
    constructor() {
 | 
			
		||||
        super({ styleClass: 'prompt-dialog' });
 | 
			
		||||
 | 
			
		||||
        this.prompt = new Shell.KeyringPrompt();
 | 
			
		||||
        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.contentLayout.add(this._content);
 | 
			
		||||
 | 
			
		||||
        // FIXME: Why does this break now?
 | 
			
		||||
        /*
 | 
			
		||||
        this.prompt.bind_property('message', this._content, 'title', GObject.BindingFlags.SYNC_CREATE);
 | 
			
		||||
        this.prompt.bind_property('description', this._content, 'body', GObject.BindingFlags.SYNC_CREATE);
 | 
			
		||||
        */
 | 
			
		||||
        this.prompt.connect('notify::message', () => {
 | 
			
		||||
            this._content.title = this.prompt.message;
 | 
			
		||||
        });
 | 
			
		||||
        this._content.title = this.prompt.message;
 | 
			
		||||
 | 
			
		||||
        this.prompt.connect('notify::description', () => {
 | 
			
		||||
            this._content.body = this.prompt.description;
 | 
			
		||||
        });
 | 
			
		||||
        this._content.body = this.prompt.description;
 | 
			
		||||
 | 
			
		||||
        this._workSpinner = null;
 | 
			
		||||
        this._controlTable = null;
 | 
			
		||||
@@ -162,7 +173,7 @@ class KeyringDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
        // NOTE: ModalDialog.open() is safe to call if the dialog is
 | 
			
		||||
        // already open - it just returns true without side-effects
 | 
			
		||||
        if (this.open())
 | 
			
		||||
            return true;
 | 
			
		||||
          return true;
 | 
			
		||||
 | 
			
		||||
        // 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.' +
 | 
			
		||||
            ' Dismissing prompt request');
 | 
			
		||||
        this.prompt.cancel();
 | 
			
		||||
        this.prompt.cancel()
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -213,7 +224,7 @@ class KeyringDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
    _onCancelButton() {
 | 
			
		||||
        this.prompt.cancel();
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var KeyringDummyDialog = class {
 | 
			
		||||
    constructor() {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
// -*- 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 Config = imports.misc.config;
 | 
			
		||||
@@ -12,10 +12,9 @@ const ShellEntry = imports.ui.shellEntry;
 | 
			
		||||
 | 
			
		||||
const VPN_UI_GROUP = 'VPN Plugin UI';
 | 
			
		||||
 | 
			
		||||
var NetworkSecretDialog = GObject.registerClass(
 | 
			
		||||
class NetworkSecretDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
    _init(agent, requestId, connection, settingName, hints, flags, contentOverride) {
 | 
			
		||||
        super._init({ styleClass: 'prompt-dialog' });
 | 
			
		||||
var NetworkSecretDialog = class extends ModalDialog.ModalDialog {
 | 
			
		||||
    constructor(agent, requestId, connection, settingName, hints, flags, contentOverride) {
 | 
			
		||||
        super({ styleClass: 'prompt-dialog' });
 | 
			
		||||
 | 
			
		||||
        this._agent = agent;
 | 
			
		||||
        this._requestId = requestId;
 | 
			
		||||
@@ -80,9 +79,8 @@ class NetworkSecretDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
                        secret.valid = secret.value.length > 0;
 | 
			
		||||
                    this._updateOkButton();
 | 
			
		||||
                });
 | 
			
		||||
            } else {
 | 
			
		||||
            } else
 | 
			
		||||
                secret.valid = true;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (rtl) {
 | 
			
		||||
                layout.attach(secret.entry, 0, pos, 1, 1);
 | 
			
		||||
@@ -106,19 +104,19 @@ class NetworkSecretDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
            descriptionLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
 | 
			
		||||
 | 
			
		||||
            contentBox.messageBox.add(descriptionLabel,
 | 
			
		||||
                                      { y_fill: true,
 | 
			
		||||
                                      { y_fill:  true,
 | 
			
		||||
                                        y_align: St.Align.START,
 | 
			
		||||
                                        expand: true });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._okButton = { label: _("Connect"),
 | 
			
		||||
        this._okButton = { label:  _("Connect"),
 | 
			
		||||
                           action: this._onOk.bind(this),
 | 
			
		||||
                           default: true
 | 
			
		||||
                         };
 | 
			
		||||
 | 
			
		||||
        this.setButtons([{ label: _("Cancel"),
 | 
			
		||||
                           action: this.cancel.bind(this),
 | 
			
		||||
                           key: Clutter.KEY_Escape,
 | 
			
		||||
                           key:    Clutter.KEY_Escape,
 | 
			
		||||
                         },
 | 
			
		||||
                         this._okButton]);
 | 
			
		||||
 | 
			
		||||
@@ -177,25 +175,24 @@ class NetworkSecretDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
        let value = secret.value;
 | 
			
		||||
        if (secret.wep_key_type == NM.WepKeyType.KEY) {
 | 
			
		||||
            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')
 | 
			
		||||
                          || (value[i] >= 'A' && value[i] <= 'F')
 | 
			
		||||
                          || (value[i] >= '0' && value[i] <= '9')))
 | 
			
		||||
                        return false;
 | 
			
		||||
                }
 | 
			
		||||
            } else if (value.length == 5 || value.length == 13) {
 | 
			
		||||
                for (let i = 0; i < value.length; i++) {
 | 
			
		||||
		}
 | 
			
		||||
	    } else if (value.length == 5 || value.length == 13) {
 | 
			
		||||
		for (let i = 0; i < value.length; i++) {
 | 
			
		||||
                    if (!((value[i] >= 'a' && value[i] <= 'z')
 | 
			
		||||
                          || (value[i] >= 'A' && value[i] <= 'Z')))
 | 
			
		||||
                        return false;
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
            } else
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
        } else if (secret.wep_key_type == NM.WepKeyType.PASSPHRASE) {
 | 
			
		||||
            if (value.length < 0 || value.length > 64)
 | 
			
		||||
                return false;
 | 
			
		||||
        }
 | 
			
		||||
	} else if (secret.wep_key_type == NM.WepKeyType.PASSPHRASE) {
 | 
			
		||||
	    if (value.length < 0 || value.length > 64)
 | 
			
		||||
	        return false;
 | 
			
		||||
	}
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -216,7 +213,7 @@ class NetworkSecretDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
                           validate: this._validateWpaPsk, password: true });
 | 
			
		||||
            break;
 | 
			
		||||
        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) || '',
 | 
			
		||||
                           wep_key_type: wirelessSecuritySetting.wep_key_type,
 | 
			
		||||
                           validate: this._validateStaticWep, password: true });
 | 
			
		||||
@@ -232,12 +229,13 @@ class NetworkSecretDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
            this._get8021xSecrets(secrets);
 | 
			
		||||
            break;
 | 
			
		||||
        default:
 | 
			
		||||
            log(`Invalid wireless key management: ${wirelessSecuritySetting.key_mgmt}`);
 | 
			
		||||
            log('Invalid wireless key management: ' + wirelessSecuritySetting.key_mgmt);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _get8021xSecrets(secrets) {
 | 
			
		||||
        let ieee8021xSetting = this._connection.get_setting_802_1x();
 | 
			
		||||
        let phase2method;
 | 
			
		||||
 | 
			
		||||
        /* If hints were given we know exactly what we need to ask */
 | 
			
		||||
        if (this._settingName == "802-1x" && this._hints.length) {
 | 
			
		||||
@@ -274,7 +272,7 @@ class NetworkSecretDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
                           value: ieee8021xSetting.private_key_password || '', password: true });
 | 
			
		||||
            break;
 | 
			
		||||
        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 content = { };
 | 
			
		||||
        content.secrets = [];
 | 
			
		||||
        content.secrets = [ ];
 | 
			
		||||
 | 
			
		||||
        switch (connectionType) {
 | 
			
		||||
        case '802-11-wireless':
 | 
			
		||||
@@ -328,7 +326,7 @@ class NetworkSecretDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
            this._getPPPoESecrets(content.secrets);
 | 
			
		||||
            break;
 | 
			
		||||
        case 'gsm':
 | 
			
		||||
            if (this._hints.includes('pin')) {
 | 
			
		||||
            if (this._hints.indexOf('pin') != -1) {
 | 
			
		||||
                let gsmSetting = this._connection.get_setting_gsm();
 | 
			
		||||
                content.title = _("PIN code required");
 | 
			
		||||
                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);
 | 
			
		||||
            break;
 | 
			
		||||
        default:
 | 
			
		||||
            log(`Invalid connection type: ${connectionType}`);
 | 
			
		||||
        }
 | 
			
		||||
            log('Invalid connection type: ' + connectionType);
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        return content;
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var VPNRequestHandler = class {
 | 
			
		||||
    constructor(agent, requestId, authHelper, serviceType, connection, hints, flags) {
 | 
			
		||||
@@ -360,15 +358,16 @@ var VPNRequestHandler = class {
 | 
			
		||||
        this._pluginOutBuffer = [];
 | 
			
		||||
        this._title = null;
 | 
			
		||||
        this._description = null;
 | 
			
		||||
        this._content = [];
 | 
			
		||||
        this._content = [ ];
 | 
			
		||||
        this._shellDialog = null;
 | 
			
		||||
 | 
			
		||||
        let connectionSetting = connection.get_setting_connection();
 | 
			
		||||
 | 
			
		||||
        let argv = [authHelper.fileName,
 | 
			
		||||
                    '-u', connectionSetting.uuid,
 | 
			
		||||
                    '-n', connectionSetting.id,
 | 
			
		||||
                    '-s', serviceType];
 | 
			
		||||
        let argv = [ authHelper.fileName,
 | 
			
		||||
                     '-u', connectionSetting.uuid,
 | 
			
		||||
                     '-n', connectionSetting.id,
 | 
			
		||||
                     '-s', serviceType
 | 
			
		||||
                   ];
 | 
			
		||||
        if (authHelper.externalUIMode)
 | 
			
		||||
            argv.push('--external-ui-mode');
 | 
			
		||||
        if (flags & NM.SecretAgentGetSecretsFlags.ALLOW_INTERACTION)
 | 
			
		||||
@@ -407,7 +406,7 @@ var VPNRequestHandler = class {
 | 
			
		||||
                                                    this._vpnChildFinished.bind(this));
 | 
			
		||||
 | 
			
		||||
            this._writeConnection();
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
            logError(e, 'error while spawning VPN auth helper');
 | 
			
		||||
 | 
			
		||||
            this._agent.respond(requestId, Shell.NetworkAgentResponse.INTERNAL_ERROR);
 | 
			
		||||
@@ -424,7 +423,7 @@ var VPNRequestHandler = class {
 | 
			
		||||
        } else {
 | 
			
		||||
            try {
 | 
			
		||||
                this._stdin.write('QUIT\n\n', null);
 | 
			
		||||
            } catch (e) { /* ignore broken pipe errors */ }
 | 
			
		||||
            } catch(e) { /* ignore broken pipe errors */ }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this.destroy();
 | 
			
		||||
@@ -459,9 +458,8 @@ var VPNRequestHandler = class {
 | 
			
		||||
                this._agent.respond(this._requestId, Shell.NetworkAgentResponse.USER_CANCELED);
 | 
			
		||||
            else
 | 
			
		||||
                this._agent.respond(this._requestId, Shell.NetworkAgentResponse.CONFIRMED);
 | 
			
		||||
        } else {
 | 
			
		||||
        } else
 | 
			
		||||
            this._agent.respond(this._requestId, Shell.NetworkAgentResponse.INTERNAL_ERROR);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this.destroy();
 | 
			
		||||
    }
 | 
			
		||||
@@ -474,7 +472,7 @@ var VPNRequestHandler = class {
 | 
			
		||||
            if (line == '' && this._previousLine == '') {
 | 
			
		||||
                try {
 | 
			
		||||
                    this._stdin.write('QUIT\n\n', null);
 | 
			
		||||
                } catch (e) { /* ignore broken pipe errors */ }
 | 
			
		||||
                } catch(e) { /* ignore broken pipe errors */ }
 | 
			
		||||
            } else {
 | 
			
		||||
                this._agent.set_password(this._requestId, this._previousLine, line);
 | 
			
		||||
                this._previousLine = undefined;
 | 
			
		||||
@@ -562,7 +560,7 @@ var VPNRequestHandler = class {
 | 
			
		||||
                    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"
 | 
			
		||||
            if (data.length > 0) {
 | 
			
		||||
                logError(e, 'error while reading VPN plugin output keyfile');
 | 
			
		||||
@@ -588,15 +586,15 @@ var VPNRequestHandler = class {
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            vpnSetting.foreach_data_item((key, value) => {
 | 
			
		||||
                this._stdin.write(`DATA_KEY=${key}\n`, null);
 | 
			
		||||
                this._stdin.write(`DATA_VAL=${value || ''}\n\n`, null);
 | 
			
		||||
                this._stdin.write('DATA_KEY=' + key + '\n', null);
 | 
			
		||||
                this._stdin.write('DATA_VAL=' + (value || '') + '\n\n', null);
 | 
			
		||||
            });
 | 
			
		||||
            vpnSetting.foreach_secret((key, value) => {
 | 
			
		||||
                this._stdin.write(`SECRET_KEY=${key}\n`, null);
 | 
			
		||||
                this._stdin.write(`SECRET_VAL=${value || ''}\n\n`, null);
 | 
			
		||||
                this._stdin.write('SECRET_KEY=' + key + '\n', null);
 | 
			
		||||
                this._stdin.write('SECRET_VAL=' + (value || '') + '\n\n', null);
 | 
			
		||||
            });
 | 
			
		||||
            this._stdin.write('DONE\n\n', null);
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
            logError(e, 'internal error while writing connection to helper');
 | 
			
		||||
 | 
			
		||||
            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);
 | 
			
		||||
        try {
 | 
			
		||||
            let monitor = this._pluginDir.monitor(Gio.FileMonitorFlags.NONE, null);
 | 
			
		||||
            monitor.connect('changed', () => this._vpnCacheBuilt = false);
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
            log(`Failed to create monitor for VPN plugin dir: ${e.message}`);
 | 
			
		||||
            monitor.connect('changed', () => { this._vpnCacheBuilt = false; });
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
            log('Failed to create monitor for VPN plugin dir: ' + e.message);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._native.connect('new-request', this._newRequest.bind(this));
 | 
			
		||||
@@ -633,7 +631,7 @@ var NetworkAgent = class {
 | 
			
		||||
            try {
 | 
			
		||||
                this._native.init_finish(res);
 | 
			
		||||
                this._initialized = true;
 | 
			
		||||
            } catch (e) {
 | 
			
		||||
            } catch(e) {
 | 
			
		||||
                this._native = null;
 | 
			
		||||
                logError(e, 'error initializing the NetworkManager Agent');
 | 
			
		||||
            }
 | 
			
		||||
@@ -681,13 +679,12 @@ var NetworkAgent = class {
 | 
			
		||||
        let connectionSetting = connection.get_setting_connection();
 | 
			
		||||
        let connectionType = connectionSetting.get_connection_type();
 | 
			
		||||
        switch (connectionType) {
 | 
			
		||||
        case '802-11-wireless': {
 | 
			
		||||
        case '802-11-wireless':
 | 
			
		||||
            let wirelessSetting = connection.get_setting_wireless();
 | 
			
		||||
            let ssid = NM.utils_ssid_to_utf8(wirelessSetting.get_ssid().get_data());
 | 
			
		||||
            title = _("Authentication required by wireless network");
 | 
			
		||||
            body = _("Passwords or encryption keys are required to access the wireless network “%s”.").format(ssid);
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        case '802-3-ethernet':
 | 
			
		||||
            title = _("Wired 802.1X authentication");
 | 
			
		||||
            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()));
 | 
			
		||||
            break;
 | 
			
		||||
        case 'gsm':
 | 
			
		||||
            if (hints.includes('pin')) {
 | 
			
		||||
            if (hints.indexOf('pin') != -1) {
 | 
			
		||||
                let gsmSetting = connection.get_setting_gsm();
 | 
			
		||||
                title = _("PIN code required");
 | 
			
		||||
                body = _("PIN code is needed for the mobile broadband device");
 | 
			
		||||
                break;
 | 
			
		||||
@@ -709,7 +707,7 @@ var NetworkAgent = class {
 | 
			
		||||
            body = _("A password is required to connect to “%s”.").format(connectionSetting.get_id());
 | 
			
		||||
            break;
 | 
			
		||||
        default:
 | 
			
		||||
            log(`Invalid connection type: ${connectionType}`);
 | 
			
		||||
            log('Invalid connection type: ' + connectionType);
 | 
			
		||||
            this._native.respond(requestId, Shell.NetworkAgentResponse.INTERNAL_ERROR);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,8 @@
 | 
			
		||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 | 
			
		||||
 | 
			
		||||
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 Dialog = imports.ui.dialog;
 | 
			
		||||
@@ -14,11 +15,9 @@ var DIALOG_ICON_SIZE = 48;
 | 
			
		||||
 | 
			
		||||
var WORK_SPINNER_ICON_SIZE = 16;
 | 
			
		||||
 | 
			
		||||
var AuthenticationDialog = GObject.registerClass({
 | 
			
		||||
    Signals: { 'done': { param_types: [GObject.TYPE_BOOLEAN] } }
 | 
			
		||||
}, class AuthenticationDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
    _init(actionId, body, cookie, userNames) {
 | 
			
		||||
        super._init({ styleClass: 'prompt-dialog' });
 | 
			
		||||
var AuthenticationDialog = class extends ModalDialog.ModalDialog {
 | 
			
		||||
    constructor(actionId, body, cookie, userNames) {
 | 
			
		||||
        super({ styleClass: 'prompt-dialog' });
 | 
			
		||||
 | 
			
		||||
        this.actionId = actionId;
 | 
			
		||||
        this.message = body;
 | 
			
		||||
@@ -26,7 +25,7 @@ var AuthenticationDialog = GObject.registerClass({
 | 
			
		||||
        this._wasDismissed = false;
 | 
			
		||||
 | 
			
		||||
        this._sessionUpdatedId = Main.sessionMode.connect('updated', () => {
 | 
			
		||||
            this.visible = !Main.sessionMode.isLocked;
 | 
			
		||||
            this._group.visible = !Main.sessionMode.isLocked;
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        this.connect('closed', this._onDialogClosed.bind(this));
 | 
			
		||||
@@ -38,19 +37,19 @@ var AuthenticationDialog = GObject.registerClass({
 | 
			
		||||
        this.contentLayout.add_actor(content);
 | 
			
		||||
 | 
			
		||||
        if (userNames.length > 1) {
 | 
			
		||||
            log(`polkitAuthenticationAgent: Received ${userNames.length} ` +
 | 
			
		||||
                'identities that can be used for authentication. Only ' +
 | 
			
		||||
            log('polkitAuthenticationAgent: Received ' + userNames.length +
 | 
			
		||||
                ' identities that can be used for authentication. Only ' +
 | 
			
		||||
                'considering one.');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let userName = GLib.get_user_name();
 | 
			
		||||
        if (!userNames.includes(userName))
 | 
			
		||||
        if (userNames.indexOf(userName) < 0)
 | 
			
		||||
            userName = 'root';
 | 
			
		||||
        if (!userNames.includes(userName))
 | 
			
		||||
        if (userNames.indexOf(userName) < 0)
 | 
			
		||||
            userName = userNames[0];
 | 
			
		||||
 | 
			
		||||
        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._onUserChanged.bind(this));
 | 
			
		||||
        this._userChangedId = this._user.connect('changed',
 | 
			
		||||
@@ -77,15 +76,15 @@ var AuthenticationDialog = GObject.registerClass({
 | 
			
		||||
                                                       styleClass: 'polkit-dialog-user-icon' });
 | 
			
		||||
            this._userAvatar.actor.hide();
 | 
			
		||||
            userBox.add(this._userAvatar.actor,
 | 
			
		||||
                        { x_fill: true,
 | 
			
		||||
                          y_fill: false,
 | 
			
		||||
                        { x_fill:  true,
 | 
			
		||||
                          y_fill:  false,
 | 
			
		||||
                          x_align: St.Align.END,
 | 
			
		||||
                          y_align: St.Align.START });
 | 
			
		||||
            let userLabel = new St.Label(({ style_class: 'polkit-dialog-user-label',
 | 
			
		||||
                                            text: userRealName }));
 | 
			
		||||
            userBox.add(userLabel,
 | 
			
		||||
                        { x_fill: true,
 | 
			
		||||
                          y_fill: false,
 | 
			
		||||
                        { x_fill:  true,
 | 
			
		||||
                          y_fill:  false,
 | 
			
		||||
                          x_align: St.Align.END,
 | 
			
		||||
                          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._passwordEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry',
 | 
			
		||||
                                             text: "",
 | 
			
		||||
                                             can_focus: true });
 | 
			
		||||
                                             can_focus: true});
 | 
			
		||||
        ShellEntry.addContextMenu(this._passwordEntry, { isPassword: true });
 | 
			
		||||
        this._passwordEntry.clutter_text.connect('activate', this._onEntryActivate.bind(this));
 | 
			
		||||
        this._passwordBox.add(this._passwordEntry,
 | 
			
		||||
@@ -127,7 +126,7 @@ var AuthenticationDialog = GObject.registerClass({
 | 
			
		||||
         * gnome-shell.css sets the color to be transparent
 | 
			
		||||
         */
 | 
			
		||||
        this._nullMessageLabel = new St.Label({ style_class: 'prompt-dialog-null-label',
 | 
			
		||||
                                                text: 'abc' });
 | 
			
		||||
                                                text: 'abc'});
 | 
			
		||||
        this._nullMessageLabel.add_style_class_name('hidden');
 | 
			
		||||
        this._nullMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
 | 
			
		||||
        this._nullMessageLabel.clutter_text.line_wrap = true;
 | 
			
		||||
@@ -137,7 +136,7 @@ var AuthenticationDialog = GObject.registerClass({
 | 
			
		||||
        this._cancelButton = this.addButton({ label: _("Cancel"),
 | 
			
		||||
                                              action: this.cancel.bind(this),
 | 
			
		||||
                                              key: Clutter.Escape });
 | 
			
		||||
        this._okButton = this.addButton({ label: _("Authenticate"),
 | 
			
		||||
        this._okButton = this.addButton({ label:  _("Authenticate"),
 | 
			
		||||
                                          action: this._onAuthenticateButtonPressed.bind(this),
 | 
			
		||||
                                          default: true });
 | 
			
		||||
 | 
			
		||||
@@ -180,9 +179,9 @@ var AuthenticationDialog = GObject.registerClass({
 | 
			
		||||
            //
 | 
			
		||||
            // We could add retrying if this turns out to be a problem
 | 
			
		||||
 | 
			
		||||
            log('polkitAuthenticationAgent: Failed to show modal dialog. ' +
 | 
			
		||||
                `Dismissing authentication request for action-id ${this.actionId} ` +
 | 
			
		||||
                `cookie ${this._cookie}`);
 | 
			
		||||
            log('polkitAuthenticationAgent: Failed to show modal dialog.' +
 | 
			
		||||
                ' Dismissing authentication request for action-id ' + this.actionId +
 | 
			
		||||
                ' cookie ' + this._cookie);
 | 
			
		||||
            this._emitDone(true);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -250,14 +249,14 @@ var AuthenticationDialog = GObject.registerClass({
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _onSessionRequest(session, request, echoOn) {
 | 
			
		||||
    _onSessionRequest(session, request, echo_on) {
 | 
			
		||||
        // Cheap localization trick
 | 
			
		||||
        if (request == 'Password:' || request == 'Password: ')
 | 
			
		||||
            this._passwordLabel.set_text(_("Password:"));
 | 
			
		||||
        else
 | 
			
		||||
            this._passwordLabel.set_text(request);
 | 
			
		||||
 | 
			
		||||
        if (echoOn)
 | 
			
		||||
        if (echo_on)
 | 
			
		||||
            this._passwordEntry.clutter_text.set_password_char('');
 | 
			
		||||
        else
 | 
			
		||||
            this._passwordEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE
 | 
			
		||||
@@ -327,7 +326,8 @@ var AuthenticationDialog = GObject.registerClass({
 | 
			
		||||
 | 
			
		||||
        this._destroySession();
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
};
 | 
			
		||||
Signals.addSignalMethods(AuthenticationDialog.prototype);
 | 
			
		||||
 | 
			
		||||
var AuthenticationAgent = class {
 | 
			
		||||
    constructor() {
 | 
			
		||||
@@ -342,7 +342,7 @@ var AuthenticationAgent = class {
 | 
			
		||||
    enable() {
 | 
			
		||||
        try {
 | 
			
		||||
            this._native.register();
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
            log('Failed to register AuthenticationAgent');
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -350,7 +350,7 @@ var AuthenticationAgent = class {
 | 
			
		||||
    disable() {
 | 
			
		||||
        try {
 | 
			
		||||
            this._native.unregister();
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
            log('Failed to unregister AuthenticationAgent');
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@ var Tpl = null;
 | 
			
		||||
var Tp = null;
 | 
			
		||||
try {
 | 
			
		||||
    ({ TelepathyGLib: Tp, TelepathyLogger: Tpl } = imports.gi);
 | 
			
		||||
} catch (e) {
 | 
			
		||||
} catch(e) {
 | 
			
		||||
    log('Telepathy is not available, chat integration will be disabled.');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -40,6 +40,8 @@ var NotificationDirection = {
 | 
			
		||||
    RECEIVED: 'chat-received'
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var N_ = s => s;
 | 
			
		||||
 | 
			
		||||
function makeMessageFromTpMessage(tpMessage, direction) {
 | 
			
		||||
    let [text, flags] = tpMessage.to_text();
 | 
			
		||||
 | 
			
		||||
@@ -87,7 +89,7 @@ var TelepathyComponent = class {
 | 
			
		||||
        try {
 | 
			
		||||
            this._client.register();
 | 
			
		||||
        } 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()))
 | 
			
		||||
@@ -147,20 +149,20 @@ class TelepathyClient extends Tp.BaseClient {
 | 
			
		||||
            this._delegatedChannelsCb.bind(this));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    vfunc_observe_channels(...args) {
 | 
			
		||||
        let [account, conn, channels, dispatchOp, requests, context] = args;
 | 
			
		||||
    vfunc_observe_channels(account, conn, channels,
 | 
			
		||||
                                     dispatchOp, requests, context) {
 | 
			
		||||
        let len = channels.length;
 | 
			
		||||
        for (let i = 0; i < len; i++) {
 | 
			
		||||
            let channel = channels[i];
 | 
			
		||||
            let [targetHandle, targetHandleType] = channel.get_handle();
 | 
			
		||||
 | 
			
		||||
            if (channel.get_invalidated())
 | 
			
		||||
                continue;
 | 
			
		||||
              continue;
 | 
			
		||||
 | 
			
		||||
            /* Only observe contact text channels */
 | 
			
		||||
            if ((!(channel instanceof Tp.TextChannel)) ||
 | 
			
		||||
               targetHandleType != Tp.HandleType.CONTACT)
 | 
			
		||||
                continue;
 | 
			
		||||
               continue;
 | 
			
		||||
 | 
			
		||||
            this._createChatSource(account, conn, channel, channel.get_target_contact());
 | 
			
		||||
        }
 | 
			
		||||
@@ -180,8 +182,8 @@ class TelepathyClient extends Tp.BaseClient {
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    vfunc_handle_channels(...args) {
 | 
			
		||||
        let [account, conn, channels, requests, userActionTime, context] = args;
 | 
			
		||||
    vfunc_handle_channels(account, conn, channels, requests,
 | 
			
		||||
                                    user_action_time, context) {
 | 
			
		||||
        this._handlingChannels(account, conn, channels, true);
 | 
			
		||||
        context.accept();
 | 
			
		||||
    }
 | 
			
		||||
@@ -198,7 +200,7 @@ class TelepathyClient extends Tp.BaseClient {
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (channel.get_invalidated())
 | 
			
		||||
                continue;
 | 
			
		||||
              continue;
 | 
			
		||||
 | 
			
		||||
            // 'notify' will be true when coming from an actual HandleChannels
 | 
			
		||||
            // 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) {
 | 
			
		||||
        let [account, conn, channels, dispatchOp, context] = args;
 | 
			
		||||
    vfunc_add_dispatch_operation(account, conn, channels,
 | 
			
		||||
                                           dispatchOp, context) {
 | 
			
		||||
        let channel = channels[0];
 | 
			
		||||
        let chanType = channel.get_channel_type();
 | 
			
		||||
 | 
			
		||||
@@ -253,7 +255,7 @@ class TelepathyClient extends Tp.BaseClient {
 | 
			
		||||
                dispatchOp.claim_with_finish(result);
 | 
			
		||||
                this._handlingChannels(account, conn, [channel], false);
 | 
			
		||||
            } 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();
 | 
			
		||||
 | 
			
		||||
        switch (presenceType) {
 | 
			
		||||
        case Tp.ConnectionPresenceType.AVAILABLE:
 | 
			
		||||
            iconName = 'user-available';
 | 
			
		||||
            break;
 | 
			
		||||
        case Tp.ConnectionPresenceType.BUSY:
 | 
			
		||||
            iconName = 'user-busy';
 | 
			
		||||
            break;
 | 
			
		||||
        case Tp.ConnectionPresenceType.OFFLINE:
 | 
			
		||||
            iconName = 'user-offline';
 | 
			
		||||
            break;
 | 
			
		||||
        case Tp.ConnectionPresenceType.HIDDEN:
 | 
			
		||||
            iconName = 'user-invisible';
 | 
			
		||||
            break;
 | 
			
		||||
        case Tp.ConnectionPresenceType.AWAY:
 | 
			
		||||
            iconName = 'user-away';
 | 
			
		||||
            break;
 | 
			
		||||
        case Tp.ConnectionPresenceType.EXTENDED_AWAY:
 | 
			
		||||
            iconName = 'user-idle';
 | 
			
		||||
            break;
 | 
			
		||||
        default:
 | 
			
		||||
            iconName = 'user-offline';
 | 
			
		||||
        }
 | 
			
		||||
        return new Gio.ThemedIcon({ name: iconName });
 | 
			
		||||
            case Tp.ConnectionPresenceType.AVAILABLE:
 | 
			
		||||
                iconName = 'user-available';
 | 
			
		||||
                break;
 | 
			
		||||
            case Tp.ConnectionPresenceType.BUSY:
 | 
			
		||||
                iconName = 'user-busy';
 | 
			
		||||
                break;
 | 
			
		||||
            case Tp.ConnectionPresenceType.OFFLINE:
 | 
			
		||||
                iconName = 'user-offline';
 | 
			
		||||
                break;
 | 
			
		||||
            case Tp.ConnectionPresenceType.HIDDEN:
 | 
			
		||||
                iconName = 'user-invisible';
 | 
			
		||||
                break;
 | 
			
		||||
            case Tp.ConnectionPresenceType.AWAY:
 | 
			
		||||
                iconName = 'user-away';
 | 
			
		||||
                break;
 | 
			
		||||
            case Tp.ConnectionPresenceType.EXTENDED_AWAY:
 | 
			
		||||
                iconName = 'user-idle';
 | 
			
		||||
                break;
 | 
			
		||||
            default:
 | 
			
		||||
                iconName = 'user-offline';
 | 
			
		||||
       }
 | 
			
		||||
       return new Gio.ThemedIcon({ name: iconName });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _updateAvatarIcon() {
 | 
			
		||||
@@ -399,7 +401,7 @@ var ChatSource = class extends MessageTray.Source {
 | 
			
		||||
        if (this._client.is_handling_channel(this._channel)) {
 | 
			
		||||
            // We are handling the channel, try to pass it to Empathy or Polari
 | 
			
		||||
            // (depending on the channel type)
 | 
			
		||||
            // We don't check if either app is available - mission control will
 | 
			
		||||
            // We don't check if either app is availble - mission control will
 | 
			
		||||
            // fallback to something else if activation fails
 | 
			
		||||
 | 
			
		||||
            let target;
 | 
			
		||||
@@ -595,8 +597,8 @@ var ChatSource = class extends MessageTray.Source {
 | 
			
		||||
        // keep track of it with the ChatStateChanged signal but it is good
 | 
			
		||||
        // enough right now.
 | 
			
		||||
        if (state != this._chatState) {
 | 
			
		||||
            this._chatState = state;
 | 
			
		||||
            this._channel.set_chat_state_async(state, null);
 | 
			
		||||
          this._chatState = state;
 | 
			
		||||
          this._channel.set_chat_state_async(state, null);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -7,6 +7,7 @@ const SwitcherPopup = imports.ui.switcherPopup;
 | 
			
		||||
const Params = imports.misc.params;
 | 
			
		||||
 | 
			
		||||
var POPUP_APPICON_SIZE = 96;
 | 
			
		||||
var POPUP_FADE_TIME = 0.1; // seconds
 | 
			
		||||
 | 
			
		||||
var SortGroup = {
 | 
			
		||||
    TOP:    0,
 | 
			
		||||
@@ -32,7 +33,7 @@ var CtrlAltTabManager = class CtrlAltTabManager {
 | 
			
		||||
        item.iconName = icon;
 | 
			
		||||
 | 
			
		||||
        this._items.push(item);
 | 
			
		||||
        root.connect('destroy', () => this.removeGroup(root));
 | 
			
		||||
        root.connect('destroy', () => { this.removeGroup(root); });
 | 
			
		||||
        if (root instanceof St.Widget)
 | 
			
		||||
            global.focus_manager.add_group(root);
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -35,7 +35,7 @@ class DashItemContainer extends St.Widget {
 | 
			
		||||
                      x_align: Clutter.ActorAlign.CENTER });
 | 
			
		||||
 | 
			
		||||
        this._labelText = "";
 | 
			
		||||
        this.label = new St.Label({ style_class: 'dash-label' });
 | 
			
		||||
        this.label = new St.Label({ style_class: 'dash-label'});
 | 
			
		||||
        this.label.hide();
 | 
			
		||||
        Main.layoutManager.addChrome(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 labelHeight = this.label.get_height();
 | 
			
		||||
        let yOffset = Math.floor((itemHeight - labelHeight) / 2);
 | 
			
		||||
        let yOffset = Math.floor((itemHeight - labelHeight) / 2)
 | 
			
		||||
 | 
			
		||||
        let y = stageY + yOffset;
 | 
			
		||||
 | 
			
		||||
@@ -198,9 +198,9 @@ class ShowAppsIcon extends DashItemContainer {
 | 
			
		||||
                                            toggle_mode: true });
 | 
			
		||||
        this._iconActor = null;
 | 
			
		||||
        this.icon = new IconGrid.BaseIcon(_("Show Applications"),
 | 
			
		||||
                                          { setSizeManually: true,
 | 
			
		||||
                                            showLabel: false,
 | 
			
		||||
                                            createIcon: this._createIcon.bind(this) });
 | 
			
		||||
                                           { setSizeManually: true,
 | 
			
		||||
                                             showLabel: false,
 | 
			
		||||
                                             createIcon: this._createIcon.bind(this) });
 | 
			
		||||
        this.toggleButton.add_actor(this.icon);
 | 
			
		||||
        this.toggleButton._delegate = this;
 | 
			
		||||
 | 
			
		||||
@@ -321,14 +321,14 @@ class DashActor extends St.Widget {
 | 
			
		||||
        let themeNode = this.get_theme_node();
 | 
			
		||||
        let adjustedForWidth = themeNode.adjust_for_width(forWidth);
 | 
			
		||||
        let [, showAppsButton] = this.get_children();
 | 
			
		||||
        let [minHeight] = showAppsButton.get_preferred_height(adjustedForWidth);
 | 
			
		||||
        [minHeight] = themeNode.adjust_preferred_height(minHeight, natHeight);
 | 
			
		||||
        let [minHeight, ] = showAppsButton.get_preferred_height(adjustedForWidth);
 | 
			
		||||
        [minHeight, ] = themeNode.adjust_preferred_height(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 {
 | 
			
		||||
    constructor() {
 | 
			
		||||
@@ -648,10 +648,10 @@ var Dash = class Dash {
 | 
			
		||||
        let running = this._appSystem.get_running();
 | 
			
		||||
 | 
			
		||||
        let children = this._box.get_children().filter(actor => {
 | 
			
		||||
            return actor.child &&
 | 
			
		||||
                   actor.child._delegate &&
 | 
			
		||||
                   actor.child._delegate.app;
 | 
			
		||||
        });
 | 
			
		||||
                return actor.child &&
 | 
			
		||||
                       actor.child._delegate &&
 | 
			
		||||
                       actor.child._delegate.app;
 | 
			
		||||
            });
 | 
			
		||||
        // Apps currently in the dash
 | 
			
		||||
        let oldApps = children.map(actor => actor.child._delegate.app);
 | 
			
		||||
        // Apps supposed to be in the dash
 | 
			
		||||
@@ -700,14 +700,14 @@ var Dash = class Dash {
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // App removed at oldIndex
 | 
			
		||||
            if (oldApp && !newApps.includes(oldApp)) {
 | 
			
		||||
            if (oldApp && newApps.indexOf(oldApp) == -1) {
 | 
			
		||||
                removedActors.push(children[oldIndex]);
 | 
			
		||||
                oldIndex++;
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // App added at newIndex
 | 
			
		||||
            if (newApp && !oldApps.includes(newApp)) {
 | 
			
		||||
            if (newApp && oldApps.indexOf(newApp) == -1) {
 | 
			
		||||
                addedItems.push({ app: newApp,
 | 
			
		||||
                                  item: this._createAppItem(newApp),
 | 
			
		||||
                                  pos: newIndex });
 | 
			
		||||
@@ -899,7 +899,7 @@ var Dash = class Dash {
 | 
			
		||||
                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
 | 
			
		||||
        if (!this._dragPlaceholder)
 | 
			
		||||
            return true;
 | 
			
		||||
 
 | 
			
		||||
@@ -47,7 +47,7 @@ var TodayButton = class TodayButton {
 | 
			
		||||
        this._calendar.connect('selected-date-changed', (calendar, date) => {
 | 
			
		||||
            // Make the button reactive only if the selected date is not the
 | 
			
		||||
            // current date.
 | 
			
		||||
            this.actor.reactive = !_isToday(date);
 | 
			
		||||
            this.actor.reactive = !_isToday(date)
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -118,7 +118,7 @@ var WorldClocksSection = class WorldClocksSection {
 | 
			
		||||
            if (!clocks[i].location)
 | 
			
		||||
                continue;
 | 
			
		||||
            let l = world.deserialize(clocks[i].location);
 | 
			
		||||
            if (l && l.get_timezone() != null)
 | 
			
		||||
            if (l)
 | 
			
		||||
                this._locations.push({ location: l });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -217,7 +217,7 @@ var WeatherSection = class WeatherSection {
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        let box = new St.BoxLayout({ style_class: 'weather-box',
 | 
			
		||||
                                     vertical: true });
 | 
			
		||||
                                      vertical: true });
 | 
			
		||||
 | 
			
		||||
        this.actor.child = box;
 | 
			
		||||
 | 
			
		||||
@@ -357,7 +357,7 @@ var MessagesIndicator = class MessagesIndicator {
 | 
			
		||||
        Main.messageTray.connect('queue-changed', this._updateCount.bind(this));
 | 
			
		||||
 | 
			
		||||
        let sources = Main.messageTray.getSources();
 | 
			
		||||
        sources.forEach(source => this._onSourceAdded(null, source));
 | 
			
		||||
        sources.forEach(source => { this._onSourceAdded(null, source); });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _onSourceAdded(tray, source) {
 | 
			
		||||
@@ -373,7 +373,7 @@ var MessagesIndicator = class MessagesIndicator {
 | 
			
		||||
 | 
			
		||||
    _updateCount() {
 | 
			
		||||
        let count = 0;
 | 
			
		||||
        this._sources.forEach(source => count += source.unseenCount);
 | 
			
		||||
        this._sources.forEach(source => { count += source.unseenCount; });
 | 
			
		||||
        count -= Main.messageTray.queueCount;
 | 
			
		||||
 | 
			
		||||
        this.actor.visible = (count > 0);
 | 
			
		||||
@@ -384,8 +384,8 @@ var IndicatorPad = GObject.registerClass(
 | 
			
		||||
class IndicatorPad extends St.Widget {
 | 
			
		||||
    _init(actor) {
 | 
			
		||||
        this._source = actor;
 | 
			
		||||
        this._source.connect('notify::visible', () => this.queue_relayout());
 | 
			
		||||
        this._source.connect('notify::size', () => this.queue_relayout());
 | 
			
		||||
        this._source.connect('notify::visible', () => { this.queue_relayout(); });
 | 
			
		||||
        this._source.connect('notify::size', () => { this.queue_relayout(); });
 | 
			
		||||
        super._init();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -459,6 +459,7 @@ class CalendarColumnLayout extends Clutter.BoxLayout {
 | 
			
		||||
var DateMenuButton = GObject.registerClass(
 | 
			
		||||
class DateMenuButton extends PanelMenu.Button {
 | 
			
		||||
    _init() {
 | 
			
		||||
        let item;
 | 
			
		||||
        let hbox;
 | 
			
		||||
        let vbox;
 | 
			
		||||
 | 
			
		||||
@@ -475,9 +476,10 @@ class DateMenuButton extends PanelMenu.Button {
 | 
			
		||||
        box.add_actor(this._clockDisplay);
 | 
			
		||||
        box.add_actor(this._indicator.actor);
 | 
			
		||||
 | 
			
		||||
        this.label_actor = this._clockDisplay;
 | 
			
		||||
        this.add_actor(box);
 | 
			
		||||
        this.add_style_class_name ('clock-display');
 | 
			
		||||
        this.actor.label_actor = this._clockDisplay;
 | 
			
		||||
        this.actor.add_actor(box);
 | 
			
		||||
        this.actor.add_style_class_name ('clock-display');
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        let layout = new FreezableBinLayout();
 | 
			
		||||
        let bin = new St.Widget({ layout_manager: layout });
 | 
			
		||||
 
 | 
			
		||||
@@ -25,9 +25,9 @@ class Dialog extends St.Widget {
 | 
			
		||||
 | 
			
		||||
    _createDialog() {
 | 
			
		||||
        this._dialog = new St.BoxLayout({ style_class: 'modal-dialog',
 | 
			
		||||
                                          x_align: Clutter.ActorAlign.CENTER,
 | 
			
		||||
                                          y_align: Clutter.ActorAlign.CENTER,
 | 
			
		||||
                                          vertical: true });
 | 
			
		||||
                                          x_align:     Clutter.ActorAlign.CENTER,
 | 
			
		||||
                                          y_align:     Clutter.ActorAlign.CENTER,
 | 
			
		||||
                                          vertical:    true });
 | 
			
		||||
 | 
			
		||||
        // modal dialogs are fixed width and grow vertically; set the request
 | 
			
		||||
        // 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,
 | 
			
		||||
                                                style_class: "modal-dialog-content-box" });
 | 
			
		||||
        this._dialog.add(this.contentLayout,
 | 
			
		||||
                         { expand: true,
 | 
			
		||||
                           x_fill: true,
 | 
			
		||||
                           y_fill: true,
 | 
			
		||||
                         { expand:  true,
 | 
			
		||||
                           x_fill:  true,
 | 
			
		||||
                           y_fill:  true,
 | 
			
		||||
                           x_align: St.Align.MIDDLE,
 | 
			
		||||
                           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,
 | 
			
		||||
                         { x_align: St.Align.MIDDLE,
 | 
			
		||||
                           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',
 | 
			
		||||
                                     button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
 | 
			
		||||
                                     reactive: true,
 | 
			
		||||
                                     can_focus: true,
 | 
			
		||||
                                     x_expand: true,
 | 
			
		||||
                                     y_expand: true,
 | 
			
		||||
                                     label: label });
 | 
			
		||||
                                     reactive:    true,
 | 
			
		||||
                                     can_focus:   true,
 | 
			
		||||
                                     x_expand:    true,
 | 
			
		||||
                                     y_expand:    true,
 | 
			
		||||
                                     label:       label });
 | 
			
		||||
        button.connect('clicked', action);
 | 
			
		||||
 | 
			
		||||
        buttonInfo['button'] = button;
 | 
			
		||||
@@ -175,10 +175,10 @@ var MessageDialogContent = GObject.registerClass({
 | 
			
		||||
            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 };
 | 
			
		||||
        this._subtitle.clutter_text.set(textProps);
 | 
			
		||||
        this._body.clutter_text.set(textProps);
 | 
			
		||||
        Object.assign(this._subtitle.clutter_text, textProps);
 | 
			
		||||
        Object.assign(this._body.clutter_text, textProps);
 | 
			
		||||
 | 
			
		||||
        if (!params.hasOwnProperty('style_class'))
 | 
			
		||||
            params.style_class = 'message-dialog-main-layout';
 | 
			
		||||
@@ -214,10 +214,7 @@ var MessageDialogContent = GObject.registerClass({
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    set icon(icon) {
 | 
			
		||||
        this._icon.set({
 | 
			
		||||
            gicon: icon,
 | 
			
		||||
            visible: icon != null
 | 
			
		||||
        });
 | 
			
		||||
        Object.assign(this._icon, { gicon: icon, visible: icon != null });
 | 
			
		||||
        this.notify('icon');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -234,10 +231,7 @@ var MessageDialogContent = GObject.registerClass({
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _setLabel(label, prop, value) {
 | 
			
		||||
        label.set({
 | 
			
		||||
            text: value || '',
 | 
			
		||||
            visible: value != null
 | 
			
		||||
        });
 | 
			
		||||
        Object.assign(label, { text: value || '', visible: value != null });
 | 
			
		||||
        this.notify(prop);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										22
									
								
								js/ui/dnd.js
									
									
									
									
									
								
							
							
						
						@@ -434,13 +434,14 @@ var _Draggable = class _Draggable {
 | 
			
		||||
                                   scale_y: scale * origScale,
 | 
			
		||||
                                   time: SCALE_ANIMATION_TIME,
 | 
			
		||||
                                   transition: 'easeOutQuad',
 | 
			
		||||
                                   onUpdate: () => {
 | 
			
		||||
                                   onUpdate() {
 | 
			
		||||
                                       let currentScale = this._dragActor.scale_x / origScale;
 | 
			
		||||
                                       this._dragOffsetX = currentScale * origDragOffsetX;
 | 
			
		||||
                                       this._dragOffsetY = currentScale * origDragOffsetY;
 | 
			
		||||
                                       this._dragActor.set_position(this._dragX + this._dragOffsetX,
 | 
			
		||||
                                                                    this._dragY + this._dragOffsetY);
 | 
			
		||||
                                   } });
 | 
			
		||||
                                   },
 | 
			
		||||
                                   onUpdateScope: this });
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -560,11 +561,11 @@ var _Draggable = class _Draggable {
 | 
			
		||||
            let dropFunc = dragMonitors[i].dragDrop;
 | 
			
		||||
            if (dropFunc)
 | 
			
		||||
                switch (dropFunc(dropEvent)) {
 | 
			
		||||
                case DragDropResult.FAILURE:
 | 
			
		||||
                case DragDropResult.SUCCESS:
 | 
			
		||||
                    return true;
 | 
			
		||||
                case DragDropResult.CONTINUE:
 | 
			
		||||
                    continue;
 | 
			
		||||
                    case DragDropResult.FAILURE:
 | 
			
		||||
                    case DragDropResult.SUCCESS:
 | 
			
		||||
                        return true;
 | 
			
		||||
                    case DragDropResult.CONTINUE:
 | 
			
		||||
                        continue;
 | 
			
		||||
                }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -587,9 +588,8 @@ var _Draggable = class _Draggable {
 | 
			
		||||
                        if (this._restoreOnSuccess) {
 | 
			
		||||
                            this._restoreDragActor(event.get_time());
 | 
			
		||||
                            return true;
 | 
			
		||||
                        } else {
 | 
			
		||||
                        } else
 | 
			
		||||
                            this._dragActor.destroy();
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    this._dragState = DragState.INIT;
 | 
			
		||||
@@ -689,12 +689,12 @@ var _Draggable = class _Draggable {
 | 
			
		||||
        params['onCompleteParams'] = [this._dragActor, eventTime];
 | 
			
		||||
 | 
			
		||||
        // start the animation
 | 
			
		||||
        Tweener.addTween(this._dragActor, params);
 | 
			
		||||
        Tweener.addTween(this._dragActor, params)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _finishAnimation() {
 | 
			
		||||
        if (!this._animationInProgress)
 | 
			
		||||
            return;
 | 
			
		||||
            return
 | 
			
		||||
 | 
			
		||||
        this._animationInProgress = false;
 | 
			
		||||
        if (!this._buttonDown)
 | 
			
		||||
 
 | 
			
		||||
@@ -16,7 +16,7 @@ var EdgeDragAction = GObject.registerClass({
 | 
			
		||||
        this._allowedModes = allowedModes;
 | 
			
		||||
        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) {
 | 
			
		||||
 
 | 
			
		||||
@@ -19,7 +19,7 @@
 | 
			
		||||
const Mainloop = imports.mainloop;
 | 
			
		||||
 | 
			
		||||
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 GnomeSession = imports.misc.gnomeSession;
 | 
			
		||||
@@ -29,9 +29,13 @@ const UserWidget = imports.ui.userWidget;
 | 
			
		||||
 | 
			
		||||
const { loadInterfaceXML } = imports.misc.fileUtils;
 | 
			
		||||
 | 
			
		||||
let _endSessionDialog = null;
 | 
			
		||||
 | 
			
		||||
const _ITEM_ICON_SIZE = 48;
 | 
			
		||||
const _DIALOG_ICON_SIZE = 48;
 | 
			
		||||
 | 
			
		||||
var GSM_SESSION_MANAGER_LOGOUT_FORCE = 2;
 | 
			
		||||
 | 
			
		||||
const EndSessionDialogIface = loadInterfaceXML('org.gnome.SessionManager.EndSessionDialog');
 | 
			
		||||
 | 
			
		||||
const logoutDialogContent = {
 | 
			
		||||
@@ -49,7 +53,7 @@ const logoutDialogContent = {
 | 
			
		||||
    },
 | 
			
		||||
    showBatteryWarning: false,
 | 
			
		||||
    confirmButtons: [{ signal: 'ConfirmedLogout',
 | 
			
		||||
                       label: C_("button", "Log Out") }],
 | 
			
		||||
                       label:  C_("button", "Log Out") }],
 | 
			
		||||
    iconStyleClass: 'end-session-dialog-logout-icon',
 | 
			
		||||
    showOtherSessions: false,
 | 
			
		||||
};
 | 
			
		||||
@@ -65,9 +69,9 @@ const shutdownDialogContent = {
 | 
			
		||||
    checkBoxText: C_("checkbox", "Install pending software updates"),
 | 
			
		||||
    showBatteryWarning: true,
 | 
			
		||||
    confirmButtons: [{ signal: 'ConfirmedReboot',
 | 
			
		||||
                       label: C_("button", "Restart") },
 | 
			
		||||
                       label:  C_("button", "Restart") },
 | 
			
		||||
                     { signal: 'ConfirmedShutdown',
 | 
			
		||||
                       label: C_("button", "Power Off") }],
 | 
			
		||||
                       label:  C_("button", "Power Off") }],
 | 
			
		||||
    iconName: 'system-shutdown-symbolic',
 | 
			
		||||
    iconStyleClass: 'end-session-dialog-shutdown-icon',
 | 
			
		||||
    showOtherSessions: true,
 | 
			
		||||
@@ -82,7 +86,7 @@ const restartDialogContent = {
 | 
			
		||||
    },
 | 
			
		||||
    showBatteryWarning: false,
 | 
			
		||||
    confirmButtons: [{ signal: 'ConfirmedReboot',
 | 
			
		||||
                       label: C_("button", "Restart") }],
 | 
			
		||||
                       label:  C_("button", "Restart") }],
 | 
			
		||||
    iconName: 'view-refresh-symbolic',
 | 
			
		||||
    iconStyleClass: 'end-session-dialog-shutdown-icon',
 | 
			
		||||
    showOtherSessions: true,
 | 
			
		||||
@@ -98,7 +102,7 @@ const restartUpdateDialogContent = {
 | 
			
		||||
    },
 | 
			
		||||
    showBatteryWarning: true,
 | 
			
		||||
    confirmButtons: [{ signal: 'ConfirmedReboot',
 | 
			
		||||
                       label: C_("button", "Restart & Install") }],
 | 
			
		||||
                       label:  C_("button", "Restart & Install") }],
 | 
			
		||||
    unusedFutureButtonForTranslation: C_("button", "Install & Power Off"),
 | 
			
		||||
    unusedFutureCheckBoxForTranslation: C_("checkbox", "Power off after updates are installed"),
 | 
			
		||||
    iconName: 'view-refresh-symbolic',
 | 
			
		||||
@@ -118,18 +122,18 @@ const restartUpgradeDialogContent = {
 | 
			
		||||
    disableTimer: true,
 | 
			
		||||
    showBatteryWarning: false,
 | 
			
		||||
    confirmButtons: [{ signal: 'ConfirmedReboot',
 | 
			
		||||
                       label: C_("button", "Restart & Install") }],
 | 
			
		||||
                       label:  C_("button", "Restart & Install") }],
 | 
			
		||||
    iconName: 'view-refresh-symbolic',
 | 
			
		||||
    iconStyleClass: 'end-session-dialog-shutdown-icon',
 | 
			
		||||
    showOtherSessions: true,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const DialogType = {
 | 
			
		||||
    LOGOUT: 0 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_LOGOUT */,
 | 
			
		||||
    SHUTDOWN: 1 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_SHUTDOWN */,
 | 
			
		||||
    RESTART: 2 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_RESTART */,
 | 
			
		||||
    UPDATE_RESTART: 3,
 | 
			
		||||
    UPGRADE_RESTART: 4
 | 
			
		||||
  LOGOUT: 0 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_LOGOUT */,
 | 
			
		||||
  SHUTDOWN: 1 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_SHUTDOWN */,
 | 
			
		||||
  RESTART: 2 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_RESTART */,
 | 
			
		||||
  UPDATE_RESTART: 3,
 | 
			
		||||
  UPGRADE_RESTART: 4
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const DialogContent = {
 | 
			
		||||
@@ -155,7 +159,7 @@ function findAppFromInhibitor(inhibitor) {
 | 
			
		||||
    let desktopFile;
 | 
			
		||||
    try {
 | 
			
		||||
        [desktopFile] = inhibitor.GetAppIdSync();
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
    } catch(e) {
 | 
			
		||||
        // XXX -- sometimes JIT inhibitors generated by gnome-session
 | 
			
		||||
        // get removed too soon. Don't fail in this case.
 | 
			
		||||
        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
 | 
			
		||||
    // By instantiating it initially, we register the
 | 
			
		||||
    // bus object, etc.
 | 
			
		||||
    (new EndSessionDialog());
 | 
			
		||||
    _endSessionDialog = new EndSessionDialog();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var EndSessionDialog = GObject.registerClass(
 | 
			
		||||
class EndSessionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
    _init() {
 | 
			
		||||
        super._init({ styleClass: 'end-session-dialog',
 | 
			
		||||
                      destroyOnClose: false });
 | 
			
		||||
var EndSessionDialog = class EndSessionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
    constructor() {
 | 
			
		||||
        super({ styleClass: 'end-session-dialog',
 | 
			
		||||
                destroyOnClose: false });
 | 
			
		||||
 | 
			
		||||
        this._loginManager = LoginManager.getLoginManager();
 | 
			
		||||
        this._userManager = AccountsService.UserManager.get_default();
 | 
			
		||||
        this._user = this._userManager.get_user(GLib.get_user_name());
 | 
			
		||||
        this._updatesPermission = null;
 | 
			
		||||
 | 
			
		||||
        this._pkOfflineProxy = new PkOfflineProxy(Gio.DBus.system,
 | 
			
		||||
                                                  'org.freedesktop.PackageKit',
 | 
			
		||||
                                                  '/org/freedesktop/PackageKit',
 | 
			
		||||
                                                  this._onPkOfflineProxyCreated.bind(this));
 | 
			
		||||
 | 
			
		||||
                                                  (proxy, error) => {
 | 
			
		||||
                                                      if (error)
 | 
			
		||||
                                                          log(error.message);
 | 
			
		||||
                                                  });
 | 
			
		||||
        this._powerProxy = new UPowerProxy(Gio.DBus.system,
 | 
			
		||||
                                           'org.freedesktop.UPower',
 | 
			
		||||
                                           '/org/freedesktop/UPower',
 | 
			
		||||
@@ -271,8 +275,8 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
 | 
			
		||||
        this._iconBin = new St.Bin();
 | 
			
		||||
        mainContentLayout.add(this._iconBin,
 | 
			
		||||
                              { x_fill: true,
 | 
			
		||||
                                y_fill: false,
 | 
			
		||||
                              { x_fill:  true,
 | 
			
		||||
                                y_fill:  false,
 | 
			
		||||
                                x_align: St.Align.END,
 | 
			
		||||
                                y_align: St.Align.START });
 | 
			
		||||
 | 
			
		||||
@@ -285,7 +289,7 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
 | 
			
		||||
        messageLayout.add(this._subjectLabel,
 | 
			
		||||
                          { x_fill: false,
 | 
			
		||||
                            y_fill: false,
 | 
			
		||||
                            y_fill:  false,
 | 
			
		||||
                            x_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;
 | 
			
		||||
 | 
			
		||||
        messageLayout.add(this._descriptionLabel,
 | 
			
		||||
                          { y_fill: true,
 | 
			
		||||
                          { y_fill:  true,
 | 
			
		||||
                            y_align: St.Align.START });
 | 
			
		||||
 | 
			
		||||
        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._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 {
 | 
			
		||||
            this._updatesPermission = Polkit.Permission.new_sync(
 | 
			
		||||
                "org.freedesktop.packagekit.trigger-offline-update", null, null);
 | 
			
		||||
            this._updatesPermission = Polkit.Permission.new_sync("org.freedesktop.packagekit.trigger-offline-update", null, null);
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
            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() {
 | 
			
		||||
@@ -403,8 +390,7 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Use a different description when we are installing a system upgrade
 | 
			
		||||
        // if the PackageKit proxy is available (i.e. PackageKit is available).
 | 
			
		||||
        if (this._pkOfflineProxy && dialogContent.upgradeDescription) {
 | 
			
		||||
        if (dialogContent.upgradeDescription) {
 | 
			
		||||
            let name = this._pkOfflineProxy.PreparedUpgrade['name'].deep_unpack();
 | 
			
		||||
            let version = this._pkOfflineProxy.PreparedUpgrade['version'].deep_unpack();
 | 
			
		||||
 | 
			
		||||
@@ -441,8 +427,8 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
    _updateButtons() {
 | 
			
		||||
        let dialogContent = DialogContent[this._type];
 | 
			
		||||
        let buttons = [{ action: this.cancel.bind(this),
 | 
			
		||||
                         label: _("Cancel"),
 | 
			
		||||
                         key: Clutter.Escape }];
 | 
			
		||||
                         label:  _("Cancel"),
 | 
			
		||||
                         key:    Clutter.Escape }];
 | 
			
		||||
 | 
			
		||||
        for (let i = 0; i < dialogContent.confirmButtons.length; i++) {
 | 
			
		||||
            let signal = dialogContent.confirmButtons[i].signal;
 | 
			
		||||
@@ -489,19 +475,19 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
        // Trigger the offline update as requested
 | 
			
		||||
        if (this._checkBox.actor.checked) {
 | 
			
		||||
            switch (signal) {
 | 
			
		||||
            case "ConfirmedReboot":
 | 
			
		||||
                this._triggerOfflineUpdateReboot(callback);
 | 
			
		||||
                break;
 | 
			
		||||
            case "ConfirmedShutdown":
 | 
			
		||||
                // To actually trigger the offline update, we need to
 | 
			
		||||
                // reboot to do the upgrade. When the upgrade is complete,
 | 
			
		||||
                // the computer will shut down automatically.
 | 
			
		||||
                signal = "ConfirmedReboot";
 | 
			
		||||
                this._triggerOfflineUpdateShutdown(callback);
 | 
			
		||||
                break;
 | 
			
		||||
            default:
 | 
			
		||||
                callback();
 | 
			
		||||
                break;
 | 
			
		||||
                case "ConfirmedReboot":
 | 
			
		||||
                    this._triggerOfflineUpdateReboot(callback);
 | 
			
		||||
                    break;
 | 
			
		||||
                case "ConfirmedShutdown":
 | 
			
		||||
                    // To actually trigger the offline update, we need to
 | 
			
		||||
                    // reboot to do the upgrade. When the upgrade is complete,
 | 
			
		||||
                    // the computer will shut down automatically.
 | 
			
		||||
                    signal = "ConfirmedReboot";
 | 
			
		||||
                    this._triggerOfflineUpdateShutdown(callback);
 | 
			
		||||
                    break;
 | 
			
		||||
                default:
 | 
			
		||||
                    callback();
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            this._triggerOfflineUpdateCancel(callback);
 | 
			
		||||
@@ -513,12 +499,6 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _triggerOfflineUpdateReboot(callback) {
 | 
			
		||||
        // Handle this gracefully if PackageKit is not available.
 | 
			
		||||
        if (!this._pkOfflineProxy) {
 | 
			
		||||
            callback();
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._pkOfflineProxy.TriggerRemote('reboot', (result, error) => {
 | 
			
		||||
            if (error)
 | 
			
		||||
                log(error.message);
 | 
			
		||||
@@ -528,12 +508,6 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _triggerOfflineUpdateShutdown(callback) {
 | 
			
		||||
        // Handle this gracefully if PackageKit is not available.
 | 
			
		||||
        if (!this._pkOfflineProxy) {
 | 
			
		||||
            callback();
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._pkOfflineProxy.TriggerRemote('power-off', (result, error) => {
 | 
			
		||||
            if (error)
 | 
			
		||||
                log(error.message);
 | 
			
		||||
@@ -543,12 +517,6 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _triggerOfflineUpdateCancel(callback) {
 | 
			
		||||
        // Handle this gracefully if PackageKit is not available.
 | 
			
		||||
        if (!this._pkOfflineProxy) {
 | 
			
		||||
            callback();
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._pkOfflineProxy.CancelRemote((result, error) => {
 | 
			
		||||
            if (error)
 | 
			
		||||
                log(error.message);
 | 
			
		||||
@@ -616,7 +584,7 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _onInhibitorLoaded(inhibitor) {
 | 
			
		||||
        if (!this._applications.includes(inhibitor)) {
 | 
			
		||||
        if (this._applications.indexOf(inhibitor) < 0) {
 | 
			
		||||
            // Stale inhibitor
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
@@ -668,7 +636,7 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
        this._loginManager.listSessions(result => {
 | 
			
		||||
            let n = 0;
 | 
			
		||||
            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);
 | 
			
		||||
 | 
			
		||||
                if (proxy.Class != 'user')
 | 
			
		||||
@@ -711,8 +679,7 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
        this._totalSecondsToStayOpen = totalSecondsToStayOpen;
 | 
			
		||||
        this._type = type;
 | 
			
		||||
 | 
			
		||||
        // Only consider updates and upgrades if PackageKit is available.
 | 
			
		||||
        if (this._pkOfflineProxy && this._type == DialogType.RESTART) {
 | 
			
		||||
        if (this._type == DialogType.RESTART) {
 | 
			
		||||
            if (this._pkOfflineProxy.UpdateTriggered)
 | 
			
		||||
                this._type = DialogType.UPDATE_RESTART;
 | 
			
		||||
            else if (this._pkOfflineProxy.UpgradeTriggered)
 | 
			
		||||
@@ -744,9 +711,8 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
        if (dialogContent.showOtherSessions)
 | 
			
		||||
            this._loadSessions();
 | 
			
		||||
 | 
			
		||||
        // Only consider updates and upgrades if PackageKit is available.
 | 
			
		||||
        let updateTriggered = this._pkOfflineProxy ? this._pkOfflineProxy.UpdateTriggered : false;
 | 
			
		||||
        let updatePrepared = this._pkOfflineProxy ? this._pkOfflineProxy.UpdatePrepared : false;
 | 
			
		||||
        let updateTriggered = this._pkOfflineProxy.UpdateTriggered;
 | 
			
		||||
        let updatePrepared = this._pkOfflineProxy.UpdatePrepared;
 | 
			
		||||
        let updatesAllowed = this._updatesPermission && this._updatesPermission.allowed;
 | 
			
		||||
 | 
			
		||||
        _setCheckBoxLabel(this._checkBox, dialogContent.checkBoxText || '');
 | 
			
		||||
@@ -781,4 +747,4 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
    Close(parameters, invocation) {
 | 
			
		||||
        this.close();
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -57,8 +57,8 @@ function _patchLayoutClass(layoutClass, styleProps) {
 | 
			
		||||
    };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function _loggingFunc(...args) {
 | 
			
		||||
    let fields = { 'MESSAGE': args.join(', ') };
 | 
			
		||||
function _loggingFunc() {
 | 
			
		||||
    let fields = {'MESSAGE': [].join.call(arguments, ', ')};
 | 
			
		||||
    let domain = "GNOME Shell";
 | 
			
		||||
 | 
			
		||||
    // If the caller is an extension, add it as metadata
 | 
			
		||||
@@ -96,25 +96,16 @@ function init() {
 | 
			
		||||
    Clutter.Actor.prototype.toString = function() {
 | 
			
		||||
        return St.describe_actor(this);
 | 
			
		||||
    };
 | 
			
		||||
    // Deprecation warning for former JS classes turned into an actor subclass
 | 
			
		||||
    Object.defineProperty(Clutter.Actor.prototype, 'actor', {
 | 
			
		||||
        get() {
 | 
			
		||||
            let klass = this.constructor.name;
 | 
			
		||||
            let { stack } = new Error();
 | 
			
		||||
            log(`Usage of object.actor is deprecated for ${klass}\n${stack}`);
 | 
			
		||||
            return this;
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    let origToString = Object.prototype.toString;
 | 
			
		||||
    Object.prototype.toString = function() {
 | 
			
		||||
        let base = origToString.call(this);
 | 
			
		||||
        try {
 | 
			
		||||
            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
 | 
			
		||||
                return base;
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
            return base;
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 
 | 
			
		||||
@@ -1,18 +1,19 @@
 | 
			
		||||
// -*- 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 Dialog = imports.ui.dialog;
 | 
			
		||||
const ExtensionUtils = imports.misc.extensionUtils;
 | 
			
		||||
const ExtensionSystem = imports.ui.extensionSystem;
 | 
			
		||||
const FileUtils = imports.misc.fileUtils;
 | 
			
		||||
const ModalDialog = imports.ui.modalDialog;
 | 
			
		||||
 | 
			
		||||
const _signals = ExtensionSystem._signals;
 | 
			
		||||
 | 
			
		||||
var REPOSITORY_URL_BASE = 'https://extensions.gnome.org';
 | 
			
		||||
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_UPDATE   = `${REPOSITORY_URL_BASE}/update-info/`;
 | 
			
		||||
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_UPDATE   = REPOSITORY_URL_BASE + '/update-info/';
 | 
			
		||||
 | 
			
		||||
let _httpSession;
 | 
			
		||||
 | 
			
		||||
@@ -24,7 +25,7 @@ function installExtension(uuid, invocation) {
 | 
			
		||||
 | 
			
		||||
    _httpSession.queue_message(message, (session, message) => {
 | 
			
		||||
        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());
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
@@ -33,7 +34,7 @@ function installExtension(uuid, invocation) {
 | 
			
		||||
        try {
 | 
			
		||||
            info = JSON.parse(message.response_body.data);
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
            ExtensionSystem.logExtensionError(uuid, `parsing info: ${e}`);
 | 
			
		||||
            ExtensionSystem.logExtensionError(uuid, 'parsing info: ' + e);
 | 
			
		||||
            invocation.return_dbus_error('org.gnome.Shell.ParseInfoError', e.toString());
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
@@ -127,7 +128,7 @@ function updateExtension(uuid) {
 | 
			
		||||
            try {
 | 
			
		||||
                extension = ExtensionUtils.createExtensionObject(uuid, extensionDir, ExtensionUtils.ExtensionType.PER_USER);
 | 
			
		||||
                ExtensionSystem.loadExtension(extension);
 | 
			
		||||
            } catch (e) {
 | 
			
		||||
            } catch(e) {
 | 
			
		||||
                if (extension)
 | 
			
		||||
                    ExtensionSystem.unloadExtension(extension);
 | 
			
		||||
 | 
			
		||||
@@ -175,10 +176,10 @@ function checkForUpdates() {
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var InstallExtensionDialog = GObject.registerClass(
 | 
			
		||||
var InstallExtensionDialog =
 | 
			
		||||
class InstallExtensionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
    _init(uuid, info, invocation) {
 | 
			
		||||
        super._init({ styleClass: 'extension-dialog' });
 | 
			
		||||
    constructor(uuid, info, invocation) {
 | 
			
		||||
        super({ styleClass: 'extension-dialog' });
 | 
			
		||||
 | 
			
		||||
        this._uuid = uuid;
 | 
			
		||||
        this._info = info;
 | 
			
		||||
@@ -186,21 +187,26 @@ class InstallExtensionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
 | 
			
		||||
        this.setButtons([{ label: _("Cancel"),
 | 
			
		||||
                           action: this._onCancelButtonPressed.bind(this),
 | 
			
		||||
                           key: Clutter.Escape
 | 
			
		||||
                           key:    Clutter.Escape
 | 
			
		||||
                         },
 | 
			
		||||
                         { label: _("Install"),
 | 
			
		||||
                         { label:  _("Install"),
 | 
			
		||||
                           action: this._onInstallButtonPressed.bind(this),
 | 
			
		||||
                           default: true
 | 
			
		||||
                         }]);
 | 
			
		||||
 | 
			
		||||
        let content = new Dialog.MessageDialogContent({
 | 
			
		||||
            title: _("Download and install “%s” from extensions.gnome.org?").format(info.name),
 | 
			
		||||
            icon: new Gio.FileIcon({
 | 
			
		||||
                file: Gio.File.new_for_uri(`${REPOSITORY_URL_BASE}${info.icon}`)
 | 
			
		||||
            })
 | 
			
		||||
        });
 | 
			
		||||
        let message = _("Download and install “%s” from extensions.gnome.org?").format(info.name);
 | 
			
		||||
 | 
			
		||||
        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) {
 | 
			
		||||
@@ -220,13 +226,13 @@ class InstallExtensionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
        function errback(code, message) {
 | 
			
		||||
            let msg = message ? message.toString() : '';
 | 
			
		||||
            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() {
 | 
			
		||||
            // Add extension to 'enabled-extensions' for the user, always...
 | 
			
		||||
            let enabledExtensions = global.settings.get_strv(ExtensionSystem.ENABLED_EXTENSIONS_KEY);
 | 
			
		||||
            if (!enabledExtensions.includes(uuid)) {
 | 
			
		||||
            if (enabledExtensions.indexOf(uuid) == -1) {
 | 
			
		||||
                enabledExtensions.push(uuid);
 | 
			
		||||
                global.settings.set_strv(ExtensionSystem.ENABLED_EXTENSIONS_KEY, enabledExtensions);
 | 
			
		||||
            }
 | 
			
		||||
@@ -234,7 +240,7 @@ class InstallExtensionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
            try {
 | 
			
		||||
                let extension = ExtensionUtils.createExtensionObject(uuid, dir, ExtensionUtils.ExtensionType.PER_USER);
 | 
			
		||||
                ExtensionSystem.loadExtension(extension);
 | 
			
		||||
            } catch (e) {
 | 
			
		||||
            } catch(e) {
 | 
			
		||||
                uninstallExtension(uuid);
 | 
			
		||||
                errback('LoadExtensionError', e);
 | 
			
		||||
                return;
 | 
			
		||||
@@ -249,7 +255,7 @@ class InstallExtensionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
 | 
			
		||||
        this.close();
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
function init() {
 | 
			
		||||
    _httpSession = new Soup.SessionAsync({ ssl_use_system_ca_file: true });
 | 
			
		||||
 
 | 
			
		||||
@@ -64,7 +64,7 @@ function disableExtension(uuid) {
 | 
			
		||||
        let uuid = orderReversed[i];
 | 
			
		||||
        try {
 | 
			
		||||
            ExtensionUtils.extensions[uuid].stateObj.disable();
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
            logExtensionError(uuid, e);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -77,7 +77,7 @@ function disableExtension(uuid) {
 | 
			
		||||
 | 
			
		||||
    try {
 | 
			
		||||
        extension.stateObj.disable();
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
    } catch(e) {
 | 
			
		||||
        logExtensionError(uuid, e);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -85,7 +85,7 @@ function disableExtension(uuid) {
 | 
			
		||||
        let uuid = order[i];
 | 
			
		||||
        try {
 | 
			
		||||
            ExtensionUtils.extensions[uuid].stateObj.enable();
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
            logExtensionError(uuid, e);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -111,7 +111,7 @@ function enableExtension(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();
 | 
			
		||||
    for (let i = 0; i < stylesheetNames.length; i++) {
 | 
			
		||||
        try {
 | 
			
		||||
@@ -132,7 +132,7 @@ function enableExtension(uuid) {
 | 
			
		||||
        extension.state = ExtensionState.ENABLED;
 | 
			
		||||
        _signals.emit('extension-state-changed', extension);
 | 
			
		||||
        return;
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
    } catch(e) {
 | 
			
		||||
        if (extension.stylesheet) {
 | 
			
		||||
            theme.unload_stylesheet(extension.stylesheet);
 | 
			
		||||
            delete extension.stylesheet;
 | 
			
		||||
@@ -147,7 +147,7 @@ function logExtensionError(uuid, error) {
 | 
			
		||||
    if (!extension)
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    let message = `${error}`;
 | 
			
		||||
    let message = '' + error;
 | 
			
		||||
 | 
			
		||||
    extension.state = ExtensionState.ERROR;
 | 
			
		||||
    if (!extension.errors)
 | 
			
		||||
@@ -169,7 +169,7 @@ function loadExtension(extension) {
 | 
			
		||||
    if (checkVersion && ExtensionUtils.isOutOfDate(extension)) {
 | 
			
		||||
        extension.state = ExtensionState.OUT_OF_DATE;
 | 
			
		||||
    } else {
 | 
			
		||||
        let enabled = enabledExtensions.includes(extension.uuid);
 | 
			
		||||
        let enabled = enabledExtensions.indexOf(extension.uuid) != -1;
 | 
			
		||||
        if (enabled) {
 | 
			
		||||
            if (!initExtension(extension.uuid))
 | 
			
		||||
                return;
 | 
			
		||||
@@ -208,7 +208,7 @@ function reloadExtension(oldExtension) {
 | 
			
		||||
    let newExtension;
 | 
			
		||||
    try {
 | 
			
		||||
        newExtension = ExtensionUtils.createExtensionObject(uuid, dir, type);
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
    } catch(e) {
 | 
			
		||||
        logExtensionError(uuid, e);
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
@@ -235,7 +235,7 @@ function initExtension(uuid) {
 | 
			
		||||
    ExtensionUtils.installImporter(extension);
 | 
			
		||||
    try {
 | 
			
		||||
        extensionModule = extension.imports.extension;
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
    } catch(e) {
 | 
			
		||||
        logExtensionError(uuid, e);
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
@@ -243,7 +243,7 @@ function initExtension(uuid) {
 | 
			
		||||
    if (extensionModule.init) {
 | 
			
		||||
        try {
 | 
			
		||||
            extensionState = extensionModule.init(extension);
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
            logExtensionError(uuid, e);
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
@@ -313,9 +313,9 @@ function _onVersionValidationChanged() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function _loadExtensions() {
 | 
			
		||||
    global.settings.connect(`changed::${ENABLED_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::' + ENABLED_EXTENSIONS_KEY, onEnabledExtensionsChanged);
 | 
			
		||||
    global.settings.connect('changed::' + DISABLE_USER_EXTENSIONS_KEY, onEnabledExtensionsChanged);
 | 
			
		||||
    global.settings.connect('changed::' + EXTENSION_DISABLE_VERSION_CHECK_KEY, _onVersionValidationChanged);
 | 
			
		||||
 | 
			
		||||
    enabledExtensions = getEnabledExtensions();
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -49,15 +49,15 @@ var FocusCaretTracker = class FocusCaretTracker {
 | 
			
		||||
            this._atspiInited = true;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return this._atspiInited;
 | 
			
		||||
	return this._atspiInited;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    registerFocusListener() {
 | 
			
		||||
        if (!this._initAtspi() || this._focusListenerRegistered)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        this._atspiListener.register(`${STATECHANGED}:focused`);
 | 
			
		||||
        this._atspiListener.register(`${STATECHANGED}:selected`);
 | 
			
		||||
        this._atspiListener.register(STATECHANGED + ':focused');
 | 
			
		||||
        this._atspiListener.register(STATECHANGED + ':selected');
 | 
			
		||||
        this._focusListenerRegistered = true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -73,8 +73,8 @@ var FocusCaretTracker = class FocusCaretTracker {
 | 
			
		||||
        if (!this._focusListenerRegistered)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        this._atspiListener.deregister(`${STATECHANGED}:focused`);
 | 
			
		||||
        this._atspiListener.deregister(`${STATECHANGED}:selected`);
 | 
			
		||||
        this._atspiListener.deregister(STATECHANGED + ':focused');
 | 
			
		||||
        this._atspiListener.deregister(STATECHANGED + ':selected');
 | 
			
		||||
        this._focusListenerRegistered = false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -43,9 +43,6 @@ function _popGrabHelper(grabHelper) {
 | 
			
		||||
// call grab().
 | 
			
		||||
var GrabHelper = class GrabHelper {
 | 
			
		||||
    constructor(owner, params) {
 | 
			
		||||
        if (!(owner instanceof Clutter.Actor))
 | 
			
		||||
            throw new Error('GrabHelper owner must be a Clutter.Actor');
 | 
			
		||||
 | 
			
		||||
        this._owner = owner;
 | 
			
		||||
        this._modalParams = params;
 | 
			
		||||
 | 
			
		||||
@@ -87,7 +84,7 @@ var GrabHelper = class GrabHelper {
 | 
			
		||||
    _isWithinGrabbedActor(actor) {
 | 
			
		||||
        let currentActor = this.currentGrab.actor;
 | 
			
		||||
        while (actor) {
 | 
			
		||||
            if (this._actors.includes(actor))
 | 
			
		||||
            if (this._actors.indexOf(actor) != -1)
 | 
			
		||||
                return true;
 | 
			
		||||
            if (actor == currentActor)
 | 
			
		||||
                return true;
 | 
			
		||||
 
 | 
			
		||||
@@ -8,8 +8,8 @@ const Main = imports.ui.main;
 | 
			
		||||
 | 
			
		||||
var MAX_CANDIDATES_PER_PAGE = 16;
 | 
			
		||||
 | 
			
		||||
var DEFAULT_INDEX_LABELS = ['1', '2', '3', '4', '5', '6', '7', '8',
 | 
			
		||||
                            '9', '0', 'a', 'b', 'c', 'd', 'e', 'f'];
 | 
			
		||||
var DEFAULT_INDEX_LABELS = [ '1', '2', '3', '4', '5', '6', '7', '8',
 | 
			
		||||
                             '9', '0', 'a', 'b', 'c', 'd', 'e', 'f' ];
 | 
			
		||||
 | 
			
		||||
var CandidateArea = class CandidateArea {
 | 
			
		||||
    constructor() {
 | 
			
		||||
@@ -37,14 +37,14 @@ var CandidateArea = class CandidateArea {
 | 
			
		||||
 | 
			
		||||
        this.actor.connect('scroll-event', (actor, event) => {
 | 
			
		||||
            let direction = event.get_scroll_direction();
 | 
			
		||||
            switch (direction) {
 | 
			
		||||
            switch(direction) {
 | 
			
		||||
            case Clutter.ScrollDirection.UP:
 | 
			
		||||
                this.emit('cursor-up');
 | 
			
		||||
                break;
 | 
			
		||||
            case Clutter.ScrollDirection.DOWN:
 | 
			
		||||
                this.emit('cursor-down');
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
            };
 | 
			
		||||
            return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
@@ -181,7 +181,7 @@ var CandidatePopup = class CandidatePopup {
 | 
			
		||||
                let window = global.display.focus_window.get_compositor_private();
 | 
			
		||||
                this._setDummyCursorGeometry(window.x + x, window.y + y, w, h);
 | 
			
		||||
            });
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
            // Only recent IBus versions have support for this signal
 | 
			
		||||
            // which is used for wayland clients. In order to work
 | 
			
		||||
            // with older IBus versions we can silently ignore the
 | 
			
		||||
@@ -235,7 +235,7 @@ var CandidatePopup = class CandidatePopup {
 | 
			
		||||
            let indexes = [];
 | 
			
		||||
            let indexLabel;
 | 
			
		||||
            for (let i = 0; (indexLabel = lookupTable.get_label(i)); ++i)
 | 
			
		||||
                indexes.push(indexLabel.get_text());
 | 
			
		||||
                 indexes.push(indexLabel.get_text());
 | 
			
		||||
 | 
			
		||||
            Main.keyboard.resetSuggestions();
 | 
			
		||||
 | 
			
		||||
@@ -272,7 +272,7 @@ var CandidatePopup = class CandidatePopup {
 | 
			
		||||
 | 
			
		||||
    _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);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -285,7 +285,7 @@ var CandidatePopup = class CandidatePopup {
 | 
			
		||||
        if (isVisible) {
 | 
			
		||||
            this._boxPointer.setPosition(Main.layoutManager.dummyCursor, 0);
 | 
			
		||||
            this._boxPointer.open(BoxPointer.PopupAnimation.NONE);
 | 
			
		||||
            this._boxPointer.raise_top();
 | 
			
		||||
            this._boxPointer.actor.raise_top();
 | 
			
		||||
        } else {
 | 
			
		||||
            this._boxPointer.close(BoxPointer.PopupAnimation.NONE);
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -12,11 +12,11 @@ var MIN_ICON_SIZE = 16;
 | 
			
		||||
var EXTRA_SPACE_ANIMATION_TIME = 0.25;
 | 
			
		||||
 | 
			
		||||
var ANIMATION_TIME_IN = 0.350;
 | 
			
		||||
var ANIMATION_TIME_OUT = 1 / 2 * 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_MAX_DELAY_OUT_FOR_ITEM = 2 / 3 * ANIMATION_TIME_OUT;
 | 
			
		||||
var ANIMATION_FADE_IN_TIME_FOR_ITEM = 1 / 4 * 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_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_FADE_IN_TIME_FOR_ITEM = 1/4 * ANIMATION_TIME_IN;
 | 
			
		||||
 | 
			
		||||
var ANIMATION_BOUNCE_ICON_SCALE = 1.1;
 | 
			
		||||
 | 
			
		||||
@@ -43,6 +43,8 @@ class BaseIcon extends St.Bin {
 | 
			
		||||
                      x_fill: true,
 | 
			
		||||
                      y_fill: true });
 | 
			
		||||
 | 
			
		||||
        this.actor = this;
 | 
			
		||||
 | 
			
		||||
        this.connect('destroy', this._onDestroy.bind(this));
 | 
			
		||||
 | 
			
		||||
        this._box = new St.BoxLayout({ vertical: true });
 | 
			
		||||
@@ -79,7 +81,7 @@ class BaseIcon extends St.Bin {
 | 
			
		||||
    // This can be overridden by a subclass, or by the createIcon
 | 
			
		||||
    // parameter to _init()
 | 
			
		||||
    createIcon(size) {
 | 
			
		||||
        throw new GObject.NotImplementedError(`createIcon in ${this.constructor.name}`);
 | 
			
		||||
        throw new Error('no implementation of createIcon in ' + this);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    setIconSize(size) {
 | 
			
		||||
@@ -141,7 +143,7 @@ class BaseIcon extends St.Bin {
 | 
			
		||||
 | 
			
		||||
function clamp(value, min, max) {
 | 
			
		||||
    return Math.max(Math.min(value, max), min);
 | 
			
		||||
}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
function zoomOutActor(actor) {
 | 
			
		||||
    let actorClone = new Clutter.Clone({ source: actor,
 | 
			
		||||
@@ -179,13 +181,15 @@ function zoomOutActor(actor) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var IconGrid = GObject.registerClass({
 | 
			
		||||
    Signals: { 'animation-done': {},
 | 
			
		||||
               'child-focused': { param_types: [Clutter.Actor.$gtype] } },
 | 
			
		||||
    Signals: {'animation-done': {},
 | 
			
		||||
              'child-focused': { param_types: [Clutter.Actor.$gtype]} },
 | 
			
		||||
}, class IconGrid extends St.Widget {
 | 
			
		||||
    _init(params) {
 | 
			
		||||
        super._init({ style_class: 'icon-grid',
 | 
			
		||||
                      y_align: Clutter.ActorAlign.START });
 | 
			
		||||
 | 
			
		||||
        this.actor = this;
 | 
			
		||||
 | 
			
		||||
        params = Params.parse(params, { rowLimit: null,
 | 
			
		||||
                                        columnLimit: null,
 | 
			
		||||
                                        minRows: 1,
 | 
			
		||||
@@ -276,7 +280,7 @@ var IconGrid = GObject.registerClass({
 | 
			
		||||
        if (forWidth < 0)
 | 
			
		||||
            nColumns = children.length;
 | 
			
		||||
        else
 | 
			
		||||
            [nColumns] = this._computeLayout(forWidth);
 | 
			
		||||
            [nColumns, ] = this._computeLayout(forWidth);
 | 
			
		||||
 | 
			
		||||
        let nRows;
 | 
			
		||||
        if (nColumns > 0)
 | 
			
		||||
@@ -311,18 +315,17 @@ var IconGrid = GObject.registerClass({
 | 
			
		||||
        let [nColumns, usedWidth] = this._computeLayout(availWidth);
 | 
			
		||||
 | 
			
		||||
        let leftEmptySpace;
 | 
			
		||||
        switch (this._xAlign) {
 | 
			
		||||
        case St.Align.START:
 | 
			
		||||
            leftEmptySpace = 0;
 | 
			
		||||
            break;
 | 
			
		||||
        case St.Align.MIDDLE:
 | 
			
		||||
            leftEmptySpace = Math.floor((availWidth - usedWidth) / 2);
 | 
			
		||||
            break;
 | 
			
		||||
        case St.Align.END:
 | 
			
		||||
            leftEmptySpace = availWidth - usedWidth;
 | 
			
		||||
        switch(this._xAlign) {
 | 
			
		||||
            case St.Align.START:
 | 
			
		||||
                leftEmptySpace = 0;
 | 
			
		||||
                break;
 | 
			
		||||
            case St.Align.MIDDLE:
 | 
			
		||||
                leftEmptySpace = Math.floor((availWidth - usedWidth) / 2);
 | 
			
		||||
                break;
 | 
			
		||||
            case St.Align.END:
 | 
			
		||||
                leftEmptySpace = availWidth - usedWidth;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let animating = this._clonesAnimating.length > 0;
 | 
			
		||||
        let x = box.x1 + leftEmptySpace + this.leftPadding;
 | 
			
		||||
        let y = box.y1 + this.topPadding;
 | 
			
		||||
        let columnIndex = 0;
 | 
			
		||||
@@ -332,11 +335,10 @@ var IconGrid = GObject.registerClass({
 | 
			
		||||
 | 
			
		||||
            if (this._rowLimit && rowIndex >= this._rowLimit ||
 | 
			
		||||
                this._fillParent && childBox.y2 > availHeight - this.bottomPadding) {
 | 
			
		||||
                children[i].opacity = 0;
 | 
			
		||||
                children[i].hide();
 | 
			
		||||
            } else {
 | 
			
		||||
                if (!animating)
 | 
			
		||||
                    children[i].opacity = 255;
 | 
			
		||||
                children[i].allocate(childBox, flags);
 | 
			
		||||
                children[i].show();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            columnIndex++;
 | 
			
		||||
@@ -377,15 +379,15 @@ var IconGrid = GObject.registerClass({
 | 
			
		||||
            return true;
 | 
			
		||||
 | 
			
		||||
        for (let child = this.get_first_child();
 | 
			
		||||
            child != null;
 | 
			
		||||
            child = child.get_next_sibling()) {
 | 
			
		||||
             child != null;
 | 
			
		||||
             child = child.get_next_sibling()) {
 | 
			
		||||
 | 
			
		||||
            if (!child.visible || !child.opacity)
 | 
			
		||||
            if (!child.visible)
 | 
			
		||||
                continue;
 | 
			
		||||
 | 
			
		||||
            let childVolume = child.get_transformed_paint_volume(this);
 | 
			
		||||
            if (!childVolume)
 | 
			
		||||
                return false;
 | 
			
		||||
                return false
 | 
			
		||||
 | 
			
		||||
            paintVolume.union(childVolume);
 | 
			
		||||
        }
 | 
			
		||||
@@ -402,7 +404,7 @@ var IconGrid = GObject.registerClass({
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _cancelAnimation() {
 | 
			
		||||
        this._clonesAnimating.forEach(clone => clone.destroy());
 | 
			
		||||
        this._clonesAnimating.forEach(clone => { clone.destroy(); });
 | 
			
		||||
        this._clonesAnimating = [];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -418,8 +420,7 @@ var IconGrid = GObject.registerClass({
 | 
			
		||||
 | 
			
		||||
    animatePulse(animationDirection) {
 | 
			
		||||
        if (animationDirection != AnimationDirection.IN)
 | 
			
		||||
            throw new GObject.NotImplementedError("Pulse animation only implements " +
 | 
			
		||||
                                                  "'in' animation direction");
 | 
			
		||||
            throw new Error("Pulse animation only implements 'in' animation direction");
 | 
			
		||||
 | 
			
		||||
        this._cancelAnimation();
 | 
			
		||||
 | 
			
		||||
@@ -445,24 +446,24 @@ var IconGrid = GObject.registerClass({
 | 
			
		||||
            let bounceUpTime = ANIMATION_TIME_IN / 4;
 | 
			
		||||
            let isLastItem = index == actors.length - 1;
 | 
			
		||||
            Tweener.addTween(actor,
 | 
			
		||||
                             { time: bounceUpTime,
 | 
			
		||||
                               transition: 'easeInOutQuad',
 | 
			
		||||
                               delay: delay,
 | 
			
		||||
                               scale_x: ANIMATION_BOUNCE_ICON_SCALE,
 | 
			
		||||
                               scale_y: ANIMATION_BOUNCE_ICON_SCALE,
 | 
			
		||||
                               onComplete: () => {
 | 
			
		||||
                                   Tweener.addTween(actor,
 | 
			
		||||
                                                    { time: ANIMATION_TIME_IN - bounceUpTime,
 | 
			
		||||
                                                      transition: 'easeInOutQuad',
 | 
			
		||||
                                                      scale_x: 1,
 | 
			
		||||
                                                      scale_y: 1,
 | 
			
		||||
                                                      onComplete: () => {
 | 
			
		||||
                                                          if (isLastItem)
 | 
			
		||||
                                                              this._animationDone();
 | 
			
		||||
                                                      }
 | 
			
		||||
                                                    });
 | 
			
		||||
                               }
 | 
			
		||||
                             });
 | 
			
		||||
                            { time: bounceUpTime,
 | 
			
		||||
                              transition: 'easeInOutQuad',
 | 
			
		||||
                              delay: delay,
 | 
			
		||||
                              scale_x: ANIMATION_BOUNCE_ICON_SCALE,
 | 
			
		||||
                              scale_y: ANIMATION_BOUNCE_ICON_SCALE,
 | 
			
		||||
                              onComplete: () => {
 | 
			
		||||
                                  Tweener.addTween(actor,
 | 
			
		||||
                                                   { time: ANIMATION_TIME_IN - bounceUpTime,
 | 
			
		||||
                                                     transition: 'easeInOutQuad',
 | 
			
		||||
                                                     scale_x: 1,
 | 
			
		||||
                                                     scale_y: 1,
 | 
			
		||||
                                                     onComplete: () => {
 | 
			
		||||
                                                        if (isLastItem)
 | 
			
		||||
                                                            this._animationDone();
 | 
			
		||||
                                                    }
 | 
			
		||||
                                                   });
 | 
			
		||||
                              }
 | 
			
		||||
                            });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -504,7 +505,7 @@ var IconGrid = GObject.registerClass({
 | 
			
		||||
            this._clonesAnimating.push(actorClone);
 | 
			
		||||
            Main.uiGroup.add_actor(actorClone);
 | 
			
		||||
 | 
			
		||||
            let [width, height] = this._getAllocatedChildSizeAndSpacing(actor);
 | 
			
		||||
            let [width, height,,] = this._getAllocatedChildSizeAndSpacing(actor);
 | 
			
		||||
            actorClone.set_size(width, height);
 | 
			
		||||
            let scaleX = sourceScaledWidth / width;
 | 
			
		||||
            let scaleY = sourceScaledHeight / height;
 | 
			
		||||
@@ -531,7 +532,7 @@ var IconGrid = GObject.registerClass({
 | 
			
		||||
                                   onComplete: () => {
 | 
			
		||||
                                       if (isLastItem)
 | 
			
		||||
                                           this._animationDone();
 | 
			
		||||
                                   } };
 | 
			
		||||
                                   }};
 | 
			
		||||
                fadeParams = { time: ANIMATION_FADE_IN_TIME_FOR_ITEM,
 | 
			
		||||
                               transition: 'easeInOutQuad',
 | 
			
		||||
                               delay: delay,
 | 
			
		||||
@@ -553,7 +554,7 @@ var IconGrid = GObject.registerClass({
 | 
			
		||||
                                   onComplete: () => {
 | 
			
		||||
                                       if (isLastItem)
 | 
			
		||||
                                           this._animationDone();
 | 
			
		||||
                                   } };
 | 
			
		||||
                                   }};
 | 
			
		||||
                fadeParams = { time: ANIMATION_FADE_IN_TIME_FOR_ITEM,
 | 
			
		||||
                               transition: 'easeInOutQuad',
 | 
			
		||||
                               delay: ANIMATION_TIME_OUT + delay - ANIMATION_FADE_IN_TIME_FOR_ITEM,
 | 
			
		||||
@@ -710,8 +711,8 @@ var IconGrid = GObject.registerClass({
 | 
			
		||||
        if (this._padWithSpacing) {
 | 
			
		||||
            // 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
 | 
			
		||||
            maxVSpacing = Math.floor(maxEmptyVArea / (this._minRows + 1));
 | 
			
		||||
            maxHSpacing = Math.floor(maxEmptyHArea / (this._minColumns + 1));
 | 
			
		||||
            maxVSpacing = Math.floor(maxEmptyVArea / (this._minRows +1));
 | 
			
		||||
            maxHSpacing = Math.floor(maxEmptyHArea / (this._minColumns +1));
 | 
			
		||||
        } else {
 | 
			
		||||
            if (this._minRows <=  1)
 | 
			
		||||
                maxVSpacing = maxEmptyVArea;
 | 
			
		||||
@@ -743,10 +744,11 @@ var IconGrid = GObject.registerClass({
 | 
			
		||||
        this._fixedHItemSize = this._hItemSize;
 | 
			
		||||
        this._fixedVItemSize = this._vItemSize;
 | 
			
		||||
        this._updateSpacingForSize(availWidth, availHeight);
 | 
			
		||||
        let spacing = this._getSpacing();
 | 
			
		||||
 | 
			
		||||
        if (this.columnsForWidth(availWidth) < this._minColumns || this.rowsForHeight(availHeight) < this._minRows) {
 | 
			
		||||
            let neededWidth = this.usedWidthForNColumns(this._minColumns) - availWidth;
 | 
			
		||||
            let neededHeight = this.usedHeightForNRows(this._minRows) - availHeight;
 | 
			
		||||
            let neededWidth = this.usedWidthForNColumns(this._minColumns) - availWidth ;
 | 
			
		||||
            let neededHeight = this.usedHeightForNRows(this._minRows) - availHeight ;
 | 
			
		||||
 | 
			
		||||
            let neededSpacePerItem = (neededWidth > neededHeight) ? Math.ceil(neededWidth / this._minColumns)
 | 
			
		||||
                                                                  : Math.ceil(neededHeight / this._minRows);
 | 
			
		||||
@@ -770,8 +772,8 @@ var IconGrid = GObject.registerClass({
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
var PaginatedIconGrid = GObject.registerClass({
 | 
			
		||||
    Signals: { 'space-opened': {},
 | 
			
		||||
               'space-closed': {} },
 | 
			
		||||
    Signals: {'space-opened': {},
 | 
			
		||||
              'space-closed': {} },
 | 
			
		||||
}, class PaginatedIconGrid extends IconGrid {
 | 
			
		||||
    _init(params) {
 | 
			
		||||
        super._init(params);
 | 
			
		||||
@@ -788,7 +790,7 @@ var PaginatedIconGrid = GObject.registerClass({
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    vfunc_allocate(box, flags) {
 | 
			
		||||
        if (this._childrenPerPage == 0)
 | 
			
		||||
         if (this._childrenPerPage == 0)
 | 
			
		||||
            log('computePages() must be called before allocate(); pagination will not work.');
 | 
			
		||||
 | 
			
		||||
        this.set_allocation(box, flags);
 | 
			
		||||
@@ -801,24 +803,26 @@ var PaginatedIconGrid = GObject.registerClass({
 | 
			
		||||
        }
 | 
			
		||||
        let children = this._getVisibleChildren();
 | 
			
		||||
        let availWidth = box.x2 - box.x1;
 | 
			
		||||
        let availHeight = box.y2 - box.y1;
 | 
			
		||||
        let spacing = this._getSpacing();
 | 
			
		||||
        let [nColumns, usedWidth] = this._computeLayout(availWidth);
 | 
			
		||||
 | 
			
		||||
        let leftEmptySpace;
 | 
			
		||||
        switch (this._xAlign) {
 | 
			
		||||
        case St.Align.START:
 | 
			
		||||
            leftEmptySpace = 0;
 | 
			
		||||
            break;
 | 
			
		||||
        case St.Align.MIDDLE:
 | 
			
		||||
            leftEmptySpace = Math.floor((availWidth - usedWidth) / 2);
 | 
			
		||||
            break;
 | 
			
		||||
        case St.Align.END:
 | 
			
		||||
            leftEmptySpace = availWidth - usedWidth;
 | 
			
		||||
        switch(this._xAlign) {
 | 
			
		||||
            case St.Align.START:
 | 
			
		||||
                leftEmptySpace = 0;
 | 
			
		||||
                break;
 | 
			
		||||
            case St.Align.MIDDLE:
 | 
			
		||||
                leftEmptySpace = Math.floor((availWidth - usedWidth) / 2);
 | 
			
		||||
                break;
 | 
			
		||||
            case St.Align.END:
 | 
			
		||||
                leftEmptySpace = availWidth - usedWidth;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let x = box.x1 + leftEmptySpace + this.leftPadding;
 | 
			
		||||
        let y = box.y1 + this.topPadding;
 | 
			
		||||
        let columnIndex = 0;
 | 
			
		||||
        let rowIndex = 0;
 | 
			
		||||
 | 
			
		||||
        for (let i = 0; i < children.length; i++) {
 | 
			
		||||
            let childBox = this._calculateChildBox(children[i], x, y, box);
 | 
			
		||||
@@ -828,19 +832,19 @@ var PaginatedIconGrid = GObject.registerClass({
 | 
			
		||||
            columnIndex++;
 | 
			
		||||
            if (columnIndex == nColumns) {
 | 
			
		||||
                columnIndex = 0;
 | 
			
		||||
                rowIndex++;
 | 
			
		||||
            }
 | 
			
		||||
            if (columnIndex == 0) {
 | 
			
		||||
                y += this._getVItemSize() + spacing;
 | 
			
		||||
                if ((i + 1) % this._childrenPerPage == 0)
 | 
			
		||||
                    y +=  this._spaceBetweenPages - spacing + this.bottomPadding + this.topPadding;
 | 
			
		||||
                x = box.x1 + leftEmptySpace + this.leftPadding;
 | 
			
		||||
            } else {
 | 
			
		||||
            } else
 | 
			
		||||
                x += this._getHItemSize() + spacing;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Overridden from IconGrid
 | 
			
		||||
    // Overriden from IconGrid
 | 
			
		||||
    _getChildrenToAnimate() {
 | 
			
		||||
        let children = this._getVisibleChildren();
 | 
			
		||||
        let firstIndex = this._childrenPerPage * this.currentPage;
 | 
			
		||||
@@ -860,6 +864,7 @@ var PaginatedIconGrid = GObject.registerClass({
 | 
			
		||||
        if (this._rowLimit)
 | 
			
		||||
            nRows = Math.min(nRows, this._rowLimit);
 | 
			
		||||
 | 
			
		||||
        let spacing = this._getSpacing();
 | 
			
		||||
        // We want to contain the grid inside the parent box with padding
 | 
			
		||||
        this._rowsPerPage = this.rowsForHeight(availHeightPerPage);
 | 
			
		||||
        this._nPages = Math.ceil(nRows / this._rowsPerPage);
 | 
			
		||||
@@ -888,7 +893,7 @@ var PaginatedIconGrid = GObject.registerClass({
 | 
			
		||||
        if (!this._nPages)
 | 
			
		||||
            return 0;
 | 
			
		||||
 | 
			
		||||
        let firstPageItem = pageNumber * this._childrenPerPage;
 | 
			
		||||
        let firstPageItem = pageNumber * this._childrenPerPage
 | 
			
		||||
        let childBox = this._getVisibleChildren()[firstPageItem].get_allocation_box();
 | 
			
		||||
        return childBox.y1 - this.topPadding;
 | 
			
		||||
    }
 | 
			
		||||
@@ -967,7 +972,7 @@ var PaginatedIconGrid = GObject.registerClass({
 | 
			
		||||
                           transition: 'easeInOutQuad'
 | 
			
		||||
                         };
 | 
			
		||||
            if (i == (children.length - 1))
 | 
			
		||||
                params.onComplete = () => this.emit('space-opened');
 | 
			
		||||
                params.onComplete = () => { this.emit('space-opened'); };
 | 
			
		||||
            Tweener.addTween(children[i], params);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -985,7 +990,7 @@ var PaginatedIconGrid = GObject.registerClass({
 | 
			
		||||
                             { translation_y: 0,
 | 
			
		||||
                               time: EXTRA_SPACE_ANIMATION_TIME,
 | 
			
		||||
                               transition: 'easeInOutQuad',
 | 
			
		||||
                               onComplete: () => this.emit('space-closed')
 | 
			
		||||
                               onComplete: () => { this.emit('space-closed'); }
 | 
			
		||||
                             });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -111,7 +111,7 @@ var InhibitShortcutsDialog = GObject.registerClass({
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -24,29 +24,29 @@ const SHOW_KEYBOARD = 'screen-keyboard-enabled';
 | 
			
		||||
const KEY_SIZE = 2;
 | 
			
		||||
 | 
			
		||||
const defaultKeysPre = [
 | 
			
		||||
    [[], [], [{ 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 }]],
 | 
			
		||||
    [[], [], [{ 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 }]],
 | 
			
		||||
    [ [], [], [{ 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 }] ],
 | 
			
		||||
    [ [], [], [{ 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 }] ],
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
const defaultKeysPost = [
 | 
			
		||||
    [[{ label: '⌫', width: 1.5, keyval: Clutter.KEY_BackSpace }],
 | 
			
		||||
     [{ width: 2, keyval: Clutter.KEY_Return, extraClassName: 'enter-key' }],
 | 
			
		||||
     [{ width: 3, level: 1, right: true, extraClassName: 'shift-key-lowercase' }],
 | 
			
		||||
     [{ label: '☻', action: 'emoji' }, { action: 'languageMenu', extraClassName: 'layout-key' }, { action: 'hide', extraClassName: 'hide-key' }]],
 | 
			
		||||
    [[{ label: '⌫', width: 1.5, keyval: Clutter.KEY_BackSpace }],
 | 
			
		||||
     [{ width: 2, keyval: Clutter.KEY_Return, extraClassName: 'enter-key' }],
 | 
			
		||||
     [{ width: 3, level: 0, right: true, extraClassName: 'shift-key-uppercase' }],
 | 
			
		||||
     [{ label: '☻', action: 'emoji' }, { action: 'languageMenu', extraClassName: 'layout-key' }, { action: 'hide', extraClassName: 'hide-key' }]],
 | 
			
		||||
    [[{ label: '⌫', width: 1.5, keyval: Clutter.KEY_BackSpace }],
 | 
			
		||||
     [{ width: 2, keyval: Clutter.KEY_Return, extraClassName: 'enter-key' }],
 | 
			
		||||
     [{ label: '=/<', width: 3, level: 3, right: true }],
 | 
			
		||||
     [{ label: '☻', action: 'emoji' }, { action: 'languageMenu', extraClassName: 'layout-key' }, { action: 'hide', extraClassName: 'hide-key' }]],
 | 
			
		||||
    [[{ label: '⌫', width: 1.5, keyval: Clutter.KEY_BackSpace }],
 | 
			
		||||
     [{ width: 2, keyval: Clutter.KEY_Return, extraClassName: 'enter-key' }],
 | 
			
		||||
     [{ label: '?123', width: 3, level: 2, right: true }],
 | 
			
		||||
     [{ label: '☻', action: 'emoji' }, { action: 'languageMenu', extraClassName: 'layout-key' }, { action: 'hide', extraClassName: 'hide-key' }]],
 | 
			
		||||
    [ [{ label: '⌫', width: 1.5, keyval: Clutter.KEY_BackSpace }],
 | 
			
		||||
      [{ width: 2, keyval: Clutter.KEY_Return, extraClassName: 'enter-key' }],
 | 
			
		||||
      [{ width: 3, level: 1, right: true, extraClassName: 'shift-key-lowercase' }],
 | 
			
		||||
      [{ label: '☻', action: 'emoji' }, { action: 'languageMenu', extraClassName: 'layout-key' }, { action: 'hide', extraClassName: 'hide-key' }] ],
 | 
			
		||||
    [ [{ label: '⌫', width: 1.5, keyval: Clutter.KEY_BackSpace }],
 | 
			
		||||
      [{ width: 2, keyval: Clutter.KEY_Return, extraClassName: 'enter-key' }],
 | 
			
		||||
      [{ width: 3, level: 0, right: true, extraClassName: 'shift-key-uppercase' }],
 | 
			
		||||
      [{ label: '☻', action: 'emoji' }, { action: 'languageMenu', extraClassName: 'layout-key' }, { action: 'hide', extraClassName: 'hide-key' }] ],
 | 
			
		||||
    [ [{ label: '⌫', width: 1.5, keyval: Clutter.KEY_BackSpace }],
 | 
			
		||||
      [{ width: 2, keyval: Clutter.KEY_Return, extraClassName: 'enter-key' }],
 | 
			
		||||
      [{ label: '=/<', width: 3, level: 3, right: true }],
 | 
			
		||||
      [{ label: '☻', action: 'emoji' }, { action: 'languageMenu', extraClassName: 'layout-key' }, { action: 'hide', extraClassName: 'hide-key' }] ],
 | 
			
		||||
    [ [{ label: '⌫', width: 1.5, keyval: Clutter.KEY_BackSpace }],
 | 
			
		||||
      [{ width: 2, keyval: Clutter.KEY_Return, extraClassName: 'enter-key' }],
 | 
			
		||||
      [{ label: '?123', width: 3, level: 2, right: true }],
 | 
			
		||||
      [{ label: '☻', action: 'emoji' }, { action: 'languageMenu', extraClassName: 'layout-key' }, { action: 'hide', extraClassName: 'hide-key' }] ],
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
var AspectContainer = GObject.registerClass(
 | 
			
		||||
@@ -282,11 +282,11 @@ var Key = class Key {
 | 
			
		||||
                                                       y_fill: true,
 | 
			
		||||
                                                       x_align: St.Align.START });
 | 
			
		||||
        this._boxPointer.hide();
 | 
			
		||||
        Main.layoutManager.addTopChrome(this._boxPointer);
 | 
			
		||||
        Main.layoutManager.addChrome(this._boxPointer.actor);
 | 
			
		||||
        this._boxPointer.setPosition(this.keyButton, 0.5);
 | 
			
		||||
 | 
			
		||||
        // 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.keyButton._extended_keys = this._extended_keyboard;
 | 
			
		||||
    }
 | 
			
		||||
@@ -297,7 +297,7 @@ var Key = class Key {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _press(key) {
 | 
			
		||||
        this.emit('activated');
 | 
			
		||||
        this.emit('activated')
 | 
			
		||||
 | 
			
		||||
        if (key != this.key || this._extended_keys.length == 0) {
 | 
			
		||||
            this.emit('pressed', this._getKeyval(key), key);
 | 
			
		||||
@@ -405,6 +405,9 @@ var Key = class Key {
 | 
			
		||||
            return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
        });
 | 
			
		||||
        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 do get emulated pointer events, which already works
 | 
			
		||||
            // for single-touch cases. Besides, the X11 passive touch grab
 | 
			
		||||
@@ -680,7 +683,7 @@ var EmojiPager = class EmojiPager {
 | 
			
		||||
 | 
			
		||||
    _onPanEnd() {
 | 
			
		||||
        if (Math.abs(this._delta) < this.actor.width * PANEL_SWITCH_RELATIVE_DISTANCE) {
 | 
			
		||||
            this._onPanCancel();
 | 
			
		||||
            this._onPanCancel()
 | 
			
		||||
        } else {
 | 
			
		||||
            let value;
 | 
			
		||||
            if (this._delta > 0)
 | 
			
		||||
@@ -862,7 +865,7 @@ var EmojiSelection = class EmojiSelection {
 | 
			
		||||
                                        x_expand: true,
 | 
			
		||||
                                        y_expand: 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.connect('page-changed', (pager, section, page, nPages) => {
 | 
			
		||||
@@ -910,6 +913,7 @@ var EmojiSelection = class EmojiSelection {
 | 
			
		||||
            contents = imports.byteArray.toString(contents);
 | 
			
		||||
        let emoji = JSON.parse(contents);
 | 
			
		||||
 | 
			
		||||
        let pages = [];
 | 
			
		||||
        let variants = [];
 | 
			
		||||
        let currentKey = 0;
 | 
			
		||||
        let currentSection = null;
 | 
			
		||||
@@ -944,14 +948,14 @@ var EmojiSelection = class EmojiSelection {
 | 
			
		||||
 | 
			
		||||
        key = new Key('ABC', []);
 | 
			
		||||
        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);
 | 
			
		||||
 | 
			
		||||
        for (let i = 0; i < this._sections.length; i++) {
 | 
			
		||||
            let section = this._sections[i];
 | 
			
		||||
 | 
			
		||||
            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);
 | 
			
		||||
 | 
			
		||||
            section.button = key;
 | 
			
		||||
@@ -1045,7 +1049,7 @@ var Keyboard = class Keyboard {
 | 
			
		||||
        this._a11yApplicationsSettings.connect('changed', this._syncEnabled.bind(this));
 | 
			
		||||
        this._lastDeviceId = null;
 | 
			
		||||
        this._suggestions = null;
 | 
			
		||||
        this._emojiKeyVisible = Meta.is_wayland_compositor();
 | 
			
		||||
        this._emojiKeyVisible = true;
 | 
			
		||||
 | 
			
		||||
        this._focusTracker = new FocusTracker();
 | 
			
		||||
        this._focusTracker.connect('position-changed', this._onFocusPositionChanged.bind(this));
 | 
			
		||||
@@ -1070,7 +1074,7 @@ var Keyboard = class Keyboard {
 | 
			
		||||
                let manager = Clutter.DeviceManager.get_default();
 | 
			
		||||
                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._syncEnabled();
 | 
			
		||||
                }
 | 
			
		||||
@@ -1140,7 +1144,6 @@ var Keyboard = class Keyboard {
 | 
			
		||||
            this._keyboardController.disconnect(this._keypadVisibleId);
 | 
			
		||||
        if (this._focusNotifyId)
 | 
			
		||||
            global.stage.disconnect(this._focusNotifyId);
 | 
			
		||||
        this._clearShowIdle();
 | 
			
		||||
        this._keyboard = null;
 | 
			
		||||
        this.actor.destroy();
 | 
			
		||||
        this.actor = null;
 | 
			
		||||
@@ -1159,7 +1162,7 @@ var Keyboard = class Keyboard {
 | 
			
		||||
        this._keyboardController = new KeyboardController();
 | 
			
		||||
 | 
			
		||||
        this._groups = {};
 | 
			
		||||
        this._currentPage = null;
 | 
			
		||||
        this._current_page = null;
 | 
			
		||||
 | 
			
		||||
        this._suggestions = new Suggestions();
 | 
			
		||||
        this.actor.add(this._suggestions.actor,
 | 
			
		||||
@@ -1171,7 +1174,7 @@ var Keyboard = class Keyboard {
 | 
			
		||||
 | 
			
		||||
        this._emojiSelection = new EmojiSelection();
 | 
			
		||||
        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._keyboardController.commitString(emoji);
 | 
			
		||||
        });
 | 
			
		||||
@@ -1199,12 +1202,10 @@ var Keyboard = class Keyboard {
 | 
			
		||||
        this._keyboardNotifyId = this._keyboardController.connect('active-group', this._onGroupChanged.bind(this));
 | 
			
		||||
        this._keyboardGroupsChangedId = this._keyboardController.connect('groups-changed', this._onKeyboardGroupsChanged.bind(this));
 | 
			
		||||
        this._keyboardStateId = this._keyboardController.connect('panel-state', this._onKeyboardStateChanged.bind(this));
 | 
			
		||||
        this._emojiKeyVisibleId = this._keyboardController.connect('emoji-visible', this._onEmojiKeyVisible.bind(this));
 | 
			
		||||
        this._keypadVisibleId = this._keyboardController.connect('keypad-visible', this._onKeypadVisible.bind(this));
 | 
			
		||||
        this._focusNotifyId = global.stage.connect('notify::key-focus', this._onKeyFocusChanged.bind(this));
 | 
			
		||||
 | 
			
		||||
        if (Meta.is_wayland_compositor())
 | 
			
		||||
            this._emojiKeyVisibleId = this._keyboardController.connect('emoji-visible', this._onEmojiKeyVisible.bind(this));
 | 
			
		||||
 | 
			
		||||
        this._relayout();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -1224,12 +1225,11 @@ var Keyboard = class Keyboard {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (!this._showIdleId) {
 | 
			
		||||
            this._showIdleId = GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => {
 | 
			
		||||
                this.show(Main.layoutManager.focusIndex);
 | 
			
		||||
                this._showIdleId = 0;
 | 
			
		||||
                return GLib.SOURCE_REMOVE;
 | 
			
		||||
            });
 | 
			
		||||
            GLib.Source.set_name_by_id(this._showIdleId, '[gnome-shell] this.show');
 | 
			
		||||
          this._showIdleId = GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => {
 | 
			
		||||
              this.show(Main.layoutManager.focusIndex);
 | 
			
		||||
              return GLib.SOURCE_REMOVE;
 | 
			
		||||
          });
 | 
			
		||||
          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 = new LanguageSelectionPopup(keyActor);
 | 
			
		||||
        Main.layoutManager.addTopChrome(this._languagePopup.actor);
 | 
			
		||||
        Main.layoutManager.addChrome(this._languagePopup.actor);
 | 
			
		||||
        this._languagePopup.open(true);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -1353,7 +1353,7 @@ var Keyboard = class Keyboard {
 | 
			
		||||
            } else if (switchToLevel == 1) {
 | 
			
		||||
                extraButton.connect('long-press', () => {
 | 
			
		||||
                    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() {
 | 
			
		||||
        if (this._currentPage)
 | 
			
		||||
            this._currentPage.visible = !this._emojiActive && !this._keypadVisible;
 | 
			
		||||
        if (this._current_page)
 | 
			
		||||
            this._current_page.visible = !this._emojiActive && !this._keypadVisible;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _setEmojiActive(active) {
 | 
			
		||||
@@ -1402,6 +1402,8 @@ var Keyboard = class Keyboard {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _getDefaultKeysForRow(row, numRows, level) {
 | 
			
		||||
        let pre, post;
 | 
			
		||||
 | 
			
		||||
        /* The first 2 rows in defaultKeysPre/Post belong together with
 | 
			
		||||
         * the first 2 rows on each keymap. On keymaps that have more than
 | 
			
		||||
         * 4 rows, the last 2 default key rows must be respectively
 | 
			
		||||
@@ -1438,12 +1440,12 @@ var Keyboard = class Keyboard {
 | 
			
		||||
 | 
			
		||||
    _getGridSlots() {
 | 
			
		||||
        let numOfHorizSlots = 0, numOfVertSlots;
 | 
			
		||||
        let rows = this._currentPage.get_children();
 | 
			
		||||
        let rows = this._current_page.get_children();
 | 
			
		||||
        numOfVertSlots = rows.length;
 | 
			
		||||
 | 
			
		||||
        for (let i = 0; i < rows.length; ++i) {
 | 
			
		||||
            let keyboardRow = rows[i];
 | 
			
		||||
            let keys = keyboardRow.get_children();
 | 
			
		||||
            let keyboard_row = rows[i];
 | 
			
		||||
            let keys = keyboard_row.get_children();
 | 
			
		||||
 | 
			
		||||
            numOfHorizSlots = Math.max(numOfHorizSlots, keys.length);
 | 
			
		||||
        }
 | 
			
		||||
@@ -1468,12 +1470,7 @@ var Keyboard = class Keyboard {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _onKeyboardGroupsChanged(keyboard) {
 | 
			
		||||
        let nonGroupActors = [this._emojiSelection.actor, this._keypad.actor];
 | 
			
		||||
        this._aspectContainer.get_children().filter(c => !nonGroupActors.includes(c)).forEach(c => {
 | 
			
		||||
            c.destroy();
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        this._groups = {};
 | 
			
		||||
        this._groups = [];
 | 
			
		||||
        this._onGroupChanged();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -1515,24 +1512,13 @@ var Keyboard = class Keyboard {
 | 
			
		||||
    _setActiveLayer(activeLevel) {
 | 
			
		||||
        let activeGroupName = this._keyboardController.getCurrentGroup();
 | 
			
		||||
        let layers = this._groups[activeGroupName];
 | 
			
		||||
        let currentPage = layers[activeLevel];
 | 
			
		||||
 | 
			
		||||
        if (this._currentPage == currentPage) {
 | 
			
		||||
            this._updateCurrentPageVisible();
 | 
			
		||||
            return;
 | 
			
		||||
        if (this._current_page != null) {
 | 
			
		||||
            this._setCurrentLevelLatched(this._current_page, false);
 | 
			
		||||
            this._current_page.hide();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (this._currentPage != null) {
 | 
			
		||||
            this._setCurrentLevelLatched(this._currentPage, false);
 | 
			
		||||
            this._currentPage.disconnect(this._currentPage._destroyID);
 | 
			
		||||
            this._currentPage.hide();
 | 
			
		||||
            delete this._currentPage._destroyID;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._currentPage = currentPage;
 | 
			
		||||
        this._currentPage._destroyID = this._currentPage.connect('destroy', () => {
 | 
			
		||||
            this._currentPage = null;
 | 
			
		||||
        });
 | 
			
		||||
        this._current_page = layers[activeLevel];
 | 
			
		||||
        this._updateCurrentPageVisible();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -1620,6 +1606,18 @@ var Keyboard = class Keyboard {
 | 
			
		||||
        this.setCursorLocation(null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _hideSubkeys() {
 | 
			
		||||
        if (this._subkeysBoxPointer) {
 | 
			
		||||
            this._subkeysBoxPointer.hide(BoxPointer.PopupAnimation.FULL);
 | 
			
		||||
            this._subkeysBoxPointer = null;
 | 
			
		||||
        }
 | 
			
		||||
        if (this._capturedEventId) {
 | 
			
		||||
            this.actor.disconnect(this._capturedEventId);
 | 
			
		||||
            this._capturedEventId = 0;
 | 
			
		||||
        }
 | 
			
		||||
        this._capturedPress = false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    resetSuggestions() {
 | 
			
		||||
        if (this._suggestions)
 | 
			
		||||
            this._suggestions.clear();
 | 
			
		||||
@@ -1640,7 +1638,8 @@ var Keyboard = class Keyboard {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _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();
 | 
			
		||||
        frameRect.y += delta;
 | 
			
		||||
        window.move_frame(true, frameRect.x, frameRect.y);
 | 
			
		||||
@@ -1681,11 +1680,12 @@ var Keyboard = class Keyboard {
 | 
			
		||||
        this._animFocusedWindow = window;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    setCursorLocation(window, x, y, w, h) {
 | 
			
		||||
    setCursorLocation(window, x, y , w, h) {
 | 
			
		||||
        let monitor = Main.layoutManager.keyboardMonitor;
 | 
			
		||||
 | 
			
		||||
        if (window && monitor) {
 | 
			
		||||
            let keyboardHeight = Main.layoutManager.keyboardBox.height;
 | 
			
		||||
            let focusObscured = false;
 | 
			
		||||
 | 
			
		||||
            if (y + h >= monitor.y + monitor.height - keyboardHeight) {
 | 
			
		||||
                if (this._keyboardVisible)
 | 
			
		||||
@@ -1736,6 +1736,7 @@ var KeyboardController = class {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _onContentPurposeHintsChanged(method) {
 | 
			
		||||
        let hints = method.content_hints;
 | 
			
		||||
        let purpose = method.content_purpose;
 | 
			
		||||
        let emojiVisible = false;
 | 
			
		||||
        let keypadVisible = false;
 | 
			
		||||
@@ -1750,13 +1751,13 @@ var KeyboardController = class {
 | 
			
		||||
            purpose == Clutter.InputContentPurpose.PHONE)
 | 
			
		||||
            keypadVisible = true;
 | 
			
		||||
 | 
			
		||||
        this.emit('emoji-visible', emojiVisible);
 | 
			
		||||
        this.emit('emoji-visible', emojiVisible)
 | 
			
		||||
        this.emit('keypad-visible', keypadVisible);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    getGroups() {
 | 
			
		||||
        let inputSources = this._inputSourceManager.inputSources;
 | 
			
		||||
        let groups = [];
 | 
			
		||||
        let groups = []
 | 
			
		||||
 | 
			
		||||
        for (let i in inputSources) {
 | 
			
		||||
            let is = inputSources[i];
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										120
									
								
								js/ui/layout.js
									
									
									
									
									
								
							
							
						
						@@ -11,7 +11,6 @@ const DND = imports.ui.dnd;
 | 
			
		||||
const Main = imports.ui.main;
 | 
			
		||||
const Params = imports.misc.params;
 | 
			
		||||
const Tweener = imports.ui.tweener;
 | 
			
		||||
const Ripples = imports.ui.ripples;
 | 
			
		||||
 | 
			
		||||
var STARTUP_ANIMATION_TIME = 0.5;
 | 
			
		||||
var KEYBOARD_ANIMATION_TIME = 0.15;
 | 
			
		||||
@@ -21,7 +20,7 @@ var HOT_CORNER_PRESSURE_THRESHOLD = 100; // pixels
 | 
			
		||||
var HOT_CORNER_PRESSURE_TIMEOUT = 1000; // ms
 | 
			
		||||
 | 
			
		||||
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.POPUP_MENU:
 | 
			
		||||
    case Meta.WindowType.COMBO:
 | 
			
		||||
@@ -32,20 +31,18 @@ function isPopupMetaWindow(actor) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var MonitorConstraint = GObject.registerClass({
 | 
			
		||||
    Properties: {
 | 
			
		||||
        'primary': GObject.ParamSpec.boolean('primary',
 | 
			
		||||
                                             'Primary', 'Track primary monitor',
 | 
			
		||||
                                             GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE,
 | 
			
		||||
                                             false),
 | 
			
		||||
        'index': GObject.ParamSpec.int('index',
 | 
			
		||||
                                       'Monitor index', 'Track specific monitor',
 | 
			
		||||
                                       GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE,
 | 
			
		||||
                                       -1, 64, -1),
 | 
			
		||||
        'work-area': GObject.ParamSpec.boolean('work-area',
 | 
			
		||||
                                               'Work-area', 'Track monitor\'s work-area',
 | 
			
		||||
                                               GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE,
 | 
			
		||||
                                               false)
 | 
			
		||||
    },
 | 
			
		||||
    Properties: {'primary': GObject.ParamSpec.boolean('primary', 
 | 
			
		||||
                                                      'Primary', 'Track primary monitor',
 | 
			
		||||
                                                      GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE,
 | 
			
		||||
                                                      false),
 | 
			
		||||
                 'index': GObject.ParamSpec.int('index',
 | 
			
		||||
                                                'Monitor index', 'Track specific monitor',
 | 
			
		||||
                                                GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE,
 | 
			
		||||
                                                -1, 64, -1),
 | 
			
		||||
                 'work-area': GObject.ParamSpec.boolean('work-area',
 | 
			
		||||
                                                        'Work-area', 'Track monitor\'s work-area',
 | 
			
		||||
                                                        GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE,
 | 
			
		||||
                                                        false)},
 | 
			
		||||
}, class MonitorConstraint extends Clutter.Constraint {
 | 
			
		||||
    _init(props) {
 | 
			
		||||
        this._primary = false;
 | 
			
		||||
@@ -149,13 +146,13 @@ var MonitorConstraint = GObject.registerClass({
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
var Monitor = class Monitor {
 | 
			
		||||
    constructor(index, geometry, geometryScale) {
 | 
			
		||||
    constructor(index, geometry, geometry_scale) {
 | 
			
		||||
        this.index = index;
 | 
			
		||||
        this.x = geometry.x;
 | 
			
		||||
        this.y = geometry.y;
 | 
			
		||||
        this.width = geometry.width;
 | 
			
		||||
        this.height = geometry.height;
 | 
			
		||||
        this.geometry_scale = geometryScale;
 | 
			
		||||
        this.geometry_scale = geometry_scale;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get inFullscreen() {
 | 
			
		||||
@@ -219,17 +216,10 @@ var LayoutManager = GObject.registerClass({
 | 
			
		||||
        this.uiGroup = new UiActor({ name: 'uiGroup' });
 | 
			
		||||
        this.uiGroup.set_flags(Clutter.ActorFlags.NO_LAYOUT);
 | 
			
		||||
 | 
			
		||||
        global.stage.add_child(this.uiGroup);
 | 
			
		||||
 | 
			
		||||
        global.stage.remove_actor(global.window_group);
 | 
			
		||||
        this.uiGroup.add_actor(global.window_group);
 | 
			
		||||
 | 
			
		||||
        // Using addChrome() to add actors to uiGroup will position actors
 | 
			
		||||
        // underneath the top_window_group.
 | 
			
		||||
        // To insert actors at the top of uiGroup, we use addTopChrome() or
 | 
			
		||||
        // add the actor directly using uiGroup.add_actor().
 | 
			
		||||
        global.stage.remove_actor(global.top_window_group);
 | 
			
		||||
        this.uiGroup.add_actor(global.top_window_group);
 | 
			
		||||
        global.stage.add_child(this.uiGroup);
 | 
			
		||||
 | 
			
		||||
        this.overviewGroup = new St.Widget({ name: 'overviewGroup',
 | 
			
		||||
                                             visible: false,
 | 
			
		||||
@@ -257,7 +247,7 @@ var LayoutManager = GObject.registerClass({
 | 
			
		||||
        this.keyboardBox = new St.BoxLayout({ name: 'keyboardBox',
 | 
			
		||||
                                              reactive: true,
 | 
			
		||||
                                              track_hover: true });
 | 
			
		||||
        this.addTopChrome(this.keyboardBox);
 | 
			
		||||
        this.addChrome(this.keyboardBox);
 | 
			
		||||
        this._keyboardHeightNotifyId = 0;
 | 
			
		||||
 | 
			
		||||
        // 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.uiGroup.add_actor(this.dummyCursor);
 | 
			
		||||
 | 
			
		||||
        global.stage.remove_actor(global.top_window_group);
 | 
			
		||||
        this.uiGroup.add_actor(global.top_window_group);
 | 
			
		||||
 | 
			
		||||
        let feedbackGroup = Meta.get_feedback_group_for_display(global.display);
 | 
			
		||||
        global.stage.remove_actor(feedbackGroup);
 | 
			
		||||
        this.uiGroup.add_actor(feedbackGroup);
 | 
			
		||||
@@ -809,16 +802,6 @@ var LayoutManager = GObject.registerClass({
 | 
			
		||||
        this._trackActor(actor, params);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // addTopChrome:
 | 
			
		||||
    // @actor: an actor to add to the chrome
 | 
			
		||||
    // @params: (optional) additional params
 | 
			
		||||
    //
 | 
			
		||||
    // Like addChrome(), but adds @actor above all windows, including popups.
 | 
			
		||||
    addTopChrome(actor, params) {
 | 
			
		||||
        this.uiGroup.add_actor(actor);
 | 
			
		||||
        this._trackActor(actor, params);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // trackChrome:
 | 
			
		||||
    // @actor: a descendant of the chrome to begin tracking
 | 
			
		||||
    // @params: parameters describing how to track @actor
 | 
			
		||||
@@ -1069,13 +1052,14 @@ var LayoutManager = GObject.registerClass({
 | 
			
		||||
                else
 | 
			
		||||
                    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 });
 | 
			
		||||
                struts.push(strut);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        global.set_stage_input_region(rects);
 | 
			
		||||
        if (!Meta.is_wayland_compositor())
 | 
			
		||||
            global.set_stage_input_region(rects);
 | 
			
		||||
        this._isPopupWindowVisible = isPopupMenuVisible;
 | 
			
		||||
 | 
			
		||||
        let workspaceManager = global.workspace_manager;
 | 
			
		||||
@@ -1120,15 +1104,14 @@ var HotCorner = class HotCorner {
 | 
			
		||||
                                                    Shell.ActionMode.OVERVIEW);
 | 
			
		||||
        this._pressureBarrier.connect('trigger', this._toggleOverview.bind(this));
 | 
			
		||||
 | 
			
		||||
        let px = 0.0;
 | 
			
		||||
        let py = 0.0;
 | 
			
		||||
        if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) {
 | 
			
		||||
            px = 1.0;
 | 
			
		||||
            py = 0.0;
 | 
			
		||||
        }
 | 
			
		||||
        // Cache the three ripples instead of dynamically creating and destroying them.
 | 
			
		||||
        this._ripple1 = new St.BoxLayout({ style_class: 'ripple-box', opacity: 0, visible: false });
 | 
			
		||||
        this._ripple2 = new St.BoxLayout({ style_class: 'ripple-box', opacity: 0, visible: false });
 | 
			
		||||
        this._ripple3 = new St.BoxLayout({ style_class: 'ripple-box', opacity: 0, visible: false });
 | 
			
		||||
 | 
			
		||||
        this._ripples = new Ripples.Ripples(px, py, 'ripple-box');
 | 
			
		||||
        this._ripples.addTo(layoutManager.uiGroup);
 | 
			
		||||
        layoutManager.uiGroup.add_actor(this._ripple1);
 | 
			
		||||
        layoutManager.uiGroup.add_actor(this._ripple2);
 | 
			
		||||
        layoutManager.uiGroup.add_actor(this._ripple3);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    setBarrierSize(size) {
 | 
			
		||||
@@ -1210,12 +1193,53 @@ var HotCorner = class HotCorner {
 | 
			
		||||
            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() {
 | 
			
		||||
        if (this._monitor.inFullscreen && !Main.overview.visible)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        if (Main.overview.shouldToggleByCornerOrButton()) {
 | 
			
		||||
            this._ripples.playAnimation(this._x, this._y);
 | 
			
		||||
            this._rippleAnimation();
 | 
			
		||||
            Main.overview.toggle();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@ const Params = imports.misc.params;
 | 
			
		||||
const Tweener = imports.ui.tweener;
 | 
			
		||||
 | 
			
		||||
var DEFAULT_FADE_FACTOR = 0.4;
 | 
			
		||||
var VIGNETTE_BRIGHTNESS = 0.2;
 | 
			
		||||
var VIGNETTE_BRIGHTNESS = 0.8;
 | 
			
		||||
var VIGNETTE_SHARPNESS = 0.7;
 | 
			
		||||
 | 
			
		||||
const VIGNETTE_DECLARATIONS = '\
 | 
			
		||||
 
 | 
			
		||||
@@ -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);
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
@@ -68,10 +68,10 @@ var AutoComplete = class AutoComplete {
 | 
			
		||||
            if (commonPrefix.length > 0) {
 | 
			
		||||
                this.additionalCompletionText(commonPrefix, event.attrHead);
 | 
			
		||||
                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') {
 | 
			
		||||
            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 });
 | 
			
		||||
 | 
			
		||||
        let vAdjust = scrollview.vscroll.adjustment;
 | 
			
		||||
        vAdjust.connect('changed', () => this._onAdjustScopeChanged(tabData));
 | 
			
		||||
        vAdjust.connect('notify::value', () => this._onAdjustValueChanged(tabData));
 | 
			
		||||
        vAdjust.connect('changed', () => { this._onAdjustScopeChanged(tabData); });
 | 
			
		||||
        vAdjust.connect('notify::value', () => { this._onAdjustValueChanged(tabData); });
 | 
			
		||||
 | 
			
		||||
        if (this._selectedIndex == -1)
 | 
			
		||||
            this.selectIndex(0);
 | 
			
		||||
@@ -185,9 +185,9 @@ var Notebook = class Notebook {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    selectChild(child) {
 | 
			
		||||
        if (child == null) {
 | 
			
		||||
        if (child == null)
 | 
			
		||||
            this.selectIndex(-1);
 | 
			
		||||
        } else {
 | 
			
		||||
        else {
 | 
			
		||||
            for (let i = 0; i < this._tabs.length; i++) {
 | 
			
		||||
                let tabData = this._tabs[i];
 | 
			
		||||
                if (tabData.child == child) {
 | 
			
		||||
@@ -242,7 +242,7 @@ function objectToString(o) {
 | 
			
		||||
        // special case this since the default is way, way too verbose
 | 
			
		||||
        return '<js function>';
 | 
			
		||||
    } else {
 | 
			
		||||
        return `${o}`;
 | 
			
		||||
        return '' + o;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -284,7 +284,7 @@ var Result = class Result {
 | 
			
		||||
        this.actor.add(cmdTxt);
 | 
			
		||||
        let box = new St.BoxLayout({});
 | 
			
		||||
        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;
 | 
			
		||||
        box.add(resultTxt);
 | 
			
		||||
        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 });
 | 
			
		||||
            let propsBox = new St.BoxLayout({ vertical: true, style: 'padding-left: 6px;' });
 | 
			
		||||
            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);
 | 
			
		||||
            if (app != null && !app.is_window_backed()) {
 | 
			
		||||
                let icon = app.create_icon_texture(22);
 | 
			
		||||
@@ -394,6 +394,7 @@ var ObjInspector = class ObjInspector {
 | 
			
		||||
 | 
			
		||||
            for (let i = 0; i < properties.length; i++) {
 | 
			
		||||
                let propName = properties[i];
 | 
			
		||||
                let valueStr;
 | 
			
		||||
                let link;
 | 
			
		||||
                try {
 | 
			
		||||
                    let prop = obj[propName];
 | 
			
		||||
@@ -402,7 +403,8 @@ var ObjInspector = class ObjInspector {
 | 
			
		||||
                    link = new St.Label({ text: '<error>' });
 | 
			
		||||
                }
 | 
			
		||||
                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);
 | 
			
		||||
                this._container.add_actor(hbox);
 | 
			
		||||
            }
 | 
			
		||||
@@ -491,13 +493,8 @@ var Inspector = GObject.registerClass({
 | 
			
		||||
        eventHandler.connect('button-press-event', this._onButtonPressEvent.bind(this));
 | 
			
		||||
        eventHandler.connect('scroll-event', this._onScrollEvent.bind(this));
 | 
			
		||||
        eventHandler.connect('motion-event', this._onMotionEvent.bind(this));
 | 
			
		||||
 | 
			
		||||
        let dm = Clutter.DeviceManager.get_default();
 | 
			
		||||
        this._pointerDevice = dm.get_core_device(Clutter.InputDeviceType.POINTER_DEVICE);
 | 
			
		||||
        this._keyboardDevice = dm.get_core_device(Clutter.InputDeviceType.KEYBOARD_DEVICE);
 | 
			
		||||
 | 
			
		||||
        this._pointerDevice.grab(eventHandler);
 | 
			
		||||
        this._keyboardDevice.grab(eventHandler);
 | 
			
		||||
        Clutter.grab_pointer(eventHandler);
 | 
			
		||||
        Clutter.grab_keyboard(eventHandler);
 | 
			
		||||
 | 
			
		||||
        // this._target is the actor currently shown by the inspector.
 | 
			
		||||
        // this._pointerTarget is the actor directly under the pointer.
 | 
			
		||||
@@ -530,8 +527,8 @@ var Inspector = GObject.registerClass({
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _close() {
 | 
			
		||||
        this._pointerDevice.ungrab();
 | 
			
		||||
        this._keyboardDevice.ungrab();
 | 
			
		||||
        Clutter.ungrab_pointer();
 | 
			
		||||
        Clutter.ungrab_keyboard();
 | 
			
		||||
        this._eventHandler.destroy();
 | 
			
		||||
        this._eventHandler = null;
 | 
			
		||||
        this.emit('closed');
 | 
			
		||||
@@ -554,7 +551,7 @@ var Inspector = GObject.registerClass({
 | 
			
		||||
 | 
			
		||||
    _onScrollEvent(actor, event) {
 | 
			
		||||
        switch (event.get_scroll_direction()) {
 | 
			
		||||
        case Clutter.ScrollDirection.UP: {
 | 
			
		||||
        case Clutter.ScrollDirection.UP:
 | 
			
		||||
            // select parent
 | 
			
		||||
            let parent = this._target.get_parent();
 | 
			
		||||
            if (parent != null) {
 | 
			
		||||
@@ -562,7 +559,6 @@ var Inspector = GObject.registerClass({
 | 
			
		||||
                this._update(event);
 | 
			
		||||
            }
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        case Clutter.ScrollDirection.DOWN:
 | 
			
		||||
            // select child
 | 
			
		||||
@@ -602,9 +598,9 @@ var Inspector = GObject.registerClass({
 | 
			
		||||
            this._target = target;
 | 
			
		||||
        this._pointerTarget = target;
 | 
			
		||||
 | 
			
		||||
        let position = `[inspect x: ${stageX} y: ${stageY}]`;
 | 
			
		||||
        let position = '[inspect x: ' + stageX + ' y: ' + stageY + ']';
 | 
			
		||||
        this._displayText.text = '';
 | 
			
		||||
        this._displayText.text = `${position} ${this._target}`;
 | 
			
		||||
        this._displayText.text = position + ' ' + this._target;
 | 
			
		||||
 | 
			
		||||
        this._lookingGlass.setBorderPaintTarget(this._target);
 | 
			
		||||
    }
 | 
			
		||||
@@ -616,7 +612,7 @@ var Extensions = class Extensions {
 | 
			
		||||
        this.actor = new St.BoxLayout({ vertical: true,
 | 
			
		||||
                                        name: 'lookingGlassExtensions' });
 | 
			
		||||
        this._noExtensions = new St.Label({ style_class: 'lg-extensions-none',
 | 
			
		||||
                                            text: _("No extensions installed") });
 | 
			
		||||
                                             text: _("No extensions installed") });
 | 
			
		||||
        this._numExtensions = 0;
 | 
			
		||||
        this._extensionsList = new St.BoxLayout({ vertical: true,
 | 
			
		||||
                                                  style_class: 'lg-extensions-list' });
 | 
			
		||||
@@ -688,17 +684,17 @@ var Extensions = class Extensions {
 | 
			
		||||
 | 
			
		||||
    _stateToString(extensionState) {
 | 
			
		||||
        switch (extensionState) {
 | 
			
		||||
        case ExtensionSystem.ExtensionState.ENABLED:
 | 
			
		||||
            return _("Enabled");
 | 
			
		||||
        case ExtensionSystem.ExtensionState.DISABLED:
 | 
			
		||||
        case ExtensionSystem.ExtensionState.INITIALIZED:
 | 
			
		||||
            return _("Disabled");
 | 
			
		||||
        case ExtensionSystem.ExtensionState.ERROR:
 | 
			
		||||
            return _("Error");
 | 
			
		||||
        case ExtensionSystem.ExtensionState.OUT_OF_DATE:
 | 
			
		||||
            return _("Out of date");
 | 
			
		||||
        case ExtensionSystem.ExtensionState.DOWNLOADING:
 | 
			
		||||
            return _("Downloading");
 | 
			
		||||
            case ExtensionSystem.ExtensionState.ENABLED:
 | 
			
		||||
                return _("Enabled");
 | 
			
		||||
            case ExtensionSystem.ExtensionState.DISABLED:
 | 
			
		||||
            case ExtensionSystem.ExtensionState.INITIALIZED:
 | 
			
		||||
                return _("Disabled");
 | 
			
		||||
            case ExtensionSystem.ExtensionState.ERROR:
 | 
			
		||||
                return _("Error");
 | 
			
		||||
            case ExtensionSystem.ExtensionState.OUT_OF_DATE:
 | 
			
		||||
                return _("Out of date");
 | 
			
		||||
            case ExtensionSystem.ExtensionState.DOWNLOADING:
 | 
			
		||||
                return _("Downloading");
 | 
			
		||||
        }
 | 
			
		||||
        return 'Unknown'; // Not translated, shouldn't appear
 | 
			
		||||
    }
 | 
			
		||||
@@ -706,7 +702,7 @@ var Extensions = class Extensions {
 | 
			
		||||
    _createExtensionDisplay(extension) {
 | 
			
		||||
        let box = new St.BoxLayout({ style_class: 'lg-extension', vertical: true });
 | 
			
		||||
        let name = new St.Label({ style_class: 'lg-extension-name',
 | 
			
		||||
                                  text: extension.metadata.name });
 | 
			
		||||
                                   text: extension.metadata.name });
 | 
			
		||||
        box.add(name, { expand: true });
 | 
			
		||||
        let description = new St.Label({ style_class: 'lg-extension-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' });
 | 
			
		||||
        box.add(metaBox);
 | 
			
		||||
        let stateString = this._stateToString(extension.state);
 | 
			
		||||
        let state = new St.Label({ style_class: 'lg-extension-state',
 | 
			
		||||
                                   text: this._stateToString(extension.state) });
 | 
			
		||||
        metaBox.add(state);
 | 
			
		||||
@@ -798,7 +795,7 @@ var LookingGlass = class LookingGlass {
 | 
			
		||||
        inspectIcon.connect('button-press-event', () => {
 | 
			
		||||
            let inspector = new Inspector(this);
 | 
			
		||||
            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', () => {
 | 
			
		||||
                this.actor.show();
 | 
			
		||||
@@ -813,15 +810,15 @@ var LookingGlass = class LookingGlass {
 | 
			
		||||
        toolbar.add_actor(gcIcon);
 | 
			
		||||
        gcIcon.reactive = true;
 | 
			
		||||
        gcIcon.connect('button-press-event', () => {
 | 
			
		||||
            gcIcon.icon_name = 'user-trash';
 | 
			
		||||
            System.gc();
 | 
			
		||||
            this._timeoutId = Mainloop.timeout_add(500, () => {
 | 
			
		||||
           gcIcon.icon_name = 'user-trash';
 | 
			
		||||
           System.gc();
 | 
			
		||||
           this._timeoutId = Mainloop.timeout_add(500, () => {
 | 
			
		||||
                gcIcon.icon_name = 'user-trash-full';
 | 
			
		||||
                this._timeoutId = 0;
 | 
			
		||||
                return GLib.SOURCE_REMOVE;
 | 
			
		||||
            });
 | 
			
		||||
            GLib.Source.set_name_by_id(this._timeoutId, '[gnome-shell] gcIcon.icon_name = \'user-trash-full\'');
 | 
			
		||||
            return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
           });
 | 
			
		||||
           GLib.Source.set_name_by_id(this._timeoutId, '[gnome-shell] gcIcon.icon_name = \'user-trash-full\'');
 | 
			
		||||
           return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        let notebook = new Notebook();
 | 
			
		||||
@@ -892,11 +889,9 @@ var LookingGlass = class LookingGlass {
 | 
			
		||||
        let fontDesc = Pango.FontDescription.from_string(fontName);
 | 
			
		||||
        // 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.
 | 
			
		||||
        let size = fontDesc.get_size() / 1024.;
 | 
			
		||||
        let unit = fontDesc.get_size_is_absolute() ? 'px' : 'pt';
 | 
			
		||||
        this.actor.style = `
 | 
			
		||||
            font-size: ${size}${unit};
 | 
			
		||||
            font-family: "${fontDesc.get_family()}";`;
 | 
			
		||||
        this.actor.style =
 | 
			
		||||
            'font-size: ' + fontDesc.get_size() / 1024. + (fontDesc.get_size_is_absolute() ? 'px' : 'pt') + ';'
 | 
			
		||||
            + 'font-family: "' + fontDesc.get_family() + '";';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    setBorderPaintTarget(obj) {
 | 
			
		||||
@@ -982,7 +977,7 @@ var LookingGlass = class LookingGlass {
 | 
			
		||||
        try {
 | 
			
		||||
            resultObj = Function(fullCmd)();
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
            resultObj = `<exception ${e}>`;
 | 
			
		||||
            resultObj = '<exception ' + e + '>';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._pushResult(command, resultObj);
 | 
			
		||||
@@ -1009,7 +1004,7 @@ var LookingGlass = class LookingGlass {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _queueResize() {
 | 
			
		||||
        Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => this._resize());
 | 
			
		||||
        Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { this._resize(); });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _resize() {
 | 
			
		||||
 
 | 
			
		||||
@@ -41,8 +41,10 @@ const CROSS_HAIRS_OPACITY_KEY   = 'cross-hairs-opacity';
 | 
			
		||||
const CROSS_HAIRS_LENGTH_KEY    = 'cross-hairs-length';
 | 
			
		||||
const CROSS_HAIRS_CLIP_KEY      = 'cross-hairs-clip';
 | 
			
		||||
 | 
			
		||||
let magDBusService = null;
 | 
			
		||||
 | 
			
		||||
var MouseSpriteContent = GObject.registerClass({
 | 
			
		||||
    Implements: [Clutter.Content],
 | 
			
		||||
    Implements: [ Clutter.Content ],
 | 
			
		||||
}, class MouseSpriteContent extends GObject.Object {
 | 
			
		||||
    _init() {
 | 
			
		||||
        super._init();
 | 
			
		||||
@@ -120,7 +122,7 @@ var Magnifier = class Magnifier {
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        // Export to dbus.
 | 
			
		||||
        (new MagnifierDBus.ShellMagnifier());
 | 
			
		||||
        magDBusService = new MagnifierDBus.ShellMagnifier();
 | 
			
		||||
        this.setActive(St.Settings.get().magnifier_active);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -148,7 +150,7 @@ var Magnifier = class Magnifier {
 | 
			
		||||
    setActive(activate) {
 | 
			
		||||
        let isActive = this.isActive();
 | 
			
		||||
 | 
			
		||||
        this._zoomRegions.forEach((zoomRegion, index, array) => {
 | 
			
		||||
        this._zoomRegions.forEach ((zoomRegion, index, array) => {
 | 
			
		||||
            zoomRegion.setActive(activate);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
@@ -282,7 +284,7 @@ var Magnifier = class Magnifier {
 | 
			
		||||
     * @zoomRegion:     The zoomRegion to add.
 | 
			
		||||
     */
 | 
			
		||||
    addZoomRegion(zoomRegion) {
 | 
			
		||||
        if (zoomRegion) {
 | 
			
		||||
        if(zoomRegion) {
 | 
			
		||||
            this._zoomRegions.push(zoomRegion);
 | 
			
		||||
            if (!this.isTrackingMouse())
 | 
			
		||||
                this.startTrackingMouse();
 | 
			
		||||
@@ -347,7 +349,8 @@ var Magnifier = class Magnifier {
 | 
			
		||||
            if (!this._crossHairs)
 | 
			
		||||
                this.addCrosshairs();
 | 
			
		||||
            this._crossHairs.show();
 | 
			
		||||
        } else {
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            if (this._crossHairs)
 | 
			
		||||
                this._crossHairs.hide();
 | 
			
		||||
        }
 | 
			
		||||
@@ -374,9 +377,9 @@ var Magnifier = class Magnifier {
 | 
			
		||||
        if (this._crossHairs) {
 | 
			
		||||
            let clutterColor = this._crossHairs.getColor();
 | 
			
		||||
            return clutterColor.to_string();
 | 
			
		||||
        } else {
 | 
			
		||||
            return '#00000000';
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
            return '#00000000';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -456,7 +459,8 @@ var Magnifier = class Magnifier {
 | 
			
		||||
        if (clip) {
 | 
			
		||||
            if (this._crossHairs)
 | 
			
		||||
                this._crossHairs.setClip(CROSSHAIRS_CLIP_SIZE);
 | 
			
		||||
        } else {
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            // Setting no clipping on crosshairs means a zero sized clip
 | 
			
		||||
            // rectangle.
 | 
			
		||||
            if (this._crossHairs)
 | 
			
		||||
@@ -469,14 +473,14 @@ var Magnifier = class Magnifier {
 | 
			
		||||
     * Get whether the crosshairs are clipped by the mouse image.
 | 
			
		||||
     * @return:   Whether the crosshairs are clipped.
 | 
			
		||||
     */
 | 
			
		||||
    getCrosshairsClip() {
 | 
			
		||||
     getCrosshairsClip() {
 | 
			
		||||
        if (this._crossHairs) {
 | 
			
		||||
            let [clipWidth, clipHeight] = this._crossHairs.getClip();
 | 
			
		||||
            return (clipWidth > 0 && clipHeight > 0);
 | 
			
		||||
        } else {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
        else
 | 
			
		||||
            return false;
 | 
			
		||||
     }
 | 
			
		||||
 | 
			
		||||
    //// Private methods ////
 | 
			
		||||
 | 
			
		||||
@@ -500,61 +504,61 @@ var Magnifier = class Magnifier {
 | 
			
		||||
    _settingsInit(zoomRegion) {
 | 
			
		||||
        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._settings.connect(`changed::${MAG_FACTOR_KEY}`,
 | 
			
		||||
        this._settings.connect('changed::' + MAG_FACTOR_KEY,
 | 
			
		||||
                               this._updateMagFactor.bind(this));
 | 
			
		||||
        this._settings.connect(`changed::${LENS_MODE_KEY}`,
 | 
			
		||||
        this._settings.connect('changed::' + LENS_MODE_KEY,
 | 
			
		||||
                               this._updateLensMode.bind(this));
 | 
			
		||||
        this._settings.connect(`changed::${CLAMP_MODE_KEY}`,
 | 
			
		||||
        this._settings.connect('changed::' + CLAMP_MODE_KEY,
 | 
			
		||||
                               this._updateClampMode.bind(this));
 | 
			
		||||
        this._settings.connect(`changed::${MOUSE_TRACKING_KEY}`,
 | 
			
		||||
        this._settings.connect('changed::' + MOUSE_TRACKING_KEY,
 | 
			
		||||
                               this._updateMouseTrackingMode.bind(this));
 | 
			
		||||
        this._settings.connect(`changed::${FOCUS_TRACKING_KEY}`,
 | 
			
		||||
        this._settings.connect('changed::' + FOCUS_TRACKING_KEY,
 | 
			
		||||
                               this._updateFocusTrackingMode.bind(this));
 | 
			
		||||
        this._settings.connect(`changed::${CARET_TRACKING_KEY}`,
 | 
			
		||||
        this._settings.connect('changed::' + CARET_TRACKING_KEY,
 | 
			
		||||
                               this._updateCaretTrackingMode.bind(this));
 | 
			
		||||
 | 
			
		||||
        this._settings.connect(`changed::${INVERT_LIGHTNESS_KEY}`,
 | 
			
		||||
        this._settings.connect('changed::' + INVERT_LIGHTNESS_KEY,
 | 
			
		||||
                               this._updateInvertLightness.bind(this));
 | 
			
		||||
        this._settings.connect(`changed::${COLOR_SATURATION_KEY}`,
 | 
			
		||||
        this._settings.connect('changed::' + COLOR_SATURATION_KEY,
 | 
			
		||||
                               this._updateColorSaturation.bind(this));
 | 
			
		||||
 | 
			
		||||
        this._settings.connect(`changed::${BRIGHT_RED_KEY}`,
 | 
			
		||||
        this._settings.connect('changed::' + BRIGHT_RED_KEY,
 | 
			
		||||
                               this._updateBrightness.bind(this));
 | 
			
		||||
        this._settings.connect(`changed::${BRIGHT_GREEN_KEY}`,
 | 
			
		||||
        this._settings.connect('changed::' + BRIGHT_GREEN_KEY,
 | 
			
		||||
                               this._updateBrightness.bind(this));
 | 
			
		||||
        this._settings.connect(`changed::${BRIGHT_BLUE_KEY}`,
 | 
			
		||||
        this._settings.connect('changed::' + BRIGHT_BLUE_KEY,
 | 
			
		||||
                               this._updateBrightness.bind(this));
 | 
			
		||||
 | 
			
		||||
        this._settings.connect(`changed::${CONTRAST_RED_KEY}`,
 | 
			
		||||
        this._settings.connect('changed::' + CONTRAST_RED_KEY,
 | 
			
		||||
                               this._updateContrast.bind(this));
 | 
			
		||||
        this._settings.connect(`changed::${CONTRAST_GREEN_KEY}`,
 | 
			
		||||
        this._settings.connect('changed::' + CONTRAST_GREEN_KEY,
 | 
			
		||||
                               this._updateContrast.bind(this));
 | 
			
		||||
        this._settings.connect(`changed::${CONTRAST_BLUE_KEY}`,
 | 
			
		||||
        this._settings.connect('changed::' + CONTRAST_BLUE_KEY,
 | 
			
		||||
                               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._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._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._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._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._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));
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
@@ -606,7 +610,7 @@ var Magnifier = class Magnifier {
 | 
			
		||||
        let showCrosshairs = this._settings.get_boolean(SHOW_CROSS_HAIRS_KEY);
 | 
			
		||||
        this.addCrosshairs();
 | 
			
		||||
        this.setCrosshairsVisible(showCrosshairs);
 | 
			
		||||
    }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
    _updateScreenPosition() {
 | 
			
		||||
        // Applies only to the first zoom region.
 | 
			
		||||
@@ -796,8 +800,8 @@ var ZoomRegion = class ZoomRegion {
 | 
			
		||||
        let extents;
 | 
			
		||||
        try {
 | 
			
		||||
            extents = component.get_extents(Atspi.CoordType.SCREEN);
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
            log(`Failed to read extents of focused component: ${e.message}`);
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
            log('Failed to read extents of focused component: ' + e.message);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -813,8 +817,8 @@ var ZoomRegion = class ZoomRegion {
 | 
			
		||||
        let extents;
 | 
			
		||||
        try {
 | 
			
		||||
            extents = text.get_character_extents(text.get_caret_offset(), 0);
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
            log(`Failed to read extents of text caret: ${e.message}`);
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
            log('Failed to read extents of text caret: ' + e.message);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -1026,7 +1030,7 @@ var ZoomRegion = class ZoomRegion {
 | 
			
		||||
        viewPort.x = 0;
 | 
			
		||||
        viewPort.y = 0;
 | 
			
		||||
        viewPort.width = global.screen_width;
 | 
			
		||||
        viewPort.height = global.screen_height / 2;
 | 
			
		||||
        viewPort.height = global.screen_height/2;
 | 
			
		||||
        this._setViewPort(viewPort);
 | 
			
		||||
        this._screenPosition = GDesktopEnums.MagnifierScreenPosition.TOP_HALF;
 | 
			
		||||
    }
 | 
			
		||||
@@ -1038,9 +1042,9 @@ var ZoomRegion = class ZoomRegion {
 | 
			
		||||
    setBottomHalf() {
 | 
			
		||||
        let viewPort = {};
 | 
			
		||||
        viewPort.x = 0;
 | 
			
		||||
        viewPort.y = global.screen_height / 2;
 | 
			
		||||
        viewPort.y = global.screen_height/2;
 | 
			
		||||
        viewPort.width = global.screen_width;
 | 
			
		||||
        viewPort.height = global.screen_height / 2;
 | 
			
		||||
        viewPort.height = global.screen_height/2;
 | 
			
		||||
        this._setViewPort(viewPort);
 | 
			
		||||
        this._screenPosition = GDesktopEnums.MagnifierScreenPosition.BOTTOM_HALF;
 | 
			
		||||
    }
 | 
			
		||||
@@ -1053,7 +1057,7 @@ var ZoomRegion = class ZoomRegion {
 | 
			
		||||
        let viewPort = {};
 | 
			
		||||
        viewPort.x = 0;
 | 
			
		||||
        viewPort.y = 0;
 | 
			
		||||
        viewPort.width = global.screen_width / 2;
 | 
			
		||||
        viewPort.width = global.screen_width/2;
 | 
			
		||||
        viewPort.height = global.screen_height;
 | 
			
		||||
        this._setViewPort(viewPort);
 | 
			
		||||
        this._screenPosition = GDesktopEnums.MagnifierScreenPosition.LEFT_HALF;
 | 
			
		||||
@@ -1065,9 +1069,9 @@ var ZoomRegion = class ZoomRegion {
 | 
			
		||||
     */
 | 
			
		||||
    setRightHalf() {
 | 
			
		||||
        let viewPort = {};
 | 
			
		||||
        viewPort.x = global.screen_width / 2;
 | 
			
		||||
        viewPort.x = global.screen_width/2;
 | 
			
		||||
        viewPort.y = 0;
 | 
			
		||||
        viewPort.width = global.screen_width / 2;
 | 
			
		||||
        viewPort.width = global.screen_width/2;
 | 
			
		||||
        viewPort.height = global.screen_height;
 | 
			
		||||
        this._setViewPort(viewPort);
 | 
			
		||||
        this._screenPosition = GDesktopEnums.MagnifierScreenPosition.RIGHT_HALF;
 | 
			
		||||
@@ -1099,21 +1103,21 @@ var ZoomRegion = class ZoomRegion {
 | 
			
		||||
     */
 | 
			
		||||
    setScreenPosition(inPosition) {
 | 
			
		||||
        switch (inPosition) {
 | 
			
		||||
        case GDesktopEnums.MagnifierScreenPosition.FULL_SCREEN:
 | 
			
		||||
            this.setFullScreenMode();
 | 
			
		||||
            break;
 | 
			
		||||
        case GDesktopEnums.MagnifierScreenPosition.TOP_HALF:
 | 
			
		||||
            this.setTopHalf();
 | 
			
		||||
            break;
 | 
			
		||||
        case GDesktopEnums.MagnifierScreenPosition.BOTTOM_HALF:
 | 
			
		||||
            this.setBottomHalf();
 | 
			
		||||
            break;
 | 
			
		||||
        case GDesktopEnums.MagnifierScreenPosition.LEFT_HALF:
 | 
			
		||||
            this.setLeftHalf();
 | 
			
		||||
            break;
 | 
			
		||||
        case GDesktopEnums.MagnifierScreenPosition.RIGHT_HALF:
 | 
			
		||||
            this.setRightHalf();
 | 
			
		||||
            break;
 | 
			
		||||
            case GDesktopEnums.MagnifierScreenPosition.FULL_SCREEN:
 | 
			
		||||
                this.setFullScreenMode();
 | 
			
		||||
                break;
 | 
			
		||||
            case GDesktopEnums.MagnifierScreenPosition.TOP_HALF:
 | 
			
		||||
                this.setTopHalf();
 | 
			
		||||
                break;
 | 
			
		||||
            case GDesktopEnums.MagnifierScreenPosition.BOTTOM_HALF:
 | 
			
		||||
                this.setBottomHalf();
 | 
			
		||||
                break;
 | 
			
		||||
            case GDesktopEnums.MagnifierScreenPosition.LEFT_HALF:
 | 
			
		||||
                this.setLeftHalf();
 | 
			
		||||
                break;
 | 
			
		||||
            case GDesktopEnums.MagnifierScreenPosition.RIGHT_HALF:
 | 
			
		||||
                this.setRightHalf();
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -1268,7 +1272,7 @@ var ZoomRegion = class ZoomRegion {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * getContrast:
 | 
			
		||||
     * Retrieve the contrast of the magnified view.
 | 
			
		||||
     * Retreive the contrast of the magnified view.
 | 
			
		||||
     * @return  Object containing the contrast for the red, green,
 | 
			
		||||
     *          and blue channels.
 | 
			
		||||
     */
 | 
			
		||||
@@ -1456,9 +1460,11 @@ var ZoomRegion = class ZoomRegion {
 | 
			
		||||
 | 
			
		||||
        if (this._mouseTrackingMode == GDesktopEnums.MagnifierMouseTrackingMode.PROPORTIONAL) {
 | 
			
		||||
            return this._centerFromPointProportional(xMouse, yMouse);
 | 
			
		||||
        } else if (this._mouseTrackingMode == GDesktopEnums.MagnifierMouseTrackingMode.PUSH) {
 | 
			
		||||
        }
 | 
			
		||||
        else if (this._mouseTrackingMode == GDesktopEnums.MagnifierMouseTrackingMode.PUSH) {
 | 
			
		||||
            return this._centerFromPointPush(xMouse, yMouse);
 | 
			
		||||
        } else if (this._mouseTrackingMode == GDesktopEnums.MagnifierMouseTrackingMode.CENTERED) {
 | 
			
		||||
        }
 | 
			
		||||
        else if (this._mouseTrackingMode == GDesktopEnums.MagnifierMouseTrackingMode.CENTERED) {
 | 
			
		||||
            return this._centerFromPointCentered(xMouse, yMouse);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -1526,7 +1532,7 @@ var ZoomRegion = class ZoomRegion {
 | 
			
		||||
        let xProportion = (xPoint - halfScreenWidth) / halfScreenWidth;   // -1 ... 1
 | 
			
		||||
        let yProportion = (yPoint - halfScreenHeight) / halfScreenHeight; // -1 ... 1
 | 
			
		||||
        let xPos = xPoint - xProportion * (widthRoi / 2 - xPadding);
 | 
			
		||||
        let yPos = yPoint - yProportion * (heightRoi / 2 - yPadding);
 | 
			
		||||
        let yPos = yPoint - yProportion * (heightRoi /2 - yPadding);
 | 
			
		||||
 | 
			
		||||
        return [xPos, yPos];
 | 
			
		||||
    }
 | 
			
		||||
@@ -1628,7 +1634,7 @@ var Crosshairs = class Crosshairs {
 | 
			
		||||
        this.reCenter();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
   /**
 | 
			
		||||
    * addToZoomRegion
 | 
			
		||||
    * 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
 | 
			
		||||
@@ -1656,7 +1662,7 @@ var Crosshairs = class Crosshairs {
 | 
			
		||||
                container.raise_child(magnifiedMouse, crosshairsActor);
 | 
			
		||||
                let [xMouse, yMouse] = magnifiedMouse.get_position();
 | 
			
		||||
                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;
 | 
			
		||||
@@ -1772,12 +1778,13 @@ var Crosshairs = class Crosshairs {
 | 
			
		||||
            // mouse.
 | 
			
		||||
            this._clipSize = size;
 | 
			
		||||
            this.reCenter();
 | 
			
		||||
        } else {
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            // Restore the missing chunk.
 | 
			
		||||
            this._clipSize = [0, 0];
 | 
			
		||||
            this.reCenter();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
     }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * show:
 | 
			
		||||
@@ -1811,7 +1818,9 @@ var Crosshairs = class Crosshairs {
 | 
			
		||||
    reCenter(clipSize) {
 | 
			
		||||
        let [groupWidth, groupHeight] = this._actor.get_size();
 | 
			
		||||
        let leftLength = this._horizLeftHair.get_width();
 | 
			
		||||
        let rightLength = this._horizRightHair.get_width();
 | 
			
		||||
        let topLength = this._vertTopHair.get_height();
 | 
			
		||||
        let bottomLength = this._vertBottomHair.get_height();
 | 
			
		||||
        let thickness = this._horizLeftHair.get_height();
 | 
			
		||||
 | 
			
		||||
        // Deal with clip rectangle.
 | 
			
		||||
@@ -1918,8 +1927,8 @@ var MagShaderEffects = class MagShaderEffects {
 | 
			
		||||
        // a null first argument.
 | 
			
		||||
        let [bRed, bGreen, bBlue] = this._brightnessContrast.get_brightness();
 | 
			
		||||
        this._brightnessContrast.set_enabled(
 | 
			
		||||
            cRed != NO_CHANGE || cGreen != NO_CHANGE || cBlue != NO_CHANGE ||
 | 
			
		||||
            bRed != NO_CHANGE || bGreen != NO_CHANGE || bBlue != NO_CHANGE
 | 
			
		||||
             cRed != NO_CHANGE || cGreen != NO_CHANGE || cBlue != NO_CHANGE ||
 | 
			
		||||
             bRed != NO_CHANGE || bGreen != NO_CHANGE || bBlue != NO_CHANGE
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -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 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 objectPath = `${ZOOM_SERVICE_PATH}/zoomer${_zoomRegionInstanceCount}`;
 | 
			
		||||
        let objectPath = ZOOM_SERVICE_PATH + '/zoomer' + _zoomRegionInstanceCount;
 | 
			
		||||
        _zoomRegionInstanceCount++;
 | 
			
		||||
 | 
			
		||||
        let zoomRegionProxy = new ShellMagnifierZoomRegion(objectPath, realZoomRegion);
 | 
			
		||||
@@ -106,9 +106,9 @@ var ShellMagnifier = class ShellMagnifier {
 | 
			
		||||
        if (proxyAndZoomRegion && proxyAndZoomRegion.zoomRegion) {
 | 
			
		||||
            Main.magnifier.addZoomRegion(proxyAndZoomRegion.zoomRegion);
 | 
			
		||||
            return true;
 | 
			
		||||
        } else {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
            return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -179,74 +179,74 @@ var ShellMagnifier = class ShellMagnifier {
 | 
			
		||||
     * Set the crosswire size of all ZoomRegions.
 | 
			
		||||
     * @size:   The thickness of each line in the cross wire.
 | 
			
		||||
     */
 | 
			
		||||
    setCrosswireSize(size) {
 | 
			
		||||
     setCrosswireSize(size) {
 | 
			
		||||
        Main.magnifier.setCrosshairsThickness(size);
 | 
			
		||||
    }
 | 
			
		||||
     }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * getCrosswireSize:
 | 
			
		||||
     * Get the crosswire size of all ZoomRegions.
 | 
			
		||||
     * @return:   The thickness of each line in the cross wire.
 | 
			
		||||
     */
 | 
			
		||||
    getCrosswireSize() {
 | 
			
		||||
     getCrosswireSize() {
 | 
			
		||||
        return Main.magnifier.getCrosshairsThickness();
 | 
			
		||||
    }
 | 
			
		||||
     }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * setCrosswireLength:
 | 
			
		||||
     * Set the crosswire length of all zoom-regions..
 | 
			
		||||
     * @size:   The length of each line in the cross wire.
 | 
			
		||||
     */
 | 
			
		||||
    setCrosswireLength(length) {
 | 
			
		||||
     setCrosswireLength(length) {
 | 
			
		||||
        Main.magnifier.setCrosshairsLength(length);
 | 
			
		||||
    }
 | 
			
		||||
     }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * setCrosswireSize:
 | 
			
		||||
     * Set the crosswire size of all zoom-regions.
 | 
			
		||||
     * @size:   The thickness of each line in the cross wire.
 | 
			
		||||
     */
 | 
			
		||||
    getCrosswireLength() {
 | 
			
		||||
     getCrosswireLength() {
 | 
			
		||||
        return Main.magnifier.getCrosshairsLength();
 | 
			
		||||
    }
 | 
			
		||||
     }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * setCrosswireClip:
 | 
			
		||||
     * Set if the crosswire will be clipped by the cursor image..
 | 
			
		||||
     * @clip:   Flag to indicate whether to clip the crosswire.
 | 
			
		||||
     */
 | 
			
		||||
    setCrosswireClip(clip) {
 | 
			
		||||
     setCrosswireClip(clip) {
 | 
			
		||||
        Main.magnifier.setCrosshairsClip(clip);
 | 
			
		||||
    }
 | 
			
		||||
     }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * getCrosswireClip:
 | 
			
		||||
     * Get the crosswire clip value.
 | 
			
		||||
     * @return:   Whether the crosswire is clipped by the cursor image.
 | 
			
		||||
     */
 | 
			
		||||
    getCrosswireClip() {
 | 
			
		||||
     getCrosswireClip() {
 | 
			
		||||
        return Main.magnifier.getCrosshairsClip();
 | 
			
		||||
    }
 | 
			
		||||
     }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * setCrosswireColor:
 | 
			
		||||
     * Set the crosswire color of all ZoomRegions.
 | 
			
		||||
     * @color:   Unsigned int of the form rrggbbaa.
 | 
			
		||||
     */
 | 
			
		||||
    setCrosswireColor(color) {
 | 
			
		||||
     setCrosswireColor(color) {
 | 
			
		||||
        Main.magnifier.setCrosshairsColor('#%08x'.format(color));
 | 
			
		||||
    }
 | 
			
		||||
     }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * getCrosswireClip:
 | 
			
		||||
     * Get the crosswire color of all ZoomRegions.
 | 
			
		||||
     * @return:   The crosswire color as an unsigned int in the form rrggbbaa.
 | 
			
		||||
     */
 | 
			
		||||
    getCrosswireColor() {
 | 
			
		||||
     getCrosswireColor() {
 | 
			
		||||
        let colorString = Main.magnifier.getCrosshairsColor();
 | 
			
		||||
        // Drop the leading '#'.
 | 
			
		||||
        return parseInt(colorString.slice(1), 16);
 | 
			
		||||
    }
 | 
			
		||||
     }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
// -*- 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 AccessDialog = imports.ui.accessDialog;
 | 
			
		||||
@@ -37,12 +37,9 @@ const WindowManager = imports.ui.windowManager;
 | 
			
		||||
const Magnifier = imports.ui.magnifier;
 | 
			
		||||
const XdndHandler = imports.ui.xdndHandler;
 | 
			
		||||
const KbdA11yDialog = imports.ui.kbdA11yDialog;
 | 
			
		||||
const LocatePointer = imports.ui.locatePointer;
 | 
			
		||||
const PointerA11yTimeout = imports.ui.pointerA11yTimeout;
 | 
			
		||||
 | 
			
		||||
const A11Y_SCHEMA = 'org.gnome.desktop.a11y.keyboard';
 | 
			
		||||
const STICKY_KEYS_ENABLE = 'stickykeys-enable';
 | 
			
		||||
const LOG_DOMAIN = 'GNOME Shell';
 | 
			
		||||
const GNOMESHELL_STARTED_MESSAGE_ID = 'f3ea493c22934e26811cd62abe8e203a';
 | 
			
		||||
 | 
			
		||||
var componentManager = null;
 | 
			
		||||
@@ -77,7 +74,6 @@ var layoutManager = null;
 | 
			
		||||
var kbdA11yDialog = null;
 | 
			
		||||
var inputMethod = null;
 | 
			
		||||
var introspectService = null;
 | 
			
		||||
var locatePointer = null;
 | 
			
		||||
let _startDate;
 | 
			
		||||
let _defaultCssStylesheet = null;
 | 
			
		||||
let _cssStylesheet = null;
 | 
			
		||||
@@ -96,8 +92,6 @@ function _sessionUpdated() {
 | 
			
		||||
    wm.allowKeybinding('overlay-key', Shell.ActionMode.NORMAL |
 | 
			
		||||
                                      Shell.ActionMode.OVERVIEW);
 | 
			
		||||
 | 
			
		||||
    wm.allowKeybinding('locate-pointer-key', Shell.ActionMode.ALL);
 | 
			
		||||
 | 
			
		||||
    wm.setCustomKeybindingHandler('panel-run-dialog',
 | 
			
		||||
                                  Shell.ActionMode.NORMAL |
 | 
			
		||||
                                  Shell.ActionMode.OVERVIEW,
 | 
			
		||||
@@ -139,12 +133,12 @@ function start() {
 | 
			
		||||
 | 
			
		||||
function _initializeUI() {
 | 
			
		||||
    // 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
 | 
			
		||||
    // 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
 | 
			
		||||
    // 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.
 | 
			
		||||
    Shell.WindowTracker.get_default();
 | 
			
		||||
    Shell.AppUsage.get_default();
 | 
			
		||||
@@ -156,8 +150,8 @@ function _initializeUI() {
 | 
			
		||||
    // Setup the stage hierarchy early
 | 
			
		||||
    layoutManager = new Layout.LayoutManager();
 | 
			
		||||
 | 
			
		||||
    // Various parts of the codebase still refer to Main.uiGroup
 | 
			
		||||
    // instead of using the layoutManager. This keeps that code
 | 
			
		||||
    // Various parts of the codebase still refers to Main.uiGroup
 | 
			
		||||
    // instead using the layoutManager.  This keeps that code
 | 
			
		||||
    // working until it's updated.
 | 
			
		||||
    uiGroup = layoutManager.uiGroup;
 | 
			
		||||
 | 
			
		||||
@@ -171,8 +165,6 @@ function _initializeUI() {
 | 
			
		||||
    kbdA11yDialog = new KbdA11yDialog.KbdA11yDialog();
 | 
			
		||||
    wm = new WindowManager.WindowManager();
 | 
			
		||||
    magnifier = new Magnifier.Magnifier();
 | 
			
		||||
    locatePointer = new LocatePointer.LocatePointer();
 | 
			
		||||
 | 
			
		||||
    if (LoginManager.canLock())
 | 
			
		||||
        screenShield = new ScreenShield.ScreenShield();
 | 
			
		||||
 | 
			
		||||
@@ -191,8 +183,6 @@ function _initializeUI() {
 | 
			
		||||
    layoutManager.init();
 | 
			
		||||
    overview.init();
 | 
			
		||||
 | 
			
		||||
    (new PointerA11yTimeout.PointerA11yTimeout());
 | 
			
		||||
 | 
			
		||||
    _a11ySettings = new Gio.Settings({ schema_id: A11Y_SCHEMA });
 | 
			
		||||
 | 
			
		||||
    global.display.connect('overlay-key', () => {
 | 
			
		||||
@@ -200,10 +190,6 @@ function _initializeUI() {
 | 
			
		||||
            overview.toggle();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    global.connect('locate-pointer', () => {
 | 
			
		||||
        locatePointer.show();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    global.display.connect('show-restart-message', (display, message) => {
 | 
			
		||||
        showRestartMessage(message);
 | 
			
		||||
        return true;
 | 
			
		||||
@@ -243,18 +229,14 @@ function _initializeUI() {
 | 
			
		||||
        }
 | 
			
		||||
        if (sessionMode.currentMode != 'gdm' &&
 | 
			
		||||
            sessionMode.currentMode != 'initial-setup') {
 | 
			
		||||
            GLib.log_structured(LOG_DOMAIN, GLib.LogLevelFlags.LEVEL_MESSAGE, {
 | 
			
		||||
                'MESSAGE': `GNOME Shell started at ${_startDate}`,
 | 
			
		||||
                'MESSAGE_ID': GNOMESHELL_STARTED_MESSAGE_ID
 | 
			
		||||
            });
 | 
			
		||||
            Shell.Global.log_structured('GNOME Shell started at ' + _startDate,
 | 
			
		||||
                                        ['MESSAGE_ID=' + GNOMESHELL_STARTED_MESSAGE_ID]);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        LoginManager.registerSessionWithGDM();
 | 
			
		||||
 | 
			
		||||
        let perfModuleName = GLib.getenv("SHELL_PERF_MODULE");
 | 
			
		||||
        if (perfModuleName) {
 | 
			
		||||
            let perfOutput = GLib.getenv("SHELL_PERF_OUTPUT");
 | 
			
		||||
            let module = eval(`imports.perf.${perfModuleName};`);
 | 
			
		||||
            let module = eval('imports.perf.' + perfModuleName + ';');
 | 
			
		||||
            Scripting.runPerfScript(module, perfOutput);
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
@@ -321,7 +303,7 @@ function getThemeStylesheet() {
 | 
			
		||||
/**
 | 
			
		||||
 * setThemeStylesheet:
 | 
			
		||||
 * @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
 | 
			
		||||
 */
 | 
			
		||||
@@ -390,9 +372,9 @@ function notify(msg, details) {
 | 
			
		||||
function notifyError(msg, details) {
 | 
			
		||||
    // Also print to stderr so it's logged somewhere
 | 
			
		||||
    if (details)
 | 
			
		||||
        log(`error: ${msg}: ${details}`);
 | 
			
		||||
        log('error: ' + msg + ': ' + details);
 | 
			
		||||
    else
 | 
			
		||||
        log(`error: ${msg}`);
 | 
			
		||||
        log('error: ' + msg);
 | 
			
		||||
 | 
			
		||||
    notify(msg, details);
 | 
			
		||||
}
 | 
			
		||||
@@ -421,15 +403,15 @@ function _findModal(actor) {
 | 
			
		||||
 *
 | 
			
		||||
 * @params may be used to provide the following parameters:
 | 
			
		||||
 *  - 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.
 | 
			
		||||
 *
 | 
			
		||||
 *  - options: Meta.ModalOptions flags to indicate that the pointer is
 | 
			
		||||
 *             already grabbed
 | 
			
		||||
 *
 | 
			
		||||
 *  - actionMode: used to set the current Shell.ActionMode to filter
 | 
			
		||||
 *                global keybindings; the default of NONE will filter
 | 
			
		||||
 *                out all keybindings
 | 
			
		||||
 *                    global keybindings; the default of NONE will filter
 | 
			
		||||
 *                    out all keybindings
 | 
			
		||||
 *
 | 
			
		||||
 * Returns: true iff we successfully acquired a grab or already had one
 | 
			
		||||
 */
 | 
			
		||||
@@ -475,15 +457,15 @@ function pushModal(actor, params) {
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * popModal:
 | 
			
		||||
 * @actor: #ClutterActor passed to original invocation of pushModal()
 | 
			
		||||
 * @actor: #ClutterActor passed to original invocation of pushModal().
 | 
			
		||||
 * @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
 | 
			
		||||
 * previous focus at the time when pushModal() was invoked.
 | 
			
		||||
 *
 | 
			
		||||
 * @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.
 | 
			
		||||
 */
 | 
			
		||||
function popModal(actor, timestamp) {
 | 
			
		||||
@@ -645,7 +627,7 @@ function _queueBeforeRedraw(workId) {
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
 * 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
 | 
			
		||||
 * to consume resources updating if the actor isn't actually going to be
 | 
			
		||||
 * displaying to the user.
 | 
			
		||||
@@ -654,15 +636,15 @@ function _queueBeforeRedraw(workId) {
 | 
			
		||||
 * initialization as well, under the assumption that new actors
 | 
			
		||||
 * will need it.
 | 
			
		||||
 *
 | 
			
		||||
 * Returns: A string work identifier
 | 
			
		||||
 * Returns: A string work identifer
 | 
			
		||||
 */
 | 
			
		||||
function initializeDeferredWork(actor, callback, props) {
 | 
			
		||||
    // Turn into a string so we can use as an object property
 | 
			
		||||
    let workId = `${(++_deferredWorkSequence)}`;
 | 
			
		||||
    let workId = '' + (++_deferredWorkSequence);
 | 
			
		||||
    _deferredWorkData[workId] = { 'actor': actor,
 | 
			
		||||
                                  'callback': callback };
 | 
			
		||||
    actor.connect('notify::mapped', () => {
 | 
			
		||||
        if (!(actor.mapped && _deferredWorkQueue.includes(workId)))
 | 
			
		||||
        if (!(actor.mapped && _deferredWorkQueue.indexOf(workId) >= 0))
 | 
			
		||||
            return;
 | 
			
		||||
        _queueBeforeRedraw(workId);
 | 
			
		||||
    });
 | 
			
		||||
@@ -681,7 +663,7 @@ function initializeDeferredWork(actor, callback, props) {
 | 
			
		||||
 * @workId: work identifier
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
 * changed.
 | 
			
		||||
 */
 | 
			
		||||
@@ -692,7 +674,7 @@ function queueDeferredWork(workId) {
 | 
			
		||||
        logError(new Error(message), message);
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    if (!_deferredWorkQueue.includes(workId))
 | 
			
		||||
    if (_deferredWorkQueue.indexOf(workId) < 0)
 | 
			
		||||
        _deferredWorkQueue.push(workId);
 | 
			
		||||
    if (data.actor.mapped) {
 | 
			
		||||
        _queueBeforeRedraw(workId);
 | 
			
		||||
@@ -707,13 +689,12 @@ function queueDeferredWork(workId) {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var RestartMessage = GObject.registerClass(
 | 
			
		||||
class RestartMessage extends ModalDialog.ModalDialog {
 | 
			
		||||
    _init(message) {
 | 
			
		||||
        super._init({ shellReactive: true,
 | 
			
		||||
                      styleClass: 'restart-message headline',
 | 
			
		||||
                      shouldFadeIn: false,
 | 
			
		||||
                      destroyOnClose: true });
 | 
			
		||||
var RestartMessage = class extends ModalDialog.ModalDialog {
 | 
			
		||||
    constructor(message) {
 | 
			
		||||
        super({ shellReactive: true,
 | 
			
		||||
                styleClass: 'restart-message headline',
 | 
			
		||||
                shouldFadeIn: false,
 | 
			
		||||
                destroyOnClose: true });
 | 
			
		||||
 | 
			
		||||
        let label = new St.Label({ text: message });
 | 
			
		||||
 | 
			
		||||
@@ -723,7 +704,7 @@ class RestartMessage extends ModalDialog.ModalDialog {
 | 
			
		||||
                                        y_align: St.Align.MIDDLE });
 | 
			
		||||
        this.buttonLayout.hide();
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
function showRestartMessage(message) {
 | 
			
		||||
    let restartMessage = new RestartMessage(message);
 | 
			
		||||
 
 | 
			
		||||
@@ -72,7 +72,7 @@ var URLHighlighter = class URLHighlighter {
 | 
			
		||||
            let urlId = this._findUrlAtPos(event);
 | 
			
		||||
            if (urlId != -1) {
 | 
			
		||||
                let url = this._urls[urlId].url;
 | 
			
		||||
                if (!url.includes(':'))
 | 
			
		||||
                if (url.indexOf(':') == -1)
 | 
			
		||||
                    url = 'http://' + url;
 | 
			
		||||
 | 
			
		||||
                Gio.app_info_launch_default_for_uri(url, global.create_app_launch_context(0, -1));
 | 
			
		||||
@@ -135,18 +135,18 @@ var URLHighlighter = class URLHighlighter {
 | 
			
		||||
        let success;
 | 
			
		||||
        let [x, y] = event.get_coords();
 | 
			
		||||
        [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++) {
 | 
			
		||||
            let [success, px, py, lineHeight] = this.actor.clutter_text.position_to_coords(i);
 | 
			
		||||
            if (py > y || py + lineHeight < y || x < px)
 | 
			
		||||
            let [success, px, py, line_height] = this.actor.clutter_text.position_to_coords(i);
 | 
			
		||||
            if (py > y || py + line_height < y || x < px)
 | 
			
		||||
                continue;
 | 
			
		||||
            findPos = i;
 | 
			
		||||
            find_pos = i;
 | 
			
		||||
        }
 | 
			
		||||
        if (findPos != -1) {
 | 
			
		||||
        if (find_pos != -1) {
 | 
			
		||||
            for (let i = 0; i < this._urls.length; i++)
 | 
			
		||||
                if (findPos >= this._urls[i].pos &&
 | 
			
		||||
                    this._urls[i].pos + this._urls[i].url.length > findPos)
 | 
			
		||||
                    return i;
 | 
			
		||||
            if (find_pos >= this._urls[i].pos &&
 | 
			
		||||
                this._urls[i].pos + this._urls[i].url.length > find_pos)
 | 
			
		||||
                return i;
 | 
			
		||||
        }
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
@@ -197,14 +197,12 @@ class ScaleLayout extends Clutter.BinLayout {
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
var LabelExpanderLayout = GObject.registerClass({
 | 
			
		||||
    Properties: {
 | 
			
		||||
        'expansion': GObject.ParamSpec.double('expansion',
 | 
			
		||||
                                              'Expansion',
 | 
			
		||||
                                              'Expansion of the layout, between 0 (collapsed) ' +
 | 
			
		||||
                                              'and 1 (fully expanded',
 | 
			
		||||
                                              GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE,
 | 
			
		||||
                                              0, 1, 0)
 | 
			
		||||
    },
 | 
			
		||||
    Properties: { 'expansion': GObject.ParamSpec.double('expansion',
 | 
			
		||||
                                                        'Expansion',
 | 
			
		||||
                                                        'Expansion of the layout, between 0 (collapsed) ' +
 | 
			
		||||
                                                        'and 1 (fully expanded',
 | 
			
		||||
                                                         GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE,
 | 
			
		||||
                                                         0, 1, 0)},
 | 
			
		||||
}, class LabelExpanderLayout extends Clutter.LayoutManager {
 | 
			
		||||
    _init(params) {
 | 
			
		||||
        this._expansion = 0;
 | 
			
		||||
@@ -469,10 +467,11 @@ var Message = class Message {
 | 
			
		||||
                             { scale_y: 0,
 | 
			
		||||
                               time: MessageTray.ANIMATION_TIME,
 | 
			
		||||
                               transition: 'easeOutQuad',
 | 
			
		||||
                               onComplete: () => {
 | 
			
		||||
                               onCompleteScope: this,
 | 
			
		||||
                               onComplete() {
 | 
			
		||||
                                   this._actionBin.hide();
 | 
			
		||||
                                   this.expanded = false;
 | 
			
		||||
                               } });
 | 
			
		||||
                               }});
 | 
			
		||||
        } else {
 | 
			
		||||
            this._bodyStack.layout_manager.expansion = 0;
 | 
			
		||||
            this._actionBin.scale_y = 0;
 | 
			
		||||
@@ -627,7 +626,7 @@ var MessageListSection = class MessageListSection {
 | 
			
		||||
                                              onComplete() {
 | 
			
		||||
                                                  obj.container.destroy();
 | 
			
		||||
                                                  global.sync_pointer();
 | 
			
		||||
                                              } });
 | 
			
		||||
                                              }});
 | 
			
		||||
        } else {
 | 
			
		||||
            obj.container.destroy();
 | 
			
		||||
            global.sync_pointer();
 | 
			
		||||
@@ -657,7 +656,7 @@ var MessageListSection = class MessageListSection {
 | 
			
		||||
                                   transition: 'easeOutQuad',
 | 
			
		||||
                                   onComplete() {
 | 
			
		||||
                                       message.close();
 | 
			
		||||
                                   } });
 | 
			
		||||
                                   }});
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -218,17 +218,17 @@ class NotificationApplicationPolicy extends NotificationPolicy {
 | 
			
		||||
 | 
			
		||||
        this._masterSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.notifications' });
 | 
			
		||||
        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._settings.connect('changed', this._changed.bind(this));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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');
 | 
			
		||||
        if (!apps.includes(this._canonicalId)) {
 | 
			
		||||
        if (apps.indexOf(this._canonicalId) < 0) {
 | 
			
		||||
            apps.push(this._canonicalId);
 | 
			
		||||
            this._masterSettings.set_strv('application-children', apps);
 | 
			
		||||
        }
 | 
			
		||||
@@ -248,7 +248,7 @@ class NotificationApplicationPolicy extends NotificationPolicy {
 | 
			
		||||
    _canonicalizeId(id) {
 | 
			
		||||
        // Keys are restricted to lowercase alphanumeric characters and dash,
 | 
			
		||||
        // 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() {
 | 
			
		||||
@@ -584,17 +584,18 @@ class SourceActor extends St.Widget {
 | 
			
		||||
        this._source = source;
 | 
			
		||||
        this._size = size;
 | 
			
		||||
 | 
			
		||||
        this.actor = this;
 | 
			
		||||
        this.connect('destroy', () => {
 | 
			
		||||
            this._source.disconnect(this._iconUpdatedId);
 | 
			
		||||
            this._actorDestroyed = true;
 | 
			
		||||
        });
 | 
			
		||||
        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,
 | 
			
		||||
                                     x_expand: true,
 | 
			
		||||
                                     height: size * scaleFactor,
 | 
			
		||||
                                     width: size * scaleFactor });
 | 
			
		||||
                                     height: size * scale_factor,
 | 
			
		||||
                                     width: size * scale_factor });
 | 
			
		||||
 | 
			
		||||
        this.add_actor(this._iconBin);
 | 
			
		||||
 | 
			
		||||
@@ -772,7 +773,7 @@ var Source = class Source {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pushNotification(notification) {
 | 
			
		||||
        if (this.notifications.includes(notification))
 | 
			
		||||
        if (this.notifications.indexOf(notification) >= 0)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        while (this.notifications.length >= MAX_NOTIFICATIONS_PER_SOURCE)
 | 
			
		||||
@@ -988,7 +989,7 @@ var MessageTray = class MessageTray {
 | 
			
		||||
 | 
			
		||||
    add(source) {
 | 
			
		||||
        if (this.contains(source)) {
 | 
			
		||||
            log(`Trying to re-add source ${source.title}`);
 | 
			
		||||
            log('Trying to re-add source ' + source.title);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -1069,7 +1070,7 @@ var MessageTray = class MessageTray {
 | 
			
		||||
            // If a new notification is updated while it is being hidden,
 | 
			
		||||
            // we stop hiding it and show it again.
 | 
			
		||||
            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
 | 
			
		||||
            // indicator in the panel; however do make an exception for CRITICAL
 | 
			
		||||
            // notifications, as only banner mode allows expansion.
 | 
			
		||||
@@ -1167,7 +1168,7 @@ var MessageTray = class MessageTray {
 | 
			
		||||
            x > this._notificationLeftMouseX - MOUSE_LEFT_ACTOR_THRESHOLD) {
 | 
			
		||||
            this._notificationLeftMouseX = -1;
 | 
			
		||||
            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');
 | 
			
		||||
        } else {
 | 
			
		||||
            this._notificationLeftTimeoutId = 0;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,7 @@
 | 
			
		||||
// -*- 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 Layout = imports.ui.layout;
 | 
			
		||||
@@ -20,22 +21,8 @@ var State = {
 | 
			
		||||
    FADED_OUT: 4
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var ModalDialog = GObject.registerClass({
 | 
			
		||||
    Properties: {
 | 
			
		||||
        'state': GObject.ParamSpec.int('state', 'Dialog state', 'state',
 | 
			
		||||
                                       GObject.ParamFlags.READABLE,
 | 
			
		||||
                                       Math.min(...Object.values(State)),
 | 
			
		||||
                                       Math.max(...Object.values(State)),
 | 
			
		||||
                                       State.CLOSED)
 | 
			
		||||
    },
 | 
			
		||||
    Signals: { 'opened': {}, 'closed': {} }
 | 
			
		||||
}, class ModalDialog extends St.Widget {
 | 
			
		||||
    _init(params) {
 | 
			
		||||
        super._init({ visible: false,
 | 
			
		||||
                      x: 0,
 | 
			
		||||
                      y: 0,
 | 
			
		||||
                      accessible_role: Atk.Role.DIALOG });
 | 
			
		||||
 | 
			
		||||
var ModalDialog = class {
 | 
			
		||||
    constructor(params) {
 | 
			
		||||
        params = Params.parse(params, { shellReactive: false,
 | 
			
		||||
                                        styleClass: null,
 | 
			
		||||
                                        actionMode: Shell.ActionMode.SYSTEM_MODAL,
 | 
			
		||||
@@ -43,7 +30,7 @@ var ModalDialog = GObject.registerClass({
 | 
			
		||||
                                        shouldFadeOut: true,
 | 
			
		||||
                                        destroyOnClose: true });
 | 
			
		||||
 | 
			
		||||
        this._state = State.CLOSED;
 | 
			
		||||
        this.state = State.CLOSED;
 | 
			
		||||
        this._hasModal = false;
 | 
			
		||||
        this._actionMode = params.actionMode;
 | 
			
		||||
        this._shellReactive = params.shellReactive;
 | 
			
		||||
@@ -51,25 +38,31 @@ var ModalDialog = GObject.registerClass({
 | 
			
		||||
        this._shouldFadeOut = params.shouldFadeOut;
 | 
			
		||||
        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,
 | 
			
		||||
                                                      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._backgroundBin = new St.Bin({ child: this.backgroundStack,
 | 
			
		||||
                                           x_fill: true, y_fill: true });
 | 
			
		||||
        this._monitorConstraint = new Layout.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.contentLayout = this.dialogLayout.contentLayout;
 | 
			
		||||
        this.buttonLayout = this.dialogLayout.buttonLayout;
 | 
			
		||||
 | 
			
		||||
        if (!this._shellReactive) {
 | 
			
		||||
            this._lightbox = new Lightbox.Lightbox(this,
 | 
			
		||||
            this._lightbox = new Lightbox.Lightbox(this._group,
 | 
			
		||||
                                                   { inhibitEvents: true,
 | 
			
		||||
                                                     radialEffect: true });
 | 
			
		||||
            this._lightbox.highlight(this._backgroundBin);
 | 
			
		||||
@@ -84,16 +77,8 @@ var ModalDialog = GObject.registerClass({
 | 
			
		||||
        this._savedKeyFocus = null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get state() {
 | 
			
		||||
        return this._state;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _setState(state) {
 | 
			
		||||
        if (this._state == state)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        this._state = state;
 | 
			
		||||
        this.notify('state');
 | 
			
		||||
    destroy() {
 | 
			
		||||
        this._group.destroy();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    clearButtons() {
 | 
			
		||||
@@ -111,25 +96,29 @@ var ModalDialog = GObject.registerClass({
 | 
			
		||||
        return this.dialogLayout.addButton(buttonInfo);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _onGroupDestroy() {
 | 
			
		||||
        this.emit('destroy');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _fadeOpen(onPrimary) {
 | 
			
		||||
        if (onPrimary)
 | 
			
		||||
            this._monitorConstraint.primary = true;
 | 
			
		||||
        else
 | 
			
		||||
            this._monitorConstraint.index = global.display.get_current_monitor();
 | 
			
		||||
 | 
			
		||||
        this._setState(State.OPENING);
 | 
			
		||||
        this.state = State.OPENING;
 | 
			
		||||
 | 
			
		||||
        this.dialogLayout.opacity = 255;
 | 
			
		||||
        if (this._lightbox)
 | 
			
		||||
            this._lightbox.show();
 | 
			
		||||
        this.opacity = 0;
 | 
			
		||||
        this.show();
 | 
			
		||||
        Tweener.addTween(this,
 | 
			
		||||
        this._group.opacity = 0;
 | 
			
		||||
        this._group.show();
 | 
			
		||||
        Tweener.addTween(this._group,
 | 
			
		||||
                         { opacity: 255,
 | 
			
		||||
                           time: this._shouldFadeIn ? OPEN_AND_CLOSE_TIME : 0,
 | 
			
		||||
                           transition: 'easeOutQuad',
 | 
			
		||||
                           onComplete: () => {
 | 
			
		||||
                               this._setState(State.OPENED);
 | 
			
		||||
                               this.state = State.OPENED;
 | 
			
		||||
                               this.emit('opened');
 | 
			
		||||
                           }
 | 
			
		||||
                         });
 | 
			
		||||
@@ -159,8 +148,8 @@ var ModalDialog = GObject.registerClass({
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _closeComplete() {
 | 
			
		||||
        this._setState(State.CLOSED);
 | 
			
		||||
        this.hide();
 | 
			
		||||
        this.state = State.CLOSED;
 | 
			
		||||
        this._group.hide();
 | 
			
		||||
        this.emit('closed');
 | 
			
		||||
 | 
			
		||||
        if (this._destroyOnClose)
 | 
			
		||||
@@ -171,17 +160,17 @@ var ModalDialog = GObject.registerClass({
 | 
			
		||||
        if (this.state == State.CLOSED || this.state == State.CLOSING)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        this._setState(State.CLOSING);
 | 
			
		||||
        this.state = State.CLOSING;
 | 
			
		||||
        this.popModal(timestamp);
 | 
			
		||||
        this._savedKeyFocus = null;
 | 
			
		||||
 | 
			
		||||
        if (this._shouldFadeOut)
 | 
			
		||||
            Tweener.addTween(this,
 | 
			
		||||
            Tweener.addTween(this._group,
 | 
			
		||||
                             { opacity: 0,
 | 
			
		||||
                               time: OPEN_AND_CLOSE_TIME,
 | 
			
		||||
                               transition: 'easeOutQuad',
 | 
			
		||||
                               onComplete: this._closeComplete.bind(this)
 | 
			
		||||
                             });
 | 
			
		||||
                             })
 | 
			
		||||
        else
 | 
			
		||||
            this._closeComplete();
 | 
			
		||||
    }
 | 
			
		||||
@@ -194,11 +183,11 @@ var ModalDialog = GObject.registerClass({
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        let focus = global.stage.key_focus;
 | 
			
		||||
        if (focus && this.contains(focus))
 | 
			
		||||
        if (focus && this._group.contains(focus))
 | 
			
		||||
            this._savedKeyFocus = focus;
 | 
			
		||||
        else
 | 
			
		||||
            this._savedKeyFocus = null;
 | 
			
		||||
        Main.popModal(this, timestamp);
 | 
			
		||||
        Main.popModal(this._group, timestamp);
 | 
			
		||||
        this._hasModal = false;
 | 
			
		||||
 | 
			
		||||
        if (!this._shellReactive)
 | 
			
		||||
@@ -212,7 +201,7 @@ var ModalDialog = GObject.registerClass({
 | 
			
		||||
        let params = { actionMode: this._actionMode };
 | 
			
		||||
        if (timestamp)
 | 
			
		||||
            params['timestamp'] = timestamp;
 | 
			
		||||
        if (!Main.pushModal(this, params))
 | 
			
		||||
        if (!Main.pushModal(this._group, params))
 | 
			
		||||
            return false;
 | 
			
		||||
 | 
			
		||||
        this._hasModal = true;
 | 
			
		||||
@@ -235,10 +224,10 @@ var ModalDialog = GObject.registerClass({
 | 
			
		||||
    // can be dismissed by a close call.
 | 
			
		||||
    //
 | 
			
		||||
    // 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.
 | 
			
		||||
    // 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.
 | 
			
		||||
    _fadeOutDialog(timestamp) {
 | 
			
		||||
        if (this.state == State.CLOSED || this.state == State.CLOSING)
 | 
			
		||||
@@ -250,11 +239,12 @@ var ModalDialog = GObject.registerClass({
 | 
			
		||||
        this.popModal(timestamp);
 | 
			
		||||
        Tweener.addTween(this.dialogLayout,
 | 
			
		||||
                         { opacity: 0,
 | 
			
		||||
                           time: FADE_OUT_DIALOG_TIME,
 | 
			
		||||
                           time:    FADE_OUT_DIALOG_TIME,
 | 
			
		||||
                           transition: 'easeOutQuad',
 | 
			
		||||
                           onComplete: () => {
 | 
			
		||||
                               this._setState(State.FADED_OUT);
 | 
			
		||||
                               this.state = State.FADED_OUT;
 | 
			
		||||
                           }
 | 
			
		||||
                         });
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
};
 | 
			
		||||
Signals.addSignalMethods(ModalDialog.prototype);
 | 
			
		||||
 
 | 
			
		||||
@@ -135,7 +135,7 @@ var MprisPlayer = class MprisPlayer {
 | 
			
		||||
        // so prefer activating the app via .desktop file if possible
 | 
			
		||||
        let app = null;
 | 
			
		||||
        if (this._mprisProxy.DesktopEntry) {
 | 
			
		||||
            let desktopId = `${this._mprisProxy.DesktopEntry}.desktop`;
 | 
			
		||||
            let desktopId = this._mprisProxy.DesktopEntry + '.desktop';
 | 
			
		||||
            app = Shell.AppSystem.get_default().lookup_app(desktopId);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -76,13 +76,13 @@ var FdoNotificationDaemon = class FdoNotificationDaemon {
 | 
			
		||||
    _fallbackIconForNotificationData(hints) {
 | 
			
		||||
        let stockIcon;
 | 
			
		||||
        switch (hints.urgency) {
 | 
			
		||||
        case Urgency.LOW:
 | 
			
		||||
        case Urgency.NORMAL:
 | 
			
		||||
            stockIcon = 'dialog-information';
 | 
			
		||||
            break;
 | 
			
		||||
        case Urgency.CRITICAL:
 | 
			
		||||
            stockIcon = 'dialog-error';
 | 
			
		||||
            break;
 | 
			
		||||
            case Urgency.LOW:
 | 
			
		||||
            case Urgency.NORMAL:
 | 
			
		||||
                stockIcon = 'dialog-information';
 | 
			
		||||
                break;
 | 
			
		||||
            case Urgency.CRITICAL:
 | 
			
		||||
                stockIcon = 'dialog-error';
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
        return new Gio.ThemedIcon({ name: stockIcon });
 | 
			
		||||
    }
 | 
			
		||||
@@ -170,11 +170,11 @@ var FdoNotificationDaemon = class FdoNotificationDaemon {
 | 
			
		||||
            // Ignore replacesId since we already sent back a
 | 
			
		||||
            // NotificationClosed for that id.
 | 
			
		||||
            id = this._nextNotificationId++;
 | 
			
		||||
            let idleId = Mainloop.idle_add(() => {
 | 
			
		||||
            let idle_id = Mainloop.idle_add(() => {
 | 
			
		||||
                this._emitNotificationClosed(id, NotificationClosedReason.DISMISSED);
 | 
			
		||||
                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]));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -231,7 +231,7 @@ var FdoNotificationDaemon = class FdoNotificationDaemon {
 | 
			
		||||
            // There's already a pending call to GetConnectionUnixProcessID,
 | 
			
		||||
            // which will see the new notification data when it finishes,
 | 
			
		||||
            // so we don't have to do anything.
 | 
			
		||||
            return invocation.return_value(GLib.Variant.new('(u)', [id]));
 | 
			
		||||
            return invocation.return_value(GLib.Variant.new('(u)', [id]));;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._busProxy.GetConnectionUnixProcessIDRemote(sender, (result, excp) => {
 | 
			
		||||
@@ -270,15 +270,15 @@ var FdoNotificationDaemon = class FdoNotificationDaemon {
 | 
			
		||||
                delete this._notifications[ndata.id];
 | 
			
		||||
                let notificationClosedReason;
 | 
			
		||||
                switch (reason) {
 | 
			
		||||
                case MessageTray.NotificationDestroyedReason.EXPIRED:
 | 
			
		||||
                    notificationClosedReason = NotificationClosedReason.EXPIRED;
 | 
			
		||||
                    break;
 | 
			
		||||
                case MessageTray.NotificationDestroyedReason.DISMISSED:
 | 
			
		||||
                    notificationClosedReason = NotificationClosedReason.DISMISSED;
 | 
			
		||||
                    break;
 | 
			
		||||
                case MessageTray.NotificationDestroyedReason.SOURCE_CLOSED:
 | 
			
		||||
                    notificationClosedReason = NotificationClosedReason.APP_CLOSED;
 | 
			
		||||
                    break;
 | 
			
		||||
                    case MessageTray.NotificationDestroyedReason.EXPIRED:
 | 
			
		||||
                        notificationClosedReason = NotificationClosedReason.EXPIRED;
 | 
			
		||||
                        break;
 | 
			
		||||
                    case MessageTray.NotificationDestroyedReason.DISMISSED:
 | 
			
		||||
                        notificationClosedReason = NotificationClosedReason.DISMISSED;
 | 
			
		||||
                        break;
 | 
			
		||||
                    case MessageTray.NotificationDestroyedReason.SOURCE_CLOSED:
 | 
			
		||||
                        notificationClosedReason = NotificationClosedReason.APP_CLOSED;
 | 
			
		||||
                        break;
 | 
			
		||||
                }
 | 
			
		||||
                this._emitNotificationClosed(ndata.id, notificationClosedReason);
 | 
			
		||||
            });
 | 
			
		||||
@@ -309,7 +309,7 @@ var FdoNotificationDaemon = class FdoNotificationDaemon {
 | 
			
		||||
 | 
			
		||||
        if (actions.length) {
 | 
			
		||||
            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')
 | 
			
		||||
                    hasDefaultAction = true;
 | 
			
		||||
                else
 | 
			
		||||
@@ -330,15 +330,15 @@ var FdoNotificationDaemon = class FdoNotificationDaemon {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        switch (hints.urgency) {
 | 
			
		||||
        case Urgency.LOW:
 | 
			
		||||
            notification.setUrgency(MessageTray.Urgency.LOW);
 | 
			
		||||
            break;
 | 
			
		||||
        case Urgency.NORMAL:
 | 
			
		||||
            notification.setUrgency(MessageTray.Urgency.NORMAL);
 | 
			
		||||
            break;
 | 
			
		||||
        case Urgency.CRITICAL:
 | 
			
		||||
            notification.setUrgency(MessageTray.Urgency.CRITICAL);
 | 
			
		||||
            break;
 | 
			
		||||
            case Urgency.LOW:
 | 
			
		||||
                notification.setUrgency(MessageTray.Urgency.LOW);
 | 
			
		||||
                break;
 | 
			
		||||
            case Urgency.NORMAL:
 | 
			
		||||
                notification.setUrgency(MessageTray.Urgency.NORMAL);
 | 
			
		||||
                break;
 | 
			
		||||
            case Urgency.CRITICAL:
 | 
			
		||||
                notification.setUrgency(MessageTray.Urgency.CRITICAL);
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
        notification.setResident(!!hints.resident);
 | 
			
		||||
        // 'transient' is a reserved keyword in JS, so we have to retrieve the value
 | 
			
		||||
@@ -437,7 +437,7 @@ class FdoNotificationDaemonSource extends MessageTray.Source {
 | 
			
		||||
 | 
			
		||||
    _createPolicy() {
 | 
			
		||||
        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);
 | 
			
		||||
        } else {
 | 
			
		||||
            return new MessageTray.NotificationGenericPolicy();
 | 
			
		||||
@@ -474,7 +474,7 @@ class FdoNotificationDaemonSource extends MessageTray.Source {
 | 
			
		||||
            return app;
 | 
			
		||||
 | 
			
		||||
        if (appId) {
 | 
			
		||||
            app = Shell.AppSystem.get_default().lookup_app(`${appId}.desktop`);
 | 
			
		||||
            app = Shell.AppSystem.get_default().lookup_app(appId + '.desktop');
 | 
			
		||||
            if (app != null)
 | 
			
		||||
                return app;
 | 
			
		||||
        }
 | 
			
		||||
@@ -573,7 +573,7 @@ class GtkNotificationDaemonNotification extends MessageTray.Notification {
 | 
			
		||||
 | 
			
		||||
        this.update(title.unpack(), body ? body.unpack() : 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) {
 | 
			
		||||
@@ -610,7 +610,7 @@ function objectPathFromAppId(appId) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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 };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -623,7 +623,7 @@ class GtkNotificationDaemonAppSource extends MessageTray.Source {
 | 
			
		||||
        if (!GLib.Variant.is_object_path(objectPath))
 | 
			
		||||
            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)
 | 
			
		||||
            throw new InvalidAppError();
 | 
			
		||||
 | 
			
		||||
@@ -759,7 +759,7 @@ var GtkNotificationDaemon = class GtkNotificationDaemon {
 | 
			
		||||
                let source;
 | 
			
		||||
                try {
 | 
			
		||||
                    source = this._ensureAppSource(appId);
 | 
			
		||||
                } catch (e) {
 | 
			
		||||
                } catch(e) {
 | 
			
		||||
                    if (e instanceof InvalidAppError)
 | 
			
		||||
                        return;
 | 
			
		||||
                    throw e;
 | 
			
		||||
@@ -793,7 +793,7 @@ var GtkNotificationDaemon = class GtkNotificationDaemon {
 | 
			
		||||
        let source;
 | 
			
		||||
        try {
 | 
			
		||||
            source = this._ensureAppSource(appId);
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
            if (e instanceof InvalidAppError) {
 | 
			
		||||
                invocation.return_dbus_error('org.gtk.Notifications.InvalidApp', 'The app by ID "%s" could not be found'.format(appId));
 | 
			
		||||
                return;
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,8 @@ const { Clutter, Gio, Meta, St } = imports.gi;
 | 
			
		||||
 | 
			
		||||
const Main = imports.ui.main;
 | 
			
		||||
 | 
			
		||||
var FADE_TIME = 0.1;
 | 
			
		||||
 | 
			
		||||
var OsdMonitorLabel = class {
 | 
			
		||||
    constructor(monitor, label) {
 | 
			
		||||
        this._actor = new St.Widget({ x_expand: true,
 | 
			
		||||
@@ -51,7 +53,7 @@ var OsdMonitorLabeler = class {
 | 
			
		||||
        this._osdLabels = [];
 | 
			
		||||
        this._monitorLabels = null;
 | 
			
		||||
        Main.layoutManager.connect('monitors-changed',
 | 
			
		||||
                                   this._reset.bind(this));
 | 
			
		||||
                                    this._reset.bind(this));
 | 
			
		||||
        this._reset();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -21,7 +21,7 @@ var LevelBar = class extends BarLevel.BarLevel {
 | 
			
		||||
 | 
			
		||||
        this.actor.accessible_name = _("Volume");
 | 
			
		||||
 | 
			
		||||
        this.actor.connect('notify::width', () => this.level = this.level);
 | 
			
		||||
        this.actor.connect('notify::width', () => { this.level = this.level; });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get level() {
 | 
			
		||||
@@ -195,8 +195,8 @@ var OsdWindow = class {
 | 
			
		||||
                           time: FADE_TIME,
 | 
			
		||||
                           transition: 'easeOutQuad',
 | 
			
		||||
                           onComplete: () => {
 | 
			
		||||
                               this._reset();
 | 
			
		||||
                               Meta.enable_unredirect_for_display(global.display);
 | 
			
		||||
                              this._reset();
 | 
			
		||||
                              Meta.enable_unredirect_for_display(global.display);
 | 
			
		||||
                           }
 | 
			
		||||
                         });
 | 
			
		||||
        return GLib.SOURCE_REMOVE;
 | 
			
		||||
@@ -231,7 +231,7 @@ var OsdWindowManager = class {
 | 
			
		||||
    constructor() {
 | 
			
		||||
        this._osdWindows = [];
 | 
			
		||||
        Main.layoutManager.connect('monitors-changed',
 | 
			
		||||
                                   this._monitorsChanged.bind(this));
 | 
			
		||||
                                    this._monitorsChanged.bind(this));
 | 
			
		||||
        this._monitorsChanged();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||