Compare commits
	
		
			125 Commits
		
	
	
		
			1151-movin
			...
			wip/jimmac
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					04b0f86433 | ||
| 
						 | 
					43584e1d35 | ||
| 
						 | 
					2f6323afc2 | ||
| 
						 | 
					d25bcbc3a7 | ||
| 
						 | 
					dd5d7d3b70 | ||
| 
						 | 
					771b1a0788 | ||
| 
						 | 
					5a9d094f3e | ||
| 
						 | 
					9ca8433170 | ||
| 
						 | 
					0ada312748 | ||
| 
						 | 
					88697add1b | ||
| 
						 | 
					4730b7a094 | ||
| 
						 | 
					aa3e64aec3 | ||
| 
						 | 
					af26e2b212 | ||
| 
						 | 
					8167f20972 | ||
| 
						 | 
					bd4aac8f49 | ||
| 
						 | 
					785dd5c5f7 | ||
| 
						 | 
					71e469a59c | ||
| 
						 | 
					6d4b9d29b8 | ||
| 
						 | 
					33f5bb39cd | ||
| 
						 | 
					a1c3900630 | ||
| 
						 | 
					cdaf164c01 | ||
| 
						 | 
					2bd80579ed | ||
| 
						 | 
					54039c3552 | ||
| 
						 | 
					b197a1affb | ||
| 
						 | 
					51655be6a3 | ||
| 
						 | 
					9697c209c0 | ||
| 
						 | 
					6ecb0a4546 | ||
| 
						 | 
					30861d4800 | ||
| 
						 | 
					a23391ea28 | ||
| 
						 | 
					58e0b80cac | ||
| 
						 | 
					41dd744b74 | ||
| 
						 | 
					bdf66d7b62 | ||
| 
						 | 
					4258ae3ec2 | ||
| 
						 | 
					9b379c49ba | ||
| 
						 | 
					7e70dd8453 | ||
| 
						 | 
					2e209a82f9 | ||
| 
						 | 
					ab0ecc469f | ||
| 
						 | 
					7d75ddf635 | ||
| 
						 | 
					271e43a1ed | ||
| 
						 | 
					2702a82896 | ||
| 
						 | 
					8ad33d8752 | ||
| 
						 | 
					d84bbb8770 | ||
| 
						 | 
					c0c2edf2e1 | ||
| 
						 | 
					de0c3251dd | ||
| 
						 | 
					0afd600ea4 | ||
| 
						 | 
					598407b14a | ||
| 
						 | 
					d9bfa16f05 | ||
| 
						 | 
					03117d65b2 | ||
| 
						 | 
					5520bb3890 | ||
| 
						 | 
					4e6b2eb72a | ||
| 
						 | 
					2e5295b3a9 | ||
| 
						 | 
					3121c9aa29 | ||
| 
						 | 
					1ebbd7c768 | ||
| 
						 | 
					8572bb97c7 | ||
| 
						 | 
					d5ebd8c816 | ||
| 
						 | 
					ed999ce926 | ||
| 
						 | 
					50b7739076 | ||
| 
						 | 
					94995e9c1e | ||
| 
						 | 
					fb04dafb0b | ||
| 
						 | 
					d57234bec9 | ||
| 
						 | 
					38da54fb02 | ||
| 
						 | 
					bbd3275dad | ||
| 
						 | 
					3a3f9aa008 | ||
| 
						 | 
					3c54e863e6 | ||
| 
						 | 
					a63ba61194 | ||
| 
						 | 
					ab9710ee7b | ||
| 
						 | 
					43cef45229 | ||
| 
						 | 
					8db4f3c67f | ||
| 
						 | 
					594a070029 | ||
| 
						 | 
					c2e04e3cfa | ||
| 
						 | 
					293f50e8e5 | ||
| 
						 | 
					df7fea3407 | ||
| 
						 | 
					563412698a | ||
| 
						 | 
					2b30146c6c | ||
| 
						 | 
					0f531d8c44 | ||
| 
						 | 
					218c87994b | ||
| 
						 | 
					f74c07b9ac | ||
| 
						 | 
					59edea4bb4 | ||
| 
						 | 
					4d4d5a0b16 | ||
| 
						 | 
					03c4930883 | ||
| 
						 | 
					9593e20425 | ||
| 
						 | 
					2b1d6e607f | ||
| 
						 | 
					1dff32e48a | ||
| 
						 | 
					1e3a174de9 | ||
| 
						 | 
					7bb84dae80 | ||
| 
						 | 
					44fcb9e9af | ||
| 
						 | 
					2d30e310bc | ||
| 
						 | 
					be2d630348 | ||
| 
						 | 
					bea6045aae | ||
| 
						 | 
					ad491e7922 | ||
| 
						 | 
					fedb8e706a | ||
| 
						 | 
					1be933bc49 | ||
| 
						 | 
					526bb72f3d | ||
| 
						 | 
					49c95cff6c | ||
| 
						 | 
					56a361650c | ||
| 
						 | 
					d4763b157d | ||
| 
						 | 
					d2dc072ba9 | ||
| 
						 | 
					ffaca00594 | ||
| 
						 | 
					9090b7dc3d | ||
| 
						 | 
					a540fe4130 | ||
| 
						 | 
					5be61bbb68 | ||
| 
						 | 
					8e51fee5c1 | ||
| 
						 | 
					9d6fcfdc85 | ||
| 
						 | 
					5f5a3b78a5 | ||
| 
						 | 
					4e5ca6d376 | ||
| 
						 | 
					2fab75f448 | ||
| 
						 | 
					22883f2fa2 | ||
| 
						 | 
					5d9f80bc73 | ||
| 
						 | 
					f7d117488b | ||
| 
						 | 
					244a329ee7 | ||
| 
						 | 
					044572cb60 | ||
| 
						 | 
					746875258d | ||
| 
						 | 
					4892a87dfe | ||
| 
						 | 
					8b9c8ddb1e | ||
| 
						 | 
					eb9000576c | ||
| 
						 | 
					862aaf341e | ||
| 
						 | 
					a5c75ff58b | ||
| 
						 | 
					4541fb9819 | ||
| 
						 | 
					9f8edd980c | ||
| 
						 | 
					e5b9043435 | ||
| 
						 | 
					c0012c2ea4 | ||
| 
						 | 
					b77e4975f0 | ||
| 
						 | 
					e83f2344f6 | ||
| 
						 | 
					de6512be1a | ||
| 
						 | 
					0b72ff1896 | 
@@ -17,6 +17,8 @@ variables:
 | 
			
		||||
check_commit_log:
 | 
			
		||||
    image: registry.gitlab.gnome.org/gnome/mutter/master:v1
 | 
			
		||||
    stage: review
 | 
			
		||||
    variables:
 | 
			
		||||
        GIT_DEPTH: "100"
 | 
			
		||||
    script:
 | 
			
		||||
        - ./.gitlab-ci/check-commit-log.sh
 | 
			
		||||
    only:
 | 
			
		||||
@@ -38,7 +40,7 @@ js_check:
 | 
			
		||||
        when: on_failure
 | 
			
		||||
 | 
			
		||||
build:
 | 
			
		||||
    image: registry.gitlab.gnome.org/gnome/gnome-shell/master:v1
 | 
			
		||||
    image: registry.gitlab.gnome.org/gnome/mutter/master:v1
 | 
			
		||||
    stage: build
 | 
			
		||||
    before_script:
 | 
			
		||||
        - .gitlab-ci/checkout-mutter.sh
 | 
			
		||||
@@ -56,7 +58,7 @@ build:
 | 
			
		||||
            - build
 | 
			
		||||
 | 
			
		||||
test:
 | 
			
		||||
    image: registry.gitlab.gnome.org/gnome/gnome-shell/master:v1
 | 
			
		||||
    image: registry.gitlab.gnome.org/gnome/mutter/master:v1
 | 
			
		||||
    stage: test
 | 
			
		||||
    before_script:
 | 
			
		||||
        - ninja -C mutter/build install
 | 
			
		||||
@@ -70,7 +72,7 @@ test:
 | 
			
		||||
        when: on_failure
 | 
			
		||||
 | 
			
		||||
test-pot:
 | 
			
		||||
    image: registry.gitlab.gnome.org/gnome/gnome-shell/master:v1
 | 
			
		||||
    image: registry.gitlab.gnome.org/gnome/mutter/master:v1
 | 
			
		||||
    stage: test
 | 
			
		||||
    before_script:
 | 
			
		||||
        - ninja -C mutter/build install
 | 
			
		||||
 
 | 
			
		||||
@@ -1,19 +0,0 @@
 | 
			
		||||
FROM registry.gitlab.gnome.org/gnome/mutter/master:v1
 | 
			
		||||
 | 
			
		||||
RUN dnf -y update && dnf -y upgrade && \
 | 
			
		||||
    dnf install -y 'dnf-command(copr)' && \
 | 
			
		||||
    dnf copr enable -y fmuellner/gnome-shell-ci && \
 | 
			
		||||
    dnf builddep -y gnome-shell --setopt=install_weak_deps=False && \
 | 
			
		||||
 | 
			
		||||
    # bt only exports HAVE_BLUETOOTH to js, rest are outdated build-requires
 | 
			
		||||
    dnf remove -y gnome-bluetooth-libs-devel dbus-glib-devel \
 | 
			
		||||
                  upower-devel python3-devel && \
 | 
			
		||||
 | 
			
		||||
    # We'll build mutter ourselves
 | 
			
		||||
    dnf remove -y --noautoremove mutter mutter-devel && \
 | 
			
		||||
 | 
			
		||||
    # Needed for tests
 | 
			
		||||
    dnf install -y '*/xvfb-run' gdm-lib accountsservice-libs && \
 | 
			
		||||
 | 
			
		||||
    dnf clean all && \
 | 
			
		||||
    rm -rf /var/cache/dnf
 | 
			
		||||
@@ -17,15 +17,19 @@ if [ "$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" ]; then
 | 
			
		||||
  merge_request_branch=$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME
 | 
			
		||||
 | 
			
		||||
  echo Looking for $merge_request_branch on remote ...
 | 
			
		||||
  if git fetch $merge_request_remote $merge_request_branch >/dev/null 2>&1; then
 | 
			
		||||
  if git fetch -q $merge_request_remote $merge_request_branch 2>/dev/null; then
 | 
			
		||||
    mutter_target=FETCH_HEAD
 | 
			
		||||
  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 $shell_branch)
 | 
			
		||||
  mutter_target=$(git branch -r -l origin/$shell_branch)
 | 
			
		||||
  mutter_target=${mutter_target:-$(git branch -r -l ${shell_branch#remotes/})}
 | 
			
		||||
  mutter_target=${mutter_target:-origin/master}
 | 
			
		||||
  echo Using $mutter_target instead
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
git checkout $mutter_target
 | 
			
		||||
git checkout -q $mutter_target
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										77
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						
									
										77
									
								
								NEWS
									
									
									
									
									
								
							@@ -1,3 +1,80 @@
 | 
			
		||||
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]
 | 
			
		||||
 
 | 
			
		||||
@@ -9,9 +9,6 @@
 | 
			
		||||
    <method name="ShowOSD">
 | 
			
		||||
      <arg type="a{sv}" direction="in" name="params"/>
 | 
			
		||||
    </method>
 | 
			
		||||
    <method name="ShowMonitorLabels">
 | 
			
		||||
      <arg type="a{uv}" direction="in" name="params"/>
 | 
			
		||||
    </method>
 | 
			
		||||
    <method name="ShowMonitorLabels2">
 | 
			
		||||
      <arg type="a{sv}" direction="in" name="params"/>
 | 
			
		||||
    </method>
 | 
			
		||||
 
 | 
			
		||||
@@ -21,10 +21,8 @@
 | 
			
		||||
    <file>noise-texture.png</file>
 | 
			
		||||
    <file>pad-osd.css</file>
 | 
			
		||||
    <file>process-working.svg</file>
 | 
			
		||||
    <file>toggle-off-us.svg</file>
 | 
			
		||||
    <file>toggle-off-intl.svg</file>
 | 
			
		||||
    <file>toggle-off-hc.svg</file>
 | 
			
		||||
    <file>toggle-on-us.svg</file>
 | 
			
		||||
    <file>toggle-on-intl.svg</file>
 | 
			
		||||
    <file>toggle-on-hc.svg</file>
 | 
			
		||||
  </gresource>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,5 @@
 | 
			
		||||
$variant: 'light';
 | 
			
		||||
 | 
			
		||||
@import "gnome-shell-sass/_high-contrast-colors"; //use gtk colors
 | 
			
		||||
@import "gnome-shell-sass/_drawing";
 | 
			
		||||
@import "gnome-shell-sass/_common";
 | 
			
		||||
 
 | 
			
		||||
@@ -11,6 +11,7 @@ $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));
 | 
			
		||||
$alt_borders_color: if($variant == 'light', darken($bg_color, 24%), darken($bg_color, 18%));
 | 
			
		||||
$link_color: if($variant == 'light', darken($selected_bg_color, 10%), lighten($selected_bg_color, 20%));
 | 
			
		||||
$link_visited_color: if($variant == 'light', darken($selected_bg_color, 20%), lighten($selected_bg_color, 10%));
 | 
			
		||||
$top_hilight: $borders_edge;
 | 
			
		||||
@@ -24,6 +25,7 @@ $osd_fg_color: #eeeeec;
 | 
			
		||||
$osd_bg_color: #2e3436;
 | 
			
		||||
$osd_borders_color: transparentize(black, 0.3);
 | 
			
		||||
$osd_outer_borders_color: transparentize(white, 0.9);
 | 
			
		||||
$shadow_color: transparentize(black, 0.9);
 | 
			
		||||
 | 
			
		||||
$tooltip_borders_color: $osd_outer_borders_color;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -157,18 +157,13 @@ StScrollBar {
 | 
			
		||||
 | 
			
		||||
/* Switches */
 | 
			
		||||
.toggle-switch {
 | 
			
		||||
  width: 65px;
 | 
			
		||||
  width: 46px;
 | 
			
		||||
  height: 22px;
 | 
			
		||||
  background-size: contain;
 | 
			
		||||
  background-image: url("resource:///org/gnome/shell/theme/toggle-off-intl.svg");
 | 
			
		||||
  &:checked { background-image: url("resource:///org/gnome/shell/theme/toggle-on-intl.svg"); }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
  @each $v in us, intl {
 | 
			
		||||
    .toggle-switch-#{$v} {
 | 
			
		||||
      background-image: url("resource:///org/gnome/shell/theme/toggle-off-#{$v}.svg");
 | 
			
		||||
      &:checked { background-image: url("resource:///org/gnome/shell/theme/toggle-on-#{$v}.svg"); }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
/* links */
 | 
			
		||||
.shell-link {
 | 
			
		||||
  color: $link_color;
 | 
			
		||||
@@ -387,7 +382,6 @@ StScrollBar {
 | 
			
		||||
 | 
			
		||||
  .prompt-dialog-password-box {
 | 
			
		||||
    spacing: 1em;
 | 
			
		||||
    padding-bottom: 1em;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .prompt-dialog-error-label {
 | 
			
		||||
@@ -410,6 +404,23 @@ StScrollBar {
 | 
			
		||||
    padding-bottom: 8px;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .prompt-dialog-pim-box {
 | 
			
		||||
    spacing: 1em;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .prompt-dialog-grid {
 | 
			
		||||
    spacing-rows: 15px;
 | 
			
		||||
    spacing-columns: 1em;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .prompt-dialog-keyfiles-box {
 | 
			
		||||
    spacing: 1em;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .prompt-dialog-button.button {
 | 
			
		||||
    padding: 8px;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Polkit Dialog */
 | 
			
		||||
 | 
			
		||||
@@ -1001,8 +1012,11 @@ StScrollBar {
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
        .message-list-clear-button.button {
 | 
			
		||||
          background-color: transparent;
 | 
			
		||||
          &:hover,&:focus { background-color: lighten($bg_color,5%); }
 | 
			
		||||
	  @include button(normal);
 | 
			
		||||
	  &:insensitive { @include button(insensitive); }
 | 
			
		||||
	  &:hover { @include button(hover); }
 | 
			
		||||
	  &:focus { @include button(focus); }
 | 
			
		||||
	  &:active { @include button(active); }
 | 
			
		||||
          margin: 1.5em 1.5em 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -1142,6 +1156,12 @@ StScrollBar {
 | 
			
		||||
 | 
			
		||||
.ripple-box:rtl { border-radius: 0 0 0 52px; } // just a simple change to the border radius position
 | 
			
		||||
 | 
			
		||||
// Rubberband for select-area screenshots
 | 
			
		||||
.select-area-rubberband {
 | 
			
		||||
  background-color: transparentize($selected_bg_color,0.7);
 | 
			
		||||
  border: 1px solid $selected_bg_color;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// not really top bar only
 | 
			
		||||
.popup-menu-arrow { icon-size: 1.09em; }
 | 
			
		||||
.popup-menu-icon { icon-size: 1.09em; }
 | 
			
		||||
@@ -1149,25 +1169,23 @@ StScrollBar {
 | 
			
		||||
//close buttons
 | 
			
		||||
 | 
			
		||||
.window-close {
 | 
			
		||||
  background-color: white;
 | 
			
		||||
  background-color: $selected_bg_color;
 | 
			
		||||
  color: white;
 | 
			
		||||
  border-radius: 24px;
 | 
			
		||||
  border: 4px solid $selected_bg_color;
 | 
			
		||||
  box-shadow: inset 0 -4px 0 0 transparentize($selected_bg_color, 0.5);
 | 
			
		||||
  color: $selected_bg_color;
 | 
			
		||||
  border: 2px solid $selected_bg_color;
 | 
			
		||||
  height: 24px;
 | 
			
		||||
  width: 24px;
 | 
			
		||||
  -shell-close-overlap: 14px;
 | 
			
		||||
  -shell-close-overlap: 11px;
 | 
			
		||||
  box-shadow: -1px 1px 5px 0px transparentize(black, 0.5);
 | 
			
		||||
 | 
			
		||||
  &:hover {
 | 
			
		||||
    background-color: $selected_bg_color;
 | 
			
		||||
    border-color: white;
 | 
			
		||||
    color: white;
 | 
			
		||||
    background-color: lighten($selected_bg_color, 5%);
 | 
			
		||||
    border-color: lighten($selected_bg_color, 5%);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  &:active {
 | 
			
		||||
    background-color: mix(white, $selected_bg_color, 75%);
 | 
			
		||||
    border-color: $selected_bg_color;
 | 
			
		||||
    color: $selected_bg_color;
 | 
			
		||||
    background-color: darken($selected_bg_color, 5%);
 | 
			
		||||
    border-color: darken($selected_bg_color, 5%);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -1232,13 +1250,14 @@ StScrollBar {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .window-clone-border {
 | 
			
		||||
    border: 4px solid $selected_bg_color;
 | 
			
		||||
    border-radius: 4px;
 | 
			
		||||
    $_bg: transparentize(white, 0.65);
 | 
			
		||||
    border: 5px solid $_bg;
 | 
			
		||||
    border-radius: 6px;
 | 
			
		||||
    // For window decorations with round corners we can't match
 | 
			
		||||
    // the exact shape when the window is scaled. So apply a shadow
 | 
			
		||||
    // to fix that case
 | 
			
		||||
    box-shadow: inset 0px 0px 0px 1px $selected_bg_color;
 | 
			
		||||
  }
 | 
			
		||||
    box-shadow: inset 0 0 0 1px $_bg;
 | 
			
		||||
}
 | 
			
		||||
  .window-caption {
 | 
			
		||||
    spacing: 25px;
 | 
			
		||||
    color: $selected_fg_color;
 | 
			
		||||
@@ -1521,12 +1540,12 @@ StScrollBar {
 | 
			
		||||
    width: 34em;
 | 
			
		||||
    margin: 5px;
 | 
			
		||||
    border-radius: 6px;
 | 
			
		||||
    color: $_bubble_fg_color;
 | 
			
		||||
    background-color: $_bubble_bg_color;
 | 
			
		||||
    color: $fg_color;
 | 
			
		||||
    background-color: $bg_color;
 | 
			
		||||
    border: 1px solid $borders_color;
 | 
			
		||||
    //box-shadow: 0 1px 4px black;
 | 
			
		||||
    &:hover { background-color: $_bubble_bg_color; }
 | 
			
		||||
    &:focus { background-color: $_bubble_bg_color; }
 | 
			
		||||
    box-shadow: 0 1px 4px black;
 | 
			
		||||
    //&:hover { background-color: $bg_color; }
 | 
			
		||||
    //&:focus { background-color: $bg_color; }
 | 
			
		||||
 | 
			
		||||
    .notification-icon { padding: 5px; }
 | 
			
		||||
    .notification-content { padding: 5px; spacing: 5px; }
 | 
			
		||||
@@ -1541,7 +1560,6 @@ StScrollBar {
 | 
			
		||||
      background-color: darken($_bubble_bg_color,5%);
 | 
			
		||||
      &:first-child { border-radius: 0 0 0 6px; }
 | 
			
		||||
      &:last-child { border-radius: 0 0 6px 0; }
 | 
			
		||||
      &:hover, &focus { background-color: darken($_bubble_bg_color,2%); }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  .summary-source-counter {
 | 
			
		||||
 
 | 
			
		||||
@@ -111,7 +111,59 @@
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@mixin button($t, $c:$osd_bg_color, $tc:$fg_color, $edge: $borders_edge) {
 | 
			
		||||
@function _border_color($c, $darker: false) {
 | 
			
		||||
  @if $darker == true { @return darken($c, 20%); }
 | 
			
		||||
  @else { @return darken($c, 10%); }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@function _text_shadow_color ($tc: $fg_color, $bg: $bg_color) {
 | 
			
		||||
//
 | 
			
		||||
// calculate the color of text shadows
 | 
			
		||||
//
 | 
			
		||||
// $tc is the text color
 | 
			
		||||
// $bg is the background color
 | 
			
		||||
//
 | 
			
		||||
  $_lbg: lightness($bg)/100%;
 | 
			
		||||
  @if lightness($tc)<50% { @return transparentize(white, 1-$_lbg/($_lbg*1.3)); }
 | 
			
		||||
  @else { @return transparentize(black, $_lbg*0.8); }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@function _button_hilight_color($c) {
 | 
			
		||||
//
 | 
			
		||||
// calculate the right top hilight color for buttons
 | 
			
		||||
//
 | 
			
		||||
// $c: base color;
 | 
			
		||||
//
 | 
			
		||||
  @if lightness($c)>95% { @return white; }
 | 
			
		||||
  @else if lightness($c)>90% { @return transparentize(white, 0.2); }
 | 
			
		||||
  @else if lightness($c)>80% { @return transparentize(white, 0.5); }
 | 
			
		||||
  @else if lightness($c)>50% { @return transparentize(white, 0.8); }
 | 
			
		||||
  @else if lightness($c)>40% { @return transparentize(white, 0.9); }
 | 
			
		||||
  @else { @return transparentize(white, 0.98); }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@mixin _button_text_shadow ($tc:$fg_color, $bg:$bg_color) {
 | 
			
		||||
//
 | 
			
		||||
// helper function for the text emboss effect
 | 
			
		||||
//
 | 
			
		||||
// $tc is the optional text color, not the shadow color
 | 
			
		||||
//
 | 
			
		||||
// TODO: this functions needs a way to deal with special cases
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
  $_shadow: _text_shadow_color($tc, $bg);
 | 
			
		||||
 | 
			
		||||
  @if lightness($tc)<50% {
 | 
			
		||||
    text-shadow: 0 1px $_shadow;
 | 
			
		||||
    -gtk-icon-shadow: 0 1px $_shadow;
 | 
			
		||||
  }
 | 
			
		||||
  @else {
 | 
			
		||||
    text-shadow: 0 -1px $_shadow;
 | 
			
		||||
    -gtk-icon-shadow: 0 -1px $_shadow;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@mixin button($t, $c:$bg_color, $tc:$fg_color, $edge: none) {
 | 
			
		||||
//
 | 
			
		||||
// Button drawing function
 | 
			
		||||
//
 | 
			
		||||
@@ -126,96 +178,222 @@
 | 
			
		||||
// backdrop, backdrop-active, backdrop-insensitive, backdrop-insensitive-active,
 | 
			
		||||
// osd, osd-hover, osd-active, osd-insensitive, osd-backdrop, undecorated
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
// This mixin sets the $button_fill global variable which containts the button background-image
 | 
			
		||||
//
 | 
			
		||||
  $_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: if($c!=$osd_bg_color, transparentize($c, 0.5),
 | 
			
		||||
                            $osd_bg_color);
 | 
			
		||||
 | 
			
		||||
    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
 | 
			
		||||
  //
 | 
			
		||||
    $_bg: if($c!=$osd_bg_color, transparentize($c, 0.3),
 | 
			
		||||
                          lighten($osd_bg_color,3%));
 | 
			
		||||
 | 
			
		||||
    color: $osd_fg_color;
 | 
			
		||||
    text-shadow: 0 1px black;
 | 
			
		||||
    icon-shadow: 0 1px black;
 | 
			
		||||
    box-shadow: inset 0px 0px 0px 1px $selected_bg_color;
 | 
			
		||||
    color: $tc;
 | 
			
		||||
    outline-color: transparentize($tc, 0.7);
 | 
			
		||||
    border-color: if($c != $bg_color, _border_color($c), $borders_color);
 | 
			
		||||
    border-bottom-color: if($c != $bg_color, _border_color($c, true), $alt_borders_color);
 | 
			
		||||
    $button_fill: if($variant == 'light', linear-gradient(to top, darken($c, 4%) 2px, $c),
 | 
			
		||||
                                          linear-gradient(to top, darken($c,1%) 2px, $c)) !global;
 | 
			
		||||
    background-image: $button_fill;
 | 
			
		||||
    @include _button_text_shadow($tc, $c);
 | 
			
		||||
    @include _shadows(inset 0 1px $_hilight_color, $_button_edge, $_button_shadow);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @else if $t==hover {
 | 
			
		||||
  //
 | 
			
		||||
  // active osd button
 | 
			
		||||
  // hovered button
 | 
			
		||||
  //
 | 
			
		||||
    $_bg: if($c!=$osd_bg_color, transparentize($c, 0.3),
 | 
			
		||||
                            lighten($osd_bg_color,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;
 | 
			
		||||
 | 
			
		||||
    color: $tc;
 | 
			
		||||
    outline-color: transparentize($tc, 0.7);
 | 
			
		||||
    border-color: if($c != $bg_color, _border_color($c), $borders_color);
 | 
			
		||||
    border-bottom-color: if($c != $bg_color, _border_color($c, true), $alt_borders_color);
 | 
			
		||||
    @if $variant == 'light' {
 | 
			
		||||
      $button_fill: linear-gradient(to top, $c, lighten($c, 1%) 1px) !global;
 | 
			
		||||
      @include _button_text_shadow($tc, lighten($c, 6%));
 | 
			
		||||
      @include _shadows(inset 0 1px _button_hilight_color(lighten($c, 6%)), $_button_edge, $_button_shadow);
 | 
			
		||||
    }
 | 
			
		||||
    @else {
 | 
			
		||||
      $button_fill: linear-gradient(to top, darken($c,1%), lighten($c, 1%) 1px) !global;
 | 
			
		||||
      @include _button_text_shadow($tc,lighten($c, 6%));
 | 
			
		||||
      @include _shadows(inset 0 1px _button_hilight_color(darken($c, 2%)), $_button_edge, $_button_shadow);
 | 
			
		||||
    }
 | 
			
		||||
    background-image: $button_fill;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @if $t==normal-alt {
 | 
			
		||||
  //
 | 
			
		||||
  // normal button alternative look
 | 
			
		||||
  //
 | 
			
		||||
    color: $tc;
 | 
			
		||||
    outline-color: transparentize($tc, 0.7);
 | 
			
		||||
    border-color: if($c != $bg_color, _border_color($c, true), $alt_borders_color);
 | 
			
		||||
    @include _button_text_shadow($tc, $c);
 | 
			
		||||
    @if $variant == 'light' {
 | 
			
		||||
      background-image: linear-gradient(to bottom, lighten($c, 5%) 20%, $c 90%);
 | 
			
		||||
       @include _shadows(inset 0 1px _button_hilight_color(lighten($c, 6%)),
 | 
			
		||||
                        $_button_edge, $_button_shadow);
 | 
			
		||||
    }
 | 
			
		||||
    @else {
 | 
			
		||||
      background-image: linear-gradient(to bottom, darken($c, 3%) 20%, darken($c, 6%) 90%);
 | 
			
		||||
      @include _shadows(inset 0 1px $_hilight_color,
 | 
			
		||||
                        $_button_edge, $_button_shadow);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @else if $t==hover-alt {
 | 
			
		||||
  //
 | 
			
		||||
  // hovered button alternative look
 | 
			
		||||
  //
 | 
			
		||||
    color: $tc;
 | 
			
		||||
    outline-color: transparentize($tc, 0.7);
 | 
			
		||||
    border-color: if($c != $bg_color, _border_color($c, true), $alt_borders_color);
 | 
			
		||||
    @if $variant == 'light' {
 | 
			
		||||
      $button_fill: linear-gradient(to bottom, lighten($c, 9%) 10%, lighten($c, 4%) 90%) !global;
 | 
			
		||||
      @include _shadows(inset 0 1px _button_hilight_color(lighten($c, 6%)),
 | 
			
		||||
                        $_button_edge, $_button_shadow);
 | 
			
		||||
    }
 | 
			
		||||
    @else {
 | 
			
		||||
      $button_fill: linear-gradient(to bottom, $c 20%, darken($c, 4%) 90%) !global;
 | 
			
		||||
      @include _shadows(inset 0 1px $_hilight_color,
 | 
			
		||||
                        $_button_edge, $_button_shadow);
 | 
			
		||||
    }
 | 
			
		||||
    background-image: $button_fill;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @else if $t==active {
 | 
			
		||||
  //
 | 
			
		||||
  // pushed button
 | 
			
		||||
  //
 | 
			
		||||
    color: $tc;
 | 
			
		||||
    outline-color: transparentize($tc, 0.7);
 | 
			
		||||
    border-color: if($c != $bg_color, _border_color($c), $borders_color);
 | 
			
		||||
    $button_fill: if($variant == 'light', image(darken($c, 14%)), image(darken($c, 9%))) !global;
 | 
			
		||||
    background-image: $button_fill;
 | 
			
		||||
    @include _shadows(inset 0 1px transparentize($_hilight_color, 1), $_button_edge);
 | 
			
		||||
 | 
			
		||||
    text-shadow: none;
 | 
			
		||||
    -gtk-icon-shadow: none;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @else if $t==insensitive {
 | 
			
		||||
  //
 | 
			
		||||
  // insensitive button
 | 
			
		||||
  //
 | 
			
		||||
    $_bg: if($c != $bg_color, mix($c, $base_color, 85%), $insensitive_bg_color);
 | 
			
		||||
 | 
			
		||||
    label, & { color: if($tc != $fg_color, mix($tc, $_bg, 50%), $insensitive_fg_color); }
 | 
			
		||||
 | 
			
		||||
    border-color: if($c != $bg_color, _border_color($c), $insensitive_borders_color);
 | 
			
		||||
    $button_fill: image($_bg) !global;
 | 
			
		||||
    background-image: $button_fill;
 | 
			
		||||
    text-shadow: none;
 | 
			
		||||
    -gtk-icon-shadow: none;
 | 
			
		||||
    // white with 0 alpha to avoid an ugly transition, since no color means
 | 
			
		||||
    // black with 0 alpha
 | 
			
		||||
    @include _shadows(inset 0 1px transparentize(white, 1), $_button_edge);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @else if $t==insensitive-active {
 | 
			
		||||
  //
 | 
			
		||||
  // insensitive pushed button
 | 
			
		||||
  //
 | 
			
		||||
    $_bg: if($variant == 'light', darken(mix($c, $base_color, 85%), 8%), darken(mix($c, $base_color, 85%), 6%));
 | 
			
		||||
    $_bc: if($c != $bg_color, _border_color($c), $insensitive_borders_color);
 | 
			
		||||
 | 
			
		||||
    label, & { color: if($c != $bg_color, mix($tc, $_bg, 60%), $insensitive_fg_color); }
 | 
			
		||||
 | 
			
		||||
    border-color: $_bc;
 | 
			
		||||
    $button_fill: image($_bg) !global;
 | 
			
		||||
    background-image: $button_fill;
 | 
			
		||||
    // white with 0 alpha to avoid an ugly transition, since no color means
 | 
			
		||||
    // black with 0 alpha
 | 
			
		||||
    @include _shadows(inset 0 1px transparentize(white, 1), $_button_edge);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  
 | 
			
		||||
  @else if $t==osd {
 | 
			
		||||
  //
 | 
			
		||||
  // normal osd button
 | 
			
		||||
  //
 | 
			
		||||
    $_bg: if($c != $bg_color, transparentize($c, 0.5), $osd_bg_color);
 | 
			
		||||
 | 
			
		||||
    color: $osd_fg_color;
 | 
			
		||||
    border-color: $osd_borders_color;
 | 
			
		||||
    background-color: transparent;
 | 
			
		||||
    $button_fill: image($_bg) !global;
 | 
			
		||||
    background-image: $button_fill;
 | 
			
		||||
    background-clip: padding-box;
 | 
			
		||||
    box-shadow: inset 0 1px transparentize(white, 0.9);
 | 
			
		||||
    text-shadow: 0 1px black;
 | 
			
		||||
    -gtk-icon-shadow: 0 1px black;
 | 
			
		||||
    outline-color: transparentize($osd_fg_color, 0.7);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @else if $t==osd-hover {
 | 
			
		||||
  //
 | 
			
		||||
  // active osd button
 | 
			
		||||
  //
 | 
			
		||||
    $_bg: if($c!=$bg_color, $c, $osd_borders_color);
 | 
			
		||||
    $_bg: if($c != $bg_color, transparentize($c, 0.3), lighten($osd_bg_color, 12%));
 | 
			
		||||
 | 
			
		||||
    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;
 | 
			
		||||
    background-color: transparent;
 | 
			
		||||
    $button_fill: image($_bg) !global;
 | 
			
		||||
    background-image: $button_fill;
 | 
			
		||||
    background-clip: padding-box;
 | 
			
		||||
    box-shadow: inset 0 1px transparentize(white, 0.9);
 | 
			
		||||
    text-shadow: 0 1px black;
 | 
			
		||||
    -gtk-icon-shadow: 0 1px black;
 | 
			
		||||
    outline-color: transparentize($osd_fg_color, 0.7);
 | 
			
		||||
  }
 | 
			
		||||
  @else if $t==insensitive {
 | 
			
		||||
 | 
			
		||||
  @else if $t==osd-active {
 | 
			
		||||
  //
 | 
			
		||||
  // active osd button
 | 
			
		||||
  //
 | 
			
		||||
    $_bg: if($c != $bg_color, $c, $osd_borders_color);
 | 
			
		||||
 | 
			
		||||
    color: white;
 | 
			
		||||
    border-color: $osd_borders_color;
 | 
			
		||||
    background-color: transparent;
 | 
			
		||||
    $button_fill: image($_bg) !global;
 | 
			
		||||
    background-image: $button_fill;
 | 
			
		||||
    background-clip: padding-box;
 | 
			
		||||
    box-shadow: none;
 | 
			
		||||
    text-shadow: none;
 | 
			
		||||
    -gtk-icon-shadow: none;
 | 
			
		||||
    outline-color: transparentize($osd_fg_color, 0.7);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @else if $t==osd-insensitive {
 | 
			
		||||
  //
 | 
			
		||||
  // insensitive osd button
 | 
			
		||||
  //
 | 
			
		||||
    $_bg: transparentize(mix($insensitive_fg_color,$osd_bg_color,20%),0.3);
 | 
			
		||||
 | 
			
		||||
    color: $insensitive_fg_color;
 | 
			
		||||
    color: $osd_insensitive_fg_color;
 | 
			
		||||
    border-color: $osd_borders_color;
 | 
			
		||||
    background-color: $_bg;
 | 
			
		||||
    background-color: transparent;
 | 
			
		||||
    $button_fill: image($osd_insensitive_bg_color) !global;
 | 
			
		||||
    background-image: $button_fill;
 | 
			
		||||
    background-clip: padding-box;
 | 
			
		||||
    box-shadow: none;
 | 
			
		||||
    text-shadow: none;
 | 
			
		||||
    icon-shadow: none;
 | 
			
		||||
    -gtk-icon-shadow: none;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  
 | 
			
		||||
  @else if $t==undecorated {
 | 
			
		||||
  //
 | 
			
		||||
  // reset
 | 
			
		||||
  //
 | 
			
		||||
    border-color: transparent;
 | 
			
		||||
    background-color: transparent;
 | 
			
		||||
    background-image: none;
 | 
			
		||||
    $button_fill: none !global;
 | 
			
		||||
    background-image: $button_fill;
 | 
			
		||||
 | 
			
		||||
    @include _shadows(inset 0 1px transparentize(white,1),
 | 
			
		||||
                      $_blank_edge);
 | 
			
		||||
    @include _shadows(inset 0 1px transparentize(white, 1), $_blank_edge);
 | 
			
		||||
 | 
			
		||||
    text-shadow: none;
 | 
			
		||||
    icon-shadow: none;
 | 
			
		||||
    -gtk-icon-shadow: none;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -10,6 +10,7 @@ $selected_fg_color: #ffffff;
 | 
			
		||||
$selected_bg_color: darken(#4a90d9,20%);
 | 
			
		||||
$selected_borders_color: darken($selected_bg_color, 20%);
 | 
			
		||||
$borders_color: darken($bg_color,12%);
 | 
			
		||||
$alt_borders_color: darken($bg_color,12%);
 | 
			
		||||
$borders_edge: transparentize($fg_color, 0.9);
 | 
			
		||||
$link_color: lighten($selected_bg_color,20%);
 | 
			
		||||
$link_visited_color: lighten($selected_bg_color,10%);
 | 
			
		||||
@@ -24,6 +25,7 @@ $osd_fg_color: #eeeeec;
 | 
			
		||||
$osd_bg_color: #2e3436;
 | 
			
		||||
$osd_borders_color: transparentize(black, 0.3);
 | 
			
		||||
$osd_outer_borders_color: transparentize(white, 0.9);
 | 
			
		||||
$shadow_color: rgba(0,0,0,0);
 | 
			
		||||
 | 
			
		||||
$tooltip_borders_color: $osd_outer_borders_color;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
$variant: 'dark';
 | 
			
		||||
$variant: 'light';
 | 
			
		||||
 | 
			
		||||
@import "gnome-shell-sass/_colors"; //use gtk colors
 | 
			
		||||
@import "gnome-shell-sass/_drawing";
 | 
			
		||||
 
 | 
			
		||||
@@ -10,124 +10,62 @@
 | 
			
		||||
   xmlns:xlink="http://www.w3.org/1999/xlink"
 | 
			
		||||
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
 | 
			
		||||
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
 | 
			
		||||
   width="65"
 | 
			
		||||
   width="46"
 | 
			
		||||
   height="22"
 | 
			
		||||
   id="svg2857"
 | 
			
		||||
   viewBox="0 0 46 22"
 | 
			
		||||
   version="1.1"
 | 
			
		||||
   inkscape:version="0.48.5 r10040"
 | 
			
		||||
   sodipodi:docname="toggle-off-us.svg">
 | 
			
		||||
   id="svg2751"
 | 
			
		||||
   inkscape:version="0.92.4 5da689c313, 2019-01-14"
 | 
			
		||||
   sodipodi:docname="toggle-off-intl.svg">
 | 
			
		||||
  <defs
 | 
			
		||||
     id="defs2859">
 | 
			
		||||
    <inkscape:perspective
 | 
			
		||||
       sodipodi:type="inkscape:persp3d"
 | 
			
		||||
       inkscape:vp_x="0 : 526.18109 : 1"
 | 
			
		||||
       inkscape:vp_y="0 : 1000 : 0"
 | 
			
		||||
       inkscape:vp_z="744.09448 : 526.18109 : 1"
 | 
			
		||||
       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
 | 
			
		||||
       id="perspective2865" />
 | 
			
		||||
    <inkscape:perspective
 | 
			
		||||
       id="perspective2843"
 | 
			
		||||
       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
 | 
			
		||||
       inkscape:vp_z="1 : 0.5 : 1"
 | 
			
		||||
       inkscape:vp_y="0 : 1000 : 0"
 | 
			
		||||
       inkscape:vp_x="0 : 0.5 : 1"
 | 
			
		||||
       sodipodi:type="inkscape:persp3d" />
 | 
			
		||||
     id="defs2745">
 | 
			
		||||
    <linearGradient
 | 
			
		||||
       inkscape:collect="always"
 | 
			
		||||
       xlink:href="#linearGradient76469-7-7-4"
 | 
			
		||||
       id="linearGradient38024"
 | 
			
		||||
       gradientUnits="userSpaceOnUse"
 | 
			
		||||
       gradientTransform="matrix(1.0215462,0,0,1.0322581,717.22867,428.68472)"
 | 
			
		||||
       x1="6"
 | 
			
		||||
       y1="102.95528"
 | 
			
		||||
       x2="6"
 | 
			
		||||
       y2="84.505203" />
 | 
			
		||||
    <linearGradient
 | 
			
		||||
       inkscape:collect="always"
 | 
			
		||||
       id="linearGradient76469-7-7-4">
 | 
			
		||||
       id="linearGradient3329">
 | 
			
		||||
      <stop
 | 
			
		||||
         style="stop-color:#2e3232;stop-opacity:1"
 | 
			
		||||
         style="stop-color:#39393a;stop-opacity:1;"
 | 
			
		||||
         offset="0"
 | 
			
		||||
         id="stop76471-7-1-5" />
 | 
			
		||||
         id="stop3325" />
 | 
			
		||||
      <stop
 | 
			
		||||
         style="stop-color:#3e4545;stop-opacity:1"
 | 
			
		||||
         style="stop-color:#302f30;stop-opacity:1"
 | 
			
		||||
         offset="1"
 | 
			
		||||
         id="stop76473-9-0-0" />
 | 
			
		||||
    </linearGradient>
 | 
			
		||||
    <inkscape:path-effect
 | 
			
		||||
       effect="spiro"
 | 
			
		||||
       id="path-effect77541-4"
 | 
			
		||||
       is_visible="true" />
 | 
			
		||||
    <inkscape:path-effect
 | 
			
		||||
       effect="spiro"
 | 
			
		||||
       id="path-effect77541-4-0"
 | 
			
		||||
       is_visible="true" />
 | 
			
		||||
    <linearGradient
 | 
			
		||||
       inkscape:collect="always"
 | 
			
		||||
       xlink:href="#linearGradient37802-8"
 | 
			
		||||
       id="linearGradient12311-3-1-0-5-4"
 | 
			
		||||
       gradientUnits="userSpaceOnUse"
 | 
			
		||||
       gradientTransform="matrix(1.5918367,0,0,0.85714285,-256.56122,59.071426)"
 | 
			
		||||
       x1="610.13782"
 | 
			
		||||
       y1="501.43866"
 | 
			
		||||
       x2="610.13782"
 | 
			
		||||
       y2="492.52756" />
 | 
			
		||||
    <linearGradient
 | 
			
		||||
       id="linearGradient37802-8"
 | 
			
		||||
       inkscape:collect="always">
 | 
			
		||||
      <stop
 | 
			
		||||
         id="stop37804-1"
 | 
			
		||||
         offset="0"
 | 
			
		||||
         style="stop-color:#2c2c2c;stop-opacity:1" />
 | 
			
		||||
      <stop
 | 
			
		||||
         id="stop37806-8"
 | 
			
		||||
         offset="1"
 | 
			
		||||
         style="stop-color:#16191a;stop-opacity:1" />
 | 
			
		||||
         id="stop3327" />
 | 
			
		||||
    </linearGradient>
 | 
			
		||||
    <linearGradient
 | 
			
		||||
       y2="492.52756"
 | 
			
		||||
       x2="610.13782"
 | 
			
		||||
       y1="501.43866"
 | 
			
		||||
       x1="610.13782"
 | 
			
		||||
       gradientTransform="matrix(1.5918367,0,0,0.85714285,-900.56122,-423.92857)"
 | 
			
		||||
       inkscape:collect="always"
 | 
			
		||||
       xlink:href="#linearGradient3329"
 | 
			
		||||
       id="linearGradient3331"
 | 
			
		||||
       x1="53"
 | 
			
		||||
       y1="294.42917"
 | 
			
		||||
       x2="53"
 | 
			
		||||
       y2="309.80417"
 | 
			
		||||
       gradientUnits="userSpaceOnUse"
 | 
			
		||||
       id="linearGradient13602"
 | 
			
		||||
       xlink:href="#linearGradient37802-8"
 | 
			
		||||
       inkscape:collect="always" />
 | 
			
		||||
       gradientTransform="translate(-42.760724)" />
 | 
			
		||||
  </defs>
 | 
			
		||||
  <sodipodi:namedview
 | 
			
		||||
     id="base"
 | 
			
		||||
     pagecolor="#000000"
 | 
			
		||||
     pagecolor="#535353"
 | 
			
		||||
     bordercolor="#666666"
 | 
			
		||||
     borderopacity="1.0"
 | 
			
		||||
     inkscape:pageopacity="1"
 | 
			
		||||
     inkscape:pageshadow="2"
 | 
			
		||||
     inkscape:zoom="1"
 | 
			
		||||
     inkscape:cx="-5.0602834"
 | 
			
		||||
     inkscape:cy="16.473273"
 | 
			
		||||
     inkscape:cx="-19.436775"
 | 
			
		||||
     inkscape:cy="-13.499723"
 | 
			
		||||
     inkscape:document-units="px"
 | 
			
		||||
     inkscape:current-layer="g37994"
 | 
			
		||||
     inkscape:current-layer="layer1"
 | 
			
		||||
     showgrid="false"
 | 
			
		||||
     inkscape:window-width="2560"
 | 
			
		||||
     inkscape:window-height="1375"
 | 
			
		||||
     inkscape:window-x="0"
 | 
			
		||||
     inkscape:window-y="27"
 | 
			
		||||
     inkscape:window-maximized="1"
 | 
			
		||||
     units="px"
 | 
			
		||||
     inkscape:pagecheckerboard="true"
 | 
			
		||||
     borderlayer="true"
 | 
			
		||||
     inkscape:showpageshadow="false"
 | 
			
		||||
     inkscape:snap-nodes="false"
 | 
			
		||||
     inkscape:snap-bbox="true"
 | 
			
		||||
     showborder="false">
 | 
			
		||||
    <inkscape:grid
 | 
			
		||||
       type="xygrid"
 | 
			
		||||
       id="grid12954"
 | 
			
		||||
       empspacing="5"
 | 
			
		||||
       visible="true"
 | 
			
		||||
       enabled="true"
 | 
			
		||||
       snapvisiblegridlinesonly="true" />
 | 
			
		||||
       id="grid3298" />
 | 
			
		||||
  </sodipodi:namedview>
 | 
			
		||||
  <metadata
 | 
			
		||||
     id="metadata2862">
 | 
			
		||||
     id="metadata2748">
 | 
			
		||||
    <rdf:RDF>
 | 
			
		||||
      <cc:Work
 | 
			
		||||
         rdf:about="">
 | 
			
		||||
@@ -142,68 +80,24 @@
 | 
			
		||||
     inkscape:label="Layer 1"
 | 
			
		||||
     inkscape:groupmode="layer"
 | 
			
		||||
     id="layer1"
 | 
			
		||||
     transform="translate(-444.64286,-781.36218)">
 | 
			
		||||
    <g
 | 
			
		||||
       transform="matrix(0.6526046,0,0,0.80554422,99.592644,-636.32172)"
 | 
			
		||||
       id="g37994">
 | 
			
		||||
      <g
 | 
			
		||||
         id="g37996"
 | 
			
		||||
         transform="translate(-115,1277)">
 | 
			
		||||
        <rect
 | 
			
		||||
           style="color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964000000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0.19591837"
 | 
			
		||||
           id="rect13475"
 | 
			
		||||
           width="98"
 | 
			
		||||
           height="25"
 | 
			
		||||
           x="644.5"
 | 
			
		||||
           y="484.61118"
 | 
			
		||||
           rx="4.7429576"
 | 
			
		||||
           ry="3.8424656" />
 | 
			
		||||
        <rect
 | 
			
		||||
           ry="3.8424656"
 | 
			
		||||
           rx="4.7429576"
 | 
			
		||||
           y="483.5"
 | 
			
		||||
           x="644.5"
 | 
			
		||||
           height="25"
 | 
			
		||||
           width="98"
 | 
			
		||||
           id="rect38000"
 | 
			
		||||
           style="color:#000000;fill:url(#linearGradient12311-3-1-0-5-4);fill-opacity:1;fill-rule:nonzero;stroke:#16191a;stroke-width:1.37920942;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
 | 
			
		||||
      </g>
 | 
			
		||||
      <g
 | 
			
		||||
         transform="translate(-49.946213,-1.890275)"
 | 
			
		||||
         id="g38002">
 | 
			
		||||
        <g
 | 
			
		||||
           transform="translate(-115,1247)"
 | 
			
		||||
           style="display:inline"
 | 
			
		||||
           id="g38004">
 | 
			
		||||
          <rect
 | 
			
		||||
             ry="3.7972314"
 | 
			
		||||
             rx="4.6871223"
 | 
			
		||||
             y="515.5"
 | 
			
		||||
             x="694.53046"
 | 
			
		||||
             height="25"
 | 
			
		||||
             width="45.969578"
 | 
			
		||||
             id="rect38006"
 | 
			
		||||
             style="color:#000000;fill:url(#linearGradient38024);fill-opacity:1;fill-rule:nonzero;stroke:#1f2020;stroke-width:1.37920964;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
 | 
			
		||||
          <path
 | 
			
		||||
             sodipodi:nodetypes="cc"
 | 
			
		||||
             style="opacity:0.1;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
 | 
			
		||||
             d="m 699.09675,516.7365 36.86904,0"
 | 
			
		||||
             id="path38016"
 | 
			
		||||
             inkscape:path-effect="#path-effect77541-4"
 | 
			
		||||
             inkscape:original-d="m 699.09675,516.7365 36.86904,0"
 | 
			
		||||
             inkscape:connector-curvature="0" />
 | 
			
		||||
        </g>
 | 
			
		||||
      </g>
 | 
			
		||||
      <path
 | 
			
		||||
         sodipodi:type="arc"
 | 
			
		||||
         style="color:#000000;fill:none;stroke:#ffffff;stroke-width:2.15627193;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
 | 
			
		||||
         id="path13479"
 | 
			
		||||
         sodipodi:cx="16.4375"
 | 
			
		||||
         sodipodi:cy="10.8125"
 | 
			
		||||
         sodipodi:rx="4.3125"
 | 
			
		||||
         sodipodi:ry="4.3125"
 | 
			
		||||
         d="m 20.75,10.8125 a 4.3125,4.3125 0 1 1 -8.625,0 4.3125,4.3125 0 1 1 8.625,0 z"
 | 
			
		||||
         transform="matrix(1.4212691,0,0,1.1514287,577.38488,1761.1138)" />
 | 
			
		||||
    </g>
 | 
			
		||||
     transform="translate(0,-291.17916)">
 | 
			
		||||
    <rect
 | 
			
		||||
       style="opacity:1;vector-effect:none;fill:#323233;fill-opacity:1;stroke:#272728;stroke-width:1.08532763;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
 | 
			
		||||
       id="rect3296"
 | 
			
		||||
       width="44.446434"
 | 
			
		||||
       height="20.910645"
 | 
			
		||||
       x="0.625"
 | 
			
		||||
       y="291.71494"
 | 
			
		||||
       rx="10.455324"
 | 
			
		||||
       ry="10.073335" />
 | 
			
		||||
    <rect
 | 
			
		||||
       ry="10.455322"
 | 
			
		||||
       rx="10.455322"
 | 
			
		||||
       y="291.71494"
 | 
			
		||||
       x="0.5428465"
 | 
			
		||||
       height="20.910645"
 | 
			
		||||
       width="21.142862"
 | 
			
		||||
       id="rect3300"
 | 
			
		||||
       style="opacity:1;vector-effect:none;fill:url(#linearGradient3331);fill-opacity:1;stroke:#151515;stroke-width:1.08532763;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal" />
 | 
			
		||||
  </g>
 | 
			
		||||
</svg>
 | 
			
		||||
 
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 7.5 KiB After Width: | Height: | Size: 3.3 KiB  | 
@@ -1,255 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
			
		||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
 | 
			
		||||
 | 
			
		||||
<svg
 | 
			
		||||
   xmlns:dc="http://purl.org/dc/elements/1.1/"
 | 
			
		||||
   xmlns:cc="http://creativecommons.org/ns#"
 | 
			
		||||
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 | 
			
		||||
   xmlns:svg="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns:xlink="http://www.w3.org/1999/xlink"
 | 
			
		||||
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
 | 
			
		||||
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
 | 
			
		||||
   width="65"
 | 
			
		||||
   height="22"
 | 
			
		||||
   id="svg2857"
 | 
			
		||||
   version="1.1"
 | 
			
		||||
   inkscape:version="0.48.5 r10040"
 | 
			
		||||
   sodipodi:docname="toggle-on-intl.svg">
 | 
			
		||||
  <defs
 | 
			
		||||
     id="defs2859">
 | 
			
		||||
    <inkscape:perspective
 | 
			
		||||
       sodipodi:type="inkscape:persp3d"
 | 
			
		||||
       inkscape:vp_x="0 : 526.18109 : 1"
 | 
			
		||||
       inkscape:vp_y="0 : 1000 : 0"
 | 
			
		||||
       inkscape:vp_z="744.09448 : 526.18109 : 1"
 | 
			
		||||
       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
 | 
			
		||||
       id="perspective2865" />
 | 
			
		||||
    <inkscape:perspective
 | 
			
		||||
       id="perspective2843"
 | 
			
		||||
       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
 | 
			
		||||
       inkscape:vp_z="1 : 0.5 : 1"
 | 
			
		||||
       inkscape:vp_y="0 : 1000 : 0"
 | 
			
		||||
       inkscape:vp_x="0 : 0.5 : 1"
 | 
			
		||||
       sodipodi:type="inkscape:persp3d" />
 | 
			
		||||
    <linearGradient
 | 
			
		||||
       inkscape:collect="always"
 | 
			
		||||
       xlink:href="#linearGradient76469-7-7-4"
 | 
			
		||||
       id="linearGradient38024"
 | 
			
		||||
       gradientUnits="userSpaceOnUse"
 | 
			
		||||
       gradientTransform="matrix(1.0215462,0,0,1.0322581,717.22867,428.68472)"
 | 
			
		||||
       x1="6"
 | 
			
		||||
       y1="102.95528"
 | 
			
		||||
       x2="6"
 | 
			
		||||
       y2="84.505203" />
 | 
			
		||||
    <linearGradient
 | 
			
		||||
       inkscape:collect="always"
 | 
			
		||||
       id="linearGradient76469-7-7-4">
 | 
			
		||||
      <stop
 | 
			
		||||
         style="stop-color:#2e3232;stop-opacity:1"
 | 
			
		||||
         offset="0"
 | 
			
		||||
         id="stop76471-7-1-5" />
 | 
			
		||||
      <stop
 | 
			
		||||
         style="stop-color:#3e4545;stop-opacity:1"
 | 
			
		||||
         offset="1"
 | 
			
		||||
         id="stop76473-9-0-0" />
 | 
			
		||||
    </linearGradient>
 | 
			
		||||
    <inkscape:path-effect
 | 
			
		||||
       effect="spiro"
 | 
			
		||||
       id="path-effect77541-4"
 | 
			
		||||
       is_visible="true" />
 | 
			
		||||
    <linearGradient
 | 
			
		||||
       inkscape:collect="always"
 | 
			
		||||
       xlink:href="#linearGradient37802"
 | 
			
		||||
       id="linearGradient12311-3-1-0-5"
 | 
			
		||||
       gradientUnits="userSpaceOnUse"
 | 
			
		||||
       gradientTransform="matrix(1.5918367,0,0,0.85714285,-256.56122,59.071426)"
 | 
			
		||||
       x1="610.13782"
 | 
			
		||||
       y1="501.43866"
 | 
			
		||||
       x2="610.13782"
 | 
			
		||||
       y2="492.52756" />
 | 
			
		||||
    <linearGradient
 | 
			
		||||
       id="linearGradient37802"
 | 
			
		||||
       inkscape:collect="always">
 | 
			
		||||
      <stop
 | 
			
		||||
         id="stop37804"
 | 
			
		||||
         offset="0"
 | 
			
		||||
         style="stop-color:#2c2c2c;stop-opacity:1" />
 | 
			
		||||
      <stop
 | 
			
		||||
         id="stop37806"
 | 
			
		||||
         offset="1"
 | 
			
		||||
         style="stop-color:#16191a;stop-opacity:1" />
 | 
			
		||||
    </linearGradient>
 | 
			
		||||
    <linearGradient
 | 
			
		||||
       inkscape:collect="always"
 | 
			
		||||
       xlink:href="#linearGradient76469-7-7-4-3"
 | 
			
		||||
       id="linearGradient77680"
 | 
			
		||||
       gradientUnits="userSpaceOnUse"
 | 
			
		||||
       gradientTransform="matrix(1,0,0,1.0322581,717.71949,428.68472)"
 | 
			
		||||
       x1="6"
 | 
			
		||||
       y1="102.95528"
 | 
			
		||||
       x2="6"
 | 
			
		||||
       y2="84.505203" />
 | 
			
		||||
    <linearGradient
 | 
			
		||||
       inkscape:collect="always"
 | 
			
		||||
       id="linearGradient76469-7-7-4-3">
 | 
			
		||||
      <stop
 | 
			
		||||
         style="stop-color:#2e3232;stop-opacity:1"
 | 
			
		||||
         offset="0"
 | 
			
		||||
         id="stop76471-7-1-5-7" />
 | 
			
		||||
      <stop
 | 
			
		||||
         style="stop-color:#3e4545;stop-opacity:1"
 | 
			
		||||
         offset="1"
 | 
			
		||||
         id="stop76473-9-0-0-9" />
 | 
			
		||||
    </linearGradient>
 | 
			
		||||
    <inkscape:path-effect
 | 
			
		||||
       effect="spiro"
 | 
			
		||||
       id="path-effect77541-4-0"
 | 
			
		||||
       is_visible="true" />
 | 
			
		||||
    <linearGradient
 | 
			
		||||
       inkscape:collect="always"
 | 
			
		||||
       xlink:href="#linearGradient37802-8"
 | 
			
		||||
       id="linearGradient12311-3-1-0-5-4"
 | 
			
		||||
       gradientUnits="userSpaceOnUse"
 | 
			
		||||
       gradientTransform="matrix(1.5918367,0,0,0.85714285,-256.56122,59.071426)"
 | 
			
		||||
       x1="610.13782"
 | 
			
		||||
       y1="501.43866"
 | 
			
		||||
       x2="610.13782"
 | 
			
		||||
       y2="492.52756" />
 | 
			
		||||
    <linearGradient
 | 
			
		||||
       id="linearGradient37802-8"
 | 
			
		||||
       inkscape:collect="always">
 | 
			
		||||
      <stop
 | 
			
		||||
         id="stop37804-1"
 | 
			
		||||
         offset="0"
 | 
			
		||||
         style="stop-color:#2c2c2c;stop-opacity:1" />
 | 
			
		||||
      <stop
 | 
			
		||||
         id="stop37806-8"
 | 
			
		||||
         offset="1"
 | 
			
		||||
         style="stop-color:#16191a;stop-opacity:1" />
 | 
			
		||||
    </linearGradient>
 | 
			
		||||
    <linearGradient
 | 
			
		||||
       y2="492.52756"
 | 
			
		||||
       x2="610.13782"
 | 
			
		||||
       y1="501.43866"
 | 
			
		||||
       x1="610.13782"
 | 
			
		||||
       gradientTransform="matrix(1.5918367,0,0,0.85714285,-900.56122,-423.92857)"
 | 
			
		||||
       gradientUnits="userSpaceOnUse"
 | 
			
		||||
       id="linearGradient13602"
 | 
			
		||||
       xlink:href="#linearGradient37802-8"
 | 
			
		||||
       inkscape:collect="always" />
 | 
			
		||||
  </defs>
 | 
			
		||||
  <sodipodi:namedview
 | 
			
		||||
     id="base"
 | 
			
		||||
     pagecolor="#000000"
 | 
			
		||||
     bordercolor="#666666"
 | 
			
		||||
     borderopacity="1.0"
 | 
			
		||||
     inkscape:pageopacity="1"
 | 
			
		||||
     inkscape:pageshadow="2"
 | 
			
		||||
     inkscape:zoom="1"
 | 
			
		||||
     inkscape:cx="16.760995"
 | 
			
		||||
     inkscape:cy="21.955673"
 | 
			
		||||
     inkscape:document-units="px"
 | 
			
		||||
     inkscape:current-layer="g37994"
 | 
			
		||||
     showgrid="false"
 | 
			
		||||
     inkscape:window-width="2560"
 | 
			
		||||
     inkscape:window-height="1375"
 | 
			
		||||
     inkscape:window-x="0"
 | 
			
		||||
     inkscape:window-y="27"
 | 
			
		||||
     inkscape:window-maximized="1"
 | 
			
		||||
     borderlayer="true"
 | 
			
		||||
     inkscape:showpageshadow="false"
 | 
			
		||||
     inkscape:snap-nodes="false"
 | 
			
		||||
     inkscape:snap-bbox="true"
 | 
			
		||||
     showborder="false">
 | 
			
		||||
    <inkscape:grid
 | 
			
		||||
       type="xygrid"
 | 
			
		||||
       id="grid12954"
 | 
			
		||||
       empspacing="5"
 | 
			
		||||
       visible="true"
 | 
			
		||||
       enabled="true"
 | 
			
		||||
       snapvisiblegridlinesonly="true" />
 | 
			
		||||
  </sodipodi:namedview>
 | 
			
		||||
  <metadata
 | 
			
		||||
     id="metadata2862">
 | 
			
		||||
    <rdf:RDF>
 | 
			
		||||
      <cc:Work
 | 
			
		||||
         rdf:about="">
 | 
			
		||||
        <dc:format>image/svg+xml</dc:format>
 | 
			
		||||
        <dc:type
 | 
			
		||||
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 | 
			
		||||
        <dc:title></dc:title>
 | 
			
		||||
      </cc:Work>
 | 
			
		||||
    </rdf:RDF>
 | 
			
		||||
  </metadata>
 | 
			
		||||
  <g
 | 
			
		||||
     inkscape:label="Layer 1"
 | 
			
		||||
     inkscape:groupmode="layer"
 | 
			
		||||
     id="layer1"
 | 
			
		||||
     transform="translate(-444.64286,-781.36218)">
 | 
			
		||||
    <g
 | 
			
		||||
       transform="matrix(0.6526046,0,0,0.80554422,99.592644,-636.32172)"
 | 
			
		||||
       id="g37994">
 | 
			
		||||
      <g
 | 
			
		||||
         id="g37996"
 | 
			
		||||
         transform="translate(-115,1277)">
 | 
			
		||||
        <rect
 | 
			
		||||
           style="color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964000000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0.19591837"
 | 
			
		||||
           id="rect13475"
 | 
			
		||||
           width="98"
 | 
			
		||||
           height="25"
 | 
			
		||||
           x="644.5"
 | 
			
		||||
           y="484.61118"
 | 
			
		||||
           rx="4.7429576"
 | 
			
		||||
           ry="3.8424656" />
 | 
			
		||||
        <rect
 | 
			
		||||
           ry="3.8424656"
 | 
			
		||||
           rx="4.7429576"
 | 
			
		||||
           y="483.5"
 | 
			
		||||
           x="644.5"
 | 
			
		||||
           height="25"
 | 
			
		||||
           width="98"
 | 
			
		||||
           id="rect38000"
 | 
			
		||||
           style="color:#000000;fill:url(#linearGradient12311-3-1-0-5-4);fill-opacity:1;fill-rule:nonzero;stroke:#16191a;stroke-width:1.37920942;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
 | 
			
		||||
      </g>
 | 
			
		||||
      <g
 | 
			
		||||
         transform="translate(-49.946213,-1.890275)"
 | 
			
		||||
         id="g38002">
 | 
			
		||||
        <g
 | 
			
		||||
           transform="translate(-115,1247)"
 | 
			
		||||
           style="display:inline"
 | 
			
		||||
           id="g38004">
 | 
			
		||||
          <rect
 | 
			
		||||
             ry="3.7972314"
 | 
			
		||||
             rx="4.6871223"
 | 
			
		||||
             y="515.5"
 | 
			
		||||
             x="694.53046"
 | 
			
		||||
             height="25"
 | 
			
		||||
             width="45.969578"
 | 
			
		||||
             id="rect38006"
 | 
			
		||||
             style="color:#000000;fill:url(#linearGradient38024);fill-opacity:1;fill-rule:nonzero;stroke:#1f2020;stroke-width:1.37920964;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
 | 
			
		||||
          <path
 | 
			
		||||
             sodipodi:nodetypes="cc"
 | 
			
		||||
             style="opacity:0.1;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
 | 
			
		||||
             d="m 699.09675,516.7365 36.86904,0"
 | 
			
		||||
             id="path38016"
 | 
			
		||||
             inkscape:path-effect="#path-effect77541-4"
 | 
			
		||||
             inkscape:original-d="m 699.09675,516.7365 36.86904,0"
 | 
			
		||||
             inkscape:connector-curvature="0" />
 | 
			
		||||
        </g>
 | 
			
		||||
      </g>
 | 
			
		||||
      <text
 | 
			
		||||
         xml:space="preserve"
 | 
			
		||||
         style="font-size:13.79166794px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Cantarell;-inkscape-font-specification:Cantarell Bold"
 | 
			
		||||
         x="520.29974"
 | 
			
		||||
         y="1997.0011"
 | 
			
		||||
         id="text75614"
 | 
			
		||||
         sodipodi:linespacing="125%"
 | 
			
		||||
         transform="scale(1.1236771,0.88993537)"><tspan
 | 
			
		||||
           sodipodi:role="line"
 | 
			
		||||
           id="tspan75616"
 | 
			
		||||
           x="520.29974"
 | 
			
		||||
           y="1997.0011">OFF</tspan></text>
 | 
			
		||||
    </g>
 | 
			
		||||
  </g>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 8.8 KiB  | 
@@ -10,117 +10,69 @@
 | 
			
		||||
   xmlns:xlink="http://www.w3.org/1999/xlink"
 | 
			
		||||
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
 | 
			
		||||
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
 | 
			
		||||
   width="65"
 | 
			
		||||
   width="46"
 | 
			
		||||
   height="22"
 | 
			
		||||
   id="svg2857"
 | 
			
		||||
   viewBox="0 0 46 22"
 | 
			
		||||
   version="1.1"
 | 
			
		||||
   inkscape:version="0.91 r13725"
 | 
			
		||||
   id="svg2751"
 | 
			
		||||
   inkscape:version="0.92.4 5da689c313, 2019-01-14"
 | 
			
		||||
   sodipodi:docname="toggle-on-intl.svg">
 | 
			
		||||
  <defs
 | 
			
		||||
     id="defs2859">
 | 
			
		||||
    <inkscape:perspective
 | 
			
		||||
       sodipodi:type="inkscape:persp3d"
 | 
			
		||||
       inkscape:vp_x="0 : 526.18109 : 1"
 | 
			
		||||
       inkscape:vp_y="0 : 1000 : 0"
 | 
			
		||||
       inkscape:vp_z="744.09448 : 526.18109 : 1"
 | 
			
		||||
       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
 | 
			
		||||
       id="perspective2865" />
 | 
			
		||||
    <inkscape:perspective
 | 
			
		||||
       id="perspective2843"
 | 
			
		||||
       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
 | 
			
		||||
       inkscape:vp_z="1 : 0.5 : 1"
 | 
			
		||||
       inkscape:vp_y="0 : 1000 : 0"
 | 
			
		||||
       inkscape:vp_x="0 : 0.5 : 1"
 | 
			
		||||
       sodipodi:type="inkscape:persp3d" />
 | 
			
		||||
     id="defs2745">
 | 
			
		||||
    <linearGradient
 | 
			
		||||
       inkscape:collect="always"
 | 
			
		||||
       xlink:href="#linearGradient77461"
 | 
			
		||||
       id="linearGradient77551"
 | 
			
		||||
       gradientUnits="userSpaceOnUse"
 | 
			
		||||
       gradientTransform="matrix(1.3066667,0,0,1,-841.64667,-483)"
 | 
			
		||||
       x1="1164.7644"
 | 
			
		||||
       y1="962.93695"
 | 
			
		||||
       x2="1164.7644"
 | 
			
		||||
       y2="970.51404" />
 | 
			
		||||
    <linearGradient
 | 
			
		||||
       id="linearGradient77461"
 | 
			
		||||
       inkscape:collect="always">
 | 
			
		||||
       id="linearGradient3329">
 | 
			
		||||
      <stop
 | 
			
		||||
         id="stop77463"
 | 
			
		||||
         style="stop-color:#39393a;stop-opacity:1;"
 | 
			
		||||
         offset="0"
 | 
			
		||||
         style="stop-color:#182f4c;stop-opacity:1" />
 | 
			
		||||
         id="stop3325" />
 | 
			
		||||
      <stop
 | 
			
		||||
         id="stop77465"
 | 
			
		||||
         style="stop-color:#302f30;stop-opacity:1"
 | 
			
		||||
         offset="1"
 | 
			
		||||
         style="stop-color:#205b9a;stop-opacity:1" />
 | 
			
		||||
         id="stop3327" />
 | 
			
		||||
    </linearGradient>
 | 
			
		||||
    <linearGradient
 | 
			
		||||
       inkscape:collect="always"
 | 
			
		||||
       xlink:href="#linearGradient76469-7-7-4"
 | 
			
		||||
       id="linearGradient38024"
 | 
			
		||||
       xlink:href="#linearGradient3329"
 | 
			
		||||
       id="linearGradient3331"
 | 
			
		||||
       x1="53"
 | 
			
		||||
       y1="294.42917"
 | 
			
		||||
       x2="53"
 | 
			
		||||
       y2="309.80417"
 | 
			
		||||
       gradientUnits="userSpaceOnUse"
 | 
			
		||||
       gradientTransform="matrix(1.0215462,0,0,1.0322581,717.22867,428.68472)"
 | 
			
		||||
       x1="6"
 | 
			
		||||
       y1="102.95528"
 | 
			
		||||
       x2="6"
 | 
			
		||||
       y2="84.505203" />
 | 
			
		||||
    <linearGradient
 | 
			
		||||
       inkscape:collect="always"
 | 
			
		||||
       id="linearGradient76469-7-7-4">
 | 
			
		||||
      <stop
 | 
			
		||||
         style="stop-color:#2e3232;stop-opacity:1"
 | 
			
		||||
         offset="0"
 | 
			
		||||
         id="stop76471-7-1-5" />
 | 
			
		||||
      <stop
 | 
			
		||||
         style="stop-color:#3e4545;stop-opacity:1"
 | 
			
		||||
         offset="1"
 | 
			
		||||
         id="stop76473-9-0-0" />
 | 
			
		||||
    </linearGradient>
 | 
			
		||||
    <inkscape:path-effect
 | 
			
		||||
       effect="spiro"
 | 
			
		||||
       id="path-effect77541-4"
 | 
			
		||||
       is_visible="true" />
 | 
			
		||||
       gradientTransform="translate(-19)" />
 | 
			
		||||
  </defs>
 | 
			
		||||
  <sodipodi:namedview
 | 
			
		||||
     id="base"
 | 
			
		||||
     pagecolor="#000000"
 | 
			
		||||
     pagecolor="#535353"
 | 
			
		||||
     bordercolor="#666666"
 | 
			
		||||
     borderopacity="1.0"
 | 
			
		||||
     inkscape:pageopacity="1"
 | 
			
		||||
     inkscape:pageshadow="2"
 | 
			
		||||
     inkscape:zoom="1"
 | 
			
		||||
     inkscape:cx="37.410841"
 | 
			
		||||
     inkscape:cy="16.009314"
 | 
			
		||||
     inkscape:cx="13.588971"
 | 
			
		||||
     inkscape:cy="14.124546"
 | 
			
		||||
     inkscape:document-units="px"
 | 
			
		||||
     inkscape:current-layer="g37994"
 | 
			
		||||
     inkscape:current-layer="layer1"
 | 
			
		||||
     showgrid="false"
 | 
			
		||||
     inkscape:window-width="2560"
 | 
			
		||||
     inkscape:window-height="1376"
 | 
			
		||||
     inkscape:window-x="0"
 | 
			
		||||
     inkscape:window-y="27"
 | 
			
		||||
     inkscape:window-maximized="1"
 | 
			
		||||
     units="px"
 | 
			
		||||
     inkscape:pagecheckerboard="true"
 | 
			
		||||
     borderlayer="true"
 | 
			
		||||
     inkscape:showpageshadow="false"
 | 
			
		||||
     inkscape:snap-nodes="false"
 | 
			
		||||
     inkscape:snap-bbox="true"
 | 
			
		||||
     showborder="false">
 | 
			
		||||
    <inkscape:grid
 | 
			
		||||
       type="xygrid"
 | 
			
		||||
       id="grid12954"
 | 
			
		||||
       empspacing="5"
 | 
			
		||||
       visible="true"
 | 
			
		||||
       enabled="true"
 | 
			
		||||
       snapvisiblegridlinesonly="true" />
 | 
			
		||||
       id="grid3298" />
 | 
			
		||||
  </sodipodi:namedview>
 | 
			
		||||
  <metadata
 | 
			
		||||
     id="metadata2862">
 | 
			
		||||
     id="metadata2748">
 | 
			
		||||
    <rdf:RDF>
 | 
			
		||||
      <cc:Work
 | 
			
		||||
         rdf:about="">
 | 
			
		||||
        <dc:format>image/svg+xml</dc:format>
 | 
			
		||||
        <dc:type
 | 
			
		||||
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 | 
			
		||||
        <dc:title />
 | 
			
		||||
        <dc:title></dc:title>
 | 
			
		||||
      </cc:Work>
 | 
			
		||||
    </rdf:RDF>
 | 
			
		||||
  </metadata>
 | 
			
		||||
@@ -128,65 +80,24 @@
 | 
			
		||||
     inkscape:label="Layer 1"
 | 
			
		||||
     inkscape:groupmode="layer"
 | 
			
		||||
     id="layer1"
 | 
			
		||||
     transform="translate(-444.64286,-781.36218)">
 | 
			
		||||
    <g
 | 
			
		||||
       transform="matrix(0.6526046,0,0,0.80554422,99.592644,-636.32172)"
 | 
			
		||||
       id="g37994">
 | 
			
		||||
      <g
 | 
			
		||||
         id="g37996"
 | 
			
		||||
         transform="translate(-115,1277)">
 | 
			
		||||
        <rect
 | 
			
		||||
           style="color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964000000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0.19591837"
 | 
			
		||||
           id="rect13475"
 | 
			
		||||
           width="98"
 | 
			
		||||
           height="25"
 | 
			
		||||
           x="644.5"
 | 
			
		||||
           y="484.61118"
 | 
			
		||||
           rx="4.7429576"
 | 
			
		||||
           ry="3.8424656" />
 | 
			
		||||
        <rect
 | 
			
		||||
           ry="3.8424656"
 | 
			
		||||
           rx="4.7429576"
 | 
			
		||||
           y="483.5"
 | 
			
		||||
           x="644.5"
 | 
			
		||||
           height="25"
 | 
			
		||||
           width="98"
 | 
			
		||||
           id="rect38000"
 | 
			
		||||
           style="color:#000000;fill:url(#linearGradient77551);fill-opacity:1;fill-rule:nonzero;stroke:#182f4c;stroke-width:1.37920964;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
 | 
			
		||||
      </g>
 | 
			
		||||
      <g
 | 
			
		||||
         transform="translate(2.0625,-2)"
 | 
			
		||||
         id="g38002">
 | 
			
		||||
        <g
 | 
			
		||||
           transform="translate(-115,1247)"
 | 
			
		||||
           style="display:inline"
 | 
			
		||||
           id="g38004">
 | 
			
		||||
          <rect
 | 
			
		||||
             ry="3.7972314"
 | 
			
		||||
             rx="4.6871223"
 | 
			
		||||
             y="515.5"
 | 
			
		||||
             x="694.53046"
 | 
			
		||||
             height="25"
 | 
			
		||||
             width="45.969578"
 | 
			
		||||
             id="rect38006"
 | 
			
		||||
             style="color:#000000;fill:url(#linearGradient38024);fill-opacity:1;fill-rule:nonzero;stroke:#1f2020;stroke-width:1.37920964;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
 | 
			
		||||
          <path
 | 
			
		||||
             sodipodi:nodetypes="cc"
 | 
			
		||||
             style="opacity:0.1;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
 | 
			
		||||
             d="m 699.09675,516.7365 36.86904,0"
 | 
			
		||||
             id="path38016"
 | 
			
		||||
             inkscape:path-effect="#path-effect77541-4"
 | 
			
		||||
             inkscape:original-d="m 699.09675,516.7365 36.86904,0"
 | 
			
		||||
             inkscape:connector-curvature="0" />
 | 
			
		||||
        </g>
 | 
			
		||||
      </g>
 | 
			
		||||
      <rect
 | 
			
		||||
         style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
 | 
			
		||||
         id="rect13678"
 | 
			
		||||
         width="3.0646207"
 | 
			
		||||
         height="12.414008"
 | 
			
		||||
         x="554.77728"
 | 
			
		||||
         y="1767.3566" />
 | 
			
		||||
    </g>
 | 
			
		||||
     transform="translate(0,-291.17916)">
 | 
			
		||||
    <rect
 | 
			
		||||
       style="opacity:1;vector-effect:none;fill:#15539e;fill-opacity:1;stroke:#030e1b;stroke-width:1.08532763;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
 | 
			
		||||
       id="rect3296"
 | 
			
		||||
       width="44.446434"
 | 
			
		||||
       height="20.910645"
 | 
			
		||||
       x="0.625"
 | 
			
		||||
       y="291.71494"
 | 
			
		||||
       rx="10.455324"
 | 
			
		||||
       ry="10.073335" />
 | 
			
		||||
    <rect
 | 
			
		||||
       ry="10.455322"
 | 
			
		||||
       rx="10.455322"
 | 
			
		||||
       y="291.71494"
 | 
			
		||||
       x="24.30357"
 | 
			
		||||
       height="20.910645"
 | 
			
		||||
       width="21.142862"
 | 
			
		||||
       id="rect3300"
 | 
			
		||||
       style="opacity:1;vector-effect:none;fill:url(#linearGradient3331);fill-opacity:1;stroke:#030e1b;stroke-width:1.08532763;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal" />
 | 
			
		||||
  </g>
 | 
			
		||||
</svg>
 | 
			
		||||
 
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 6.8 KiB After Width: | Height: | Size: 3.3 KiB  | 
@@ -1,207 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
			
		||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
 | 
			
		||||
 | 
			
		||||
<svg
 | 
			
		||||
   xmlns:dc="http://purl.org/dc/elements/1.1/"
 | 
			
		||||
   xmlns:cc="http://creativecommons.org/ns#"
 | 
			
		||||
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 | 
			
		||||
   xmlns:svg="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns:xlink="http://www.w3.org/1999/xlink"
 | 
			
		||||
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
 | 
			
		||||
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
 | 
			
		||||
   width="65"
 | 
			
		||||
   height="22"
 | 
			
		||||
   id="svg2857"
 | 
			
		||||
   version="1.1"
 | 
			
		||||
   inkscape:version="0.91 r13725"
 | 
			
		||||
   sodipodi:docname="toggle-on-us.svg">
 | 
			
		||||
  <defs
 | 
			
		||||
     id="defs2859">
 | 
			
		||||
    <inkscape:perspective
 | 
			
		||||
       sodipodi:type="inkscape:persp3d"
 | 
			
		||||
       inkscape:vp_x="0 : 526.18109 : 1"
 | 
			
		||||
       inkscape:vp_y="0 : 1000 : 0"
 | 
			
		||||
       inkscape:vp_z="744.09448 : 526.18109 : 1"
 | 
			
		||||
       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
 | 
			
		||||
       id="perspective2865" />
 | 
			
		||||
    <inkscape:perspective
 | 
			
		||||
       id="perspective2843"
 | 
			
		||||
       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
 | 
			
		||||
       inkscape:vp_z="1 : 0.5 : 1"
 | 
			
		||||
       inkscape:vp_y="0 : 1000 : 0"
 | 
			
		||||
       inkscape:vp_x="0 : 0.5 : 1"
 | 
			
		||||
       sodipodi:type="inkscape:persp3d" />
 | 
			
		||||
    <linearGradient
 | 
			
		||||
       inkscape:collect="always"
 | 
			
		||||
       xlink:href="#linearGradient76469-7-7-4"
 | 
			
		||||
       id="linearGradient38024"
 | 
			
		||||
       gradientUnits="userSpaceOnUse"
 | 
			
		||||
       gradientTransform="matrix(1.0215462,0,0,1.0322581,717.22867,428.68472)"
 | 
			
		||||
       x1="6"
 | 
			
		||||
       y1="102.95528"
 | 
			
		||||
       x2="6"
 | 
			
		||||
       y2="84.505203" />
 | 
			
		||||
    <linearGradient
 | 
			
		||||
       inkscape:collect="always"
 | 
			
		||||
       id="linearGradient76469-7-7-4">
 | 
			
		||||
      <stop
 | 
			
		||||
         style="stop-color:#2e3232;stop-opacity:1"
 | 
			
		||||
         offset="0"
 | 
			
		||||
         id="stop76471-7-1-5" />
 | 
			
		||||
      <stop
 | 
			
		||||
         style="stop-color:#3e4545;stop-opacity:1"
 | 
			
		||||
         offset="1"
 | 
			
		||||
         id="stop76473-9-0-0" />
 | 
			
		||||
    </linearGradient>
 | 
			
		||||
    <inkscape:path-effect
 | 
			
		||||
       effect="spiro"
 | 
			
		||||
       id="path-effect77541-4"
 | 
			
		||||
       is_visible="true" />
 | 
			
		||||
    <linearGradient
 | 
			
		||||
       id="linearGradient77461-1"
 | 
			
		||||
       inkscape:collect="always">
 | 
			
		||||
      <stop
 | 
			
		||||
         id="stop77463-1"
 | 
			
		||||
         offset="0"
 | 
			
		||||
         style="stop-color:#182f4c;stop-opacity:1" />
 | 
			
		||||
      <stop
 | 
			
		||||
         id="stop77465-4"
 | 
			
		||||
         offset="1"
 | 
			
		||||
         style="stop-color:#205b9a;stop-opacity:1" />
 | 
			
		||||
    </linearGradient>
 | 
			
		||||
    <linearGradient
 | 
			
		||||
       inkscape:collect="always"
 | 
			
		||||
       xlink:href="#linearGradient77461-1"
 | 
			
		||||
       id="linearGradient77551-6-5"
 | 
			
		||||
       gradientUnits="userSpaceOnUse"
 | 
			
		||||
       gradientTransform="matrix(0.8527367,0,0,0.80554422,-969.41608,-778.00299)"
 | 
			
		||||
       x1="1164.7644"
 | 
			
		||||
       y1="962.93695"
 | 
			
		||||
       x2="1164.7644"
 | 
			
		||||
       y2="970.51404" />
 | 
			
		||||
    <linearGradient
 | 
			
		||||
       inkscape:collect="always"
 | 
			
		||||
       xlink:href="#linearGradient77461-1"
 | 
			
		||||
       id="linearGradient11198"
 | 
			
		||||
       gradientUnits="userSpaceOnUse"
 | 
			
		||||
       gradientTransform="matrix(1.3066667,0,0,1,-1066.3709,794.25325)"
 | 
			
		||||
       x1="1322.5831"
 | 
			
		||||
       y1="-312.51855"
 | 
			
		||||
       x2="1322.5831"
 | 
			
		||||
       y2="-306.53461" />
 | 
			
		||||
  </defs>
 | 
			
		||||
  <sodipodi:namedview
 | 
			
		||||
     id="base"
 | 
			
		||||
     pagecolor="#000000"
 | 
			
		||||
     bordercolor="#666666"
 | 
			
		||||
     borderopacity="1.0"
 | 
			
		||||
     inkscape:pageopacity="1"
 | 
			
		||||
     inkscape:pageshadow="2"
 | 
			
		||||
     inkscape:zoom="1"
 | 
			
		||||
     inkscape:cx="-26.798898"
 | 
			
		||||
     inkscape:cy="5.3753009"
 | 
			
		||||
     inkscape:document-units="px"
 | 
			
		||||
     inkscape:current-layer="g37994"
 | 
			
		||||
     showgrid="false"
 | 
			
		||||
     inkscape:window-width="2560"
 | 
			
		||||
     inkscape:window-height="1376"
 | 
			
		||||
     inkscape:window-x="0"
 | 
			
		||||
     inkscape:window-y="27"
 | 
			
		||||
     inkscape:window-maximized="1"
 | 
			
		||||
     borderlayer="true"
 | 
			
		||||
     inkscape:showpageshadow="false"
 | 
			
		||||
     inkscape:snap-nodes="false"
 | 
			
		||||
     inkscape:snap-bbox="true"
 | 
			
		||||
     showborder="false">
 | 
			
		||||
    <inkscape:grid
 | 
			
		||||
       type="xygrid"
 | 
			
		||||
       id="grid12954"
 | 
			
		||||
       empspacing="5"
 | 
			
		||||
       visible="true"
 | 
			
		||||
       enabled="true"
 | 
			
		||||
       snapvisiblegridlinesonly="true" />
 | 
			
		||||
  </sodipodi:namedview>
 | 
			
		||||
  <metadata
 | 
			
		||||
     id="metadata2862">
 | 
			
		||||
    <rdf:RDF>
 | 
			
		||||
      <cc:Work
 | 
			
		||||
         rdf:about="">
 | 
			
		||||
        <dc:format>image/svg+xml</dc:format>
 | 
			
		||||
        <dc:type
 | 
			
		||||
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 | 
			
		||||
        <dc:title />
 | 
			
		||||
      </cc:Work>
 | 
			
		||||
    </rdf:RDF>
 | 
			
		||||
  </metadata>
 | 
			
		||||
  <g
 | 
			
		||||
     inkscape:label="Layer 1"
 | 
			
		||||
     inkscape:groupmode="layer"
 | 
			
		||||
     id="layer1"
 | 
			
		||||
     transform="translate(-444.64286,-781.36218)">
 | 
			
		||||
    <g
 | 
			
		||||
       transform="matrix(0.6526046,0,0,0.80554422,99.592644,-636.32172)"
 | 
			
		||||
       id="g37994">
 | 
			
		||||
      <g
 | 
			
		||||
         id="g37996"
 | 
			
		||||
         transform="translate(-115,1277)">
 | 
			
		||||
        <rect
 | 
			
		||||
           style="color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964000000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0.19591837"
 | 
			
		||||
           id="rect13475"
 | 
			
		||||
           width="98"
 | 
			
		||||
           height="25"
 | 
			
		||||
           x="644.5"
 | 
			
		||||
           y="484.61118"
 | 
			
		||||
           rx="4.7429576"
 | 
			
		||||
           ry="3.8424656" />
 | 
			
		||||
        <rect
 | 
			
		||||
           ry="3.8424656"
 | 
			
		||||
           rx="4.7429576"
 | 
			
		||||
           y="483.5"
 | 
			
		||||
           x="644.5"
 | 
			
		||||
           height="25"
 | 
			
		||||
           width="98"
 | 
			
		||||
           id="rect38000"
 | 
			
		||||
           style="color:#000000;fill:url(#linearGradient11198);fill-opacity:1;fill-rule:nonzero;stroke:#182f4c;stroke-width:1.37920964;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;clip-rule:nonzero;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;filter-blend-mode:normal;filter-gaussianBlur-deviation:0;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto" />
 | 
			
		||||
      </g>
 | 
			
		||||
      <g
 | 
			
		||||
         transform="translate(2.0625,-2)"
 | 
			
		||||
         id="g38002">
 | 
			
		||||
        <g
 | 
			
		||||
           transform="translate(-115,1247)"
 | 
			
		||||
           style="display:inline"
 | 
			
		||||
           id="g38004">
 | 
			
		||||
          <rect
 | 
			
		||||
             ry="3.7972314"
 | 
			
		||||
             rx="4.6871223"
 | 
			
		||||
             y="515.5"
 | 
			
		||||
             x="694.53046"
 | 
			
		||||
             height="25"
 | 
			
		||||
             width="45.969578"
 | 
			
		||||
             id="rect38006"
 | 
			
		||||
             style="color:#000000;fill:url(#linearGradient38024);fill-opacity:1;fill-rule:nonzero;stroke:#1f2020;stroke-width:1.37920964;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
 | 
			
		||||
          <path
 | 
			
		||||
             sodipodi:nodetypes="cc"
 | 
			
		||||
             style="opacity:0.1;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
 | 
			
		||||
             d="m 699.09675,516.7365 36.86904,0"
 | 
			
		||||
             id="path38016"
 | 
			
		||||
             inkscape:path-effect="#path-effect77541-4"
 | 
			
		||||
             inkscape:original-d="m 699.09675,516.7365 36.86904,0"
 | 
			
		||||
             inkscape:connector-curvature="0" />
 | 
			
		||||
        </g>
 | 
			
		||||
      </g>
 | 
			
		||||
      <text
 | 
			
		||||
         transform="scale(1.1000946,0.90901274)"
 | 
			
		||||
         sodipodi:linespacing="125%"
 | 
			
		||||
         id="text38018"
 | 
			
		||||
         y="1955.5205"
 | 
			
		||||
         x="495.94223"
 | 
			
		||||
         style="font-size:13.29953671px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Cantarell;-inkscape-font-specification:Cantarell Bold"
 | 
			
		||||
         xml:space="preserve"><tspan
 | 
			
		||||
           y="1955.5205"
 | 
			
		||||
           x="495.94223"
 | 
			
		||||
           id="tspan38020"
 | 
			
		||||
           sodipodi:role="line">ON</tspan></text>
 | 
			
		||||
    </g>
 | 
			
		||||
  </g>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 7.7 KiB  | 
@@ -551,9 +551,9 @@ class ExtensionRow extends Gtk.ListBoxRow {
 | 
			
		||||
 | 
			
		||||
        let button = new Gtk.Button({ valign: Gtk.Align.CENTER,
 | 
			
		||||
                                      no_show_all: true });
 | 
			
		||||
        button.add(new Gtk.Image({ icon_name: 'emblem-system-symbolic',
 | 
			
		||||
                                   icon_size: Gtk.IconSize.BUTTON,
 | 
			
		||||
                                   visible: true }));
 | 
			
		||||
        button.set_image(new Gtk.Image({ icon_name: 'emblem-system-symbolic',
 | 
			
		||||
                                         icon_size: Gtk.IconSize.BUTTON,
 | 
			
		||||
                                         visible: true }));
 | 
			
		||||
        button.get_style_context().add_class('circular');
 | 
			
		||||
        hbox.add(button);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -124,7 +124,7 @@ var Batch = class extends Task {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    process() {
 | 
			
		||||
        throw new Error('Not implemented');
 | 
			
		||||
        throw new GObject.NotImplementedError(`process in ${this.constructor.name}`);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    runTask() {
 | 
			
		||||
 
 | 
			
		||||
@@ -325,7 +325,7 @@ var SessionMenuButton = class {
 | 
			
		||||
                 this._button.remove_style_pseudo_class('active');
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        this._manager = new PopupMenu.PopupMenuManager({ actor: this._button },
 | 
			
		||||
        this._manager = new PopupMenu.PopupMenuManager(this._button,
 | 
			
		||||
                                                       { actionMode: Shell.ActionMode.NONE });
 | 
			
		||||
        this._manager.addMenu(this._menu);
 | 
			
		||||
 | 
			
		||||
@@ -652,7 +652,7 @@ var LoginDialog = GObject.registerClass({
 | 
			
		||||
                     bannerAllocation.x2 = Math.floor(centerX - centerGap / 2);
 | 
			
		||||
                     bannerAllocation.x1 = Math.floor(bannerAllocation.x2 - wideBannerWidth);
 | 
			
		||||
 | 
			
		||||
                     // figure out how tall it would like to be and try to accomodate
 | 
			
		||||
                     // figure out how tall it would like to be and try to accommodate
 | 
			
		||||
                     // but don't let it get too close to the logo
 | 
			
		||||
                     let [wideMinHeight, wideBannerHeight] = this._bannerView.get_preferred_height(wideBannerWidth);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -42,8 +42,6 @@ var IntrospectService = class {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _isStandaloneApp(app) {
 | 
			
		||||
        let windows = app.get_windows();
 | 
			
		||||
 | 
			
		||||
        return app.get_windows().some(w => w.transient_for == null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -55,6 +53,11 @@ var IntrospectService = class {
 | 
			
		||||
       return APP_WHITELIST.includes(sender);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _getSandboxedAppId(app) {
 | 
			
		||||
        let ids = app.get_windows().map(w => w.get_sandboxed_app_id());
 | 
			
		||||
        return ids.find(id => id != null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _syncRunningApplications() {
 | 
			
		||||
        let tracker = Shell.WindowTracker.get_default();
 | 
			
		||||
        let apps = this._appSystem.get_running();
 | 
			
		||||
@@ -76,6 +79,10 @@ var IntrospectService = class {
 | 
			
		||||
                newActiveApplication = app.get_id();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            let sandboxedAppId = this._getSandboxedAppId(app);
 | 
			
		||||
            if (sandboxedAppId)
 | 
			
		||||
                appInfo['sandboxed-app-id'] = new GLib.Variant('s', sandboxedAppId);
 | 
			
		||||
 | 
			
		||||
            newRunningApplications[app.get_id()] = appInfo;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -137,6 +144,7 @@ var IntrospectService = class {
 | 
			
		||||
                let frameRect = window.get_frame_rect();
 | 
			
		||||
                let title = window.get_title();
 | 
			
		||||
                let wmClass = window.get_wm_class();
 | 
			
		||||
                let sandboxedAppId = window.get_sandboxed_app_id();
 | 
			
		||||
 | 
			
		||||
                windowsList[windowId] = {
 | 
			
		||||
                    'app-id': GLib.Variant.new('s', app.get_id()),
 | 
			
		||||
@@ -153,6 +161,10 @@ var IntrospectService = class {
 | 
			
		||||
 | 
			
		||||
                if (wmClass != null)
 | 
			
		||||
                    windowsList[windowId]['wm-class'] = GLib.Variant.new('s', wmClass);
 | 
			
		||||
 | 
			
		||||
                if (sandboxedAppId != null)
 | 
			
		||||
                    windowsList[windowId]['sandboxed-app-id'] =
 | 
			
		||||
                        GLib.Variant.new('s', sandboxedAppId);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        invocation.return_value(new GLib.Variant('(a{ta{sv}})', [windowsList]));
 | 
			
		||||
 
 | 
			
		||||
@@ -88,42 +88,42 @@ const SystemActions = GObject.registerClass({
 | 
			
		||||
                            name: C_("search-result", "Power Off"),
 | 
			
		||||
                            iconName: 'system-shutdown-symbolic',
 | 
			
		||||
                            // Translators: A list of keywords that match the power-off action, separated by semicolons
 | 
			
		||||
                            keywords: _("power off;shutdown;reboot;restart").split(';'),
 | 
			
		||||
                            keywords: _("power off;shutdown;reboot;restart").split(/[; ]/),
 | 
			
		||||
                            available: false });
 | 
			
		||||
        this._actions.set(LOCK_SCREEN_ACTION_ID,
 | 
			
		||||
                          { // Translators: The name of the lock screen action in search
 | 
			
		||||
                            name: C_("search-result", "Lock Screen"),
 | 
			
		||||
                            iconName: 'system-lock-screen-symbolic',
 | 
			
		||||
                            // Translators: A list of keywords that match the lock screen action, separated by semicolons
 | 
			
		||||
                            keywords: _("lock screen").split(';'),
 | 
			
		||||
                            keywords: _("lock screen").split(/[; ]/),
 | 
			
		||||
                            available: false });
 | 
			
		||||
        this._actions.set(LOGOUT_ACTION_ID,
 | 
			
		||||
                          { // Translators: The name of the logout action in search
 | 
			
		||||
                            name: C_("search-result", "Log Out"),
 | 
			
		||||
                            iconName: 'application-exit-symbolic',
 | 
			
		||||
                            // Translators: A list of keywords that match the logout action, separated by semicolons
 | 
			
		||||
                            keywords: _("logout;sign off").split(';'),
 | 
			
		||||
                            keywords: _("logout;log out;sign off").split(/[; ]/),
 | 
			
		||||
                            available: false });
 | 
			
		||||
        this._actions.set(SUSPEND_ACTION_ID,
 | 
			
		||||
                          { // Translators: The name of the suspend action in search
 | 
			
		||||
                            name: C_("search-result", "Suspend"),
 | 
			
		||||
                            iconName: 'media-playback-pause-symbolic',
 | 
			
		||||
                            // Translators: A list of keywords that match the suspend action, separated by semicolons
 | 
			
		||||
                            keywords: _("suspend;sleep").split(';'),
 | 
			
		||||
                            keywords: _("suspend;sleep").split(/[; ]/),
 | 
			
		||||
                            available: false });
 | 
			
		||||
        this._actions.set(SWITCH_USER_ACTION_ID,
 | 
			
		||||
                          { // Translators: The name of the switch user action in search
 | 
			
		||||
                            name: C_("search-result", "Switch User"),
 | 
			
		||||
                            iconName: 'system-switch-user-symbolic',
 | 
			
		||||
                            // Translators: A list of keywords that match the switch user action, separated by semicolons
 | 
			
		||||
                            keywords: _("switch user").split(';'),
 | 
			
		||||
                            keywords: _("switch user").split(/[; ]/),
 | 
			
		||||
                            available: false });
 | 
			
		||||
        this._actions.set(LOCK_ORIENTATION_ACTION_ID,
 | 
			
		||||
                          { // Translators: The name of the lock orientation action in search
 | 
			
		||||
                            name: C_("search-result", "Lock Orientation"),
 | 
			
		||||
                            iconName: '',
 | 
			
		||||
                            // Translators: A list of keywords that match the lock orientation action, separated by semicolons
 | 
			
		||||
                            keywords: _("lock orientation;screen;rotation").split(';'),
 | 
			
		||||
                            keywords: _("lock orientation;screen;rotation").split(/[; ]/),
 | 
			
		||||
                            available: false });
 | 
			
		||||
 | 
			
		||||
        this._loginScreenSettings = new Gio.Settings({ schema_id: LOGIN_SCREEN_SCHEMA });
 | 
			
		||||
@@ -262,7 +262,7 @@ const SystemActions = GObject.registerClass({
 | 
			
		||||
        let results = [];
 | 
			
		||||
 | 
			
		||||
        for (let [key, {available, keywords}] of this._actions)
 | 
			
		||||
            if (available && terms.every(t => keywords.some(k => (k.indexOf(t) >= 0))))
 | 
			
		||||
            if (available && terms.every(t => keywords.some(k => k.startsWith(t))))
 | 
			
		||||
                results.push(key);
 | 
			
		||||
 | 
			
		||||
        return results;
 | 
			
		||||
 
 | 
			
		||||
@@ -366,7 +366,7 @@ class CloseButton extends St.Button {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _computeBoxPointerOffset() {
 | 
			
		||||
        if (!this._boxPointer || !this._boxPointer.actor.get_stage())
 | 
			
		||||
        if (!this._boxPointer || !this._boxPointer.get_stage())
 | 
			
		||||
            return 0;
 | 
			
		||||
 | 
			
		||||
        let side = this._boxPointer.arrowSide;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
const { Clutter, Gio, Gtk, Shell } = imports.gi;
 | 
			
		||||
const { Clutter, Gio, Shell } = imports.gi;
 | 
			
		||||
const Main = imports.ui.main;
 | 
			
		||||
const Scripting = imports.ui.scripting;
 | 
			
		||||
 | 
			
		||||
@@ -104,7 +104,10 @@ function *run() {
 | 
			
		||||
    yield Scripting.waitLeisure();
 | 
			
		||||
    Scripting.scriptEvent('desktopShown');
 | 
			
		||||
 | 
			
		||||
    Gtk.Settings.get_default().gtk_enable_animations = false;
 | 
			
		||||
    let interfaceSettings = new Gio.Settings({
 | 
			
		||||
        schema_id: 'org.gnome.desktop.interface'
 | 
			
		||||
    });
 | 
			
		||||
    interfaceSettings.set_boolean('enable-animations', false);
 | 
			
		||||
 | 
			
		||||
    Scripting.scriptEvent('overviewShowStart');
 | 
			
		||||
    Main.overview.show();
 | 
			
		||||
@@ -200,7 +203,7 @@ function *run() {
 | 
			
		||||
 | 
			
		||||
    yield Scripting.sleep(1000);
 | 
			
		||||
 | 
			
		||||
    Gtk.Settings.get_default().gtk_enable_animations = true;
 | 
			
		||||
    interfaceSettings.set_boolean('enable-animations', true);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
let overviewShowStart;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
const { Clutter, Gio, GLib, Shell } = imports.gi;
 | 
			
		||||
const { Clutter, Gio, GLib, GObject, Shell } = imports.gi;
 | 
			
		||||
 | 
			
		||||
const CheckBox = imports.ui.checkBox;
 | 
			
		||||
const Dialog = imports.ui.dialog;
 | 
			
		||||
@@ -15,9 +15,10 @@ var DialogResponse = {
 | 
			
		||||
    CLOSED: 2
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var AccessDialog = class extends ModalDialog.ModalDialog {
 | 
			
		||||
    constructor(invocation, handle, title, subtitle, body, options) {
 | 
			
		||||
        super({ styleClass: 'access-dialog' });
 | 
			
		||||
var AccessDialog = GObject.registerClass(
 | 
			
		||||
class AccessDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
    _init(invocation, handle, title, subtitle, body, options) {
 | 
			
		||||
        super._init({ styleClass: 'access-dialog' });
 | 
			
		||||
 | 
			
		||||
        this._invocation = invocation;
 | 
			
		||||
        this._handle = handle;
 | 
			
		||||
@@ -109,7 +110,7 @@ var AccessDialog = class extends ModalDialog.ModalDialog {
 | 
			
		||||
        });
 | 
			
		||||
        this.close();
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
var AccessDialogDBus = class {
 | 
			
		||||
    constructor() {
 | 
			
		||||
 
 | 
			
		||||
@@ -474,12 +474,10 @@ var CyclerList = GObject.registerClass({
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
var CyclerPopup = GObject.registerClass(
 | 
			
		||||
class CyclerPopup extends SwitcherPopup.SwitcherPopup {
 | 
			
		||||
var CyclerPopup = GObject.registerClass({
 | 
			
		||||
    GTypeFlags: GObject.TypeFlags.ABSTRACT
 | 
			
		||||
}, class CyclerPopup extends SwitcherPopup.SwitcherPopup {
 | 
			
		||||
    _init() {
 | 
			
		||||
        if (new.target === CyclerPopup)
 | 
			
		||||
            throw new TypeError('Cannot instantiate abstract class ' + new.target.name);
 | 
			
		||||
 | 
			
		||||
        super._init();
 | 
			
		||||
 | 
			
		||||
        this._items = this._getWindows();
 | 
			
		||||
 
 | 
			
		||||
@@ -98,8 +98,8 @@ function clamp(value, min, max) {
 | 
			
		||||
 | 
			
		||||
class BaseAppView {
 | 
			
		||||
    constructor(params, gridParams) {
 | 
			
		||||
        if (new.target === BaseAppView)
 | 
			
		||||
            throw new TypeError('Cannot instantiate abstract class ' + new.target.name);
 | 
			
		||||
        if (this.constructor === BaseAppView)
 | 
			
		||||
            throw new TypeError(`Cannot instantiate abstract class ${this.constructor.name}`);
 | 
			
		||||
 | 
			
		||||
        gridParams = Params.parse(gridParams, { xAlign: St.Align.MIDDLE,
 | 
			
		||||
                                                columnLimit: MAX_COLUMNS,
 | 
			
		||||
@@ -414,7 +414,7 @@ var AllView = class AllView extends BaseAppView {
 | 
			
		||||
        this._refilterApps();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Overriden from BaseAppView
 | 
			
		||||
    // Overridden from BaseAppView
 | 
			
		||||
    animate(animationDirection, onComplete) {
 | 
			
		||||
        this._scrollView.reactive = false;
 | 
			
		||||
        let completionFunc = () => {
 | 
			
		||||
@@ -1017,7 +1017,7 @@ var FolderView = class FolderView extends BaseAppView {
 | 
			
		||||
        Util.ensureActorVisibleInScrollView(this.actor, actor);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Overriden from BaseAppView
 | 
			
		||||
    // Overridden from BaseAppView
 | 
			
		||||
    animate(animationDirection) {
 | 
			
		||||
        this._grid.animatePulse(animationDirection);
 | 
			
		||||
    }
 | 
			
		||||
@@ -1081,7 +1081,7 @@ var FolderView = class FolderView extends BaseAppView {
 | 
			
		||||
 | 
			
		||||
        let contentBox = this.actor.get_theme_node().get_content_box(pageBox);
 | 
			
		||||
        // We only can show icons inside the collection view boxPointer
 | 
			
		||||
        // so we have to substract the required padding etc of the boxpointer
 | 
			
		||||
        // so we have to subtract the required padding etc of the boxpointer
 | 
			
		||||
        return [(contentBox.x2 - contentBox.x1) - 2 * this._offsetForEachSide, (contentBox.y2 - contentBox.y1) - 2 * this._offsetForEachSide];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -1301,16 +1301,16 @@ var AppFolderPopup = class AppFolderPopup {
 | 
			
		||||
                                                       x_expand: true,
 | 
			
		||||
                                                       x_align: St.Align.START });
 | 
			
		||||
 | 
			
		||||
        this._boxPointer.actor.style_class = 'app-folder-popup';
 | 
			
		||||
        this.actor.add_actor(this._boxPointer.actor);
 | 
			
		||||
        this._boxPointer.style_class = 'app-folder-popup';
 | 
			
		||||
        this.actor.add_actor(this._boxPointer);
 | 
			
		||||
        this._boxPointer.bin.set_child(this._view.actor);
 | 
			
		||||
 | 
			
		||||
        this.closeButton = Util.makeCloseButton(this._boxPointer);
 | 
			
		||||
        this.closeButton.connect('clicked', this.popdown.bind(this));
 | 
			
		||||
        this.actor.add_actor(this.closeButton);
 | 
			
		||||
 | 
			
		||||
        this._boxPointer.actor.bind_property('opacity', this.closeButton, 'opacity',
 | 
			
		||||
                                             GObject.BindingFlags.SYNC_CREATE);
 | 
			
		||||
        this._boxPointer.bind_property('opacity', this.closeButton, 'opacity',
 | 
			
		||||
                                       GObject.BindingFlags.SYNC_CREATE);
 | 
			
		||||
 | 
			
		||||
        global.focus_manager.add_group(this.actor);
 | 
			
		||||
 | 
			
		||||
@@ -1479,7 +1479,7 @@ var AppIcon = class AppIcon {
 | 
			
		||||
        this.actor.connect('popup-menu', this._onKeyboardPopupMenu.bind(this));
 | 
			
		||||
 | 
			
		||||
        this._menu = null;
 | 
			
		||||
        this._menuManager = new PopupMenu.PopupMenuManager(this);
 | 
			
		||||
        this._menuManager = new PopupMenu.PopupMenuManager(this.actor);
 | 
			
		||||
 | 
			
		||||
        if (isDraggable) {
 | 
			
		||||
            this._draggable = DND.makeDraggable(this.actor);
 | 
			
		||||
@@ -1707,25 +1707,20 @@ var AppIconMenu = class AppIconMenu extends PopupMenu.PopupMenu {
 | 
			
		||||
            w => !w.skip_taskbar
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        // Display the app windows menu items and the separator between windows
 | 
			
		||||
        // of the current desktop and other windows.
 | 
			
		||||
        let workspaceManager = global.workspace_manager;
 | 
			
		||||
        let activeWorkspace = workspaceManager.get_active_workspace();
 | 
			
		||||
        let separatorShown = windows.length > 0 && windows[0].get_workspace() != activeWorkspace;
 | 
			
		||||
        if (windows.length > 0)
 | 
			
		||||
            this.addMenuItem(
 | 
			
		||||
                /* Translators: This is the heading of a list of open windows */
 | 
			
		||||
                new PopupMenu.PopupSeparatorMenuItem(_("Open Windows"))
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
        for (let i = 0; i < windows.length; i++) {
 | 
			
		||||
            let window = windows[i];
 | 
			
		||||
            if (!separatorShown && window.get_workspace() != activeWorkspace) {
 | 
			
		||||
                this._appendSeparator();
 | 
			
		||||
                separatorShown = true;
 | 
			
		||||
            }
 | 
			
		||||
        windows.forEach(window => {
 | 
			
		||||
            let title = window.title ? window.title
 | 
			
		||||
                                     : this._source.app.get_name();
 | 
			
		||||
            let item = this._appendMenuItem(title);
 | 
			
		||||
            item.connect('activate', () => {
 | 
			
		||||
                this.emit('activate-window', window);
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        if (!this._source.app.is_window_backed()) {
 | 
			
		||||
            this._appendSeparator();
 | 
			
		||||
 
 | 
			
		||||
@@ -14,39 +14,47 @@ const RENAMED_DESKTOP_IDS = {
 | 
			
		||||
    'epiphany.desktop': 'org.gnome.Epiphany.desktop',
 | 
			
		||||
    'evolution.desktop': 'org.gnome.Evolution.desktop',
 | 
			
		||||
    'file-roller.desktop': 'org.gnome.FileRoller.desktop',
 | 
			
		||||
    'five-or-more.desktop': 'org.gnome.five-or-more.desktop',
 | 
			
		||||
    'four-in-a-row.desktop': 'org.gnome.Four-in-a-row.desktop',
 | 
			
		||||
    'gcalctool.desktop': 'org.gnome.Calculator.desktop',
 | 
			
		||||
    'geary.desktop': 'org.gnome.Geary.desktop',
 | 
			
		||||
    'gedit.desktop': 'org.gnome.gedit.desktop',
 | 
			
		||||
    'glchess.desktop': 'gnome-chess.desktop',
 | 
			
		||||
    'glines.desktop': 'five-or-more.desktop',
 | 
			
		||||
    'gnect.desktop': 'four-in-a-row.desktop',
 | 
			
		||||
    'glchess.desktop': 'org.gnome.Chess.desktop',
 | 
			
		||||
    'glines.desktop': 'org.gnome.five-or-more.desktop',
 | 
			
		||||
    'gnect.desktop': 'org.gnome.Four-in-a-row.desktop',
 | 
			
		||||
    'gnibbles.desktop': 'org.gnome.Nibbles.desktop',
 | 
			
		||||
    'gnobots2.desktop': 'gnome-robots.desktop',
 | 
			
		||||
    'gnobots2.desktop': 'org.gnome.Robots.desktop',
 | 
			
		||||
    'gnome-boxes.desktop': 'org.gnome.Boxes.desktop',
 | 
			
		||||
    'gnome-calculator.desktop': 'org.gnome.Calculator.desktop',
 | 
			
		||||
    'gnome-chess.desktop': 'org.gnome.Chess.desktop',
 | 
			
		||||
    'gnome-clocks.desktop': 'org.gnome.clocks.desktop',
 | 
			
		||||
    'gnome-contacts.desktop': 'org.gnome.Contacts.desktop',
 | 
			
		||||
    'gnome-documents.desktop': 'org.gnome.Documents.desktop',
 | 
			
		||||
    'gnome-font-viewer.desktop': 'org.gnome.font-viewer.desktop',
 | 
			
		||||
    'gnome-klotski.desktop': 'org.gnome.Klotski.desktop',
 | 
			
		||||
    'gnome-nibbles.desktop': 'org.gnome.Nibbles.desktop',
 | 
			
		||||
    'gnome-mahjongg.desktop': 'org.gnome.Mahjongg.desktop',
 | 
			
		||||
    'gnome-mines.desktop': 'org.gnome.Mines.desktop',
 | 
			
		||||
    'gnome-music.desktop': 'org.gnome.Music.desktop',
 | 
			
		||||
    'gnome-photos.desktop': 'org.gnome.Photos.desktop',
 | 
			
		||||
    'gnome-robots.desktop': 'org.gnome.Robots.desktop',
 | 
			
		||||
    'gnome-screenshot.desktop': 'org.gnome.Screenshot.desktop',
 | 
			
		||||
    'gnome-software.desktop': 'org.gnome.Software.desktop',
 | 
			
		||||
    'gnome-terminal.desktop': 'org.gnome.Terminal.desktop',
 | 
			
		||||
    'gnome-tetravex.desktop': 'org.gnome.Tetravex.desktop',
 | 
			
		||||
    'gnome-tweaks.desktop': 'org.gnome.tweaks.desktop',
 | 
			
		||||
    'gnome-weather.desktop': 'org.gnome.Weather.desktop',
 | 
			
		||||
    'gnomine.desktop': 'gnome-mines.desktop',
 | 
			
		||||
    'gnotravex.desktop': 'gnome-tetravex.desktop',
 | 
			
		||||
    'gnotski.desktop': 'gnome-klotski.desktop',
 | 
			
		||||
    'gtali.desktop': 'tali.desktop',
 | 
			
		||||
    'gnomine.desktop': 'org.gnome.Mines.desktop',
 | 
			
		||||
    'gnotravex.desktop': 'org.gnome.Tetravex.desktop',
 | 
			
		||||
    'gnotski.desktop': 'org.gnome.Klotski.desktop',
 | 
			
		||||
    'gtali.desktop': 'org.gnome.Tali.desktop',
 | 
			
		||||
    'iagno.desktop': 'org.gnome.Reversi.desktop',
 | 
			
		||||
    'nautilus.desktop': 'org.gnome.Nautilus.desktop',
 | 
			
		||||
    'org.gnome.gnome-2048.desktop': 'org.gnome.TwentyFortyEight.desktop',
 | 
			
		||||
    'org.gnome.taquin.desktop': 'org.gnome.Taquin.desktop',
 | 
			
		||||
    'org.gnome.Weather.Application.desktop': 'org.gnome.Weather.desktop',
 | 
			
		||||
    'polari.desktop': 'org.gnome.Polari.desktop',
 | 
			
		||||
    'tali.desktop': 'org.gnome.Tali.desktop',
 | 
			
		||||
    'totem.desktop': 'org.gnome.Totem.desktop',
 | 
			
		||||
    'evince.desktop': 'org.gnome.Evince.desktop',
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
const { Clutter, Gio, GLib, Meta, Shell, St } = imports.gi;
 | 
			
		||||
const { Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi;
 | 
			
		||||
 | 
			
		||||
const Main = imports.ui.main;
 | 
			
		||||
const ModalDialog = imports.ui.modalDialog;
 | 
			
		||||
@@ -13,10 +13,11 @@ var AudioDevice = {
 | 
			
		||||
 | 
			
		||||
const AudioDeviceSelectionIface = loadInterfaceXML('org.gnome.Shell.AudioDeviceSelection');
 | 
			
		||||
 | 
			
		||||
var AudioDeviceSelectionDialog =
 | 
			
		||||
class AudioDeviceSelectionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
    constructor(devices) {
 | 
			
		||||
        super({ styleClass: 'audio-device-selection-dialog' });
 | 
			
		||||
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' });
 | 
			
		||||
 | 
			
		||||
        this._deviceItems = {};
 | 
			
		||||
 | 
			
		||||
@@ -33,10 +34,6 @@ class AudioDeviceSelectionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
            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"),
 | 
			
		||||
@@ -125,7 +122,7 @@ class AudioDeviceSelectionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
        Main.overview.hide();
 | 
			
		||||
        app.activate();
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
var AudioDeviceSelectionDBus = class AudioDeviceSelectionDBus {
 | 
			
		||||
    constructor() {
 | 
			
		||||
 
 | 
			
		||||
@@ -25,7 +25,7 @@ var BackgroundMenu = class BackgroundMenu extends PopupMenu.PopupMenu {
 | 
			
		||||
function addBackgroundMenu(actor, layoutManager) {
 | 
			
		||||
    actor.reactive = true;
 | 
			
		||||
    actor._backgroundMenu = new BackgroundMenu(layoutManager);
 | 
			
		||||
    actor._backgroundManager = new PopupMenu.PopupMenuManager({ actor: actor });
 | 
			
		||||
    actor._backgroundManager = new PopupMenu.PopupMenuManager(actor);
 | 
			
		||||
    actor._backgroundManager.addMenu(actor._backgroundMenu);
 | 
			
		||||
 | 
			
		||||
    function openMenu(x, y) {
 | 
			
		||||
 
 | 
			
		||||
@@ -121,7 +121,8 @@ var BarLevel = class {
 | 
			
		||||
        cr.lineTo(x, (height - barLevelHeight) / 2);
 | 
			
		||||
        cr.lineTo(x, (height + barLevelHeight) / 2);
 | 
			
		||||
        cr.lineTo(barLevelBorderRadius + barLevelBorderWidth, (height + barLevelHeight) / 2);
 | 
			
		||||
        Clutter.cairo_set_source_color(cr, barLevelActiveColor);
 | 
			
		||||
        if (this._value > 0)
 | 
			
		||||
          Clutter.cairo_set_source_color(cr, barLevelActiveColor);
 | 
			
		||||
        cr.fillPreserve();
 | 
			
		||||
        Clutter.cairo_set_source_color(cr, barLevelActiveBorderColor);
 | 
			
		||||
        cr.setLineWidth(barLevelBorderWidth);
 | 
			
		||||
@@ -143,17 +144,19 @@ var BarLevel = class {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /* end progress bar arc */
 | 
			
		||||
        if (this._value <= this._overdriveStart)
 | 
			
		||||
            Clutter.cairo_set_source_color(cr, barLevelActiveColor);
 | 
			
		||||
        else
 | 
			
		||||
            Clutter.cairo_set_source_color(cr, barLevelOverdriveColor);
 | 
			
		||||
        cr.arc(endX, height / 2, barLevelBorderRadius, TAU * 3 / 4, TAU * 1 / 4);
 | 
			
		||||
        cr.lineTo(Math.floor(endX), (height + barLevelHeight) / 2);
 | 
			
		||||
        cr.lineTo(Math.floor(endX), (height - barLevelHeight) / 2);
 | 
			
		||||
        cr.lineTo(endX, (height - barLevelHeight) / 2);
 | 
			
		||||
        cr.fillPreserve();
 | 
			
		||||
        cr.setLineWidth(barLevelBorderWidth);
 | 
			
		||||
        cr.stroke();
 | 
			
		||||
        if (this._value > 0) {
 | 
			
		||||
          if (this._value <= this._overdriveStart)
 | 
			
		||||
              Clutter.cairo_set_source_color(cr, barLevelActiveColor);
 | 
			
		||||
          else
 | 
			
		||||
              Clutter.cairo_set_source_color(cr, barLevelOverdriveColor);
 | 
			
		||||
          cr.arc(endX, height / 2, barLevelBorderRadius, TAU * 3 / 4, TAU * 1 / 4);
 | 
			
		||||
          cr.lineTo(Math.floor(endX), (height + barLevelHeight) / 2);
 | 
			
		||||
          cr.lineTo(Math.floor(endX), (height - barLevelHeight) / 2);
 | 
			
		||||
          cr.lineTo(endX, (height - barLevelHeight) / 2);
 | 
			
		||||
          cr.fillPreserve();
 | 
			
		||||
          cr.setLineWidth(barLevelBorderWidth);
 | 
			
		||||
          cr.stroke();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /* draw overdrive separator */
 | 
			
		||||
        if (overdriveActive) {
 | 
			
		||||
 
 | 
			
		||||
@@ -33,8 +33,6 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
    _init(arrowSide, binProperties) {
 | 
			
		||||
        super._init();
 | 
			
		||||
 | 
			
		||||
        this.actor = this;
 | 
			
		||||
 | 
			
		||||
        this.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS);
 | 
			
		||||
 | 
			
		||||
        this._arrowSide = arrowSide;
 | 
			
		||||
@@ -47,10 +45,6 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
        this._border.connect('repaint', this._drawBorder.bind(this));
 | 
			
		||||
        this.add_actor(this._border);
 | 
			
		||||
        this.bin.raise(this._border);
 | 
			
		||||
        this._xOffset = 0;
 | 
			
		||||
        this._yOffset = 0;
 | 
			
		||||
        this._xPosition = 0;
 | 
			
		||||
        this._yPosition = 0;
 | 
			
		||||
        this._sourceAlignment = 0.5;
 | 
			
		||||
        this._capturedEventId = 0;
 | 
			
		||||
        this._muteInput();
 | 
			
		||||
@@ -118,23 +112,23 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
        if (animate & PopupAnimation.SLIDE) {
 | 
			
		||||
            switch (this._arrowSide) {
 | 
			
		||||
                case St.Side.TOP:
 | 
			
		||||
                    this.yOffset = -rise;
 | 
			
		||||
                    this.translation_y = -rise;
 | 
			
		||||
                    break;
 | 
			
		||||
                case St.Side.BOTTOM:
 | 
			
		||||
                    this.yOffset = rise;
 | 
			
		||||
                    this.translation_y = rise;
 | 
			
		||||
                    break;
 | 
			
		||||
                case St.Side.LEFT:
 | 
			
		||||
                    this.xOffset = -rise;
 | 
			
		||||
                    this.translation_x = -rise;
 | 
			
		||||
                    break;
 | 
			
		||||
                case St.Side.RIGHT:
 | 
			
		||||
                    this.xOffset = rise;
 | 
			
		||||
                    this.translation_x = rise;
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Tweener.addTween(this, { opacity: 255,
 | 
			
		||||
                                 xOffset: 0,
 | 
			
		||||
                                 yOffset: 0,
 | 
			
		||||
                                 translation_x: 0,
 | 
			
		||||
                                 translation_y: 0,
 | 
			
		||||
                                 transition: 'linear',
 | 
			
		||||
                                 onComplete: () => {
 | 
			
		||||
                                     this._unmuteInput();
 | 
			
		||||
@@ -148,8 +142,8 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
        if (!this.visible)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        let xOffset = 0;
 | 
			
		||||
        let yOffset = 0;
 | 
			
		||||
        let translationX = 0;
 | 
			
		||||
        let translationY = 0;
 | 
			
		||||
        let themeNode = this.get_theme_node();
 | 
			
		||||
        let rise = themeNode.get_length('-arrow-rise');
 | 
			
		||||
        let fade = (animate & PopupAnimation.FADE);
 | 
			
		||||
@@ -158,16 +152,16 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
        if (animate & PopupAnimation.SLIDE) {
 | 
			
		||||
            switch (this._arrowSide) {
 | 
			
		||||
                case St.Side.TOP:
 | 
			
		||||
                    yOffset = rise;
 | 
			
		||||
                    translationY = rise;
 | 
			
		||||
                    break;
 | 
			
		||||
                case St.Side.BOTTOM:
 | 
			
		||||
                    yOffset = -rise;
 | 
			
		||||
                    translationY = -rise;
 | 
			
		||||
                    break;
 | 
			
		||||
                case St.Side.LEFT:
 | 
			
		||||
                    xOffset = rise;
 | 
			
		||||
                    translationX = rise;
 | 
			
		||||
                    break;
 | 
			
		||||
                case St.Side.RIGHT:
 | 
			
		||||
                    xOffset = -rise;
 | 
			
		||||
                    translationX = -rise;
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@@ -176,15 +170,15 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
 | 
			
		||||
        Tweener.removeTweens(this);
 | 
			
		||||
        Tweener.addTween(this, { opacity: fade ? 0 : 255,
 | 
			
		||||
                                 xOffset: xOffset,
 | 
			
		||||
                                 yOffset: yOffset,
 | 
			
		||||
                                 translation_x: translationX,
 | 
			
		||||
                                 translation_y: translationY,
 | 
			
		||||
                                 transition: 'linear',
 | 
			
		||||
                                 time: animationTime,
 | 
			
		||||
                                 onComplete: () => {
 | 
			
		||||
                                     this.hide();
 | 
			
		||||
                                     this.opacity = 0;
 | 
			
		||||
                                     this.xOffset = 0;
 | 
			
		||||
                                     this.yOffset = 0;
 | 
			
		||||
                                     this.translation_x = 0;
 | 
			
		||||
                                     this.translation_y = 0;
 | 
			
		||||
                                     if (onComplete)
 | 
			
		||||
                                         onComplete();
 | 
			
		||||
                                 }
 | 
			
		||||
@@ -477,11 +471,15 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
    _reposition() {
 | 
			
		||||
        let sourceActor = this._sourceActor;
 | 
			
		||||
        let alignment = this._arrowAlignment;
 | 
			
		||||
        let monitorIndex = Main.layoutManager.findIndexForActor(sourceActor);
 | 
			
		||||
 | 
			
		||||
        this._sourceAllocation = Shell.util_get_transformed_allocation(sourceActor);
 | 
			
		||||
        this._workArea = Main.layoutManager.getWorkAreaForMonitor(monitorIndex);
 | 
			
		||||
 | 
			
		||||
        // Position correctly relative to the sourceActor
 | 
			
		||||
        let sourceNode = sourceActor.get_theme_node();
 | 
			
		||||
        let sourceContentBox = sourceNode.get_content_box(sourceActor.get_allocation_box());
 | 
			
		||||
        let sourceAllocation = Shell.util_get_transformed_allocation(sourceActor);
 | 
			
		||||
        let sourceAllocation = this._sourceAllocation;
 | 
			
		||||
        let sourceCenterX = sourceAllocation.x1 + sourceContentBox.x1 + (sourceContentBox.x2 - sourceContentBox.x1) * this._sourceAlignment;
 | 
			
		||||
        let sourceCenterY = sourceAllocation.y1 + sourceContentBox.y1 + (sourceContentBox.y2 - sourceContentBox.y1) * this._sourceAlignment;
 | 
			
		||||
        let [minWidth, minHeight, natWidth, natHeight] = this.get_preferred_size();
 | 
			
		||||
@@ -489,8 +487,7 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
        // We also want to keep it onscreen, and separated from the
 | 
			
		||||
        // edge by the same distance as the main part of the box is
 | 
			
		||||
        // separated from its sourceActor
 | 
			
		||||
        let monitorIndex = Main.layoutManager.findIndexForActor(sourceActor);
 | 
			
		||||
        let workarea = Main.layoutManager.getWorkAreaForMonitor(monitorIndex);
 | 
			
		||||
        let workarea = this._workArea;
 | 
			
		||||
        let themeNode = this.get_theme_node();
 | 
			
		||||
        let borderWidth = themeNode.get_length('-arrow-border-width');
 | 
			
		||||
        let arrowBase = themeNode.get_length('-arrow-base');
 | 
			
		||||
@@ -584,9 +581,9 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
            parent = parent.get_parent();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._xPosition = Math.floor(x);
 | 
			
		||||
        this._yPosition = Math.floor(y);
 | 
			
		||||
        this._shiftActor();
 | 
			
		||||
        // Actually set the position
 | 
			
		||||
        this.x = Math.floor(x);
 | 
			
		||||
        this.y = Math.floor(y);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // @origin: Coordinate specifying middle of the arrow, along
 | 
			
		||||
@@ -609,25 +606,10 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _shiftActor() {
 | 
			
		||||
        // Since the position of the BoxPointer depends on the allocated size
 | 
			
		||||
        // of the BoxPointer and the position of the source actor, trying
 | 
			
		||||
        // to position the BoxPointer via the x/y properties will result in
 | 
			
		||||
        // allocation loops and warnings. Instead we do the positioning via
 | 
			
		||||
        // the anchor point, which is independent of allocation, and leave
 | 
			
		||||
        // x == y == 0.
 | 
			
		||||
        this.set_anchor_point(-(this._xPosition + this._xOffset),
 | 
			
		||||
                              -(this._yPosition + this._yOffset));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _calculateArrowSide(arrowSide) {
 | 
			
		||||
        let sourceAllocation = Shell.util_get_transformed_allocation(this._sourceActor);
 | 
			
		||||
        let sourceAllocation = this._sourceAllocation;
 | 
			
		||||
        let [minWidth, minHeight, boxWidth, boxHeight] = this.get_preferred_size();
 | 
			
		||||
        let monitorActor = this.sourceActor;
 | 
			
		||||
        if (!monitorActor)
 | 
			
		||||
            monitorActor = this;
 | 
			
		||||
        let monitorIndex = Main.layoutManager.findIndexForActor(monitorActor);
 | 
			
		||||
        let workarea = Main.layoutManager.getWorkAreaForMonitor(monitorIndex);
 | 
			
		||||
        let workarea = this._workArea;
 | 
			
		||||
 | 
			
		||||
        switch (arrowSide) {
 | 
			
		||||
        case St.Side.TOP:
 | 
			
		||||
@@ -669,24 +651,6 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    set xOffset(offset) {
 | 
			
		||||
        this._xOffset = offset;
 | 
			
		||||
        this._shiftActor();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get xOffset() {
 | 
			
		||||
        return this._xOffset;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    set yOffset(offset) {
 | 
			
		||||
        this._yOffset = offset;
 | 
			
		||||
        this._shiftActor();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get yOffset() {
 | 
			
		||||
        return this._yOffset;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    updateArrowSide(side) {
 | 
			
		||||
        this._arrowSide = side;
 | 
			
		||||
        this._border.queue_repaint();
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,7 @@ 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;
 | 
			
		||||
@@ -199,12 +200,20 @@ 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)
 | 
			
		||||
                e.message.includes('Error unlocking')) {                       // udisks (wrong password)
 | 
			
		||||
                // libblockdev wrong password opening LUKS device
 | 
			
		||||
                e.message.includes('Failed to activate device: Incorrect passphrase') ||
 | 
			
		||||
                // cryptsetup returns EINVAL in many cases, including wrong TCRYPT password/parameters
 | 
			
		||||
                e.message.includes('Failed to load device\'s parameters: Invalid argument')) {
 | 
			
		||||
 | 
			
		||||
                this._reaskPassword(volume);
 | 
			
		||||
            } 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());
 | 
			
		||||
 | 
			
		||||
                this._closeOperation(volume);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -10,9 +10,10 @@ const CheckBox = imports.ui.checkBox;
 | 
			
		||||
 | 
			
		||||
var WORK_SPINNER_ICON_SIZE = 16;
 | 
			
		||||
 | 
			
		||||
var KeyringDialog = class extends ModalDialog.ModalDialog {
 | 
			
		||||
    constructor() {
 | 
			
		||||
        super({ styleClass: 'prompt-dialog' });
 | 
			
		||||
var KeyringDialog = GObject.registerClass(
 | 
			
		||||
class KeyringDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
    _init() {
 | 
			
		||||
        super._init({ styleClass: 'prompt-dialog' });
 | 
			
		||||
 | 
			
		||||
        this.prompt = new Shell.KeyringPrompt();
 | 
			
		||||
        this.prompt.connect('show-password', this._onShowPassword.bind(this));
 | 
			
		||||
@@ -23,20 +24,8 @@ var KeyringDialog = class extends ModalDialog.ModalDialog {
 | 
			
		||||
        this._content = new Dialog.MessageDialogContent({ icon });
 | 
			
		||||
        this.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;
 | 
			
		||||
@@ -224,7 +213,7 @@ var KeyringDialog = class 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, NM, Pango, Shell, St } = imports.gi;
 | 
			
		||||
const { Clutter, Gio, GLib, GObject, NM, Pango, Shell, St } = imports.gi;
 | 
			
		||||
const Signals = imports.signals;
 | 
			
		||||
 | 
			
		||||
const Config = imports.misc.config;
 | 
			
		||||
@@ -12,9 +12,10 @@ const ShellEntry = imports.ui.shellEntry;
 | 
			
		||||
 | 
			
		||||
const VPN_UI_GROUP = 'VPN Plugin UI';
 | 
			
		||||
 | 
			
		||||
var NetworkSecretDialog = class extends ModalDialog.ModalDialog {
 | 
			
		||||
    constructor(agent, requestId, connection, settingName, hints, flags, contentOverride) {
 | 
			
		||||
        super({ styleClass: 'prompt-dialog' });
 | 
			
		||||
var NetworkSecretDialog = GObject.registerClass(
 | 
			
		||||
class NetworkSecretDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
    _init(agent, requestId, connection, settingName, hints, flags, contentOverride) {
 | 
			
		||||
        super._init({ styleClass: 'prompt-dialog' });
 | 
			
		||||
 | 
			
		||||
        this._agent = agent;
 | 
			
		||||
        this._requestId = requestId;
 | 
			
		||||
@@ -347,7 +348,7 @@ var NetworkSecretDialog = class extends ModalDialog.ModalDialog {
 | 
			
		||||
 | 
			
		||||
        return content;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
var VPNRequestHandler = class {
 | 
			
		||||
    constructor(agent, requestId, authHelper, serviceType, connection, hints, flags) {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 | 
			
		||||
 | 
			
		||||
const { AccountsService, Clutter, Gio, GLib,
 | 
			
		||||
        Pango, PolkitAgent, Polkit, Shell, St } = imports.gi;
 | 
			
		||||
        GObject, Pango, PolkitAgent, Polkit, Shell, St } = imports.gi;
 | 
			
		||||
const Signals = imports.signals;
 | 
			
		||||
 | 
			
		||||
const Animation = imports.ui.animation;
 | 
			
		||||
@@ -15,9 +15,11 @@ var DIALOG_ICON_SIZE = 48;
 | 
			
		||||
 | 
			
		||||
var WORK_SPINNER_ICON_SIZE = 16;
 | 
			
		||||
 | 
			
		||||
var AuthenticationDialog = class extends ModalDialog.ModalDialog {
 | 
			
		||||
    constructor(actionId, body, cookie, userNames) {
 | 
			
		||||
        super({ styleClass: 'prompt-dialog' });
 | 
			
		||||
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' });
 | 
			
		||||
 | 
			
		||||
        this.actionId = actionId;
 | 
			
		||||
        this.message = body;
 | 
			
		||||
@@ -25,7 +27,7 @@ var AuthenticationDialog = class extends ModalDialog.ModalDialog {
 | 
			
		||||
        this._wasDismissed = false;
 | 
			
		||||
 | 
			
		||||
        this._sessionUpdatedId = Main.sessionMode.connect('updated', () => {
 | 
			
		||||
            this._group.visible = !Main.sessionMode.isLocked;
 | 
			
		||||
            this.visible = !Main.sessionMode.isLocked;
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        this.connect('closed', this._onDialogClosed.bind(this));
 | 
			
		||||
@@ -326,8 +328,7 @@ var AuthenticationDialog = class extends ModalDialog.ModalDialog {
 | 
			
		||||
 | 
			
		||||
        this._destroySession();
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
Signals.addSignalMethods(AuthenticationDialog.prototype);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
var AuthenticationAgent = class {
 | 
			
		||||
    constructor() {
 | 
			
		||||
 
 | 
			
		||||
@@ -401,7 +401,7 @@ var ChatSource = class extends MessageTray.Source {
 | 
			
		||||
        if (this._client.is_handling_channel(this._channel)) {
 | 
			
		||||
            // We are handling the channel, try to pass it to Empathy or Polari
 | 
			
		||||
            // (depending on the channel type)
 | 
			
		||||
            // We don't check if either app is availble - mission control will
 | 
			
		||||
            // We don't check if either app is available - mission control will
 | 
			
		||||
            // fallback to something else if activation fails
 | 
			
		||||
 | 
			
		||||
            let target;
 | 
			
		||||
 
 | 
			
		||||
@@ -584,22 +584,18 @@ var Dash = class Dash {
 | 
			
		||||
        let firstButton = iconChildren[0].child;
 | 
			
		||||
        let firstIcon = firstButton._delegate.icon;
 | 
			
		||||
 | 
			
		||||
        let minHeight, natHeight;
 | 
			
		||||
        let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
 | 
			
		||||
 | 
			
		||||
        // Enforce the current icon size during the size request
 | 
			
		||||
        // Enforce valid spacings during the size request
 | 
			
		||||
        firstIcon.icon.ensure_style();
 | 
			
		||||
        let [, currentHeight] = firstIcon.icon.get_size();
 | 
			
		||||
        firstIcon.icon.set_height(this.iconSize * scaleFactor);
 | 
			
		||||
        [minHeight, natHeight] = firstButton.get_preferred_height(-1);
 | 
			
		||||
        firstIcon.icon.set_height(currentHeight);
 | 
			
		||||
        let [, iconHeight] = firstIcon.icon.get_preferred_height(-1);
 | 
			
		||||
        let [, buttonHeight] = firstButton.get_preferred_height(-1);
 | 
			
		||||
 | 
			
		||||
        // Subtract icon padding and box spacing from the available height
 | 
			
		||||
        availHeight -= iconChildren.length * (natHeight - this.iconSize * scaleFactor) +
 | 
			
		||||
        availHeight -= iconChildren.length * (buttonHeight - iconHeight) +
 | 
			
		||||
                       (iconChildren.length - 1) * spacing;
 | 
			
		||||
 | 
			
		||||
        let availSize = availHeight / iconChildren.length;
 | 
			
		||||
 | 
			
		||||
        let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
 | 
			
		||||
        let iconSizes = baseIconSizes.map(s => s * scaleFactor);
 | 
			
		||||
 | 
			
		||||
        let newIconSize = baseIconSizes[0];
 | 
			
		||||
@@ -903,7 +899,7 @@ var Dash = class Dash {
 | 
			
		||||
                favPos++;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // No drag placeholder means we don't wan't to favorite the app
 | 
			
		||||
        // No drag placeholder means we don't want to favorite the app
 | 
			
		||||
        // and we are dragging it to its original position
 | 
			
		||||
        if (!this._dragPlaceholder)
 | 
			
		||||
            return true;
 | 
			
		||||
 
 | 
			
		||||
@@ -118,7 +118,7 @@ var WorldClocksSection = class WorldClocksSection {
 | 
			
		||||
            if (!clocks[i].location)
 | 
			
		||||
                continue;
 | 
			
		||||
            let l = world.deserialize(clocks[i].location);
 | 
			
		||||
            if (l)
 | 
			
		||||
            if (l && l.get_timezone() != null)
 | 
			
		||||
                this._locations.push({ location: l });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -136,11 +136,12 @@ var WorldClocksSection = class WorldClocksSection {
 | 
			
		||||
        layout.attach(header, 0, 0, 2, 1);
 | 
			
		||||
        this.actor.label_actor = header;
 | 
			
		||||
 | 
			
		||||
        let localOffset = GLib.DateTime.new_now_local().get_utc_offset();
 | 
			
		||||
 | 
			
		||||
        for (let i = 0; i < this._locations.length; i++) {
 | 
			
		||||
            let l = this._locations[i].location;
 | 
			
		||||
 | 
			
		||||
            let name = l.get_level() == GWeather.LocationLevel.NAMED_TIMEZONE ? l.get_name()
 | 
			
		||||
                                                                              : l.get_city_name();
 | 
			
		||||
            let name = l.get_city_name() || l.get_name();
 | 
			
		||||
            let label = new St.Label({ style_class: 'world-clocks-city',
 | 
			
		||||
                                       text: name,
 | 
			
		||||
                                       x_align: Clutter.ActorAlign.START,
 | 
			
		||||
@@ -149,7 +150,8 @@ var WorldClocksSection = class WorldClocksSection {
 | 
			
		||||
 | 
			
		||||
            let time = new St.Label({ style_class: 'world-clocks-time' });
 | 
			
		||||
 | 
			
		||||
            let offset = l.get_timezone().get_offset() / 60.;
 | 
			
		||||
            let otherOffset = this._getTimeAtLocation(l).get_utc_offset();
 | 
			
		||||
            let offset = (otherOffset - localOffset) / GLib.TIME_SPAN_HOUR;
 | 
			
		||||
            let fmt = (Math.trunc(offset) == offset) ? '%s%.0f' : '%s%.1f';
 | 
			
		||||
            let prefix = (offset >= 0) ? '+' : '-';
 | 
			
		||||
            let tz = new St.Label({ style_class: 'world-clocks-timezone',
 | 
			
		||||
@@ -182,11 +184,15 @@ var WorldClocksSection = class WorldClocksSection {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _getTimeAtLocation(location) {
 | 
			
		||||
        let tz = GLib.TimeZone.new(location.get_timezone().get_tzid());
 | 
			
		||||
        return GLib.DateTime.new_now(tz);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _updateLabels() {
 | 
			
		||||
        for (let i = 0; i < this._locations.length; i++) {
 | 
			
		||||
            let l = this._locations[i];
 | 
			
		||||
            let tz = GLib.TimeZone.new(l.location.get_timezone().get_tzid());
 | 
			
		||||
            let now = GLib.DateTime.new_now(tz);
 | 
			
		||||
            let now = this._getTimeAtLocation(l.location);
 | 
			
		||||
            l.actor.text = Util.formatTime(now, { timeOnly: true });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -470,10 +476,9 @@ class DateMenuButton extends PanelMenu.Button {
 | 
			
		||||
        box.add_actor(this._clockDisplay);
 | 
			
		||||
        box.add_actor(this._indicator.actor);
 | 
			
		||||
 | 
			
		||||
        this.actor.label_actor = this._clockDisplay;
 | 
			
		||||
        this.actor.add_actor(box);
 | 
			
		||||
        this.actor.add_style_class_name ('clock-display');
 | 
			
		||||
 | 
			
		||||
        this.label_actor = this._clockDisplay;
 | 
			
		||||
        this.add_actor(box);
 | 
			
		||||
        this.add_style_class_name ('clock-display');
 | 
			
		||||
 | 
			
		||||
        let layout = new FreezableBinLayout();
 | 
			
		||||
        let bin = new St.Widget({ layout_manager: layout });
 | 
			
		||||
 
 | 
			
		||||
@@ -175,10 +175,10 @@ var MessageDialogContent = GObject.registerClass({
 | 
			
		||||
            this[`_${prop}`].add_style_class_name(`message-dialog-${prop}`);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        let textProps = { ellipsize_mode: Pango.EllipsizeMode.NONE,
 | 
			
		||||
        let textProps = { ellipsize: Pango.EllipsizeMode.NONE,
 | 
			
		||||
                          line_wrap: true };
 | 
			
		||||
        Object.assign(this._subtitle.clutter_text, textProps);
 | 
			
		||||
        Object.assign(this._body.clutter_text, textProps);
 | 
			
		||||
        this._subtitle.clutter_text.set(textProps);
 | 
			
		||||
        this._body.clutter_text.set(textProps);
 | 
			
		||||
 | 
			
		||||
        if (!params.hasOwnProperty('style_class'))
 | 
			
		||||
            params.style_class = 'message-dialog-main-layout';
 | 
			
		||||
 
 | 
			
		||||
@@ -19,7 +19,7 @@
 | 
			
		||||
const Mainloop = imports.mainloop;
 | 
			
		||||
 | 
			
		||||
const { AccountsService, Clutter, Gio,
 | 
			
		||||
        GLib, Pango, Polkit, Shell, St }  = imports.gi;
 | 
			
		||||
        GLib, GObject, Pango, Polkit, Shell, St }  = imports.gi;
 | 
			
		||||
 | 
			
		||||
const CheckBox = imports.ui.checkBox;
 | 
			
		||||
const GnomeSession = imports.misc.gnomeSession;
 | 
			
		||||
@@ -226,10 +226,11 @@ function init() {
 | 
			
		||||
    _endSessionDialog = new EndSessionDialog();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var EndSessionDialog = class EndSessionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
    constructor() {
 | 
			
		||||
        super({ styleClass: 'end-session-dialog',
 | 
			
		||||
                destroyOnClose: false });
 | 
			
		||||
var EndSessionDialog = GObject.registerClass(
 | 
			
		||||
class EndSessionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
    _init() {
 | 
			
		||||
        super._init({ styleClass: 'end-session-dialog',
 | 
			
		||||
                      destroyOnClose: false });
 | 
			
		||||
 | 
			
		||||
        this._loginManager = LoginManager.getLoginManager();
 | 
			
		||||
        this._userManager = AccountsService.UserManager.get_default();
 | 
			
		||||
@@ -747,4 +748,4 @@ var EndSessionDialog = class EndSessionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
    Close(parameters, invocation) {
 | 
			
		||||
        this.close();
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
@@ -96,6 +96,15 @@ function init() {
 | 
			
		||||
    Clutter.Actor.prototype.toString = function() {
 | 
			
		||||
        return St.describe_actor(this);
 | 
			
		||||
    };
 | 
			
		||||
    // Deprecation warning for former JS classes turned into an actor subclass
 | 
			
		||||
    Object.defineProperty(Clutter.Actor.prototype, 'actor', {
 | 
			
		||||
        get() {
 | 
			
		||||
            let klass = this.constructor.name;
 | 
			
		||||
            let { stack } = new Error();
 | 
			
		||||
            log(`Usage of object.actor is deprecated for ${klass}\n${stack}`);
 | 
			
		||||
            return this;
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    let origToString = Object.prototype.toString;
 | 
			
		||||
    Object.prototype.toString = function() {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 | 
			
		||||
 | 
			
		||||
const { Clutter, Gio, GLib, Soup, St } = imports.gi;
 | 
			
		||||
const { Clutter, Gio, GLib, GObject, Soup, St } = imports.gi;
 | 
			
		||||
 | 
			
		||||
const Config = imports.misc.config;
 | 
			
		||||
const ExtensionUtils = imports.misc.extensionUtils;
 | 
			
		||||
@@ -176,10 +176,10 @@ function checkForUpdates() {
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var InstallExtensionDialog =
 | 
			
		||||
var InstallExtensionDialog = GObject.registerClass(
 | 
			
		||||
class InstallExtensionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
    constructor(uuid, info, invocation) {
 | 
			
		||||
        super({ styleClass: 'extension-dialog' });
 | 
			
		||||
    _init(uuid, info, invocation) {
 | 
			
		||||
        super._init({ styleClass: 'extension-dialog' });
 | 
			
		||||
 | 
			
		||||
        this._uuid = uuid;
 | 
			
		||||
        this._info = info;
 | 
			
		||||
@@ -255,7 +255,7 @@ class InstallExtensionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
 | 
			
		||||
        this.close();
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
function init() {
 | 
			
		||||
    _httpSession = new Soup.SessionAsync({ ssl_use_system_ca_file: true });
 | 
			
		||||
 
 | 
			
		||||
@@ -272,7 +272,7 @@ var CandidatePopup = class CandidatePopup {
 | 
			
		||||
 | 
			
		||||
    _setDummyCursorGeometry(x, y, w, h) {
 | 
			
		||||
        Main.layoutManager.setDummyCursorGeometry(x, y, w, h);
 | 
			
		||||
        if (this._boxPointer.actor.visible)
 | 
			
		||||
        if (this._boxPointer.visible)
 | 
			
		||||
            this._boxPointer.setPosition(Main.layoutManager.dummyCursor, 0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -285,7 +285,7 @@ var CandidatePopup = class CandidatePopup {
 | 
			
		||||
        if (isVisible) {
 | 
			
		||||
            this._boxPointer.setPosition(Main.layoutManager.dummyCursor, 0);
 | 
			
		||||
            this._boxPointer.open(BoxPointer.PopupAnimation.NONE);
 | 
			
		||||
            this._boxPointer.actor.raise_top();
 | 
			
		||||
            this._boxPointer.raise_top();
 | 
			
		||||
        } else {
 | 
			
		||||
            this._boxPointer.close(BoxPointer.PopupAnimation.NONE);
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -43,8 +43,6 @@ class BaseIcon extends St.Bin {
 | 
			
		||||
                      x_fill: true,
 | 
			
		||||
                      y_fill: true });
 | 
			
		||||
 | 
			
		||||
        this.actor = this;
 | 
			
		||||
 | 
			
		||||
        this.connect('destroy', this._onDestroy.bind(this));
 | 
			
		||||
 | 
			
		||||
        this._box = new St.BoxLayout({ vertical: true });
 | 
			
		||||
@@ -81,7 +79,7 @@ class BaseIcon extends St.Bin {
 | 
			
		||||
    // This can be overridden by a subclass, or by the createIcon
 | 
			
		||||
    // parameter to _init()
 | 
			
		||||
    createIcon(size) {
 | 
			
		||||
        throw new Error('no implementation of createIcon in ' + this);
 | 
			
		||||
        throw new GObject.NotImplementedError(`createIcon in ${this.constructor.name}`);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    setIconSize(size) {
 | 
			
		||||
@@ -188,8 +186,6 @@ var IconGrid = GObject.registerClass({
 | 
			
		||||
        super._init({ style_class: 'icon-grid',
 | 
			
		||||
                      y_align: Clutter.ActorAlign.START });
 | 
			
		||||
 | 
			
		||||
        this.actor = this;
 | 
			
		||||
 | 
			
		||||
        params = Params.parse(params, { rowLimit: null,
 | 
			
		||||
                                        columnLimit: null,
 | 
			
		||||
                                        minRows: 1,
 | 
			
		||||
@@ -420,7 +416,8 @@ var IconGrid = GObject.registerClass({
 | 
			
		||||
 | 
			
		||||
    animatePulse(animationDirection) {
 | 
			
		||||
        if (animationDirection != AnimationDirection.IN)
 | 
			
		||||
            throw new Error("Pulse animation only implements 'in' animation direction");
 | 
			
		||||
            throw new GObject.NotImplementedError("Pulse animation only implements " +
 | 
			
		||||
                                                  "'in' animation direction");
 | 
			
		||||
 | 
			
		||||
        this._cancelAnimation();
 | 
			
		||||
 | 
			
		||||
@@ -844,7 +841,7 @@ var PaginatedIconGrid = GObject.registerClass({
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Overriden from IconGrid
 | 
			
		||||
    // Overridden from IconGrid
 | 
			
		||||
    _getChildrenToAnimate() {
 | 
			
		||||
        let children = this._getVisibleChildren();
 | 
			
		||||
        let firstIndex = this._childrenPerPage * this.currentPage;
 | 
			
		||||
 
 | 
			
		||||
@@ -282,11 +282,11 @@ var Key = class Key {
 | 
			
		||||
                                                       y_fill: true,
 | 
			
		||||
                                                       x_align: St.Align.START });
 | 
			
		||||
        this._boxPointer.hide();
 | 
			
		||||
        Main.layoutManager.addChrome(this._boxPointer.actor);
 | 
			
		||||
        Main.layoutManager.addChrome(this._boxPointer);
 | 
			
		||||
        this._boxPointer.setPosition(this.keyButton, 0.5);
 | 
			
		||||
 | 
			
		||||
        // Adds style to existing keyboard style to avoid repetition
 | 
			
		||||
        this._boxPointer.actor.add_style_class_name('keyboard-subkeys');
 | 
			
		||||
        this._boxPointer.add_style_class_name('keyboard-subkeys');
 | 
			
		||||
        this._getExtendedKeys();
 | 
			
		||||
        this.keyButton._extended_keys = this._extended_keyboard;
 | 
			
		||||
    }
 | 
			
		||||
@@ -1049,7 +1049,7 @@ var Keyboard = class Keyboard {
 | 
			
		||||
        this._a11yApplicationsSettings.connect('changed', this._syncEnabled.bind(this));
 | 
			
		||||
        this._lastDeviceId = null;
 | 
			
		||||
        this._suggestions = null;
 | 
			
		||||
        this._emojiKeyVisible = true;
 | 
			
		||||
        this._emojiKeyVisible = Meta.is_wayland_compositor();
 | 
			
		||||
 | 
			
		||||
        this._focusTracker = new FocusTracker();
 | 
			
		||||
        this._focusTracker.connect('position-changed', this._onFocusPositionChanged.bind(this));
 | 
			
		||||
@@ -1144,6 +1144,7 @@ var Keyboard = class Keyboard {
 | 
			
		||||
            this._keyboardController.disconnect(this._keypadVisibleId);
 | 
			
		||||
        if (this._focusNotifyId)
 | 
			
		||||
            global.stage.disconnect(this._focusNotifyId);
 | 
			
		||||
        this._clearShowIdle();
 | 
			
		||||
        this._keyboard = null;
 | 
			
		||||
        this.actor.destroy();
 | 
			
		||||
        this.actor = null;
 | 
			
		||||
@@ -1162,7 +1163,7 @@ var Keyboard = class Keyboard {
 | 
			
		||||
        this._keyboardController = new KeyboardController();
 | 
			
		||||
 | 
			
		||||
        this._groups = {};
 | 
			
		||||
        this._current_page = null;
 | 
			
		||||
        this._currentPage = null;
 | 
			
		||||
 | 
			
		||||
        this._suggestions = new Suggestions();
 | 
			
		||||
        this.actor.add(this._suggestions.actor,
 | 
			
		||||
@@ -1202,10 +1203,12 @@ var Keyboard = class Keyboard {
 | 
			
		||||
        this._keyboardNotifyId = this._keyboardController.connect('active-group', this._onGroupChanged.bind(this));
 | 
			
		||||
        this._keyboardGroupsChangedId = this._keyboardController.connect('groups-changed', this._onKeyboardGroupsChanged.bind(this));
 | 
			
		||||
        this._keyboardStateId = this._keyboardController.connect('panel-state', this._onKeyboardStateChanged.bind(this));
 | 
			
		||||
        this._emojiKeyVisibleId = this._keyboardController.connect('emoji-visible', this._onEmojiKeyVisible.bind(this));
 | 
			
		||||
        this._keypadVisibleId = this._keyboardController.connect('keypad-visible', this._onKeypadVisible.bind(this));
 | 
			
		||||
        this._focusNotifyId = global.stage.connect('notify::key-focus', this._onKeyFocusChanged.bind(this));
 | 
			
		||||
 | 
			
		||||
        if (Meta.is_wayland_compositor())
 | 
			
		||||
            this._emojiKeyVisibleId = this._keyboardController.connect('emoji-visible', this._onEmojiKeyVisible.bind(this));
 | 
			
		||||
 | 
			
		||||
        this._relayout();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -1227,6 +1230,7 @@ var Keyboard = class Keyboard {
 | 
			
		||||
        if (!this._showIdleId) {
 | 
			
		||||
          this._showIdleId = GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => {
 | 
			
		||||
              this.show(Main.layoutManager.focusIndex);
 | 
			
		||||
              this._showIdleId = 0;
 | 
			
		||||
              return GLib.SOURCE_REMOVE;
 | 
			
		||||
          });
 | 
			
		||||
          GLib.Source.set_name_by_id(this._showIdleId, '[gnome-shell] this.show');
 | 
			
		||||
@@ -1353,7 +1357,7 @@ var Keyboard = class Keyboard {
 | 
			
		||||
            } else if (switchToLevel == 1) {
 | 
			
		||||
                extraButton.connect('long-press', () => {
 | 
			
		||||
                    this._latched = true;
 | 
			
		||||
                    this._setCurrentLevelLatched(this._current_page, this._latched);
 | 
			
		||||
                    this._setCurrentLevelLatched(this._currentPage, this._latched);
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
@@ -1380,8 +1384,8 @@ var Keyboard = class Keyboard {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _updateCurrentPageVisible() {
 | 
			
		||||
        if (this._current_page)
 | 
			
		||||
            this._current_page.visible = !this._emojiActive && !this._keypadVisible;
 | 
			
		||||
        if (this._currentPage)
 | 
			
		||||
            this._currentPage.visible = !this._emojiActive && !this._keypadVisible;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _setEmojiActive(active) {
 | 
			
		||||
@@ -1440,7 +1444,7 @@ var Keyboard = class Keyboard {
 | 
			
		||||
 | 
			
		||||
    _getGridSlots() {
 | 
			
		||||
        let numOfHorizSlots = 0, numOfVertSlots;
 | 
			
		||||
        let rows = this._current_page.get_children();
 | 
			
		||||
        let rows = this._currentPage.get_children();
 | 
			
		||||
        numOfVertSlots = rows.length;
 | 
			
		||||
 | 
			
		||||
        for (let i = 0; i < rows.length; ++i) {
 | 
			
		||||
@@ -1470,7 +1474,12 @@ var Keyboard = class Keyboard {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _onKeyboardGroupsChanged(keyboard) {
 | 
			
		||||
        this._groups = [];
 | 
			
		||||
        let nonGroupActors = [this._emojiSelection.actor, this._keypad.actor];
 | 
			
		||||
        this._aspectContainer.get_children().filter(c => !nonGroupActors.includes(c)).forEach(c => {
 | 
			
		||||
            c.destroy();
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        this._groups = {};
 | 
			
		||||
        this._onGroupChanged();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -1512,13 +1521,24 @@ var Keyboard = class Keyboard {
 | 
			
		||||
    _setActiveLayer(activeLevel) {
 | 
			
		||||
        let activeGroupName = this._keyboardController.getCurrentGroup();
 | 
			
		||||
        let layers = this._groups[activeGroupName];
 | 
			
		||||
        let currentPage = layers[activeLevel];
 | 
			
		||||
 | 
			
		||||
        if (this._current_page != null) {
 | 
			
		||||
            this._setCurrentLevelLatched(this._current_page, false);
 | 
			
		||||
            this._current_page.hide();
 | 
			
		||||
        if (this._currentPage == currentPage) {
 | 
			
		||||
            this._updateCurrentPageVisible();
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._current_page = layers[activeLevel];
 | 
			
		||||
        if (this._currentPage != null) {
 | 
			
		||||
            this._setCurrentLevelLatched(this._currentPage, false);
 | 
			
		||||
            this._currentPage.disconnect(this._currentPage._destroyID);
 | 
			
		||||
            this._currentPage.hide();
 | 
			
		||||
            delete this._currentPage._destroyID;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._currentPage = currentPage;
 | 
			
		||||
        this._currentPage._destroyID = this._currentPage.connect('destroy', () => {
 | 
			
		||||
            this._currentPage = null;
 | 
			
		||||
        });
 | 
			
		||||
        this._updateCurrentPageVisible();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -1606,18 +1626,6 @@ var Keyboard = class Keyboard {
 | 
			
		||||
        this.setCursorLocation(null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _hideSubkeys() {
 | 
			
		||||
        if (this._subkeysBoxPointer) {
 | 
			
		||||
            this._subkeysBoxPointer.hide(BoxPointer.PopupAnimation.FULL);
 | 
			
		||||
            this._subkeysBoxPointer = null;
 | 
			
		||||
        }
 | 
			
		||||
        if (this._capturedEventId) {
 | 
			
		||||
            this.actor.disconnect(this._capturedEventId);
 | 
			
		||||
            this._capturedEventId = 0;
 | 
			
		||||
        }
 | 
			
		||||
        this._capturedPress = false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    resetSuggestions() {
 | 
			
		||||
        if (this._suggestions)
 | 
			
		||||
            this._suggestions.clear();
 | 
			
		||||
 
 | 
			
		||||
@@ -216,10 +216,17 @@ 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);
 | 
			
		||||
 | 
			
		||||
        global.stage.add_child(this.uiGroup);
 | 
			
		||||
        // Using addChrome() to add actors to uiGroup will position actors
 | 
			
		||||
        // underneath the top_window_group.
 | 
			
		||||
        // To insert actors at the top of uiGroup, we use addTopChrome() or
 | 
			
		||||
        // add the actor directly using uiGroup.add_actor().
 | 
			
		||||
        global.stage.remove_actor(global.top_window_group);
 | 
			
		||||
        this.uiGroup.add_actor(global.top_window_group);
 | 
			
		||||
 | 
			
		||||
        this.overviewGroup = new St.Widget({ name: 'overviewGroup',
 | 
			
		||||
                                             visible: false,
 | 
			
		||||
@@ -231,7 +238,7 @@ var LayoutManager = GObject.registerClass({
 | 
			
		||||
                                                 clip_to_allocation: true,
 | 
			
		||||
                                                 layout_manager: new Clutter.BinLayout(),
 | 
			
		||||
                                               });
 | 
			
		||||
        this.addChrome(this.screenShieldGroup);
 | 
			
		||||
        this.addTopChrome(this.screenShieldGroup);
 | 
			
		||||
 | 
			
		||||
        this.panelBox = new St.BoxLayout({ name: 'panelBox',
 | 
			
		||||
                                           vertical: true });
 | 
			
		||||
@@ -247,17 +254,14 @@ var LayoutManager = GObject.registerClass({
 | 
			
		||||
        this.keyboardBox = new St.BoxLayout({ name: 'keyboardBox',
 | 
			
		||||
                                              reactive: true,
 | 
			
		||||
                                              track_hover: true });
 | 
			
		||||
        this.addChrome(this.keyboardBox);
 | 
			
		||||
        this.addTopChrome(this.keyboardBox);
 | 
			
		||||
        this._keyboardHeightNotifyId = 0;
 | 
			
		||||
 | 
			
		||||
        // A dummy actor that tracks the mouse or text cursor, based on the
 | 
			
		||||
        // position and size set in setDummyCursorGeometry.
 | 
			
		||||
        this.dummyCursor = new St.Widget({ width: 0, height: 0, visible: false });
 | 
			
		||||
        this.dummyCursor = new St.Widget({ width: 0, height: 0, opacity: 0 });
 | 
			
		||||
        this.uiGroup.add_actor(this.dummyCursor);
 | 
			
		||||
 | 
			
		||||
        global.stage.remove_actor(global.top_window_group);
 | 
			
		||||
        this.uiGroup.add_actor(global.top_window_group);
 | 
			
		||||
 | 
			
		||||
        let feedbackGroup = Meta.get_feedback_group_for_display(global.display);
 | 
			
		||||
        global.stage.remove_actor(feedbackGroup);
 | 
			
		||||
        this.uiGroup.add_actor(feedbackGroup);
 | 
			
		||||
@@ -802,6 +806,16 @@ var LayoutManager = GObject.registerClass({
 | 
			
		||||
        this._trackActor(actor, params);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // addTopChrome:
 | 
			
		||||
    // @actor: an actor to add to the chrome
 | 
			
		||||
    // @params: (optional) additional params
 | 
			
		||||
    //
 | 
			
		||||
    // Like addChrome(), but adds @actor above all windows, including popups.
 | 
			
		||||
    addTopChrome(actor, params) {
 | 
			
		||||
        this.uiGroup.add_actor(actor);
 | 
			
		||||
        this._trackActor(actor, params);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // trackChrome:
 | 
			
		||||
    // @actor: a descendant of the chrome to begin tracking
 | 
			
		||||
    // @params: parameters describing how to track @actor
 | 
			
		||||
@@ -1058,8 +1072,7 @@ var LayoutManager = GObject.registerClass({
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (!Meta.is_wayland_compositor())
 | 
			
		||||
            global.set_stage_input_region(rects);
 | 
			
		||||
        global.set_stage_input_region(rects);
 | 
			
		||||
        this._isPopupWindowVisible = isPopupMenuVisible;
 | 
			
		||||
 | 
			
		||||
        let workspaceManager = global.workspace_manager;
 | 
			
		||||
 
 | 
			
		||||
@@ -1272,7 +1272,7 @@ var ZoomRegion = class ZoomRegion {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * getContrast:
 | 
			
		||||
     * Retreive the contrast of the magnified view.
 | 
			
		||||
     * Retrieve the contrast of the magnified view.
 | 
			
		||||
     * @return  Object containing the contrast for the red, green,
 | 
			
		||||
     *          and blue channels.
 | 
			
		||||
     */
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 | 
			
		||||
 | 
			
		||||
const { Clutter, Gio, GLib, Meta, Shell, St } = imports.gi;
 | 
			
		||||
const { Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi;
 | 
			
		||||
const Mainloop = imports.mainloop;
 | 
			
		||||
 | 
			
		||||
const AccessDialog = imports.ui.accessDialog;
 | 
			
		||||
@@ -636,7 +636,7 @@ function _queueBeforeRedraw(workId) {
 | 
			
		||||
 * initialization as well, under the assumption that new actors
 | 
			
		||||
 * will need it.
 | 
			
		||||
 *
 | 
			
		||||
 * Returns: A string work identifer
 | 
			
		||||
 * Returns: A string work identifier
 | 
			
		||||
 */
 | 
			
		||||
function initializeDeferredWork(actor, callback, props) {
 | 
			
		||||
    // Turn into a string so we can use as an object property
 | 
			
		||||
@@ -689,12 +689,13 @@ function queueDeferredWork(workId) {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var RestartMessage = class extends ModalDialog.ModalDialog {
 | 
			
		||||
    constructor(message) {
 | 
			
		||||
        super({ shellReactive: true,
 | 
			
		||||
                styleClass: 'restart-message headline',
 | 
			
		||||
                shouldFadeIn: false,
 | 
			
		||||
                destroyOnClose: true });
 | 
			
		||||
var RestartMessage = GObject.registerClass(
 | 
			
		||||
class RestartMessage extends ModalDialog.ModalDialog {
 | 
			
		||||
    _init(message) {
 | 
			
		||||
        super._init({ shellReactive: true,
 | 
			
		||||
                      styleClass: 'restart-message headline',
 | 
			
		||||
                      shouldFadeIn: false,
 | 
			
		||||
                      destroyOnClose: true });
 | 
			
		||||
 | 
			
		||||
        let label = new St.Label({ text: message });
 | 
			
		||||
 | 
			
		||||
@@ -704,7 +705,7 @@ var RestartMessage = class extends ModalDialog.ModalDialog {
 | 
			
		||||
                                        y_align: St.Align.MIDDLE });
 | 
			
		||||
        this.buttonLayout.hide();
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
function showRestartMessage(message) {
 | 
			
		||||
    let restartMessage = new RestartMessage(message);
 | 
			
		||||
 
 | 
			
		||||
@@ -584,7 +584,6 @@ class SourceActor extends St.Widget {
 | 
			
		||||
        this._source = source;
 | 
			
		||||
        this._size = size;
 | 
			
		||||
 | 
			
		||||
        this.actor = this;
 | 
			
		||||
        this.connect('destroy', () => {
 | 
			
		||||
            this._source.disconnect(this._iconUpdatedId);
 | 
			
		||||
            this._actorDestroyed = true;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 | 
			
		||||
 | 
			
		||||
const { Atk, Clutter, Shell, St } = imports.gi;
 | 
			
		||||
const { Atk, Clutter, GObject, Shell, St } = imports.gi;
 | 
			
		||||
const Signals = imports.signals;
 | 
			
		||||
 | 
			
		||||
const Dialog = imports.ui.dialog;
 | 
			
		||||
@@ -21,8 +21,20 @@ var State = {
 | 
			
		||||
    FADED_OUT: 4
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var ModalDialog = class {
 | 
			
		||||
    constructor(params) {
 | 
			
		||||
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 });
 | 
			
		||||
 | 
			
		||||
        params = Params.parse(params, { shellReactive: false,
 | 
			
		||||
                                        styleClass: null,
 | 
			
		||||
                                        actionMode: Shell.ActionMode.SYSTEM_MODAL,
 | 
			
		||||
@@ -30,7 +42,7 @@ var ModalDialog = class {
 | 
			
		||||
                                        shouldFadeOut: true,
 | 
			
		||||
                                        destroyOnClose: true });
 | 
			
		||||
 | 
			
		||||
        this.state = State.CLOSED;
 | 
			
		||||
        this._state = State.CLOSED;
 | 
			
		||||
        this._hasModal = false;
 | 
			
		||||
        this._actionMode = params.actionMode;
 | 
			
		||||
        this._shellReactive = params.shellReactive;
 | 
			
		||||
@@ -38,31 +50,25 @@ var ModalDialog = class {
 | 
			
		||||
        this._shouldFadeOut = params.shouldFadeOut;
 | 
			
		||||
        this._destroyOnClose = params.destroyOnClose;
 | 
			
		||||
 | 
			
		||||
        this._group = new St.Widget({ visible: false,
 | 
			
		||||
                                      x: 0,
 | 
			
		||||
                                      y: 0,
 | 
			
		||||
                                      accessible_role: Atk.Role.DIALOG });
 | 
			
		||||
        Main.layoutManager.modalDialogGroup.add_actor(this._group);
 | 
			
		||||
        Main.layoutManager.modalDialogGroup.add_actor(this);
 | 
			
		||||
 | 
			
		||||
        let constraint = new Clutter.BindConstraint({ source: global.stage,
 | 
			
		||||
                                                      coordinate: Clutter.BindCoordinate.ALL });
 | 
			
		||||
        this._group.add_constraint(constraint);
 | 
			
		||||
 | 
			
		||||
        this._group.connect('destroy', this._onGroupDestroy.bind(this));
 | 
			
		||||
        this.add_constraint(constraint);
 | 
			
		||||
 | 
			
		||||
        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._group.add_actor(this._backgroundBin);
 | 
			
		||||
        this.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._group,
 | 
			
		||||
            this._lightbox = new Lightbox.Lightbox(this,
 | 
			
		||||
                                                   { inhibitEvents: true,
 | 
			
		||||
                                                     radialEffect: true });
 | 
			
		||||
            this._lightbox.highlight(this._backgroundBin);
 | 
			
		||||
@@ -77,8 +83,16 @@ var ModalDialog = class {
 | 
			
		||||
        this._savedKeyFocus = null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    destroy() {
 | 
			
		||||
        this._group.destroy();
 | 
			
		||||
    get state() {
 | 
			
		||||
        return this._state;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _setState(state) {
 | 
			
		||||
        if (this._state == state)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        this._state = state;
 | 
			
		||||
        this.notify('state');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    clearButtons() {
 | 
			
		||||
@@ -96,29 +110,25 @@ var ModalDialog = class {
 | 
			
		||||
        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.state = State.OPENING;
 | 
			
		||||
        this._setState(State.OPENING);
 | 
			
		||||
 | 
			
		||||
        this.dialogLayout.opacity = 255;
 | 
			
		||||
        if (this._lightbox)
 | 
			
		||||
            this._lightbox.show();
 | 
			
		||||
        this._group.opacity = 0;
 | 
			
		||||
        this._group.show();
 | 
			
		||||
        Tweener.addTween(this._group,
 | 
			
		||||
        this.opacity = 0;
 | 
			
		||||
        this.show();
 | 
			
		||||
        Tweener.addTween(this,
 | 
			
		||||
                         { opacity: 255,
 | 
			
		||||
                           time: this._shouldFadeIn ? OPEN_AND_CLOSE_TIME : 0,
 | 
			
		||||
                           transition: 'easeOutQuad',
 | 
			
		||||
                           onComplete: () => {
 | 
			
		||||
                               this.state = State.OPENED;
 | 
			
		||||
                               this._setState(State.OPENED);
 | 
			
		||||
                               this.emit('opened');
 | 
			
		||||
                           }
 | 
			
		||||
                         });
 | 
			
		||||
@@ -148,8 +158,8 @@ var ModalDialog = class {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _closeComplete() {
 | 
			
		||||
        this.state = State.CLOSED;
 | 
			
		||||
        this._group.hide();
 | 
			
		||||
        this._setState(State.CLOSED);
 | 
			
		||||
        this.hide();
 | 
			
		||||
        this.emit('closed');
 | 
			
		||||
 | 
			
		||||
        if (this._destroyOnClose)
 | 
			
		||||
@@ -160,12 +170,12 @@ var ModalDialog = class {
 | 
			
		||||
        if (this.state == State.CLOSED || this.state == State.CLOSING)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        this.state = State.CLOSING;
 | 
			
		||||
        this._setState(State.CLOSING);
 | 
			
		||||
        this.popModal(timestamp);
 | 
			
		||||
        this._savedKeyFocus = null;
 | 
			
		||||
 | 
			
		||||
        if (this._shouldFadeOut)
 | 
			
		||||
            Tweener.addTween(this._group,
 | 
			
		||||
            Tweener.addTween(this,
 | 
			
		||||
                             { opacity: 0,
 | 
			
		||||
                               time: OPEN_AND_CLOSE_TIME,
 | 
			
		||||
                               transition: 'easeOutQuad',
 | 
			
		||||
@@ -183,11 +193,11 @@ var ModalDialog = class {
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        let focus = global.stage.key_focus;
 | 
			
		||||
        if (focus && this._group.contains(focus))
 | 
			
		||||
        if (focus && this.contains(focus))
 | 
			
		||||
            this._savedKeyFocus = focus;
 | 
			
		||||
        else
 | 
			
		||||
            this._savedKeyFocus = null;
 | 
			
		||||
        Main.popModal(this._group, timestamp);
 | 
			
		||||
        Main.popModal(this, timestamp);
 | 
			
		||||
        this._hasModal = false;
 | 
			
		||||
 | 
			
		||||
        if (!this._shellReactive)
 | 
			
		||||
@@ -201,7 +211,7 @@ var ModalDialog = class {
 | 
			
		||||
        let params = { actionMode: this._actionMode };
 | 
			
		||||
        if (timestamp)
 | 
			
		||||
            params['timestamp'] = timestamp;
 | 
			
		||||
        if (!Main.pushModal(this._group, params))
 | 
			
		||||
        if (!Main.pushModal(this, params))
 | 
			
		||||
            return false;
 | 
			
		||||
 | 
			
		||||
        this._hasModal = true;
 | 
			
		||||
@@ -224,10 +234,10 @@ var ModalDialog = class {
 | 
			
		||||
    // can be dismissed by a close call.
 | 
			
		||||
    //
 | 
			
		||||
    // The main point of this method is to give some indication to the user
 | 
			
		||||
    // that the dialog reponse has been acknowledged but will take a few
 | 
			
		||||
    // that the dialog response has been acknowledged but will take a few
 | 
			
		||||
    // moments before being processed.
 | 
			
		||||
    // e.g., if a user clicked "Log Out" then the dialog should go away
 | 
			
		||||
    // imediately, but the lightbox should remain until the logout is
 | 
			
		||||
    // immediately, but the lightbox should remain until the logout is
 | 
			
		||||
    // complete.
 | 
			
		||||
    _fadeOutDialog(timestamp) {
 | 
			
		||||
        if (this.state == State.CLOSED || this.state == State.CLOSING)
 | 
			
		||||
@@ -242,9 +252,8 @@ var ModalDialog = class {
 | 
			
		||||
                           time:    FADE_OUT_DIALOG_TIME,
 | 
			
		||||
                           transition: 'easeOutQuad',
 | 
			
		||||
                           onComplete: () => {
 | 
			
		||||
                               this.state = State.FADED_OUT;
 | 
			
		||||
                               this._setState(State.FADED_OUT);
 | 
			
		||||
                           }
 | 
			
		||||
                         });
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
Signals.addSignalMethods(ModalDialog.prototype);
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
@@ -95,28 +95,6 @@ var OsdMonitorLabeler = class {
 | 
			
		||||
 | 
			
		||||
        this._reset();
 | 
			
		||||
 | 
			
		||||
        for (let id in params) {
 | 
			
		||||
            let monitor = this._monitorManager.get_monitor_for_output(id);
 | 
			
		||||
            if (monitor == -1)
 | 
			
		||||
                continue;
 | 
			
		||||
            this._monitorLabels.get(monitor).push(params[id].deep_unpack());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // In mirrored display setups, more than one physical outputs
 | 
			
		||||
        // might be showing the same logical monitor. In that case, we
 | 
			
		||||
        // join each output's labels on the same OSD widget.
 | 
			
		||||
        for (let [monitor, labels] of this._monitorLabels.entries()) {
 | 
			
		||||
            labels.sort();
 | 
			
		||||
            this._osdLabels.push(new OsdMonitorLabel(monitor, labels.join(' ')));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    show2(client, params) {
 | 
			
		||||
        if (!this._trackClient(client))
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        this._reset();
 | 
			
		||||
 | 
			
		||||
        for (let connector in params) {
 | 
			
		||||
            let monitor = this._monitorManager.get_monitor_for_connector(connector);
 | 
			
		||||
            if (monitor == -1)
 | 
			
		||||
 
 | 
			
		||||
@@ -122,7 +122,7 @@ var SlidingControl = class {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _getSlide() {
 | 
			
		||||
        throw new Error('getSlide() must be overridden');
 | 
			
		||||
        throw new GObject.NotImplementedError(`_getSlide in ${this.constructor.name}`);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _updateSlide() {
 | 
			
		||||
@@ -369,17 +369,15 @@ class DashSpacer extends St.Widget {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    vfunc_get_preferred_width(forHeight) {
 | 
			
		||||
        let box = this.get_allocation_box();
 | 
			
		||||
        let minWidth = super.vfunc_get_preferred_width(forHeight)[0];
 | 
			
		||||
        let natWidth = box.x2 - box.x1;
 | 
			
		||||
        return [minWidth, natWidth];
 | 
			
		||||
        if (this._bindConstraint)
 | 
			
		||||
            return this._bindConstraint.source.get_preferred_width(forHeight);
 | 
			
		||||
        return super.vfunc_get_preferred_width(forHeight);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    vfunc_get_preferred_height(forWidth) {
 | 
			
		||||
        let box = this.get_allocation_box();
 | 
			
		||||
        let minHeight = super.vfunc_get_preferred_height(forWidth)[0];
 | 
			
		||||
        let natHeight = box.y2 - box.y1;
 | 
			
		||||
        return [minHeight, natHeight];
 | 
			
		||||
        if (this._bindConstraint)
 | 
			
		||||
            return this._bindConstraint.source.get_preferred_height(forWidth);
 | 
			
		||||
        return super.vfunc_get_preferred_height(forWidth);
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -374,12 +374,12 @@ var PadDiagram = GObject.registerClass({
 | 
			
		||||
        svgData += this._cssString();
 | 
			
		||||
        svgData += this._wrappingSvgFooter();
 | 
			
		||||
 | 
			
		||||
        let handle = new Rsvg.Handle();
 | 
			
		||||
        handle.set_base_uri(GLib.path_get_dirname(this._imagePath));
 | 
			
		||||
        handle.write(svgData);
 | 
			
		||||
        handle.close();
 | 
			
		||||
        let istream = new Gio.MemoryInputStream();
 | 
			
		||||
        istream.add_bytes(new GLib.Bytes(svgData));
 | 
			
		||||
 | 
			
		||||
        return handle;
 | 
			
		||||
        return Rsvg.Handle.new_from_stream_sync(istream,
 | 
			
		||||
                                                Gio.File.new_for_path(this._imagePath),
 | 
			
		||||
                                                0, null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _updateDiagramScale() {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										108
									
								
								js/ui/panel.js
									
									
									
									
									
								
							
							
						
						
									
										108
									
								
								js/ui/panel.js
									
									
									
									
									
								
							@@ -1,6 +1,6 @@
 | 
			
		||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 | 
			
		||||
 | 
			
		||||
const { Atk, Clutter, Gio, GLib, GObject, Gtk, Meta, Shell, St } = imports.gi;
 | 
			
		||||
const { Atk, Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi;
 | 
			
		||||
const Cairo = imports.cairo;
 | 
			
		||||
const Mainloop = imports.mainloop;
 | 
			
		||||
 | 
			
		||||
@@ -75,6 +75,9 @@ class AppMenu extends PopupMenu.PopupMenu {
 | 
			
		||||
 | 
			
		||||
        this._windowsChangedId = 0;
 | 
			
		||||
 | 
			
		||||
        /* Translators: This is the heading of a list of open windows */
 | 
			
		||||
        this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem(_("Open Windows")));
 | 
			
		||||
 | 
			
		||||
        this._windowSection = new PopupMenu.PopupMenuSection();
 | 
			
		||||
        this.addMenuItem(this._windowSection);
 | 
			
		||||
 | 
			
		||||
@@ -105,6 +108,8 @@ class AppMenu extends PopupMenu.PopupMenu {
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
 | 
			
		||||
 | 
			
		||||
        this.addAction(_("Quit"), () => {
 | 
			
		||||
            this._app.request_quit();
 | 
			
		||||
        });
 | 
			
		||||
@@ -117,7 +122,7 @@ class AppMenu extends PopupMenu.PopupMenu {
 | 
			
		||||
 | 
			
		||||
    _updateDetailsVisibility() {
 | 
			
		||||
        let sw = this._appSystem.lookup_app('org.gnome.Software.desktop');
 | 
			
		||||
        this._detailsItem.actor.visible = (sw != null);
 | 
			
		||||
        this._detailsItem.visible = (sw != null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    isEmpty() {
 | 
			
		||||
@@ -155,7 +160,7 @@ class AppMenu extends PopupMenu.PopupMenu {
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        this._newWindowItem.actor.visible =
 | 
			
		||||
        this._newWindowItem.visible =
 | 
			
		||||
            app && app.can_open_new_window() && !actions.includes('new-window');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -172,13 +177,6 @@ class AppMenu extends PopupMenu.PopupMenu {
 | 
			
		||||
                Main.activateWindow(window, event.get_time());
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        // Add separator between windows of the current desktop and other windows.
 | 
			
		||||
        let workspaceManager = global.workspace_manager;
 | 
			
		||||
        let activeWorkspace = workspaceManager.get_active_workspace();
 | 
			
		||||
        let pos = windows.findIndex(w => w.get_workspace() != activeWorkspace);
 | 
			
		||||
        if (pos >= 0)
 | 
			
		||||
            this._windowSection.addMenuItem(new PopupMenu.PopupSeparatorMenuItem(), pos);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -196,21 +194,20 @@ var AppMenuButton = GObject.registerClass({
 | 
			
		||||
    _init(panel) {
 | 
			
		||||
        super._init(0.0, null, true);
 | 
			
		||||
 | 
			
		||||
        this.actor.accessible_role = Atk.Role.MENU;
 | 
			
		||||
        this.accessible_role = Atk.Role.MENU;
 | 
			
		||||
 | 
			
		||||
        this._startingApps = [];
 | 
			
		||||
 | 
			
		||||
        this._menuManager = panel.menuManager;
 | 
			
		||||
        this._gtkSettings = Gtk.Settings.get_default();
 | 
			
		||||
        this._targetApp = null;
 | 
			
		||||
        this._busyNotifyId = 0;
 | 
			
		||||
 | 
			
		||||
        let bin = new St.Bin({ name: 'appMenu' });
 | 
			
		||||
        bin.connect('style-changed', this._onStyleChanged.bind(this));
 | 
			
		||||
        this.actor.add_actor(bin);
 | 
			
		||||
        this.add_actor(bin);
 | 
			
		||||
 | 
			
		||||
        this.actor.bind_property("reactive", this.actor, "can-focus", 0);
 | 
			
		||||
        this.actor.reactive = false;
 | 
			
		||||
        this.bind_property("reactive", this, "can-focus", 0);
 | 
			
		||||
        this.reactive = false;
 | 
			
		||||
 | 
			
		||||
        this._container = new St.BoxLayout({ style_class: 'panel-status-menu-box' });
 | 
			
		||||
        bin.set_child(this._container);
 | 
			
		||||
@@ -266,10 +263,10 @@ var AppMenuButton = GObject.registerClass({
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        this._visible = true;
 | 
			
		||||
        this.actor.reactive = true;
 | 
			
		||||
        this.reactive = true;
 | 
			
		||||
        this.show();
 | 
			
		||||
        Tweener.removeTweens(this.actor);
 | 
			
		||||
        Tweener.addTween(this.actor,
 | 
			
		||||
        Tweener.removeTweens(this);
 | 
			
		||||
        Tweener.addTween(this,
 | 
			
		||||
                         { opacity: 255,
 | 
			
		||||
                           time: Overview.ANIMATION_TIME,
 | 
			
		||||
                           transition: 'easeOutQuad' });
 | 
			
		||||
@@ -280,9 +277,9 @@ var AppMenuButton = GObject.registerClass({
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        this._visible = false;
 | 
			
		||||
        this.actor.reactive = false;
 | 
			
		||||
        Tweener.removeTweens(this.actor);
 | 
			
		||||
        Tweener.addTween(this.actor,
 | 
			
		||||
        this.reactive = false;
 | 
			
		||||
        Tweener.removeTweens(this);
 | 
			
		||||
        Tweener.addTween(this,
 | 
			
		||||
                         { opacity: 0,
 | 
			
		||||
                           time: Overview.ANIMATION_TIME,
 | 
			
		||||
                           transition: 'easeOutQuad',
 | 
			
		||||
@@ -405,7 +402,7 @@ var AppMenuButton = GObject.registerClass({
 | 
			
		||||
            if (this._targetApp) {
 | 
			
		||||
                this._busyNotifyId = this._targetApp.connect('notify::busy', this._sync.bind(this));
 | 
			
		||||
                this._label.set_text(this._targetApp.get_name());
 | 
			
		||||
                this.actor.set_accessible_name(this._targetApp.get_name());
 | 
			
		||||
                this.set_accessible_name(this._targetApp.get_name());
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -423,7 +420,7 @@ var AppMenuButton = GObject.registerClass({
 | 
			
		||||
        else
 | 
			
		||||
            this.stopAnimation();
 | 
			
		||||
 | 
			
		||||
        this.actor.reactive = (visible && !isBusy);
 | 
			
		||||
        this.reactive = (visible && !isBusy);
 | 
			
		||||
 | 
			
		||||
        this._syncIcon();
 | 
			
		||||
        this.menu.setApp(this._targetApp);
 | 
			
		||||
@@ -462,28 +459,28 @@ var ActivitiesButton = GObject.registerClass(
 | 
			
		||||
class ActivitiesButton extends PanelMenu.Button {
 | 
			
		||||
    _init() {
 | 
			
		||||
        super._init(0.0, null, true);
 | 
			
		||||
        this.actor.accessible_role = Atk.Role.TOGGLE_BUTTON;
 | 
			
		||||
        this.accessible_role = Atk.Role.TOGGLE_BUTTON;
 | 
			
		||||
 | 
			
		||||
        this.actor.name = 'panelActivities';
 | 
			
		||||
        this.name = 'panelActivities';
 | 
			
		||||
 | 
			
		||||
        /* Translators: If there is no suitable word for "Activities"
 | 
			
		||||
           in your language, you can use the word for "Overview". */
 | 
			
		||||
        this._label = new St.Label({ text: _("Activities"),
 | 
			
		||||
                                     y_align: Clutter.ActorAlign.CENTER });
 | 
			
		||||
        this.actor.add_actor(this._label);
 | 
			
		||||
        this.add_actor(this._label);
 | 
			
		||||
 | 
			
		||||
        this.actor.label_actor = this._label;
 | 
			
		||||
        this.label_actor = this._label;
 | 
			
		||||
 | 
			
		||||
        this.actor.connect('captured-event', this._onCapturedEvent.bind(this));
 | 
			
		||||
        this.actor.connect_after('key-release-event', this._onKeyRelease.bind(this));
 | 
			
		||||
        this.connect('captured-event', this._onCapturedEvent.bind(this));
 | 
			
		||||
        this.connect_after('key-release-event', this._onKeyRelease.bind(this));
 | 
			
		||||
 | 
			
		||||
        Main.overview.connect('showing', () => {
 | 
			
		||||
            this.actor.add_style_pseudo_class('overview');
 | 
			
		||||
            this.actor.add_accessible_state (Atk.StateType.CHECKED);
 | 
			
		||||
            this.add_style_pseudo_class('overview');
 | 
			
		||||
            this.add_accessible_state (Atk.StateType.CHECKED);
 | 
			
		||||
        });
 | 
			
		||||
        Main.overview.connect('hiding', () => {
 | 
			
		||||
            this.actor.remove_style_pseudo_class('overview');
 | 
			
		||||
            this.actor.remove_accessible_state (Atk.StateType.CHECKED);
 | 
			
		||||
            this.remove_style_pseudo_class('overview');
 | 
			
		||||
            this.remove_accessible_state (Atk.StateType.CHECKED);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        this._xdndTimeOut = 0;
 | 
			
		||||
@@ -536,7 +533,7 @@ class ActivitiesButton extends PanelMenu.Button {
 | 
			
		||||
        let [x, y, mask] = global.get_pointer();
 | 
			
		||||
        let pickedActor = global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, x, y);
 | 
			
		||||
 | 
			
		||||
        if (pickedActor == this.actor && Main.overview.shouldToggleByCornerOrButton())
 | 
			
		||||
        if (pickedActor == this && Main.overview.shouldToggleByCornerOrButton())
 | 
			
		||||
            Main.overview.toggle();
 | 
			
		||||
 | 
			
		||||
        Mainloop.source_remove(this._xdndTimeOut);
 | 
			
		||||
@@ -750,7 +747,7 @@ class AggregateMenu extends PanelMenu.Button {
 | 
			
		||||
        this.menu.box.set_layout_manager(menuLayout);
 | 
			
		||||
 | 
			
		||||
        this._indicators = new St.BoxLayout({ style_class: 'panel-status-indicators-box' });
 | 
			
		||||
        this.actor.add_child(this._indicators);
 | 
			
		||||
        this.add_child(this._indicators);
 | 
			
		||||
 | 
			
		||||
        if (Config.HAVE_NETWORKMANAGER) {
 | 
			
		||||
            this._network = new imports.ui.status.network.NMApplet();
 | 
			
		||||
@@ -828,9 +825,6 @@ class Panel extends St.Widget {
 | 
			
		||||
        super._init({ name: 'panel',
 | 
			
		||||
                      reactive: true });
 | 
			
		||||
 | 
			
		||||
        // For compatibility with extensions that still use the
 | 
			
		||||
        // this.actor field
 | 
			
		||||
        this.actor = this;
 | 
			
		||||
        this.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS);
 | 
			
		||||
 | 
			
		||||
        this._sessionStyle = null;
 | 
			
		||||
@@ -883,7 +877,7 @@ class Panel extends St.Widget {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    vfunc_allocate(box, flags) {
 | 
			
		||||
        super.vfunc_allocate(box, flags);
 | 
			
		||||
        this.set_allocation(box, flags);
 | 
			
		||||
 | 
			
		||||
        let allocWidth = box.x2 - box.x1;
 | 
			
		||||
        let allocHeight = box.y2 - box.y1;
 | 
			
		||||
@@ -977,22 +971,11 @@ class Panel extends St.Widget {
 | 
			
		||||
        if (isPress && button != 1)
 | 
			
		||||
            return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
 | 
			
		||||
        let focusWindow = global.display.focus_window;
 | 
			
		||||
        if (!focusWindow)
 | 
			
		||||
            return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
 | 
			
		||||
        let dragWindow = focusWindow.is_attached_dialog() ? focusWindow.get_transient_for()
 | 
			
		||||
                                                          : focusWindow;
 | 
			
		||||
        if (!dragWindow)
 | 
			
		||||
            return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
 | 
			
		||||
        let rect = dragWindow.get_frame_rect();
 | 
			
		||||
        let [stageX, stageY] = event.get_coords();
 | 
			
		||||
 | 
			
		||||
        let allowDrag = dragWindow.maximized_vertically &&
 | 
			
		||||
                        stageX > rect.x && stageX < rect.x + rect.width;
 | 
			
		||||
        let dragWindow = this._getDraggableWindowForPosition(stageX);
 | 
			
		||||
 | 
			
		||||
        if (!allowDrag)
 | 
			
		||||
        if (!dragWindow)
 | 
			
		||||
            return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
 | 
			
		||||
        global.display.begin_grab_op(dragWindow,
 | 
			
		||||
@@ -1022,7 +1005,7 @@ class Panel extends St.Widget {
 | 
			
		||||
            return; // menu not supported by current session mode
 | 
			
		||||
 | 
			
		||||
        let menu = indicator.menu;
 | 
			
		||||
        if (!indicator.actor.reactive)
 | 
			
		||||
        if (!indicator.reactive)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        menu.toggle();
 | 
			
		||||
@@ -1044,7 +1027,7 @@ class Panel extends St.Widget {
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        let menu = indicator.menu;
 | 
			
		||||
        if (!indicator.actor.reactive)
 | 
			
		||||
        if (!indicator.reactive)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        menu.close();
 | 
			
		||||
@@ -1202,4 +1185,21 @@ class Panel extends St.Widget {
 | 
			
		||||
                    Main.messageTray.bannerBlocked = isOpen;
 | 
			
		||||
            });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _getDraggableWindowForPosition(stageX) {
 | 
			
		||||
        let workspaceManager = global.workspace_manager;
 | 
			
		||||
        let workspace = workspaceManager.get_active_workspace()
 | 
			
		||||
        let allWindowsByStacking = global.display.sort_windows_by_stacking(
 | 
			
		||||
            workspace.list_windows()
 | 
			
		||||
        ).reverse();
 | 
			
		||||
 | 
			
		||||
        return allWindowsByStacking.find(metaWindow => {
 | 
			
		||||
            let rect = metaWindow.get_frame_rect();
 | 
			
		||||
            return metaWindow.is_on_primary_monitor() &&
 | 
			
		||||
                   metaWindow.showing_on_its_workspace() &&
 | 
			
		||||
                   metaWindow.get_window_type() != Meta.WindowType.DESKTOP &&
 | 
			
		||||
                   metaWindow.maximized_vertically &&
 | 
			
		||||
                   stageX > rect.x && stageX < rect.x + rect.width
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
@@ -14,12 +14,11 @@ class ButtonBox extends St.Widget {
 | 
			
		||||
 | 
			
		||||
        super._init(params);
 | 
			
		||||
 | 
			
		||||
        this.actor = this;
 | 
			
		||||
        this._delegate = this;
 | 
			
		||||
 | 
			
		||||
        this.container = new St.Bin({ y_fill: true,
 | 
			
		||||
                                      x_fill: true,
 | 
			
		||||
                                      child: this.actor });
 | 
			
		||||
                                      child: this });
 | 
			
		||||
 | 
			
		||||
        this.connect('style-changed', this._onStyleChanged.bind(this));
 | 
			
		||||
        this.connect('destroy', this._onDestroy.bind(this));
 | 
			
		||||
@@ -105,9 +104,9 @@ var Button = GObject.registerClass({
 | 
			
		||||
        this.connect('notify::visible', this._onVisibilityChanged.bind(this));
 | 
			
		||||
 | 
			
		||||
        if (dontCreateMenu)
 | 
			
		||||
            this.menu = new PopupMenu.PopupDummyMenu(this.actor);
 | 
			
		||||
            this.menu = new PopupMenu.PopupDummyMenu(this);
 | 
			
		||||
        else
 | 
			
		||||
            this.setMenu(new PopupMenu.PopupMenu(this.actor, menuAlignment, St.Side.TOP, 0));
 | 
			
		||||
            this.setMenu(new PopupMenu.PopupMenu(this, menuAlignment, St.Side.TOP, 0));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    setSensitive(sensitive) {
 | 
			
		||||
@@ -145,7 +144,7 @@ var Button = GObject.registerClass({
 | 
			
		||||
        if (!this.menu)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        if (!this.actor.visible)
 | 
			
		||||
        if (!this.visible)
 | 
			
		||||
            this.menu.close();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -155,10 +154,10 @@ var Button = GObject.registerClass({
 | 
			
		||||
 | 
			
		||||
        let symbol = event.get_key_symbol();
 | 
			
		||||
        if (symbol == Clutter.KEY_Left || symbol == Clutter.KEY_Right) {
 | 
			
		||||
            let group = global.focus_manager.get_group(this.actor);
 | 
			
		||||
            let group = global.focus_manager.get_group(this);
 | 
			
		||||
            if (group) {
 | 
			
		||||
                let direction = (symbol == Clutter.KEY_Left) ? St.DirectionType.LEFT : St.DirectionType.RIGHT;
 | 
			
		||||
                group.navigate_focus(this.actor, direction, false);
 | 
			
		||||
                group.navigate_focus(this, direction, false);
 | 
			
		||||
                return Clutter.EVENT_STOP;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@@ -167,9 +166,9 @@ var Button = GObject.registerClass({
 | 
			
		||||
 | 
			
		||||
    _onOpenStateChanged(menu, open) {
 | 
			
		||||
        if (open)
 | 
			
		||||
            this.actor.add_style_pseudo_class('active');
 | 
			
		||||
            this.add_style_pseudo_class('active');
 | 
			
		||||
        else
 | 
			
		||||
            this.actor.remove_style_pseudo_class('active');
 | 
			
		||||
            this.remove_style_pseudo_class('active');
 | 
			
		||||
 | 
			
		||||
        // Setting the max-height won't do any good if the minimum height of the
 | 
			
		||||
        // menu is higher then the screen; it's useful if part of the menu is
 | 
			
		||||
 
 | 
			
		||||
@@ -51,49 +51,64 @@ function arrowIcon(side) {
 | 
			
		||||
    return arrow;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var PopupBaseMenuItem = class {
 | 
			
		||||
    constructor(params) {
 | 
			
		||||
var PopupBaseMenuItem = GObject.registerClass({
 | 
			
		||||
    Properties: {
 | 
			
		||||
        'active': GObject.ParamSpec.boolean('active', 'active', 'active',
 | 
			
		||||
                                            GObject.ParamFlags.READWRITE,
 | 
			
		||||
                                            GObject.TYPE_BOOLEAN,
 | 
			
		||||
                                            false),
 | 
			
		||||
        'sensitive': GObject.ParamSpec.boolean('sensitive', 'sensitive', 'sensitive',
 | 
			
		||||
                                               GObject.ParamFlags.READWRITE,
 | 
			
		||||
                                               GObject.TYPE_BOOLEAN,
 | 
			
		||||
                                               true),
 | 
			
		||||
    },
 | 
			
		||||
    Signals: {
 | 
			
		||||
        'activate': { param_types: [Clutter.Event.$gtype] },
 | 
			
		||||
    }
 | 
			
		||||
}, class PopupBaseMenuItem extends St.BoxLayout {
 | 
			
		||||
    _init(params) {
 | 
			
		||||
        params = Params.parse (params, { reactive: true,
 | 
			
		||||
                                         activate: true,
 | 
			
		||||
                                         hover: true,
 | 
			
		||||
                                         style_class: null,
 | 
			
		||||
                                         can_focus: true
 | 
			
		||||
                                       });
 | 
			
		||||
 | 
			
		||||
        this.actor = new St.BoxLayout({ style_class: 'popup-menu-item',
 | 
			
		||||
                                        reactive: params.reactive,
 | 
			
		||||
                                        track_hover: params.reactive,
 | 
			
		||||
                                        can_focus: params.can_focus,
 | 
			
		||||
                                        accessible_role: Atk.Role.MENU_ITEM });
 | 
			
		||||
        this.actor._delegate = this;
 | 
			
		||||
        super._init({ style_class: 'popup-menu-item',
 | 
			
		||||
                      reactive: params.reactive,
 | 
			
		||||
                      track_hover: params.reactive,
 | 
			
		||||
                      can_focus: params.can_focus,
 | 
			
		||||
                      accessible_role: Atk.Role.MENU_ITEM });
 | 
			
		||||
        this._delegate = this;
 | 
			
		||||
 | 
			
		||||
        this._ornament = Ornament.NONE;
 | 
			
		||||
        this._ornamentLabel = new St.Label({ style_class: 'popup-menu-ornament' });
 | 
			
		||||
        this.actor.add(this._ornamentLabel);
 | 
			
		||||
        this.add(this._ornamentLabel);
 | 
			
		||||
 | 
			
		||||
        this._parent = null;
 | 
			
		||||
        this.active = false;
 | 
			
		||||
        this._active = false;
 | 
			
		||||
        this._activatable = params.reactive && params.activate;
 | 
			
		||||
        this._sensitive = true;
 | 
			
		||||
 | 
			
		||||
        if (!this._activatable)
 | 
			
		||||
            this.actor.add_style_class_name('popup-inactive-menu-item');
 | 
			
		||||
            this.add_style_class_name('popup-inactive-menu-item');
 | 
			
		||||
 | 
			
		||||
        if (params.style_class)
 | 
			
		||||
            this.actor.add_style_class_name(params.style_class);
 | 
			
		||||
            this.add_style_class_name(params.style_class);
 | 
			
		||||
 | 
			
		||||
        if (this._activatable) {
 | 
			
		||||
            this.actor.connect('button-press-event', this._onButtonPressEvent.bind(this));
 | 
			
		||||
            this.actor.connect('button-release-event', this._onButtonReleaseEvent.bind(this));
 | 
			
		||||
            this.actor.connect('touch-event', this._onTouchEvent.bind(this));
 | 
			
		||||
            this.actor.connect('key-press-event', this._onKeyPressEvent.bind(this));
 | 
			
		||||
            this.connect('button-press-event', this._onButtonPressEvent.bind(this));
 | 
			
		||||
            this.connect('button-release-event', this._onButtonReleaseEvent.bind(this));
 | 
			
		||||
            this.connect('touch-event', this._onTouchEvent.bind(this));
 | 
			
		||||
            this.connect('key-press-event', this._onKeyPressEvent.bind(this));
 | 
			
		||||
        }
 | 
			
		||||
        if (params.reactive && params.hover)
 | 
			
		||||
            this.actor.connect('notify::hover', this._onHoverChanged.bind(this));
 | 
			
		||||
            this.bind_property('hover', this, 'active', GObject.BindingFlags.SYNC_CREATE);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
        this.actor.connect('key-focus-in', this._onKeyFocusIn.bind(this));
 | 
			
		||||
        this.actor.connect('key-focus-out', this._onKeyFocusOut.bind(this));
 | 
			
		||||
        this.actor.connect('destroy', this._onDestroy.bind(this));
 | 
			
		||||
    get actor() {
 | 
			
		||||
        /* This is kept for compatibility with current implementation, and we
 | 
			
		||||
           don't want to warn here yet since PopupMenu depends on this */
 | 
			
		||||
        return this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _getTopMenu() {
 | 
			
		||||
@@ -109,24 +124,24 @@ var PopupBaseMenuItem = class {
 | 
			
		||||
 | 
			
		||||
    _onButtonPressEvent(actor, event) {
 | 
			
		||||
        // This is the CSS active state
 | 
			
		||||
        this.actor.add_style_pseudo_class ('active');
 | 
			
		||||
        this.add_style_pseudo_class('active');
 | 
			
		||||
        return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _onButtonReleaseEvent(actor, event) {
 | 
			
		||||
        this.actor.remove_style_pseudo_class ('active');
 | 
			
		||||
        this.remove_style_pseudo_class('active');
 | 
			
		||||
        this.activate(event);
 | 
			
		||||
        return Clutter.EVENT_STOP;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _onTouchEvent(actor, event) {
 | 
			
		||||
        if (event.type() == Clutter.EventType.TOUCH_END) {
 | 
			
		||||
            this.actor.remove_style_pseudo_class ('active');
 | 
			
		||||
            this.remove_style_pseudo_class('active');
 | 
			
		||||
            this.activate(event);
 | 
			
		||||
            return Clutter.EVENT_STOP;
 | 
			
		||||
        } else if (event.type() == Clutter.EventType.TOUCH_BEGIN) {
 | 
			
		||||
            // This is the CSS active state
 | 
			
		||||
            this.actor.add_style_pseudo_class ('active');
 | 
			
		||||
            this.add_style_pseudo_class('active');
 | 
			
		||||
        }
 | 
			
		||||
        return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
    }
 | 
			
		||||
@@ -151,54 +166,56 @@ var PopupBaseMenuItem = class {
 | 
			
		||||
        return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _onKeyFocusIn(actor) {
 | 
			
		||||
        this.setActive(true);
 | 
			
		||||
    vfunc_key_focus_in() {
 | 
			
		||||
        super.vfunc_key_focus_in();
 | 
			
		||||
        this.active = true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _onKeyFocusOut(actor) {
 | 
			
		||||
        this.setActive(false);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _onHoverChanged(actor) {
 | 
			
		||||
        this.setActive(actor.hover);
 | 
			
		||||
    vfunc_key_focus_out() {
 | 
			
		||||
        super.vfunc_key_focus_out();
 | 
			
		||||
        this.active = false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    activate(event) {
 | 
			
		||||
        this.emit('activate', event);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    setActive(active) {
 | 
			
		||||
    get active() {
 | 
			
		||||
        return this._active;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    set active(active) {
 | 
			
		||||
        let activeChanged = active != this.active;
 | 
			
		||||
        if (activeChanged) {
 | 
			
		||||
            this.active = active;
 | 
			
		||||
            this._active = active;
 | 
			
		||||
            if (active) {
 | 
			
		||||
                this.actor.add_style_class_name('selected');
 | 
			
		||||
                if (this.actor.can_focus)
 | 
			
		||||
                    this.actor.grab_key_focus();
 | 
			
		||||
                this.add_style_class_name('selected');
 | 
			
		||||
                if (this.can_focus)
 | 
			
		||||
                    this.grab_key_focus();
 | 
			
		||||
            } else {
 | 
			
		||||
                this.actor.remove_style_class_name('selected');
 | 
			
		||||
                this.remove_style_class_name('selected');
 | 
			
		||||
                // Remove the CSS active state if the user press the button and
 | 
			
		||||
                // while holding moves to another menu item, so we don't paint all items.
 | 
			
		||||
                // The correct behaviour would be to set the new item with the CSS
 | 
			
		||||
                // active state as well, but button-press-event is not trigered,
 | 
			
		||||
                // so we should track it in our own, which would involve some work
 | 
			
		||||
                // in the container
 | 
			
		||||
                this.actor.remove_style_pseudo_class ('active');
 | 
			
		||||
                this.remove_style_pseudo_class('active');
 | 
			
		||||
            }
 | 
			
		||||
            this.emit('active-changed', active);
 | 
			
		||||
            this.notify('active');
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    syncSensitive() {
 | 
			
		||||
        let sensitive = this.getSensitive();
 | 
			
		||||
        this.actor.reactive = sensitive;
 | 
			
		||||
        this.actor.can_focus = sensitive;
 | 
			
		||||
        this.emit('sensitive-changed');
 | 
			
		||||
        let sensitive = this.sensitive;
 | 
			
		||||
        this.reactive = sensitive;
 | 
			
		||||
        this.can_focus = sensitive;
 | 
			
		||||
        this.notify('sensitive');
 | 
			
		||||
        return sensitive;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    getSensitive() {
 | 
			
		||||
        let parentSensitive = this._parent ? this._parent.getSensitive() : true;
 | 
			
		||||
        let parentSensitive = this._parent ? this._parent.sensitive : true;
 | 
			
		||||
        return this._activatable && this._sensitive && parentSensitive;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -210,12 +227,12 @@ var PopupBaseMenuItem = class {
 | 
			
		||||
        this.syncSensitive();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    destroy() {
 | 
			
		||||
        this.actor.destroy();
 | 
			
		||||
    get sensitive() {
 | 
			
		||||
        return this.getSensitive();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _onDestroy() {
 | 
			
		||||
        this.emit('destroy');
 | 
			
		||||
    set sensitive(sensitive) {
 | 
			
		||||
        this.setSensitive(sensitive);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    setOrnament(ornament) {
 | 
			
		||||
@@ -226,36 +243,38 @@ var PopupBaseMenuItem = class {
 | 
			
		||||
 | 
			
		||||
        if (ornament == Ornament.DOT) {
 | 
			
		||||
            this._ornamentLabel.text = '\u2022';
 | 
			
		||||
            this.actor.add_accessible_state(Atk.StateType.CHECKED);
 | 
			
		||||
            this.add_accessible_state(Atk.StateType.CHECKED);
 | 
			
		||||
        } else if (ornament == Ornament.CHECK) {
 | 
			
		||||
            this._ornamentLabel.text = '\u2713';
 | 
			
		||||
            this.actor.add_accessible_state(Atk.StateType.CHECKED);
 | 
			
		||||
            this.add_accessible_state(Atk.StateType.CHECKED);
 | 
			
		||||
        } else if (ornament == Ornament.NONE) {
 | 
			
		||||
            this._ornamentLabel.text = '';
 | 
			
		||||
            this.actor.remove_accessible_state(Atk.StateType.CHECKED);
 | 
			
		||||
            this.remove_accessible_state(Atk.StateType.CHECKED);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
Signals.addSignalMethods(PopupBaseMenuItem.prototype);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
var PopupMenuItem = class extends PopupBaseMenuItem {
 | 
			
		||||
    constructor(text, params) {
 | 
			
		||||
        super(params);
 | 
			
		||||
var PopupMenuItem = GObject.registerClass(
 | 
			
		||||
class PopupMenuItem extends PopupBaseMenuItem {
 | 
			
		||||
    _init(text, params) {
 | 
			
		||||
        super._init(params);
 | 
			
		||||
 | 
			
		||||
        this.label = new St.Label({ text: text });
 | 
			
		||||
        this.actor.add_child(this.label);
 | 
			
		||||
        this.actor.label_actor = this.label
 | 
			
		||||
        this.add_child(this.label);
 | 
			
		||||
        this.label_actor = this.label
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
var PopupSeparatorMenuItem = class extends PopupBaseMenuItem {
 | 
			
		||||
    constructor(text) {
 | 
			
		||||
        super({ reactive: false,
 | 
			
		||||
                can_focus: false});
 | 
			
		||||
 | 
			
		||||
var PopupSeparatorMenuItem = GObject.registerClass(
 | 
			
		||||
class PopupSeparatorMenuItem extends PopupBaseMenuItem {
 | 
			
		||||
    _init(text) {
 | 
			
		||||
        super._init({ reactive: false,
 | 
			
		||||
                      can_focus: false });
 | 
			
		||||
 | 
			
		||||
        this.label = new St.Label({ text: text || '' });
 | 
			
		||||
        this.actor.add(this.label);
 | 
			
		||||
        this.actor.label_actor = this.label;
 | 
			
		||||
        this.add(this.label);
 | 
			
		||||
        this.label_actor = this.label;
 | 
			
		||||
 | 
			
		||||
        this.label.connect('notify::text',
 | 
			
		||||
                           this._syncVisibility.bind(this));
 | 
			
		||||
@@ -264,81 +283,78 @@ var PopupSeparatorMenuItem = class extends PopupBaseMenuItem {
 | 
			
		||||
        this._separator = new St.Widget({ style_class: 'popup-separator-menu-item',
 | 
			
		||||
                                          y_expand: true,
 | 
			
		||||
                                          y_align: Clutter.ActorAlign.CENTER });
 | 
			
		||||
        this.actor.add(this._separator, { expand: true });
 | 
			
		||||
        this.add(this._separator, { expand: true });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _syncVisibility() {
 | 
			
		||||
        this.label.visible = this.label.text != '';
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
var Switch = class {
 | 
			
		||||
    constructor(state) {
 | 
			
		||||
        this.actor = new St.Bin({ style_class: 'toggle-switch',
 | 
			
		||||
                                  accessible_role: Atk.Role.CHECK_BOX,
 | 
			
		||||
                                  can_focus: true });
 | 
			
		||||
        // Translators: this MUST be either "toggle-switch-us"
 | 
			
		||||
        // (for toggle switches containing the English words
 | 
			
		||||
        // "ON" and "OFF") or "toggle-switch-intl" (for toggle
 | 
			
		||||
        // switches containing "◯" and "|"). Other values will
 | 
			
		||||
        // simply result in invisible toggle switches.
 | 
			
		||||
        this.actor.add_style_class_name(_("toggle-switch-us"));
 | 
			
		||||
var Switch = GObject.registerClass(
 | 
			
		||||
class Switch extends St.Bin {
 | 
			
		||||
    _init(state) {
 | 
			
		||||
        super._init({ style_class: 'toggle-switch',
 | 
			
		||||
                      accessible_role: Atk.Role.CHECK_BOX,
 | 
			
		||||
                      can_focus: true });
 | 
			
		||||
        this.setToggleState(state);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    setToggleState(state) {
 | 
			
		||||
        if (state)
 | 
			
		||||
            this.actor.add_style_pseudo_class('checked');
 | 
			
		||||
            this.add_style_pseudo_class('checked');
 | 
			
		||||
        else
 | 
			
		||||
            this.actor.remove_style_pseudo_class('checked');
 | 
			
		||||
            this.remove_style_pseudo_class('checked');
 | 
			
		||||
        this.state = state;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    toggle() {
 | 
			
		||||
        this.setToggleState(!this.state);
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
var PopupSwitchMenuItem = class extends PopupBaseMenuItem {
 | 
			
		||||
    constructor(text, active, params) {
 | 
			
		||||
        super(params);
 | 
			
		||||
var PopupSwitchMenuItem = GObject.registerClass({
 | 
			
		||||
    Signals: { 'toggled': { param_types: [GObject.TYPE_BOOLEAN] }, },
 | 
			
		||||
},
 | 
			
		||||
class PopupSwitchMenuItem extends PopupBaseMenuItem {
 | 
			
		||||
    _init(text, active, params) {
 | 
			
		||||
        super._init(params);
 | 
			
		||||
 | 
			
		||||
        this.label = new St.Label({ text: text });
 | 
			
		||||
        this._switch = new Switch(active);
 | 
			
		||||
 | 
			
		||||
        this.actor.accessible_role = Atk.Role.CHECK_MENU_ITEM;
 | 
			
		||||
        this.accessible_role = Atk.Role.CHECK_MENU_ITEM;
 | 
			
		||||
        this.checkAccessibleState();
 | 
			
		||||
        this.actor.label_actor = this.label;
 | 
			
		||||
        this.label_actor = this.label;
 | 
			
		||||
 | 
			
		||||
        this.actor.add_child(this.label);
 | 
			
		||||
        this.add_child(this.label);
 | 
			
		||||
 | 
			
		||||
        this._statusBin = new St.Bin({ x_align: St.Align.END });
 | 
			
		||||
        this.actor.add(this._statusBin, { expand: true, x_align: St.Align.END });
 | 
			
		||||
        this.add(this._statusBin, { expand: true, x_align: St.Align.END });
 | 
			
		||||
 | 
			
		||||
        this._statusLabel = new St.Label({ text: '',
 | 
			
		||||
                                           style_class: 'popup-status-menu-item'
 | 
			
		||||
                                         });
 | 
			
		||||
        this._statusBin.child = this._switch.actor;
 | 
			
		||||
        this._statusBin.child = this._switch;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    setStatus(text) {
 | 
			
		||||
        if (text != null) {
 | 
			
		||||
            this._statusLabel.text = text;
 | 
			
		||||
            this._statusBin.child = this._statusLabel;
 | 
			
		||||
            this.actor.reactive = false;
 | 
			
		||||
            this.actor.accessible_role = Atk.Role.MENU_ITEM;
 | 
			
		||||
            this.reactive = false;
 | 
			
		||||
            this.accessible_role = Atk.Role.MENU_ITEM;
 | 
			
		||||
        } else {
 | 
			
		||||
            this._statusBin.child = this._switch.actor;
 | 
			
		||||
            this.actor.reactive = true;
 | 
			
		||||
            this.actor.accessible_role = Atk.Role.CHECK_MENU_ITEM;
 | 
			
		||||
            this._statusBin.child = this._switch;
 | 
			
		||||
            this.reactive = true;
 | 
			
		||||
            this.accessible_role = Atk.Role.CHECK_MENU_ITEM;
 | 
			
		||||
        }
 | 
			
		||||
        this.checkAccessibleState();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    activate(event) {
 | 
			
		||||
        if (this._switch.actor.mapped) {
 | 
			
		||||
        if (this._switch.mapped)
 | 
			
		||||
            this.toggle();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // we allow pressing space to toggle the switch
 | 
			
		||||
        // without closing the menu
 | 
			
		||||
@@ -365,29 +381,30 @@ var PopupSwitchMenuItem = class extends PopupBaseMenuItem {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    checkAccessibleState() {
 | 
			
		||||
        switch (this.actor.accessible_role) {
 | 
			
		||||
        switch (this.accessible_role) {
 | 
			
		||||
        case Atk.Role.CHECK_MENU_ITEM:
 | 
			
		||||
            if (this._switch.state)
 | 
			
		||||
                this.actor.add_accessible_state (Atk.StateType.CHECKED);
 | 
			
		||||
                this.add_accessible_state(Atk.StateType.CHECKED);
 | 
			
		||||
            else
 | 
			
		||||
                this.actor.remove_accessible_state (Atk.StateType.CHECKED);
 | 
			
		||||
                this.remove_accessible_state(Atk.StateType.CHECKED);
 | 
			
		||||
            break;
 | 
			
		||||
        default:
 | 
			
		||||
            this.actor.remove_accessible_state (Atk.StateType.CHECKED);
 | 
			
		||||
            this.remove_accessible_state(Atk.StateType.CHECKED);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
var PopupImageMenuItem = class extends PopupBaseMenuItem {
 | 
			
		||||
    constructor(text, icon, params) {
 | 
			
		||||
        super(params);
 | 
			
		||||
var PopupImageMenuItem = GObject.registerClass(
 | 
			
		||||
class PopupImageMenuItem extends PopupBaseMenuItem {
 | 
			
		||||
    _init(text, icon, params) {
 | 
			
		||||
        super._init(params);
 | 
			
		||||
 | 
			
		||||
        this._icon = new St.Icon({ style_class: 'popup-menu-icon',
 | 
			
		||||
                                   x_align: Clutter.ActorAlign.END });
 | 
			
		||||
        this.actor.add_child(this._icon);
 | 
			
		||||
        this.add_child(this._icon);
 | 
			
		||||
        this.label = new St.Label({ text: text });
 | 
			
		||||
        this.actor.add_child(this.label);
 | 
			
		||||
        this.actor.label_actor = this.label;
 | 
			
		||||
        this.add_child(this.label);
 | 
			
		||||
        this.label_actor = this.label;
 | 
			
		||||
 | 
			
		||||
        this.setIcon(icon);
 | 
			
		||||
    }
 | 
			
		||||
@@ -399,12 +416,12 @@ var PopupImageMenuItem = class extends PopupBaseMenuItem {
 | 
			
		||||
        else
 | 
			
		||||
            this._icon.icon_name = icon;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
var PopupMenuBase = class {
 | 
			
		||||
    constructor(sourceActor, styleClass) {
 | 
			
		||||
        if (new.target === PopupMenuBase)
 | 
			
		||||
            throw new TypeError('Cannot instantiate abstract class ' + new.target.name);
 | 
			
		||||
        if (this.constructor === PopupMenuBase)
 | 
			
		||||
            throw new TypeError(`Cannot instantiate abstract class ${this.constructor.name}`);
 | 
			
		||||
 | 
			
		||||
        this.sourceActor = sourceActor;
 | 
			
		||||
        this._parent = null;
 | 
			
		||||
@@ -443,13 +460,21 @@ var PopupMenuBase = class {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    getSensitive() {
 | 
			
		||||
        let parentSensitive = this._parent ? this._parent.getSensitive() : true;
 | 
			
		||||
        let parentSensitive = this._parent ? this._parent.sensitive : true;
 | 
			
		||||
        return this._sensitive && parentSensitive;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    setSensitive(sensitive) {
 | 
			
		||||
        this._sensitive = sensitive;
 | 
			
		||||
        this.emit('sensitive-changed');
 | 
			
		||||
        this.emit('notify::sensitive');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get sensitive() {
 | 
			
		||||
        return this.getSensitive();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    set sensitive(sensitive) {
 | 
			
		||||
        this.setSensitive(sensitive);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _sessionUpdated() {
 | 
			
		||||
@@ -485,7 +510,7 @@ var PopupMenuBase = class {
 | 
			
		||||
            app.activate();
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        menuItem.actor.visible = Main.sessionMode.allowSettings;
 | 
			
		||||
        menuItem.visible = Main.sessionMode.allowSettings;
 | 
			
		||||
        this._settingsActions[desktopFile] = menuItem;
 | 
			
		||||
 | 
			
		||||
        return menuItem;
 | 
			
		||||
@@ -494,7 +519,7 @@ var PopupMenuBase = class {
 | 
			
		||||
    _setSettingsVisibility(visible) {
 | 
			
		||||
        for (let id in this._settingsActions) {
 | 
			
		||||
            let item = this._settingsActions[id];
 | 
			
		||||
            item.actor.visible = visible;
 | 
			
		||||
            item.visible = visible;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -517,16 +542,17 @@ var PopupMenuBase = class {
 | 
			
		||||
 | 
			
		||||
    _subMenuActiveChanged(submenu, submenuItem) {
 | 
			
		||||
        if (this._activeMenuItem && this._activeMenuItem != submenuItem)
 | 
			
		||||
            this._activeMenuItem.setActive(false);
 | 
			
		||||
            this._activeMenuItem.active = false;
 | 
			
		||||
        this._activeMenuItem = submenuItem;
 | 
			
		||||
        this.emit('active-changed', submenuItem);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _connectItemSignals(menuItem) {
 | 
			
		||||
        menuItem._activeChangeId = menuItem.connect('active-changed', (menuItem, active) => {
 | 
			
		||||
        menuItem._activeChangeId = menuItem.connect('notify::active', (menuItem) => {
 | 
			
		||||
            let active = menuItem.active;
 | 
			
		||||
            if (active && this._activeMenuItem != menuItem) {
 | 
			
		||||
                if (this._activeMenuItem)
 | 
			
		||||
                    this._activeMenuItem.setActive(false);
 | 
			
		||||
                    this._activeMenuItem.active = false;
 | 
			
		||||
                this._activeMenuItem = menuItem;
 | 
			
		||||
                this.emit('active-changed', menuItem);
 | 
			
		||||
            } else if (!active && this._activeMenuItem == menuItem) {
 | 
			
		||||
@@ -534,8 +560,8 @@ var PopupMenuBase = class {
 | 
			
		||||
                this.emit('active-changed', null);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        menuItem._sensitiveChangeId = menuItem.connect('sensitive-changed', () => {
 | 
			
		||||
            let sensitive = menuItem.getSensitive();
 | 
			
		||||
        menuItem._sensitiveChangeId = menuItem.connect('notify::sensitive', () => {
 | 
			
		||||
            let sensitive = menuItem.sensitive;
 | 
			
		||||
            if (!sensitive && this._activeMenuItem == menuItem) {
 | 
			
		||||
                if (!this.actor.navigate_focus(menuItem.actor,
 | 
			
		||||
                                               St.DirectionType.TAB_FORWARD,
 | 
			
		||||
@@ -551,7 +577,7 @@ var PopupMenuBase = class {
 | 
			
		||||
            this.itemActivated(BoxPointer.PopupAnimation.FULL);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        menuItem._parentSensitiveChangeId = this.connect('sensitive-changed', () => {
 | 
			
		||||
        menuItem._parentSensitiveChangeId = this.connect('notify::sensitive', () => {
 | 
			
		||||
            menuItem.syncSensitive();
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
@@ -603,7 +629,7 @@ var PopupMenuBase = class {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        menuItem.actor.show();
 | 
			
		||||
        menuItem.show();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    moveMenuItem(menuItem, position) {
 | 
			
		||||
@@ -650,8 +676,8 @@ var PopupMenuBase = class {
 | 
			
		||||
            let parentClosingId = this.connect('menu-closed', () => {
 | 
			
		||||
                menuItem.emit('menu-closed');
 | 
			
		||||
            });
 | 
			
		||||
            let subMenuSensitiveChangedId = this.connect('sensitive-changed', () => {
 | 
			
		||||
                menuItem.emit('sensitive-changed');
 | 
			
		||||
            let subMenuSensitiveChangedId = this.connect('notify::sensitive', () => {
 | 
			
		||||
                menuItem.emit('notify::sensitive');
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            menuItem.connect('destroy', () => {
 | 
			
		||||
@@ -857,9 +883,9 @@ var PopupMenu = class extends PopupMenuBase {
 | 
			
		||||
 | 
			
		||||
    close(animate) {
 | 
			
		||||
        if (this._activeMenuItem)
 | 
			
		||||
            this._activeMenuItem.setActive(false);
 | 
			
		||||
            this._activeMenuItem.active = false;
 | 
			
		||||
 | 
			
		||||
        if (this._boxPointer.actor.visible) {
 | 
			
		||||
        if (this._boxPointer.visible) {
 | 
			
		||||
            this._boxPointer.close(animate, () => {
 | 
			
		||||
                this.emit('menu-closed');
 | 
			
		||||
            });
 | 
			
		||||
@@ -890,6 +916,10 @@ var PopupDummyMenu = class {
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get sensitive() {
 | 
			
		||||
        return this.getSensitive();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    open() { this.emit('open-state-changed', true); }
 | 
			
		||||
    close() { this.emit('open-state-changed', false); }
 | 
			
		||||
    toggle() {}
 | 
			
		||||
@@ -929,7 +959,11 @@ var PopupSubMenu = class extends PopupMenuBase {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    getSensitive() {
 | 
			
		||||
        return this._sensitive && this.sourceActor._delegate.getSensitive();
 | 
			
		||||
        return this._sensitive && this.sourceActor.sensitive;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get sensitive() {
 | 
			
		||||
        return this.getSensitive();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    open(animate) {
 | 
			
		||||
@@ -996,7 +1030,7 @@ var PopupSubMenu = class extends PopupMenuBase {
 | 
			
		||||
        this.emit('open-state-changed', false);
 | 
			
		||||
 | 
			
		||||
        if (this._activeMenuItem)
 | 
			
		||||
            this._activeMenuItem.setActive(false);
 | 
			
		||||
            this._activeMenuItem.active = false;
 | 
			
		||||
 | 
			
		||||
        if (animate && this._needsScrollbar())
 | 
			
		||||
            animate = false;
 | 
			
		||||
@@ -1028,7 +1062,7 @@ var PopupSubMenu = class extends PopupMenuBase {
 | 
			
		||||
 | 
			
		||||
        if (this.isOpen && event.get_key_symbol() == Clutter.KEY_Left) {
 | 
			
		||||
            this.close(BoxPointer.PopupAnimation.FULL);
 | 
			
		||||
            this.sourceActor._delegate.setActive(true);
 | 
			
		||||
            this.sourceActor._delegate.active = true;
 | 
			
		||||
            return Clutter.EVENT_STOP;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -1059,25 +1093,26 @@ var PopupMenuSection = class extends PopupMenuBase {
 | 
			
		||||
    close() { this.emit('open-state-changed', false); }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var PopupSubMenuMenuItem = class extends PopupBaseMenuItem {
 | 
			
		||||
    constructor(text, wantIcon) {
 | 
			
		||||
        super();
 | 
			
		||||
var PopupSubMenuMenuItem = GObject.registerClass(
 | 
			
		||||
class PopupSubMenuMenuItem extends PopupBaseMenuItem {
 | 
			
		||||
    _init(text, wantIcon) {
 | 
			
		||||
        super._init();
 | 
			
		||||
 | 
			
		||||
        this.actor.add_style_class_name('popup-submenu-menu-item');
 | 
			
		||||
        this.add_style_class_name('popup-submenu-menu-item');
 | 
			
		||||
 | 
			
		||||
        if (wantIcon) {
 | 
			
		||||
            this.icon = new St.Icon({ style_class: 'popup-menu-icon' });
 | 
			
		||||
            this.actor.add_child(this.icon);
 | 
			
		||||
            this.add_child(this.icon);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this.label = new St.Label({ text: text,
 | 
			
		||||
                                    y_expand: true,
 | 
			
		||||
                                    y_align: Clutter.ActorAlign.CENTER });
 | 
			
		||||
        this.actor.add_child(this.label);
 | 
			
		||||
        this.actor.label_actor = this.label;
 | 
			
		||||
        this.add_child(this.label);
 | 
			
		||||
        this.label_actor = this.label;
 | 
			
		||||
 | 
			
		||||
        let expander = new St.Bin({ style_class: 'popup-menu-item-expander' });
 | 
			
		||||
        this.actor.add(expander, { expand: true });
 | 
			
		||||
        this.add(expander, { expand: true });
 | 
			
		||||
 | 
			
		||||
        this._triangle = arrowIcon(St.Side.RIGHT);
 | 
			
		||||
        this._triangle.pivot_point = new Clutter.Point({ x: 0.5, y: 0.6 });
 | 
			
		||||
@@ -1086,11 +1121,12 @@ var PopupSubMenuMenuItem = class extends PopupBaseMenuItem {
 | 
			
		||||
                                            y_align: Clutter.ActorAlign.CENTER });
 | 
			
		||||
        this._triangleBin.add_child(this._triangle);
 | 
			
		||||
 | 
			
		||||
        this.actor.add_child(this._triangleBin);
 | 
			
		||||
        this.actor.add_accessible_state (Atk.StateType.EXPANDABLE);
 | 
			
		||||
        this.add_child(this._triangleBin);
 | 
			
		||||
        this.add_accessible_state(Atk.StateType.EXPANDABLE);
 | 
			
		||||
 | 
			
		||||
        this.menu = new PopupSubMenu(this.actor, this._triangle);
 | 
			
		||||
        this.menu = new PopupSubMenu(this, this._triangle);
 | 
			
		||||
        this.menu.connect('open-state-changed', this._subMenuOpenStateChanged.bind(this));
 | 
			
		||||
        this.connect('destroy', () => { this.menu.destroy(); });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _setParent(parent) {
 | 
			
		||||
@@ -1107,24 +1143,18 @@ var PopupSubMenuMenuItem = class extends PopupBaseMenuItem {
 | 
			
		||||
 | 
			
		||||
    _subMenuOpenStateChanged(menu, open) {
 | 
			
		||||
        if (open) {
 | 
			
		||||
            this.actor.add_style_pseudo_class('open');
 | 
			
		||||
            this.add_style_pseudo_class('open');
 | 
			
		||||
            this._getTopMenu()._setOpenedSubMenu(this.menu);
 | 
			
		||||
            this.actor.add_accessible_state (Atk.StateType.EXPANDED);
 | 
			
		||||
            this.actor.add_style_pseudo_class('checked');
 | 
			
		||||
            this.add_accessible_state(Atk.StateType.EXPANDED);
 | 
			
		||||
            this.add_style_pseudo_class('checked');
 | 
			
		||||
        } else {
 | 
			
		||||
            this.actor.remove_style_pseudo_class('open');
 | 
			
		||||
            this.remove_style_pseudo_class('open');
 | 
			
		||||
            this._getTopMenu()._setOpenedSubMenu(null);
 | 
			
		||||
            this.actor.remove_accessible_state (Atk.StateType.EXPANDED);
 | 
			
		||||
            this.actor.remove_style_pseudo_class('checked');
 | 
			
		||||
            this.remove_accessible_state (Atk.StateType.EXPANDED);
 | 
			
		||||
            this.remove_style_pseudo_class('checked');
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    destroy() {
 | 
			
		||||
        this.menu.destroy();
 | 
			
		||||
 | 
			
		||||
        super.destroy();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    setSubmenuShown(open) {
 | 
			
		||||
        if (open)
 | 
			
		||||
            this.menu.open(BoxPointer.PopupAnimation.FULL);
 | 
			
		||||
@@ -1162,7 +1192,7 @@ var PopupSubMenuMenuItem = class extends PopupBaseMenuItem {
 | 
			
		||||
    _onButtonReleaseEvent(actor) {
 | 
			
		||||
        // Since we override the parent, we need to manage what the parent does
 | 
			
		||||
        // with the active style class
 | 
			
		||||
        this.actor.remove_style_pseudo_class ('active');
 | 
			
		||||
        this.remove_style_pseudo_class('active');
 | 
			
		||||
        this._setOpenState(!this._getOpenState());
 | 
			
		||||
        return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
    }
 | 
			
		||||
@@ -1171,12 +1201,12 @@ var PopupSubMenuMenuItem = class extends PopupBaseMenuItem {
 | 
			
		||||
        if (event.type() == Clutter.EventType.TOUCH_END) {
 | 
			
		||||
            // Since we override the parent, we need to manage what the parent does
 | 
			
		||||
            // with the active style class
 | 
			
		||||
            this.actor.remove_style_pseudo_class ('active');
 | 
			
		||||
            this.remove_style_pseudo_class('active');
 | 
			
		||||
            this._setOpenState(!this._getOpenState());
 | 
			
		||||
        }
 | 
			
		||||
        return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
/* Basic implementation of a menu manager.
 | 
			
		||||
 * Call addMenu to add menus
 | 
			
		||||
@@ -1186,7 +1216,7 @@ var PopupMenuManager = class {
 | 
			
		||||
        grabParams = Params.parse(grabParams,
 | 
			
		||||
                                  { actionMode: Shell.ActionMode.POPUP });
 | 
			
		||||
        this._owner = owner;
 | 
			
		||||
        this._grabHelper = new GrabHelper.GrabHelper(owner.actor, grabParams);
 | 
			
		||||
        this._grabHelper = new GrabHelper.GrabHelper(owner, grabParams);
 | 
			
		||||
        this._menus = [];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 | 
			
		||||
 | 
			
		||||
const { Clutter, Gio, GLib, Meta, Shell, St } = imports.gi;
 | 
			
		||||
const { Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi;
 | 
			
		||||
const Signals = imports.signals;
 | 
			
		||||
 | 
			
		||||
const Main = imports.ui.main;
 | 
			
		||||
@@ -23,10 +23,11 @@ const EXEC_ARG_KEY = 'exec-arg';
 | 
			
		||||
 | 
			
		||||
var DIALOG_GROW_TIME = 0.1;
 | 
			
		||||
 | 
			
		||||
var RunDialog = class extends ModalDialog.ModalDialog {
 | 
			
		||||
    constructor() {
 | 
			
		||||
        super({ styleClass: 'run-dialog',
 | 
			
		||||
                destroyOnClose: false });
 | 
			
		||||
var RunDialog = GObject.registerClass(
 | 
			
		||||
class RunDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
    _init() {
 | 
			
		||||
        super._init({ styleClass: 'run-dialog',
 | 
			
		||||
                      destroyOnClose: false });
 | 
			
		||||
 | 
			
		||||
        this._lockdownSettings = new Gio.Settings({ schema_id: LOCKDOWN_SCHEMA });
 | 
			
		||||
        this._terminalSettings = new Gio.Settings({ schema_id: TERMINAL_SCHEMA });
 | 
			
		||||
@@ -282,5 +283,4 @@ var RunDialog = class extends ModalDialog.ModalDialog {
 | 
			
		||||
 | 
			
		||||
        super.open();
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
Signals.addSignalMethods(RunDialog.prototype);
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 | 
			
		||||
 | 
			
		||||
const { Clutter, Gio, GLib, Gtk, Meta, Shell, St } = imports.gi;
 | 
			
		||||
const { Clutter, Gio, GLib, Meta, Shell, St } = imports.gi;
 | 
			
		||||
const Signals = imports.signals;
 | 
			
		||||
 | 
			
		||||
const GrabHelper = imports.ui.grabHelper;
 | 
			
		||||
@@ -227,8 +227,6 @@ var SelectArea = class {
 | 
			
		||||
        this._lastY = 0;
 | 
			
		||||
        this._result = null;
 | 
			
		||||
 | 
			
		||||
        this._initRubberbandColors();
 | 
			
		||||
 | 
			
		||||
        this._group = new St.Widget({ visible: false,
 | 
			
		||||
                                      reactive: true,
 | 
			
		||||
                                      x: 0,
 | 
			
		||||
@@ -248,10 +246,10 @@ var SelectArea = class {
 | 
			
		||||
                                                      coordinate: Clutter.BindCoordinate.ALL });
 | 
			
		||||
        this._group.add_constraint(constraint);
 | 
			
		||||
 | 
			
		||||
        this._rubberband = new Clutter.Rectangle({ color: this._background,
 | 
			
		||||
                                                   has_border: true,
 | 
			
		||||
                                                   border_width: 1,
 | 
			
		||||
                                                   border_color: this._border });
 | 
			
		||||
        this._rubberband = new St.Widget({
 | 
			
		||||
            style_class: 'select-area-rubberband',
 | 
			
		||||
            visible: false
 | 
			
		||||
        });
 | 
			
		||||
        this._group.add_actor(this._rubberband);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -265,25 +263,6 @@ var SelectArea = class {
 | 
			
		||||
        this._group.visible = true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _initRubberbandColors() {
 | 
			
		||||
        function colorFromRGBA(rgba) {
 | 
			
		||||
            return new Clutter.Color({ red: rgba.red * 255,
 | 
			
		||||
                                       green: rgba.green * 255,
 | 
			
		||||
                                       blue: rgba.blue * 255,
 | 
			
		||||
                                       alpha: rgba.alpha * 255 });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let path = new Gtk.WidgetPath();
 | 
			
		||||
        path.append_type(Gtk.IconView);
 | 
			
		||||
 | 
			
		||||
        let context = new Gtk.StyleContext();
 | 
			
		||||
        context.set_path(path);
 | 
			
		||||
        context.add_class('rubberband');
 | 
			
		||||
 | 
			
		||||
        this._background = colorFromRGBA(context.get_background_color(Gtk.StateFlags.NORMAL));
 | 
			
		||||
        this._border = colorFromRGBA(context.get_border_color(Gtk.StateFlags.NORMAL));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _getGeometry() {
 | 
			
		||||
        return { x: Math.min(this._startX, this._lastX),
 | 
			
		||||
                 y: Math.min(this._startY, this._lastY),
 | 
			
		||||
@@ -302,6 +281,7 @@ var SelectArea = class {
 | 
			
		||||
 | 
			
		||||
        this._rubberband.set_position(geometry.x, geometry.y);
 | 
			
		||||
        this._rubberband.set_size(geometry.width, geometry.height);
 | 
			
		||||
        this._rubberband.show();
 | 
			
		||||
 | 
			
		||||
        return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -79,14 +79,17 @@ var GnomeShell = class {
 | 
			
		||||
        for (let param in params)
 | 
			
		||||
            params[param] = params[param].deep_unpack();
 | 
			
		||||
 | 
			
		||||
        let { monitor: monitorIndex,
 | 
			
		||||
        let { connector,
 | 
			
		||||
              label,
 | 
			
		||||
              level,
 | 
			
		||||
              max_level: maxLevel,
 | 
			
		||||
              icon: serializedIcon } = params;
 | 
			
		||||
 | 
			
		||||
        if (monitorIndex === undefined)
 | 
			
		||||
            monitorIndex = -1;
 | 
			
		||||
        let monitorIndex = -1;
 | 
			
		||||
        if (connector) {
 | 
			
		||||
            let monitorManager = Meta.MonitorManager.get();
 | 
			
		||||
            monitorIndex = monitorManager.get_monitor_for_connector(connector);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let icon = null;
 | 
			
		||||
        if (serializedIcon)
 | 
			
		||||
@@ -203,16 +206,10 @@ var GnomeShell = class {
 | 
			
		||||
        this._grabbers.delete(name);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ShowMonitorLabelsAsync(params, invocation) {
 | 
			
		||||
        let sender = invocation.get_sender();
 | 
			
		||||
        let [dict] = params;
 | 
			
		||||
        Main.osdMonitorLabeler.show(sender, dict);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ShowMonitorLabels2Async(params, invocation) {
 | 
			
		||||
        let sender = invocation.get_sender();
 | 
			
		||||
        let [dict] = params;
 | 
			
		||||
        Main.osdMonitorLabeler.show2(sender, dict);
 | 
			
		||||
        Main.osdMonitorLabeler.show(sender, dict);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    HideMonitorLabelsAsync(params, invocation) {
 | 
			
		||||
 
 | 
			
		||||
@@ -148,7 +148,7 @@ function addContextMenu(entry, params) {
 | 
			
		||||
 | 
			
		||||
    entry.menu = new EntryMenu(entry);
 | 
			
		||||
    entry.menu.isPassword = params.isPassword;
 | 
			
		||||
    entry._menuManager = new PopupMenu.PopupMenuManager({ actor: entry },
 | 
			
		||||
    entry._menuManager = new PopupMenu.PopupMenuManager(entry,
 | 
			
		||||
                                                        { actionMode: params.actionMode });
 | 
			
		||||
    entry._menuManager.addMenu(entry.menu);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,9 @@
 | 
			
		||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 | 
			
		||||
 | 
			
		||||
const { Clutter, Gio, GLib, Pango, Shell, St } = imports.gi;
 | 
			
		||||
const { Clutter, Gio, GLib, GObject, Pango, Shell, St } = imports.gi;
 | 
			
		||||
const Signals = imports.signals;
 | 
			
		||||
 | 
			
		||||
const Animation = imports.ui.animation;
 | 
			
		||||
const CheckBox = imports.ui.checkBox;
 | 
			
		||||
const Dialog = imports.ui.dialog;
 | 
			
		||||
const Main = imports.ui.main;
 | 
			
		||||
@@ -14,6 +15,7 @@ const ShellEntry = imports.ui.shellEntry;
 | 
			
		||||
const { loadInterfaceXML } = imports.misc.fileUtils;
 | 
			
		||||
 | 
			
		||||
var LIST_ITEM_ICON_SIZE = 48;
 | 
			
		||||
var WORK_SPINNER_ICON_SIZE = 16;
 | 
			
		||||
 | 
			
		||||
const REMEMBER_MOUNT_PASSWORD_KEY = 'remember-mount-password';
 | 
			
		||||
 | 
			
		||||
@@ -148,7 +150,7 @@ var ShellMountOperation = class {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._dialogId = this._dialog.connect('response',
 | 
			
		||||
            (object, choice, password, remember) => {
 | 
			
		||||
            (object, choice, password, remember, hiddenVolume, systemVolume, pim) => {
 | 
			
		||||
                if (choice == -1) {
 | 
			
		||||
                    this.mountOp.reply(Gio.MountOperationResult.ABORTED);
 | 
			
		||||
                } else {
 | 
			
		||||
@@ -158,6 +160,9 @@ var ShellMountOperation = class {
 | 
			
		||||
                        this.mountOp.set_password_save(Gio.PasswordSave.NEVER);
 | 
			
		||||
 | 
			
		||||
                    this.mountOp.set_password(password);
 | 
			
		||||
                    this.mountOp.set_is_tcrypt_hidden_volume(hiddenVolume);
 | 
			
		||||
                    this.mountOp.set_is_tcrypt_system_volume(systemVolume);
 | 
			
		||||
                    this.mountOp.set_pim(pim);
 | 
			
		||||
                    this.mountOp.reply(Gio.MountOperationResult.HANDLED);
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
@@ -264,9 +269,11 @@ var ShellUnmountNotifier = class extends MessageTray.Source {
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var ShellMountQuestionDialog = class extends ModalDialog.ModalDialog {
 | 
			
		||||
    constructor(icon) {
 | 
			
		||||
        super({ styleClass: 'mount-dialog' });
 | 
			
		||||
var ShellMountQuestionDialog = GObject.registerClass({
 | 
			
		||||
    Signals: { 'response': { param_types: [GObject.TYPE_INT] } }
 | 
			
		||||
}, class ShellMountQuestionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
    _init(icon) {
 | 
			
		||||
        super._init({ styleClass: 'mount-dialog' });
 | 
			
		||||
 | 
			
		||||
        this._content = new Dialog.MessageDialogContent({ icon });
 | 
			
		||||
        this.contentLayout.add(this._content, { x_fill: true, y_fill: false });
 | 
			
		||||
@@ -276,34 +283,107 @@ var ShellMountQuestionDialog = class extends ModalDialog.ModalDialog {
 | 
			
		||||
        _setLabelsForMessage(this._content, message);
 | 
			
		||||
        _setButtonsForChoices(this, choices);
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
Signals.addSignalMethods(ShellMountQuestionDialog.prototype);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
var ShellMountPasswordDialog = class extends ModalDialog.ModalDialog {
 | 
			
		||||
    constructor(message, icon, flags) {
 | 
			
		||||
var ShellMountPasswordDialog = GObject.registerClass({
 | 
			
		||||
    Signals: { 'response': { param_types: [GObject.TYPE_INT,
 | 
			
		||||
                                           GObject.TYPE_STRING,
 | 
			
		||||
                                           GObject.TYPE_BOOLEAN,
 | 
			
		||||
                                           GObject.TYPE_BOOLEAN,
 | 
			
		||||
                                           GObject.TYPE_BOOLEAN,
 | 
			
		||||
                                           GObject.TYPE_UINT] } }
 | 
			
		||||
}, class ShellMountPasswordDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
    _init(message, icon, flags) {
 | 
			
		||||
        let strings = message.split('\n');
 | 
			
		||||
        let title = strings.shift() || null;
 | 
			
		||||
        let body = strings.shift() || null;
 | 
			
		||||
        super({ styleClass: 'prompt-dialog' });
 | 
			
		||||
        super._init({ styleClass: 'prompt-dialog' });
 | 
			
		||||
 | 
			
		||||
        let disksApp = Shell.AppSystem.get_default().lookup_app('org.gnome.DiskUtility.desktop');
 | 
			
		||||
 | 
			
		||||
        let content = new Dialog.MessageDialogContent({ icon, title, body });
 | 
			
		||||
        this.contentLayout.add_actor(content);
 | 
			
		||||
        content._body.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
 | 
			
		||||
 | 
			
		||||
        this._passwordBox = new St.BoxLayout({ vertical: false, style_class: 'prompt-dialog-password-box' });
 | 
			
		||||
        content.messageBox.add(this._passwordBox);
 | 
			
		||||
        let layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL });
 | 
			
		||||
        let grid = new St.Widget({ style_class: 'prompt-dialog-grid',
 | 
			
		||||
                                   layout_manager: layout });
 | 
			
		||||
        layout.hookup_style(grid);
 | 
			
		||||
        let rtl = grid.get_text_direction() === Clutter.TextDirection.RTL;
 | 
			
		||||
 | 
			
		||||
        this._passwordLabel = new St.Label(({ style_class: 'prompt-dialog-password-label',
 | 
			
		||||
                                              text: _("Password") }));
 | 
			
		||||
        this._passwordBox.add(this._passwordLabel, { y_fill: false, y_align: St.Align.MIDDLE });
 | 
			
		||||
        if (flags & Gio.AskPasswordFlags.TCRYPT) {
 | 
			
		||||
            this._keyfilesLabel = new St.Label(({ style_class: 'prompt-dialog-keyfiles-label',
 | 
			
		||||
                                                  visible: false }));
 | 
			
		||||
 | 
			
		||||
            this._hiddenVolume = new CheckBox.CheckBox(_("Hidden Volume"));
 | 
			
		||||
            content.messageBox.add(this._hiddenVolume.actor);
 | 
			
		||||
 | 
			
		||||
            this._systemVolume = new CheckBox.CheckBox(_("Windows System Volume"));
 | 
			
		||||
            content.messageBox.add(this._systemVolume.actor);
 | 
			
		||||
 | 
			
		||||
            this._keyfilesCheckbox = new CheckBox.CheckBox(_("Uses Keyfiles"));
 | 
			
		||||
            this._keyfilesCheckbox.actor.connect("clicked", this._onKeyfilesCheckboxClicked.bind(this));
 | 
			
		||||
            content.messageBox.add(this._keyfilesCheckbox.actor);
 | 
			
		||||
 | 
			
		||||
            this._keyfilesLabel.clutter_text.set_markup(
 | 
			
		||||
                /* Translators: %s is the Disks application */
 | 
			
		||||
                _("To unlock a volume that uses keyfiles, use the <i>%s</i> utility instead.").format(disksApp.get_name())
 | 
			
		||||
            );
 | 
			
		||||
            this._keyfilesLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
 | 
			
		||||
            this._keyfilesLabel.clutter_text.line_wrap = true;
 | 
			
		||||
            content.messageBox.add(this._keyfilesLabel, { y_fill: false, y_align: St.Align.MIDDLE, expand: true });
 | 
			
		||||
 | 
			
		||||
            this._pimLabel = new St.Label({ style_class: 'prompt-dialog-password-label',
 | 
			
		||||
                                            text: _("PIM Number"),
 | 
			
		||||
                                            y_align: Clutter.ActorAlign.CENTER });
 | 
			
		||||
            this._pimEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry',
 | 
			
		||||
                                            can_focus: true,
 | 
			
		||||
                                            x_expand: true });
 | 
			
		||||
            this._pimEntry.clutter_text.connect('activate', this._onEntryActivate.bind(this));
 | 
			
		||||
            this._pimEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE
 | 
			
		||||
            ShellEntry.addContextMenu(this._pimEntry, { isPassword: true });
 | 
			
		||||
 | 
			
		||||
            if (rtl) {
 | 
			
		||||
                layout.attach(this._pimEntry, 0, 0, 1, 1);
 | 
			
		||||
                layout.attach(this._pimLabel, 1, 0, 1, 1);
 | 
			
		||||
            } else {
 | 
			
		||||
                layout.attach(this._pimLabel, 0, 0, 1, 1);
 | 
			
		||||
                layout.attach(this._pimEntry, 1, 0, 1, 1);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            this._pimErrorMessageLabel = new St.Label({ style_class: 'prompt-dialog-password-entry',
 | 
			
		||||
                                                        text: _("The PIM must be a number or empty."),
 | 
			
		||||
                                                        visible: false });
 | 
			
		||||
            layout.attach(this._pimErrorMessageLabel, 0, 2, 2, 1);
 | 
			
		||||
        } else {
 | 
			
		||||
            this._hiddenVolume = null;
 | 
			
		||||
            this._systemVolume = null;
 | 
			
		||||
            this._pimEntry = null;
 | 
			
		||||
            this._pimErrorMessageLabel = null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._passwordLabel = new St.Label({ style_class: 'prompt-dialog-password-label',
 | 
			
		||||
                                             text: _("Password"),
 | 
			
		||||
                                             y_align: Clutter.ActorAlign.CENTER });
 | 
			
		||||
        this._passwordEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry',
 | 
			
		||||
                                             text: "",
 | 
			
		||||
                                             can_focus: true});
 | 
			
		||||
        ShellEntry.addContextMenu(this._passwordEntry, { isPassword: true });
 | 
			
		||||
                                             can_focus: true,
 | 
			
		||||
                                             x_expand: true });
 | 
			
		||||
        this._passwordEntry.clutter_text.connect('activate', this._onEntryActivate.bind(this));
 | 
			
		||||
        this._passwordEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE
 | 
			
		||||
        this._passwordBox.add(this._passwordEntry, {expand: true });
 | 
			
		||||
        ShellEntry.addContextMenu(this._passwordEntry, { isPassword: true });
 | 
			
		||||
        this.setInitialKeyFocus(this._passwordEntry);
 | 
			
		||||
        this._workSpinner = new Animation.Spinner(WORK_SPINNER_ICON_SIZE, true);
 | 
			
		||||
        this._passwordEntry.secondary_icon = this._workSpinner.actor;
 | 
			
		||||
 | 
			
		||||
        if (rtl) {
 | 
			
		||||
            layout.attach(this._passwordEntry, 0, 1, 1, 1);
 | 
			
		||||
            layout.attach(this._passwordLabel, 1, 1, 1, 1);
 | 
			
		||||
        } else {
 | 
			
		||||
            layout.attach(this._passwordLabel, 0, 1, 1, 1);
 | 
			
		||||
            layout.attach(this._passwordEntry, 1, 1, 1, 1);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        content.messageBox.add(grid);
 | 
			
		||||
 | 
			
		||||
        this._errorMessageLabel = new St.Label({ style_class: 'prompt-dialog-error-label',
 | 
			
		||||
                                                 text: _("Sorry, that didn’t work. Please try again.") });
 | 
			
		||||
@@ -313,8 +393,7 @@ var ShellMountPasswordDialog = class extends ModalDialog.ModalDialog {
 | 
			
		||||
        content.messageBox.add(this._errorMessageLabel);
 | 
			
		||||
 | 
			
		||||
        if (flags & Gio.AskPasswordFlags.SAVING_SUPPORTED) {
 | 
			
		||||
            this._rememberChoice = new CheckBox.CheckBox();
 | 
			
		||||
            this._rememberChoice.getLabelActor().text = _("Remember Password");
 | 
			
		||||
            this._rememberChoice = new CheckBox.CheckBox(_("Remember Password"));
 | 
			
		||||
            this._rememberChoice.actor.checked =
 | 
			
		||||
                global.settings.get_boolean(REMEMBER_MOUNT_PASSWORD_KEY);
 | 
			
		||||
            content.messageBox.add(this._rememberChoice.actor);
 | 
			
		||||
@@ -322,25 +401,36 @@ var ShellMountPasswordDialog = class extends ModalDialog.ModalDialog {
 | 
			
		||||
            this._rememberChoice = null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let buttons = [{ label: _("Cancel"),
 | 
			
		||||
                         action: this._onCancelButton.bind(this),
 | 
			
		||||
                         key:    Clutter.Escape
 | 
			
		||||
                       },
 | 
			
		||||
                       { label: _("Unlock"),
 | 
			
		||||
                         action: this._onUnlockButton.bind(this),
 | 
			
		||||
                         default: true
 | 
			
		||||
                       }];
 | 
			
		||||
        this._defaultButtons = [{ label: _("Cancel"),
 | 
			
		||||
                                  action: this._onCancelButton.bind(this),
 | 
			
		||||
                                  key:    Clutter.Escape
 | 
			
		||||
                                },
 | 
			
		||||
                                { label: _("Unlock"),
 | 
			
		||||
                                  action: this._onUnlockButton.bind(this),
 | 
			
		||||
                                  default: true
 | 
			
		||||
                                }];
 | 
			
		||||
 | 
			
		||||
        this.setButtons(buttons);
 | 
			
		||||
        this._usesKeyfilesButtons = [{ label: _("Cancel"),
 | 
			
		||||
                                       action: this._onCancelButton.bind(this),
 | 
			
		||||
                                       key:    Clutter.Escape
 | 
			
		||||
                                     },
 | 
			
		||||
                                     { /* Translators: %s is the Disks application */
 | 
			
		||||
                                       label: _("Open %s").format(disksApp.get_name()),
 | 
			
		||||
                                       action: this._onOpenDisksButton.bind(this),
 | 
			
		||||
                                       default: true
 | 
			
		||||
                                     }];
 | 
			
		||||
 | 
			
		||||
        this.setButtons(this._defaultButtons);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    reaskPassword() {
 | 
			
		||||
        this._passwordEntry.set_text('');
 | 
			
		||||
        this._errorMessageLabel.show();
 | 
			
		||||
        this._workSpinner.stop();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _onCancelButton() {
 | 
			
		||||
        this.emit('response', -1, '', false);
 | 
			
		||||
        this.emit('response', -1, '', false, false, false, 0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _onUnlockButton() {
 | 
			
		||||
@@ -348,18 +438,68 @@ var ShellMountPasswordDialog = class extends ModalDialog.ModalDialog {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _onEntryActivate() {
 | 
			
		||||
        let pim = 0;
 | 
			
		||||
        if (this._pimEntry !== null)
 | 
			
		||||
            pim = this._pimEntry.get_text();
 | 
			
		||||
        if (isNaN(pim)) {
 | 
			
		||||
            this._pimEntry.set_text('');
 | 
			
		||||
            this._pimErrorMessageLabel.show();
 | 
			
		||||
            return;
 | 
			
		||||
        } else if (this._pimErrorMessageLabel !== null) {
 | 
			
		||||
            this._pimErrorMessageLabel.hide();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        global.settings.set_boolean(REMEMBER_MOUNT_PASSWORD_KEY,
 | 
			
		||||
            this._rememberChoice && this._rememberChoice.actor.checked);
 | 
			
		||||
 | 
			
		||||
        this._workSpinner.play();
 | 
			
		||||
        this.emit('response', 1,
 | 
			
		||||
            this._passwordEntry.get_text(),
 | 
			
		||||
            this._rememberChoice &&
 | 
			
		||||
            this._rememberChoice.actor.checked);
 | 
			
		||||
            this._rememberChoice.actor.checked,
 | 
			
		||||
            this._hiddenVolume &&
 | 
			
		||||
            this._hiddenVolume.actor.checked,
 | 
			
		||||
            this._systemVolume &&
 | 
			
		||||
            this._systemVolume.actor.checked,
 | 
			
		||||
            parseInt(pim));
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var ShellProcessesDialog = class extends ModalDialog.ModalDialog {
 | 
			
		||||
    constructor(icon) {
 | 
			
		||||
        super({ styleClass: 'mount-dialog' });
 | 
			
		||||
    _onKeyfilesCheckboxClicked() {
 | 
			
		||||
        let useKeyfiles = this._keyfilesCheckbox.actor.checked;
 | 
			
		||||
        this._passwordEntry.reactive = !useKeyfiles;
 | 
			
		||||
        this._passwordEntry.can_focus = !useKeyfiles;
 | 
			
		||||
        this._passwordEntry.clutter_text.editable = !useKeyfiles;
 | 
			
		||||
        this._passwordEntry.clutter_text.selectable = !useKeyfiles;
 | 
			
		||||
        this._pimEntry.reactive = !useKeyfiles;
 | 
			
		||||
        this._pimEntry.can_focus = !useKeyfiles;
 | 
			
		||||
        this._pimEntry.clutter_text.editable = !useKeyfiles;
 | 
			
		||||
        this._pimEntry.clutter_text.selectable = !useKeyfiles;
 | 
			
		||||
        this._rememberChoice.actor.reactive = !useKeyfiles;
 | 
			
		||||
        this._rememberChoice.actor.can_focus = !useKeyfiles;
 | 
			
		||||
        this._keyfilesLabel.visible = useKeyfiles;
 | 
			
		||||
        this.setButtons(useKeyfiles ? this._usesKeyfilesButtons : this._defaultButtons);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _onOpenDisksButton() {
 | 
			
		||||
        let app = Shell.AppSystem.get_default().lookup_app('org.gnome.DiskUtility.desktop');
 | 
			
		||||
        if (app)
 | 
			
		||||
            app.activate();
 | 
			
		||||
        else
 | 
			
		||||
            Main.notifyError(
 | 
			
		||||
                /* Translators: %s is the Disks application */
 | 
			
		||||
                _("Unable to start %s").format(app.get_name()),
 | 
			
		||||
                /* Translators: %s is the Disks application */
 | 
			
		||||
                _("Couldn't find the %s application").format(app.get_name())
 | 
			
		||||
            );
 | 
			
		||||
        this._onCancelButton();
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
var ShellProcessesDialog = GObject.registerClass({
 | 
			
		||||
    Signals: { 'response': { param_types: [GObject.TYPE_INT] } }
 | 
			
		||||
}, class ShellProcessesDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
    _init(icon) {
 | 
			
		||||
        super._init({ styleClass: 'mount-dialog' });
 | 
			
		||||
 | 
			
		||||
        this._content = new Dialog.MessageDialogContent({ icon });
 | 
			
		||||
        this.contentLayout.add(this._content, { x_fill: true, y_fill: false });
 | 
			
		||||
@@ -412,8 +552,7 @@ var ShellProcessesDialog = class extends ModalDialog.ModalDialog {
 | 
			
		||||
        _setLabelsForMessage(this._content, message);
 | 
			
		||||
        _setButtonsForChoices(this, choices);
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
Signals.addSignalMethods(ShellProcessesDialog.prototype);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
const GnomeShellMountOpIface = loadInterfaceXML('org.Gtk.MountOperationHandler');
 | 
			
		||||
 | 
			
		||||
@@ -515,7 +654,7 @@ var GnomeShellMountOpHandler = class {
 | 
			
		||||
 | 
			
		||||
        this._dialog = new ShellMountPasswordDialog(message, this._createGIcon(iconName), flags);
 | 
			
		||||
        this._dialog.connect('response',
 | 
			
		||||
            (object, choice, password, remember) => {
 | 
			
		||||
            (object, choice, password, remember, hiddenVolume, systemVolume, pim) => {
 | 
			
		||||
                let details = {};
 | 
			
		||||
                let response;
 | 
			
		||||
 | 
			
		||||
@@ -527,6 +666,9 @@ var GnomeShellMountOpHandler = class {
 | 
			
		||||
                    let passSave = remember ? Gio.PasswordSave.PERMANENTLY : Gio.PasswordSave.NEVER;
 | 
			
		||||
                    details['password_save'] = GLib.Variant.new('u', passSave);
 | 
			
		||||
                    details['password'] = GLib.Variant.new('s', password);
 | 
			
		||||
                    details['hidden_volume'] = GLib.Variant.new('b', hiddenVolume);
 | 
			
		||||
                    details['system_volume'] = GLib.Variant.new('b', systemVolume);
 | 
			
		||||
                    details['pim'] = GLib.Variant.new('u', pim);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                this._clearCurrentRequest(response, details);
 | 
			
		||||
 
 | 
			
		||||
@@ -39,7 +39,7 @@ class ATIndicator extends PanelMenu.Button {
 | 
			
		||||
                                           icon_name: 'preferences-desktop-accessibility-symbolic' }));
 | 
			
		||||
        this._hbox.add_child(PopupMenu.arrowIcon(St.Side.BOTTOM));
 | 
			
		||||
 | 
			
		||||
        this.actor.add_child(this._hbox);
 | 
			
		||||
        this.add_child(this._hbox);
 | 
			
		||||
 | 
			
		||||
        this._a11ySettings = new Gio.Settings({ schema_id: A11Y_SCHEMA });
 | 
			
		||||
        this._a11ySettings.connect('changed::' + KEY_ALWAYS_SHOW, this._queueSyncMenuVisibility.bind(this));
 | 
			
		||||
@@ -86,7 +86,7 @@ class ATIndicator extends PanelMenu.Button {
 | 
			
		||||
        let alwaysShow = this._a11ySettings.get_boolean(KEY_ALWAYS_SHOW);
 | 
			
		||||
        let items = this.menu._getMenuItems();
 | 
			
		||||
 | 
			
		||||
        this.actor.visible = alwaysShow || items.some(f => !!f.state);
 | 
			
		||||
        this.visible = alwaysShow || items.some(f => !!f.state);
 | 
			
		||||
 | 
			
		||||
        return GLib.SOURCE_REMOVE;
 | 
			
		||||
    }
 | 
			
		||||
@@ -112,38 +112,22 @@ class ATIndicator extends PanelMenu.Button {
 | 
			
		||||
 | 
			
		||||
    _buildItem(string, schema, key) {
 | 
			
		||||
        let settings = new Gio.Settings({ schema_id: schema });
 | 
			
		||||
        settings.connect('changed::'+key, () => {
 | 
			
		||||
        let widget = this._buildItemExtended(string,
 | 
			
		||||
            settings.get_boolean(key),
 | 
			
		||||
            settings.is_writable(key),
 | 
			
		||||
            enabled => settings.set_boolean(key, enabled));
 | 
			
		||||
 | 
			
		||||
        settings.connect('changed::' + key, () => {
 | 
			
		||||
            widget.setToggleState(settings.get_boolean(key));
 | 
			
		||||
 | 
			
		||||
            this._queueSyncMenuVisibility();
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        let widget = this._buildItemExtended(string,
 | 
			
		||||
            settings.get_boolean(key),
 | 
			
		||||
            settings.is_writable(key),
 | 
			
		||||
            enabled => settings.set_boolean(key, enabled));
 | 
			
		||||
        return widget;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _buildHCItem() {
 | 
			
		||||
        let interfaceSettings = new Gio.Settings({ schema_id: DESKTOP_INTERFACE_SCHEMA });
 | 
			
		||||
        interfaceSettings.connect('changed::' + KEY_GTK_THEME, () => {
 | 
			
		||||
            let value = interfaceSettings.get_string(KEY_GTK_THEME);
 | 
			
		||||
            if (value == HIGH_CONTRAST_THEME) {
 | 
			
		||||
                highContrast.setToggleState(true);
 | 
			
		||||
            } else {
 | 
			
		||||
                highContrast.setToggleState(false);
 | 
			
		||||
                gtkTheme = value;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            this._queueSyncMenuVisibility();
 | 
			
		||||
        });
 | 
			
		||||
        interfaceSettings.connect('changed::' + KEY_ICON_THEME, () => {
 | 
			
		||||
            let value = interfaceSettings.get_string(KEY_ICON_THEME);
 | 
			
		||||
            if (value != HIGH_CONTRAST_THEME)
 | 
			
		||||
                iconTheme = value;
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        let gtkTheme = interfaceSettings.get_string(KEY_GTK_THEME);
 | 
			
		||||
        let iconTheme = interfaceSettings.get_string(KEY_ICON_THEME);
 | 
			
		||||
        let hasHC = (gtkTheme == HIGH_CONTRAST_THEME);
 | 
			
		||||
@@ -164,19 +148,30 @@ class ATIndicator extends PanelMenu.Button {
 | 
			
		||||
                    interfaceSettings.reset(KEY_ICON_THEME);
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
        interfaceSettings.connect('changed::' + KEY_GTK_THEME, () => {
 | 
			
		||||
            let value = interfaceSettings.get_string(KEY_GTK_THEME);
 | 
			
		||||
            if (value == HIGH_CONTRAST_THEME) {
 | 
			
		||||
                highContrast.setToggleState(true);
 | 
			
		||||
            } else {
 | 
			
		||||
                highContrast.setToggleState(false);
 | 
			
		||||
                gtkTheme = value;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            this._queueSyncMenuVisibility();
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        interfaceSettings.connect('changed::' + KEY_ICON_THEME, () => {
 | 
			
		||||
            let value = interfaceSettings.get_string(KEY_ICON_THEME);
 | 
			
		||||
            if (value != HIGH_CONTRAST_THEME)
 | 
			
		||||
                iconTheme = value;
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        return highContrast;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _buildFontItem() {
 | 
			
		||||
        let settings = new Gio.Settings({ schema_id: DESKTOP_INTERFACE_SCHEMA });
 | 
			
		||||
        settings.connect('changed::' + KEY_TEXT_SCALING_FACTOR, () => {
 | 
			
		||||
            let factor = settings.get_double(KEY_TEXT_SCALING_FACTOR);
 | 
			
		||||
            let active = (factor > 1.0);
 | 
			
		||||
            widget.setToggleState(active);
 | 
			
		||||
 | 
			
		||||
            this._queueSyncMenuVisibility();
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        let factor = settings.get_double(KEY_TEXT_SCALING_FACTOR);
 | 
			
		||||
        let initial_setting = (factor > 1.0);
 | 
			
		||||
        let widget = this._buildItemExtended(_("Large Text"),
 | 
			
		||||
@@ -189,6 +184,15 @@ class ATIndicator extends PanelMenu.Button {
 | 
			
		||||
                else
 | 
			
		||||
                    settings.reset(KEY_TEXT_SCALING_FACTOR);
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
        settings.connect('changed::' + KEY_TEXT_SCALING_FACTOR, () => {
 | 
			
		||||
            let factor = settings.get_double(KEY_TEXT_SCALING_FACTOR);
 | 
			
		||||
            let active = (factor > 1.0);
 | 
			
		||||
            widget.setToggleState(active);
 | 
			
		||||
 | 
			
		||||
            this._queueSyncMenuVisibility();
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        return widget;
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
@@ -118,9 +118,9 @@ var Indicator = class extends PanelMenu.SystemIndicator {
 | 
			
		||||
        // Remember if there were setup devices and show the menu
 | 
			
		||||
        // if we've seen setup devices and we're not hard blocked
 | 
			
		||||
        if (nDevices > 0)
 | 
			
		||||
            this._item.actor.visible = !this._proxy.BluetoothHardwareAirplaneMode;
 | 
			
		||||
            this._item.visible = !this._proxy.BluetoothHardwareAirplaneMode;
 | 
			
		||||
        else
 | 
			
		||||
            this._item.actor.visible = this._proxy.BluetoothHasAirplaneMode && !this._proxy.BluetoothAirplaneMode;
 | 
			
		||||
            this._item.visible = this._proxy.BluetoothHasAirplaneMode && !this._proxy.BluetoothAirplaneMode;
 | 
			
		||||
 | 
			
		||||
        if (nConnectedDevices > 0)
 | 
			
		||||
            /* Translators: this is the number of connected bluetooth devices */
 | 
			
		||||
 
 | 
			
		||||
@@ -37,12 +37,12 @@ var Indicator = class extends PanelMenu.SystemIndicator {
 | 
			
		||||
 | 
			
		||||
        let icon = new St.Icon({ icon_name: 'display-brightness-symbolic',
 | 
			
		||||
                                 style_class: 'popup-menu-icon' });
 | 
			
		||||
        this._item.actor.add(icon);
 | 
			
		||||
        this._item.actor.add(this._slider.actor, { expand: true });
 | 
			
		||||
        this._item.actor.connect('button-press-event', (actor, event) => {
 | 
			
		||||
        this._item.add(icon);
 | 
			
		||||
        this._item.add(this._slider.actor, { expand: true });
 | 
			
		||||
        this._item.connect('button-press-event', (actor, event) => {
 | 
			
		||||
            return this._slider.startDragging(event);
 | 
			
		||||
        });
 | 
			
		||||
        this._item.actor.connect('key-press-event', (actor, event) => {
 | 
			
		||||
        this._item.connect('key-press-event', (actor, event) => {
 | 
			
		||||
            return this._slider.onKeyPressEvent(actor, event);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
@@ -55,7 +55,7 @@ var Indicator = class extends PanelMenu.SystemIndicator {
 | 
			
		||||
 | 
			
		||||
    _sync() {
 | 
			
		||||
        let visible = this._proxy.Brightness >= 0;
 | 
			
		||||
        this._item.actor.visible = visible;
 | 
			
		||||
        this._item.visible = visible;
 | 
			
		||||
        if (visible)
 | 
			
		||||
            this._slider.setValue(this._proxy.Brightness / 100.0);
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -15,17 +15,18 @@ const Util = imports.misc.util;
 | 
			
		||||
const INPUT_SOURCE_TYPE_XKB = 'xkb';
 | 
			
		||||
const INPUT_SOURCE_TYPE_IBUS = 'ibus';
 | 
			
		||||
 | 
			
		||||
var LayoutMenuItem = class extends PopupMenu.PopupBaseMenuItem {
 | 
			
		||||
    constructor(displayName, shortName) {
 | 
			
		||||
        super();
 | 
			
		||||
var LayoutMenuItem = GObject.registerClass(
 | 
			
		||||
class LayoutMenuItem extends PopupMenu.PopupBaseMenuItem {
 | 
			
		||||
    _init(displayName, shortName) {
 | 
			
		||||
        super._init();
 | 
			
		||||
 | 
			
		||||
        this.label = new St.Label({ text: displayName });
 | 
			
		||||
        this.indicator = new St.Label({ text: shortName });
 | 
			
		||||
        this.actor.add(this.label, { expand: true });
 | 
			
		||||
        this.actor.add(this.indicator);
 | 
			
		||||
        this.actor.label_actor = this.label;
 | 
			
		||||
        this.add(this.label, { expand: true });
 | 
			
		||||
        this.add(this.indicator);
 | 
			
		||||
        this.label_actor = this.label;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
var InputSource = class {
 | 
			
		||||
    constructor(type, id, displayName, shortName, index) {
 | 
			
		||||
@@ -125,8 +126,8 @@ class InputSourceSwitcher extends SwitcherPopup.SwitcherList {
 | 
			
		||||
 | 
			
		||||
var InputSourceSettings = class {
 | 
			
		||||
    constructor() {
 | 
			
		||||
        if (new.target === InputSourceSettings)
 | 
			
		||||
            throw new TypeError('Cannot instantiate abstract class ' + new.target.name);
 | 
			
		||||
        if (this.constructor === InputSourceSettings)
 | 
			
		||||
            throw new TypeError(`Cannot instantiate abstract class ${this.constructor.name}`);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _emitInputSourcesChanged() {
 | 
			
		||||
@@ -822,7 +823,7 @@ class InputSourceIndicator extends PanelMenu.Button {
 | 
			
		||||
        this._hbox.add_child(this._container);
 | 
			
		||||
        this._hbox.add_child(PopupMenu.arrowIcon(St.Side.BOTTOM));
 | 
			
		||||
 | 
			
		||||
        this.actor.add_child(this._hbox);
 | 
			
		||||
        this.add_child(this._hbox);
 | 
			
		||||
 | 
			
		||||
        this._propSeparator = new PopupMenu.PopupSeparatorMenuItem();
 | 
			
		||||
        this.menu.addMenuItem(this._propSeparator);
 | 
			
		||||
@@ -857,7 +858,7 @@ class InputSourceIndicator extends PanelMenu.Button {
 | 
			
		||||
        // but at least for now it is used as "allow popping up windows
 | 
			
		||||
        // from shell menus"; we can always add a separate sessionMode
 | 
			
		||||
        // option if need arises.
 | 
			
		||||
        this._showLayoutItem.actor.visible = Main.sessionMode.allowSettings;
 | 
			
		||||
        this._showLayoutItem.visible = Main.sessionMode.allowSettings;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _sourcesChanged() {
 | 
			
		||||
@@ -908,11 +909,11 @@ class InputSourceIndicator extends PanelMenu.Button {
 | 
			
		||||
            // We also hide if we have only one visible source unless
 | 
			
		||||
            // it's an IBus source with properties.
 | 
			
		||||
            this.menu.close();
 | 
			
		||||
            this.actor.hide();
 | 
			
		||||
            this.hide();
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this.actor.show();
 | 
			
		||||
        this.show();
 | 
			
		||||
 | 
			
		||||
        this._buildPropSection(newSource.properties);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 | 
			
		||||
 | 
			
		||||
const { Clutter, Gio, GLib, Shell } = imports.gi;
 | 
			
		||||
const { Clutter, Gio, GLib, GObject, Shell } = imports.gi;
 | 
			
		||||
 | 
			
		||||
const Dialog = imports.ui.dialog;
 | 
			
		||||
const Main = imports.ui.main;
 | 
			
		||||
@@ -101,12 +101,12 @@ var Indicator = class extends PanelMenu.SystemIndicator {
 | 
			
		||||
    _syncIndicator() {
 | 
			
		||||
        if (this._managerProxy == null) {
 | 
			
		||||
            this._indicator.visible = false;
 | 
			
		||||
            this._item.actor.visible = false;
 | 
			
		||||
            this._item.visible = false;
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._indicator.visible = this._managerProxy.InUse;
 | 
			
		||||
        this._item.actor.visible = this._indicator.visible;
 | 
			
		||||
        this._item.visible = this._indicator.visible;
 | 
			
		||||
        this._updateMenuLabels();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -342,9 +342,11 @@ var AppAuthorizer = class {
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var GeolocationDialog = class extends ModalDialog.ModalDialog {
 | 
			
		||||
    constructor(name, subtitle, reqAccuracyLevel) {
 | 
			
		||||
        super({ styleClass: 'geolocation-dialog' });
 | 
			
		||||
var GeolocationDialog = GObject.registerClass({
 | 
			
		||||
    Signals: { 'response': { param_types: [GObject.TYPE_UINT] } }
 | 
			
		||||
}, class GeolocationDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
    _init(name, subtitle, reqAccuracyLevel) {
 | 
			
		||||
        super._init({ styleClass: 'geolocation-dialog' });
 | 
			
		||||
        this.reqAccuracyLevel = reqAccuracyLevel;
 | 
			
		||||
 | 
			
		||||
        let icon = new Gio.ThemedIcon({ name: 'find-location-symbolic' });
 | 
			
		||||
@@ -375,5 +377,4 @@ var GeolocationDialog = class extends ModalDialog.ModalDialog {
 | 
			
		||||
        this.emit('response', GeoclueAccuracyLevel.NONE);
 | 
			
		||||
        this.close();
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
Signals.addSignalMethods(GeolocationDialog.prototype);
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
@@ -167,10 +167,10 @@ var NMConnectionItem = class {
 | 
			
		||||
};
 | 
			
		||||
Signals.addSignalMethods(NMConnectionItem.prototype);
 | 
			
		||||
 | 
			
		||||
var NMConnectionSection = class {
 | 
			
		||||
var NMConnectionSection = class NMConnectionSection {
 | 
			
		||||
    constructor(client) {
 | 
			
		||||
        if (new.target === NMConnectionSection)
 | 
			
		||||
            throw new TypeError('Cannot instantiate abstract type ' + new.target.name);
 | 
			
		||||
        if (this.constructor === NMConnectionSection)
 | 
			
		||||
            throw new TypeError(`Cannot instantiate abstract type ${this.constructor.name}`);
 | 
			
		||||
 | 
			
		||||
        this._client = client;
 | 
			
		||||
 | 
			
		||||
@@ -235,14 +235,14 @@ var NMConnectionSection = class {
 | 
			
		||||
        if (!this._connectionValid(connection))
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        // This function is called everytime connection is added or updated
 | 
			
		||||
        // This function is called every time the connection is added or updated.
 | 
			
		||||
        // In the usual case, we already added this connection and UUID
 | 
			
		||||
        // didn't change. So we need to check if we already have an item,
 | 
			
		||||
        // and update it for properties in the connection that changed
 | 
			
		||||
        // (the only one we care about is the name)
 | 
			
		||||
        // But it's also possible we didn't know about this connection
 | 
			
		||||
        // (eg, during coldplug, or because it was updated and suddenly
 | 
			
		||||
        // it's valid for this device), in which case we add a new item
 | 
			
		||||
        // it's valid for this device), in which case we add a new item.
 | 
			
		||||
 | 
			
		||||
        let item = this._connectionItems.get(connection.get_uuid());
 | 
			
		||||
        if (item)
 | 
			
		||||
@@ -297,12 +297,13 @@ var NMConnectionSection = class {
 | 
			
		||||
};
 | 
			
		||||
Signals.addSignalMethods(NMConnectionSection.prototype);
 | 
			
		||||
 | 
			
		||||
var NMConnectionDevice = class extends NMConnectionSection {
 | 
			
		||||
var NMConnectionDevice = class NMConnectionDevice extends NMConnectionSection {
 | 
			
		||||
    constructor(client, device) {
 | 
			
		||||
        if (new.target === NMConnectionDevice)
 | 
			
		||||
            throw new TypeError('Cannot instantiate abstract type ' + new.target.name);
 | 
			
		||||
 | 
			
		||||
        super(client);
 | 
			
		||||
 | 
			
		||||
        if (this.constructor === NMConnectionDevice)
 | 
			
		||||
            throw new TypeError(`Cannot instantiate abstract type ${this.constructor.name}`);
 | 
			
		||||
 | 
			
		||||
        this._device = device;
 | 
			
		||||
        this._description = '';
 | 
			
		||||
 | 
			
		||||
@@ -388,8 +389,8 @@ var NMConnectionDevice = class extends NMConnectionSection {
 | 
			
		||||
 | 
			
		||||
    _sync() {
 | 
			
		||||
        let nItems = this._connectionItems.size;
 | 
			
		||||
        this._autoConnectItem.actor.visible = (nItems == 0);
 | 
			
		||||
        this._deactivateItem.actor.visible = this._device.state > NM.DeviceState.DISCONNECTED;
 | 
			
		||||
        this._autoConnectItem.visible = (nItems == 0);
 | 
			
		||||
        this._deactivateItem.visible = this._device.state > NM.DeviceState.DISCONNECTED;
 | 
			
		||||
 | 
			
		||||
        if (this._activeConnection == null) {
 | 
			
		||||
            let activeConnection = this._device.active_connection;
 | 
			
		||||
@@ -476,7 +477,7 @@ var NMDeviceWired = class extends NMConnectionDevice {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _sync() {
 | 
			
		||||
        this.item.actor.visible = this._hasCarrier();
 | 
			
		||||
        this.item.visible = this._hasCarrier();
 | 
			
		||||
        super._sync();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -612,31 +613,36 @@ var NMDeviceBluetooth = class extends NMConnectionDevice {
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var NMWirelessDialogItem = class {
 | 
			
		||||
    constructor(network) {
 | 
			
		||||
var NMWirelessDialogItem = GObject.registerClass({
 | 
			
		||||
    Signals: {
 | 
			
		||||
        'selected': {},
 | 
			
		||||
    }
 | 
			
		||||
}, class NMWirelessDialogItem extends St.BoxLayout {
 | 
			
		||||
    _init(network) {
 | 
			
		||||
        this._network = network;
 | 
			
		||||
        this._ap = network.accessPoints[0];
 | 
			
		||||
 | 
			
		||||
        this.actor = new St.BoxLayout({ style_class: 'nm-dialog-item',
 | 
			
		||||
                                        can_focus: true,
 | 
			
		||||
                                        reactive: true });
 | 
			
		||||
        this.actor.connect('key-focus-in', () => { this.emit('selected'); });
 | 
			
		||||
        super._init({ style_class: 'nm-dialog-item',
 | 
			
		||||
                      can_focus: true,
 | 
			
		||||
                      reactive: true });
 | 
			
		||||
 | 
			
		||||
        this.connect('key-focus-in', () => { this.emit('selected'); });
 | 
			
		||||
        let action = new Clutter.ClickAction();
 | 
			
		||||
        action.connect('clicked', () => { this.actor.grab_key_focus(); });
 | 
			
		||||
        this.actor.add_action(action);
 | 
			
		||||
        action.connect('clicked', () => { this.grab_key_focus(); });
 | 
			
		||||
        this.add_action(action);
 | 
			
		||||
 | 
			
		||||
        let title = ssidToLabel(this._ap.get_ssid());
 | 
			
		||||
        this._label = new St.Label({ text: title });
 | 
			
		||||
 | 
			
		||||
        this.actor.label_actor = this._label;
 | 
			
		||||
        this.actor.add(this._label, { x_align: St.Align.START });
 | 
			
		||||
        this.label_actor = this._label;
 | 
			
		||||
        this.add(this._label, { x_align: St.Align.START });
 | 
			
		||||
 | 
			
		||||
        this._selectedIcon = new St.Icon({ style_class: 'nm-dialog-icon',
 | 
			
		||||
                                           icon_name: 'object-select-symbolic' });
 | 
			
		||||
        this.actor.add(this._selectedIcon);
 | 
			
		||||
        this.add(this._selectedIcon);
 | 
			
		||||
 | 
			
		||||
        this._icons = new St.BoxLayout({ style_class: 'nm-dialog-icons' });
 | 
			
		||||
        this.actor.add(this._icons, { expand: true, x_fill: false, x_align: St.Align.END });
 | 
			
		||||
        this.add(this._icons, { expand: true, x_fill: false, x_align: St.Align.END });
 | 
			
		||||
 | 
			
		||||
        this._secureIcon = new St.Icon({ style_class: 'nm-dialog-icon' });
 | 
			
		||||
        if (this._ap._secType != NMAccessPointSecurity.NONE)
 | 
			
		||||
@@ -668,12 +674,12 @@ var NMWirelessDialogItem = class {
 | 
			
		||||
        else
 | 
			
		||||
            return 'network-wireless-signal-' + signalToIcon(this._ap.strength) + '-symbolic';
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
Signals.addSignalMethods(NMWirelessDialogItem.prototype);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
var NMWirelessDialog = class extends ModalDialog.ModalDialog {
 | 
			
		||||
    constructor(client, device) {
 | 
			
		||||
        super({ styleClass: 'nm-dialog' });
 | 
			
		||||
var NMWirelessDialog = GObject.registerClass(
 | 
			
		||||
class NMWirelessDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
    _init(client, device) {
 | 
			
		||||
        super._init({ styleClass: 'nm-dialog' });
 | 
			
		||||
 | 
			
		||||
        this._client = client;
 | 
			
		||||
        this._device = device;
 | 
			
		||||
@@ -719,9 +725,11 @@ var NMWirelessDialog = class extends ModalDialog.ModalDialog {
 | 
			
		||||
            Main.sessionMode.disconnect(id);
 | 
			
		||||
            this.close();
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        this.connect('destroy', this._onDestroy.bind(this));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    destroy() {
 | 
			
		||||
    _onDestroy() {
 | 
			
		||||
        if (this._apAddedId) {
 | 
			
		||||
            GObject.Object.prototype.disconnect.call(this._device, this._apAddedId);
 | 
			
		||||
            this._apAddedId = 0;
 | 
			
		||||
@@ -747,8 +755,6 @@ var NMWirelessDialog = class extends ModalDialog.ModalDialog {
 | 
			
		||||
            Mainloop.source_remove(this._scanTimeoutId);
 | 
			
		||||
            this._scanTimeoutId = 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        super.destroy();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _onScanTimeout() {
 | 
			
		||||
@@ -1075,7 +1081,7 @@ var NMWirelessDialog = class extends ModalDialog.ModalDialog {
 | 
			
		||||
 | 
			
		||||
            let newPos = Util.insertSorted(this._networks, network, this._networkSortFunction);
 | 
			
		||||
            this._createNetworkItem(network);
 | 
			
		||||
            this._itemBox.insert_child_at_index(network.item.actor, newPos);
 | 
			
		||||
            this._itemBox.insert_child_at_index(network.item, newPos);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._syncView();
 | 
			
		||||
@@ -1093,7 +1099,7 @@ var NMWirelessDialog = class extends ModalDialog.ModalDialog {
 | 
			
		||||
        network.accessPoints.splice(res.ap, 1);
 | 
			
		||||
 | 
			
		||||
        if (network.accessPoints.length == 0) {
 | 
			
		||||
            network.item.actor.destroy();
 | 
			
		||||
            network.item.destroy();
 | 
			
		||||
            this._networks.splice(res.network, 1);
 | 
			
		||||
        } else {
 | 
			
		||||
            network.item.updateBestAP(network.accessPoints[0]);
 | 
			
		||||
@@ -1109,7 +1115,7 @@ var NMWirelessDialog = class extends ModalDialog.ModalDialog {
 | 
			
		||||
 | 
			
		||||
        this._itemBox.remove_all_children();
 | 
			
		||||
        this._networks.forEach(network => {
 | 
			
		||||
            this._itemBox.add_child(network.item.actor);
 | 
			
		||||
            this._itemBox.add_child(network.item);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        adjustment.value = scrollValue;
 | 
			
		||||
@@ -1117,29 +1123,29 @@ var NMWirelessDialog = class extends ModalDialog.ModalDialog {
 | 
			
		||||
 | 
			
		||||
    _selectNetwork(network) {
 | 
			
		||||
        if (this._selectedNetwork)
 | 
			
		||||
            this._selectedNetwork.item.actor.remove_style_pseudo_class('selected');
 | 
			
		||||
            this._selectedNetwork.item.remove_style_pseudo_class('selected');
 | 
			
		||||
 | 
			
		||||
        this._selectedNetwork = network;
 | 
			
		||||
        this._updateSensitivity();
 | 
			
		||||
 | 
			
		||||
        if (this._selectedNetwork)
 | 
			
		||||
            this._selectedNetwork.item.actor.add_style_pseudo_class('selected');
 | 
			
		||||
            this._selectedNetwork.item.add_style_pseudo_class('selected');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _createNetworkItem(network) {
 | 
			
		||||
        network.item = new NMWirelessDialogItem(network);
 | 
			
		||||
        network.item.setActive(network == this._selectedNetwork);
 | 
			
		||||
        network.item.connect('selected', () => {
 | 
			
		||||
            Util.ensureActorVisibleInScrollView(this._scrollView, network.item.actor);
 | 
			
		||||
            Util.ensureActorVisibleInScrollView(this._scrollView, network.item);
 | 
			
		||||
            this._selectNetwork(network);
 | 
			
		||||
        });
 | 
			
		||||
        network.item.actor.connect('destroy', () => {
 | 
			
		||||
        network.item.connect('destroy', () => {
 | 
			
		||||
            let keyFocus = global.stage.key_focus;
 | 
			
		||||
            if (keyFocus && keyFocus.contains(network.item.actor))
 | 
			
		||||
            if (keyFocus && keyFocus.contains(network.item))
 | 
			
		||||
                this._itemBox.grab_key_focus();
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
var NMDeviceWireless = class {
 | 
			
		||||
    constructor(client, device) {
 | 
			
		||||
@@ -1261,7 +1267,7 @@ var NMDeviceWireless = class {
 | 
			
		||||
 | 
			
		||||
    _sync() {
 | 
			
		||||
        this._toggleItem.label.text = this._client.wireless_enabled ? _("Turn Off") : _("Turn On");
 | 
			
		||||
        this._toggleItem.actor.visible = this._client.wireless_hardware_enabled;
 | 
			
		||||
        this._toggleItem.visible = this._client.wireless_hardware_enabled;
 | 
			
		||||
 | 
			
		||||
        this.item.icon.icon_name = this._getMenuIcon();
 | 
			
		||||
        this.item.label.text = this._getStatus();
 | 
			
		||||
@@ -1451,7 +1457,7 @@ var NMVpnSection = class extends NMConnectionSection {
 | 
			
		||||
 | 
			
		||||
    _sync() {
 | 
			
		||||
        let nItems = this._connectionItems.size;
 | 
			
		||||
        this.item.actor.visible = (nItems > 0);
 | 
			
		||||
        this.item.visible = (nItems > 0);
 | 
			
		||||
 | 
			
		||||
        super._sync();
 | 
			
		||||
    }
 | 
			
		||||
@@ -1534,7 +1540,7 @@ var DeviceCategory = class extends PopupMenu.PopupMenuSection {
 | 
			
		||||
 | 
			
		||||
        this._summaryItem.menu.addSettingsAction(_('Network Settings'),
 | 
			
		||||
                                                 'gnome-network-panel.desktop');
 | 
			
		||||
        this._summaryItem.actor.hide();
 | 
			
		||||
        this._summaryItem.hide();
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -1543,7 +1549,7 @@ var DeviceCategory = class extends PopupMenu.PopupMenuSection {
 | 
			
		||||
            (prev, child) => prev + (child.visible ? 1 : 0), 0);
 | 
			
		||||
        this._summaryItem.label.text = this._getSummaryLabel(nDevices);
 | 
			
		||||
        let shouldSummarize = nDevices > MAX_DEVICE_ITEMS;
 | 
			
		||||
        this._summaryItem.actor.visible = shouldSummarize;
 | 
			
		||||
        this._summaryItem.visible = shouldSummarize;
 | 
			
		||||
        this.section.actor.visible = !shouldSummarize;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -1730,14 +1736,24 @@ var NMApplet = class extends PanelMenu.SystemIndicator {
 | 
			
		||||
            this._addDeviceWrapper(wrapper);
 | 
			
		||||
 | 
			
		||||
            this._nmDevices.push(device);
 | 
			
		||||
            if (!skipSyncDeviceNames)
 | 
			
		||||
                this._syncDeviceNames();
 | 
			
		||||
            this._deviceChanged(device, skipSyncDeviceNames);
 | 
			
		||||
 | 
			
		||||
            if (wrapper instanceof NMConnectionSection) {
 | 
			
		||||
                this._connections.forEach(connection => {
 | 
			
		||||
                    wrapper.checkConnection(connection);
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
            device.connect('notify::interface', () => {
 | 
			
		||||
                this._deviceChanged(device, false);
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _deviceChanged(device, skipSyncDeviceNames) {
 | 
			
		||||
        let wrapper = device._delegate;
 | 
			
		||||
 | 
			
		||||
        if (!skipSyncDeviceNames)
 | 
			
		||||
            this._syncDeviceNames();
 | 
			
		||||
 | 
			
		||||
        if (wrapper instanceof NMConnectionSection) {
 | 
			
		||||
            this._connections.forEach(connection => {
 | 
			
		||||
                wrapper.checkConnection(connection);
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -61,6 +61,6 @@ var Indicator = class extends PanelMenu.SystemIndicator {
 | 
			
		||||
                                         : _("Night Light On");
 | 
			
		||||
        this._disableItem.label.text = disabled ? _("Resume")
 | 
			
		||||
                                                : _("Disable Until Tomorrow");
 | 
			
		||||
        this._item.actor.visible = this._indicator.visible = visible;
 | 
			
		||||
        this._item.visible = this._indicator.visible = visible;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -96,11 +96,11 @@ var Indicator = class extends PanelMenu.SystemIndicator {
 | 
			
		||||
        // Do we have batteries or a UPS?
 | 
			
		||||
        let visible = this._proxy.IsPresent;
 | 
			
		||||
        if (visible) {
 | 
			
		||||
            this._item.actor.show();
 | 
			
		||||
            this._item.show();
 | 
			
		||||
            this._percentageLabel.visible = this._desktopSettings.get_boolean(SHOW_BATTERY_PERCENTAGE);
 | 
			
		||||
        } else {
 | 
			
		||||
            // If there's no battery, then we use the power icon.
 | 
			
		||||
            this._item.actor.hide();
 | 
			
		||||
            this._item.hide();
 | 
			
		||||
            this._indicator.icon_name = 'system-shutdown-symbolic';
 | 
			
		||||
            this._percentageLabel.hide();
 | 
			
		||||
            return;
 | 
			
		||||
 
 | 
			
		||||
@@ -53,10 +53,10 @@ var RemoteAccessApplet = class extends PanelMenu.SystemIndicator {
 | 
			
		||||
    _sync() {
 | 
			
		||||
        if (this._handles.size == 0) {
 | 
			
		||||
            this._indicator.visible = false;
 | 
			
		||||
            this._item.actor.visible = false;
 | 
			
		||||
            this._item.visible = false;
 | 
			
		||||
        } else {
 | 
			
		||||
            this._indicator.visible = true;
 | 
			
		||||
            this._item.actor.visible = true;
 | 
			
		||||
            this._item.visible = true;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -97,7 +97,7 @@ var Indicator = class extends PanelMenu.SystemIndicator {
 | 
			
		||||
        let showAirplaneMode = this._manager.shouldShowAirplaneMode;
 | 
			
		||||
 | 
			
		||||
        this._indicator.visible = (airplaneMode && showAirplaneMode);
 | 
			
		||||
        this._item.actor.visible = (airplaneMode && showAirplaneMode);
 | 
			
		||||
        this._item.visible = (airplaneMode && showAirplaneMode);
 | 
			
		||||
        this._offItem.setSensitive(!hwAirplaneMode);
 | 
			
		||||
 | 
			
		||||
        if (hwAirplaneMode)
 | 
			
		||||
 
 | 
			
		||||
@@ -116,10 +116,10 @@ var Indicator = class extends PanelMenu.SystemIndicator {
 | 
			
		||||
 | 
			
		||||
        this._createSubMenu();
 | 
			
		||||
 | 
			
		||||
        this._loginScreenItem.actor.connect('notify::visible',
 | 
			
		||||
                                            () => { this._updateMultiUser(); });
 | 
			
		||||
        this._logoutItem.actor.connect('notify::visible',
 | 
			
		||||
                                       () => { this._updateMultiUser(); });
 | 
			
		||||
        this._loginScreenItem.connect('notify::visible',
 | 
			
		||||
                                      () => { this._updateMultiUser(); });
 | 
			
		||||
        this._logoutItem.connect('notify::visible',
 | 
			
		||||
                                 () => { this._updateMultiUser(); });
 | 
			
		||||
        // Whether shutdown is available or not depends on both lockdown
 | 
			
		||||
        // settings (disable-log-out) and Polkit policy - the latter doesn't
 | 
			
		||||
        // notify, so we update the menu item each time the menu opens or
 | 
			
		||||
@@ -142,7 +142,7 @@ var Indicator = class extends PanelMenu.SystemIndicator {
 | 
			
		||||
                       this._lockScreenAction.visible ||
 | 
			
		||||
                       this._altSwitcher.actor.visible);
 | 
			
		||||
 | 
			
		||||
        this._actionsItem.actor.visible = visible;
 | 
			
		||||
        this.buttonGroup.visible = visible;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _sessionUpdated() {
 | 
			
		||||
@@ -150,10 +150,10 @@ var Indicator = class extends PanelMenu.SystemIndicator {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _updateMultiUser() {
 | 
			
		||||
        let hasSwitchUser = this._loginScreenItem.actor.visible;
 | 
			
		||||
        let hasLogout = this._logoutItem.actor.visible;
 | 
			
		||||
        let hasSwitchUser = this._loginScreenItem.visible;
 | 
			
		||||
        let hasLogout = this._logoutItem.visible;
 | 
			
		||||
 | 
			
		||||
        this._switchUserSubMenu.actor.visible = hasSwitchUser || hasLogout;
 | 
			
		||||
        this._switchUserSubMenu.visible = hasSwitchUser || hasLogout;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _updateSwitchUserSubMenu() {
 | 
			
		||||
@@ -208,7 +208,7 @@ var Indicator = class extends PanelMenu.SystemIndicator {
 | 
			
		||||
        this._switchUserSubMenu.menu.addMenuItem(item);
 | 
			
		||||
        this._loginScreenItem = item;
 | 
			
		||||
        this._systemActions.bind_property('can-switch-user',
 | 
			
		||||
                                          this._loginScreenItem.actor,
 | 
			
		||||
                                          this._loginScreenItem,
 | 
			
		||||
                                          'visible',
 | 
			
		||||
                                          bindFlags);
 | 
			
		||||
 | 
			
		||||
@@ -220,7 +220,7 @@ var Indicator = class extends PanelMenu.SystemIndicator {
 | 
			
		||||
        this._switchUserSubMenu.menu.addMenuItem(item);
 | 
			
		||||
        this._logoutItem = item;
 | 
			
		||||
        this._systemActions.bind_property('can-logout',
 | 
			
		||||
                                          this._logoutItem.actor,
 | 
			
		||||
                                          this._logoutItem,
 | 
			
		||||
                                          'visible',
 | 
			
		||||
                                          bindFlags);
 | 
			
		||||
 | 
			
		||||
@@ -236,7 +236,7 @@ var Indicator = class extends PanelMenu.SystemIndicator {
 | 
			
		||||
 | 
			
		||||
        item = new PopupMenu.PopupBaseMenuItem({ reactive: false,
 | 
			
		||||
                                                 can_focus: false });
 | 
			
		||||
        this.buttonGroup = item.actor;
 | 
			
		||||
        this.buttonGroup = item;
 | 
			
		||||
 | 
			
		||||
        let app = this._settingsApp = Shell.AppSystem.get_default().lookup_app(
 | 
			
		||||
            'gnome-control-center.desktop'
 | 
			
		||||
@@ -251,14 +251,14 @@ var Indicator = class extends PanelMenu.SystemIndicator {
 | 
			
		||||
            log('Missing required core component Settings, expect trouble…');
 | 
			
		||||
            this._settingsAction = new St.Widget();
 | 
			
		||||
        }
 | 
			
		||||
        item.actor.add(this._settingsAction, { expand: true, x_fill: false });
 | 
			
		||||
        item.add(this._settingsAction, { expand: true, x_fill: false });
 | 
			
		||||
 | 
			
		||||
        this._orientationLockAction = this._createActionButton('', _("Orientation Lock"));
 | 
			
		||||
        this._orientationLockAction.connect('clicked', () => {
 | 
			
		||||
            this.menu.itemActivated(BoxPointer.PopupAnimation.NONE),
 | 
			
		||||
            this._systemActions.activateLockOrientation();
 | 
			
		||||
        });
 | 
			
		||||
        item.actor.add(this._orientationLockAction, { expand: true, x_fill: false });
 | 
			
		||||
        item.add(this._orientationLockAction, { expand: true, x_fill: false });
 | 
			
		||||
        this._systemActions.bind_property('can-lock-orientation',
 | 
			
		||||
                                          this._orientationLockAction,
 | 
			
		||||
                                          'visible',
 | 
			
		||||
@@ -273,7 +273,7 @@ var Indicator = class extends PanelMenu.SystemIndicator {
 | 
			
		||||
            this.menu.itemActivated(BoxPointer.PopupAnimation.NONE);
 | 
			
		||||
            this._systemActions.activateLockScreen();
 | 
			
		||||
        });
 | 
			
		||||
        item.actor.add(this._lockScreenAction, { expand: true, x_fill: false });
 | 
			
		||||
        item.add(this._lockScreenAction, { expand: true, x_fill: false });
 | 
			
		||||
        this._systemActions.bind_property('can-lock-screen',
 | 
			
		||||
                                          this._lockScreenAction,
 | 
			
		||||
                                          'visible',
 | 
			
		||||
@@ -300,9 +300,8 @@ var Indicator = class extends PanelMenu.SystemIndicator {
 | 
			
		||||
                                          bindFlags);
 | 
			
		||||
 | 
			
		||||
        this._altSwitcher = new AltSwitcher(this._powerOffAction, this._suspendAction);
 | 
			
		||||
        item.actor.add(this._altSwitcher.actor, { expand: true, x_fill: false });
 | 
			
		||||
        item.add(this._altSwitcher.actor, { expand: true, x_fill: false });
 | 
			
		||||
 | 
			
		||||
        this._actionsItem = item;
 | 
			
		||||
        this.menu.addMenuItem(item);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -41,12 +41,12 @@ var StreamSlider = class {
 | 
			
		||||
        this._slider.connect('drag-end', this._notifyVolumeChange.bind(this));
 | 
			
		||||
 | 
			
		||||
        this._icon = new St.Icon({ style_class: 'popup-menu-icon' });
 | 
			
		||||
        this.item.actor.add(this._icon);
 | 
			
		||||
        this.item.actor.add(this._slider.actor, { expand: true });
 | 
			
		||||
        this.item.actor.connect('button-press-event', (actor, event) => {
 | 
			
		||||
        this.item.add(this._icon);
 | 
			
		||||
        this.item.add(this._slider.actor, { expand: true });
 | 
			
		||||
        this.item.connect('button-press-event', (actor, event) => {
 | 
			
		||||
            return this._slider.startDragging(event);
 | 
			
		||||
        });
 | 
			
		||||
        this.item.actor.connect('key-press-event', (actor, event) => {
 | 
			
		||||
        this.item.connect('key-press-event', (actor, event) => {
 | 
			
		||||
            return this._slider.onKeyPressEvent(actor, event);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
@@ -93,7 +93,7 @@ var StreamSlider = class {
 | 
			
		||||
 | 
			
		||||
    _updateVisibility() {
 | 
			
		||||
        let visible = this._shouldBeVisible();
 | 
			
		||||
        this.item.actor.visible = visible;
 | 
			
		||||
        this.item.visible = visible;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    scroll(event) {
 | 
			
		||||
 
 | 
			
		||||
@@ -30,12 +30,10 @@ function primaryModifier(mask) {
 | 
			
		||||
    return primary;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var SwitcherPopup = GObject.registerClass(
 | 
			
		||||
class SwitcherPopup extends St.Widget {
 | 
			
		||||
var SwitcherPopup = GObject.registerClass({
 | 
			
		||||
    GTypeFlags: GObject.TypeFlags.ABSTRACT
 | 
			
		||||
}, class SwitcherPopup extends St.Widget {
 | 
			
		||||
    _init(items) {
 | 
			
		||||
        if (new.target === SwitcherPopup)
 | 
			
		||||
            throw new TypeError('Cannot instantiate abstract class ' + new.target.name);
 | 
			
		||||
 | 
			
		||||
        super._init({ style_class: 'switcher-popup',
 | 
			
		||||
                      reactive: true,
 | 
			
		||||
                      visible: false });
 | 
			
		||||
@@ -164,7 +162,7 @@ class SwitcherPopup extends St.Widget {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _keyPressHandler(keysym, action) {
 | 
			
		||||
        throw new Error('Not implemented');
 | 
			
		||||
        throw new GObject.NotImplementedError(`_keyPressHandler in ${this.constructor.name}`);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _keyPressEvent(actor, event) {
 | 
			
		||||
 
 | 
			
		||||
@@ -152,7 +152,7 @@ function registerSpecialPropertySplitter(name, splitFunction, parameters) {
 | 
			
		||||
// Tweener to a Clutter.TimeLine. Now, Clutter.Timeline itself isn't a
 | 
			
		||||
// whole lot more sophisticated than a simple timeout at a fixed frame
 | 
			
		||||
// rate, but at least it knows how to drop frames. (See
 | 
			
		||||
// HippoAnimationManager for a more sophisticated view of continous
 | 
			
		||||
// HippoAnimationManager for a more sophisticated view of continuous
 | 
			
		||||
// time updates; even better is to pay attention to the vertical
 | 
			
		||||
// vblank and sync to that when possible.)
 | 
			
		||||
//
 | 
			
		||||
 
 | 
			
		||||
@@ -40,9 +40,10 @@ const GSD_WACOM_OBJECT_PATH = '/org/gnome/SettingsDaemon/Wacom';
 | 
			
		||||
const GsdWacomIface = loadInterfaceXML('org.gnome.SettingsDaemon.Wacom');
 | 
			
		||||
const GsdWacomProxy = Gio.DBusProxy.makeProxyWrapper(GsdWacomIface);
 | 
			
		||||
 | 
			
		||||
var DisplayChangeDialog = class extends ModalDialog.ModalDialog {
 | 
			
		||||
    constructor(wm) {
 | 
			
		||||
        super({ styleClass: 'prompt-dialog' });
 | 
			
		||||
var DisplayChangeDialog = GObject.registerClass(
 | 
			
		||||
class DisplayChangeDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
    _init(wm) {
 | 
			
		||||
        super._init({ styleClass: 'prompt-dialog' });
 | 
			
		||||
 | 
			
		||||
        this._wm = wm;
 | 
			
		||||
 | 
			
		||||
@@ -59,7 +60,7 @@ var DisplayChangeDialog = class extends ModalDialog.ModalDialog {
 | 
			
		||||
                               { x_fill: true,
 | 
			
		||||
                                 y_fill: true });
 | 
			
		||||
 | 
			
		||||
        /* Translators: this and the following message should be limited in lenght,
 | 
			
		||||
        /* Translators: this and the following message should be limited in length,
 | 
			
		||||
           to avoid ellipsizing the labels.
 | 
			
		||||
        */
 | 
			
		||||
        this._cancelButton = this.addButton({ label: _("Revert Settings"),
 | 
			
		||||
@@ -111,7 +112,7 @@ var DisplayChangeDialog = class extends ModalDialog.ModalDialog {
 | 
			
		||||
        this._wm.complete_display_change(true);
 | 
			
		||||
        this.close();
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
var WindowDimmer = class {
 | 
			
		||||
    constructor(actor) {
 | 
			
		||||
@@ -456,13 +457,28 @@ var TilePreview = class {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var TouchpadWorkspaceSwitchAction = class {
 | 
			
		||||
    constructor(actor) {
 | 
			
		||||
    constructor(actor, allowedModes) {
 | 
			
		||||
        this._allowedModes = allowedModes;
 | 
			
		||||
        this._dx = 0;
 | 
			
		||||
        this._dy = 0;
 | 
			
		||||
        this._enabled = true;
 | 
			
		||||
        actor.connect('captured-event', this._handleEvent.bind(this));
 | 
			
		||||
	this._touchpadSettings = new Gio.Settings({schema_id: 'org.gnome.desktop.peripherals.touchpad'});
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get enabled() {
 | 
			
		||||
        return this._enabled;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    set enabled(enabled) {
 | 
			
		||||
        if (this._enabled == enabled)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        this._enabled = enabled;
 | 
			
		||||
        if (!enabled)
 | 
			
		||||
            this.emit('cancel');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _checkActivated() {
 | 
			
		||||
        let dir;
 | 
			
		||||
 | 
			
		||||
@@ -482,15 +498,16 @@ var TouchpadWorkspaceSwitchAction = class {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _handleEvent(actor, event) {
 | 
			
		||||
        let allowedModes = Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW;
 | 
			
		||||
 | 
			
		||||
        if (event.type() != Clutter.EventType.TOUCHPAD_SWIPE)
 | 
			
		||||
            return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
 | 
			
		||||
        if (event.get_touchpad_gesture_finger_count() != 4)
 | 
			
		||||
            return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
 | 
			
		||||
        if ((allowedModes & Main.actionMode) == 0)
 | 
			
		||||
        if ((this._allowedModes & Main.actionMode) == 0)
 | 
			
		||||
            return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
 | 
			
		||||
        if (!this._enabled)
 | 
			
		||||
            return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
 | 
			
		||||
        if (event.get_gesture_phase() == Clutter.TouchpadGesturePhase.UPDATE) {
 | 
			
		||||
@@ -523,10 +540,11 @@ var WorkspaceSwitchAction = GObject.registerClass({
 | 
			
		||||
               'motion':    { param_types: [GObject.TYPE_DOUBLE, GObject.TYPE_DOUBLE] },
 | 
			
		||||
               'cancel':    { param_types: [] }},
 | 
			
		||||
}, class WorkspaceSwitchAction extends Clutter.SwipeAction {
 | 
			
		||||
    _init() {
 | 
			
		||||
    _init(allowedModes) {
 | 
			
		||||
        super._init();
 | 
			
		||||
        this.set_n_touch_points(4);
 | 
			
		||||
        this._swept = false;
 | 
			
		||||
        this._allowedModes = allowedModes;
 | 
			
		||||
 | 
			
		||||
        global.display.connect('grab-op-begin', () => {
 | 
			
		||||
            this.cancel();
 | 
			
		||||
@@ -534,14 +552,12 @@ var WorkspaceSwitchAction = GObject.registerClass({
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    vfunc_gesture_prepare(actor) {
 | 
			
		||||
        let allowedModes = Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW;
 | 
			
		||||
 | 
			
		||||
        this._swept = false;
 | 
			
		||||
 | 
			
		||||
        if (!super.vfunc_gesture_prepare(actor))
 | 
			
		||||
            return false;
 | 
			
		||||
 | 
			
		||||
        return (allowedModes & Main.actionMode);
 | 
			
		||||
        return (this._allowedModes & Main.actionMode);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    vfunc_gesture_progress(actor) {
 | 
			
		||||
@@ -1043,14 +1059,15 @@ var WindowManager = class {
 | 
			
		||||
        global.workspace_manager.override_workspace_layout(Meta.DisplayCorner.TOPLEFT,
 | 
			
		||||
                                                           false, -1, 1);
 | 
			
		||||
 | 
			
		||||
        let gesture = new WorkspaceSwitchAction();
 | 
			
		||||
        let allowedModes = Shell.ActionMode.NORMAL;
 | 
			
		||||
        let gesture = new WorkspaceSwitchAction(allowedModes);
 | 
			
		||||
        gesture.connect('motion', this._switchWorkspaceMotion.bind(this));
 | 
			
		||||
        gesture.connect('activated', this._actionSwitchWorkspace.bind(this));
 | 
			
		||||
        gesture.connect('cancel', this._switchWorkspaceCancel.bind(this));
 | 
			
		||||
        global.stage.add_action(gesture);
 | 
			
		||||
 | 
			
		||||
        // This is not a normal Clutter.GestureAction, doesn't need add_action()
 | 
			
		||||
        gesture = new TouchpadWorkspaceSwitchAction(global.stage);
 | 
			
		||||
        gesture = new TouchpadWorkspaceSwitchAction(global.stage, allowedModes);
 | 
			
		||||
        gesture.connect('motion', this._switchWorkspaceMotion.bind(this));
 | 
			
		||||
        gesture.connect('activated', this._actionSwitchWorkspace.bind(this));
 | 
			
		||||
        gesture.connect('cancel', this._switchWorkspaceCancel.bind(this));
 | 
			
		||||
@@ -1202,6 +1219,10 @@ var WindowManager = class {
 | 
			
		||||
            // Same for OR windows
 | 
			
		||||
            if (window.is_override_redirect())
 | 
			
		||||
                return;
 | 
			
		||||
            // Sticky windows don't need moving, in fact moving would
 | 
			
		||||
            // unstick them
 | 
			
		||||
            if (window.on_all_workspaces)
 | 
			
		||||
                return;
 | 
			
		||||
            // Windows on workspaces below pos don't need moving
 | 
			
		||||
            let index = window.get_workspace().index();
 | 
			
		||||
            if (index < pos)
 | 
			
		||||
@@ -1468,8 +1489,13 @@ var WindowManager = class {
 | 
			
		||||
        if (this._clearAnimationInfo(actor))
 | 
			
		||||
            this._shellwm.completed_size_change(actor);
 | 
			
		||||
 | 
			
		||||
        let destroyId = actor.connect('destroy', () => {
 | 
			
		||||
            this._clearAnimationInfo(actor);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        actor.__animationInfo = { clone: actorClone,
 | 
			
		||||
                                  oldRect: oldFrameRect };
 | 
			
		||||
                                  oldRect: oldFrameRect,
 | 
			
		||||
                                  destroyId: destroyId };
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _sizeChangedWindow(shellwm, actor) {
 | 
			
		||||
@@ -1530,6 +1556,7 @@ var WindowManager = class {
 | 
			
		||||
    _clearAnimationInfo(actor) {
 | 
			
		||||
        if (actor.__animationInfo) {
 | 
			
		||||
            actor.__animationInfo.clone.destroy();
 | 
			
		||||
            actor.disconnect(actor.__animationInfo.destroyId);
 | 
			
		||||
            delete actor.__animationInfo;
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
@@ -1844,17 +1871,25 @@ var WindowManager = class {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _getPositionForDirection(direction) {
 | 
			
		||||
    _getPositionForDirection(direction, fromWs, toWs) {
 | 
			
		||||
        let xDest = 0, yDest = 0;
 | 
			
		||||
 | 
			
		||||
        let oldWsIsFullscreen = fromWs.list_windows().some(w => w.is_fullscreen());
 | 
			
		||||
        let newWsIsFullscreen = toWs.list_windows().some(w => w.is_fullscreen());
 | 
			
		||||
 | 
			
		||||
        // We have to shift windows up or down by the height of the panel to prevent having a
 | 
			
		||||
        // visible gap between the windows while switching workspaces. Since fullscreen windows
 | 
			
		||||
        // hide the panel, they don't need to be shifted up or down.
 | 
			
		||||
        let shiftHeight = Main.panel.height;
 | 
			
		||||
 | 
			
		||||
        if (direction == Meta.MotionDirection.UP ||
 | 
			
		||||
            direction == Meta.MotionDirection.UP_LEFT ||
 | 
			
		||||
            direction == Meta.MotionDirection.UP_RIGHT)
 | 
			
		||||
            yDest = -global.screen_height + Main.panel.height;
 | 
			
		||||
            yDest = -global.screen_height + (oldWsIsFullscreen ? 0 : shiftHeight);
 | 
			
		||||
        else if (direction == Meta.MotionDirection.DOWN ||
 | 
			
		||||
            direction == Meta.MotionDirection.DOWN_LEFT ||
 | 
			
		||||
            direction == Meta.MotionDirection.DOWN_RIGHT)
 | 
			
		||||
            yDest = global.screen_height - Main.panel.height;
 | 
			
		||||
            yDest = global.screen_height - (newWsIsFullscreen ? 0 : shiftHeight);
 | 
			
		||||
 | 
			
		||||
        if (direction == Meta.MotionDirection.LEFT ||
 | 
			
		||||
            direction == Meta.MotionDirection.UP_LEFT ||
 | 
			
		||||
@@ -1912,7 +1947,7 @@ var WindowManager = class {
 | 
			
		||||
            switchData.container.add_actor(info.actor);
 | 
			
		||||
            info.actor.raise_top();
 | 
			
		||||
 | 
			
		||||
            let [x, y] = this._getPositionForDirection(dir);
 | 
			
		||||
            let [x, y] = this._getPositionForDirection(dir, curWs, ws);
 | 
			
		||||
            info.actor.set_position(x, y);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -1998,7 +2033,11 @@ var WindowManager = class {
 | 
			
		||||
 | 
			
		||||
        this._switchData.inProgress = true;
 | 
			
		||||
 | 
			
		||||
        let [xDest, yDest] = this._getPositionForDirection(direction);
 | 
			
		||||
        let workspaceManager = global.workspace_manager;
 | 
			
		||||
        let fromWs = workspaceManager.get_workspace_by_index(from);
 | 
			
		||||
        let toWs = workspaceManager.get_workspace_by_index(to);
 | 
			
		||||
 | 
			
		||||
        let [xDest, yDest] = this._getPositionForDirection(direction, fromWs, toWs);
 | 
			
		||||
 | 
			
		||||
        /* @direction is the direction that the "camera" moves, so the
 | 
			
		||||
         * screen contents have to move one screen's worth in the
 | 
			
		||||
 
 | 
			
		||||
@@ -173,7 +173,7 @@ var WindowMenu = class extends PopupMenu.PopupMenu {
 | 
			
		||||
 | 
			
		||||
var WindowMenuManager = class {
 | 
			
		||||
    constructor() {
 | 
			
		||||
        this._manager = new PopupMenu.PopupMenuManager({ actor: Main.layoutManager.dummyCursor });
 | 
			
		||||
        this._manager = new PopupMenu.PopupMenuManager(Main.layoutManager.dummyCursor);
 | 
			
		||||
 | 
			
		||||
        this._sourceActor = new St.Widget({ reactive: true, visible: false });
 | 
			
		||||
        this._sourceActor.connect('button-press-event', () => {
 | 
			
		||||
 
 | 
			
		||||
@@ -786,8 +786,8 @@ var WindowPositionFlags = {
 | 
			
		||||
 | 
			
		||||
var LayoutStrategy = class {
 | 
			
		||||
    constructor(monitor, rowSpacing, columnSpacing) {
 | 
			
		||||
        if (new.target === LayoutStrategy)
 | 
			
		||||
            throw new TypeError('Cannot instantiate abstract type ' + new.target.name);
 | 
			
		||||
        if (this.constructor === LayoutStrategy)
 | 
			
		||||
            throw new TypeError(`Cannot instantiate abstract type ${this.constructor.name}`);
 | 
			
		||||
 | 
			
		||||
        this._monitor = monitor;
 | 
			
		||||
        this._rowSpacing = rowSpacing;
 | 
			
		||||
@@ -813,7 +813,7 @@ var LayoutStrategy = class {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Computes and returns an individual scaling factor for @window,
 | 
			
		||||
    // to be applied in addition to the overal layout scale.
 | 
			
		||||
    // to be applied in addition to the overall layout scale.
 | 
			
		||||
    _computeWindowScale(window) {
 | 
			
		||||
        // Since we align windows next to each other, the height of the
 | 
			
		||||
        // thumbnails is much more important to preserve than the width of
 | 
			
		||||
@@ -835,7 +835,7 @@ var LayoutStrategy = class {
 | 
			
		||||
    // (optionally) for each row in @layout.rows. This method is
 | 
			
		||||
    // intended to be called by subclasses.
 | 
			
		||||
    _computeRowSizes(layout) {
 | 
			
		||||
        throw new Error('_computeRowSizes not implemented');
 | 
			
		||||
        throw new GObject.NotImplementedError(`_computeRowSizes in ${this.constructor.name}`);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Compute strategy-specific window slots for each window in
 | 
			
		||||
@@ -848,7 +848,7 @@ var LayoutStrategy = class {
 | 
			
		||||
    //  * gridHeight - The totial height used by the grid, unscaled, unspaced.
 | 
			
		||||
    //  * rows - A list of rows, which should be instantiated by _newRow.
 | 
			
		||||
    computeLayout(windows, layout) {
 | 
			
		||||
        throw new Error('computeLayout not implemented');
 | 
			
		||||
        throw new GObject.NotImplementedError(`computeLayout in ${this.constructor.name}`);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Given @layout, compute the overall scale and space of the layout.
 | 
			
		||||
@@ -1266,7 +1266,7 @@ var Workspace = class {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // We will reposition windows anyway when enter again overview or when ending the windows
 | 
			
		||||
        // animations whith fade animation.
 | 
			
		||||
        // animations with fade animation.
 | 
			
		||||
        // In this way we avoid unwanted animations of windows repositioning while
 | 
			
		||||
        // animating overview.
 | 
			
		||||
        if (this.leavingOverview || this._animatingWindowsFade)
 | 
			
		||||
@@ -1886,10 +1886,10 @@ var Workspace = class {
 | 
			
		||||
            // Win win -- better scale and better space
 | 
			
		||||
            return true;
 | 
			
		||||
        } else if (newLayout.scale > oldLayout.scale && newLayout.space <= oldLayout.space) {
 | 
			
		||||
            // Keep new layout only if scale gain outweights aspect space loss
 | 
			
		||||
            // Keep new layout only if scale gain outweighs aspect space loss
 | 
			
		||||
            return scalePower > spacePower;
 | 
			
		||||
        } else if (newLayout.scale <= oldLayout.scale && newLayout.space > oldLayout.space) {
 | 
			
		||||
            // Keep new layout only if aspect space gain outweights scale loss
 | 
			
		||||
            // Keep new layout only if aspect space gain outweighs scale loss
 | 
			
		||||
            return spacePower > scalePower;
 | 
			
		||||
        } else {
 | 
			
		||||
            // Lose -- worse scale and space
 | 
			
		||||
 
 | 
			
		||||
@@ -85,8 +85,6 @@ class WorkspaceSwitcherPopup extends St.Widget {
 | 
			
		||||
                      height: global.screen_height,
 | 
			
		||||
                      style_class: 'workspace-switcher-group' });
 | 
			
		||||
 | 
			
		||||
        this.actor = this;
 | 
			
		||||
 | 
			
		||||
        Main.uiGroup.add_actor(this);
 | 
			
		||||
 | 
			
		||||
        this._timeoutId = 0;
 | 
			
		||||
@@ -142,7 +140,7 @@ class WorkspaceSwitcherPopup extends St.Widget {
 | 
			
		||||
                                            time: ANIMATION_TIME,
 | 
			
		||||
                                            transition: 'easeOutQuad'
 | 
			
		||||
                                           });
 | 
			
		||||
        this.actor.show();
 | 
			
		||||
        this.show();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    display(direction, activeWorkspaceIndex) {
 | 
			
		||||
 
 | 
			
		||||
@@ -601,8 +601,7 @@ class ThumbnailsBox extends St.Widget {
 | 
			
		||||
                      style_class: 'workspace-thumbnails',
 | 
			
		||||
                      request_mode: Clutter.RequestMode.WIDTH_FOR_HEIGHT });
 | 
			
		||||
 | 
			
		||||
        this.actor = this;
 | 
			
		||||
        this.actor._delegate = this;
 | 
			
		||||
        this._delegate = this;
 | 
			
		||||
 | 
			
		||||
        let indicator = new St.Bin({ style_class: 'workspace-thumbnail-indicator' });
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,11 @@
 | 
			
		||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 | 
			
		||||
 | 
			
		||||
const { Clutter, Gio, GObject, Meta, St } = imports.gi;
 | 
			
		||||
const { Clutter, Gio, GObject, Meta, Shell, St } = imports.gi;
 | 
			
		||||
const Signals = imports.signals;
 | 
			
		||||
 | 
			
		||||
const Main = imports.ui.main;
 | 
			
		||||
const Tweener = imports.ui.tweener;
 | 
			
		||||
const WindowManager = imports.ui.windowManager;
 | 
			
		||||
const Workspace = imports.ui.workspace;
 | 
			
		||||
 | 
			
		||||
var WORKSPACE_SWITCH_TIME = 0.25;
 | 
			
		||||
@@ -82,7 +83,8 @@ var WorkspacesView = class extends WorkspacesViewBase {
 | 
			
		||||
 | 
			
		||||
        this._animating = false; // tweening
 | 
			
		||||
        this._scrolling = false; // swipe-scrolling
 | 
			
		||||
        this._animatingScroll = false; // programatically updating the adjustment
 | 
			
		||||
        this._gestureActive = false; // touch(pad) gestures
 | 
			
		||||
        this._animatingScroll = false; // programmatically updating the adjustment
 | 
			
		||||
 | 
			
		||||
        let activeWorkspaceIndex = workspaceManager.get_active_workspace_index();
 | 
			
		||||
        this.scrollAdjustment = new St.Adjustment({ value: activeWorkspaceIndex,
 | 
			
		||||
@@ -211,7 +213,7 @@ var WorkspacesView = class extends WorkspacesViewBase {
 | 
			
		||||
 | 
			
		||||
        for (let w = 0; w < this._workspaces.length; w++) {
 | 
			
		||||
            let workspace = this._workspaces[w];
 | 
			
		||||
            if (this._animating || this._scrolling) {
 | 
			
		||||
            if (this._animating || this._scrolling || this._gestureActive) {
 | 
			
		||||
                workspace.actor.show();
 | 
			
		||||
            } else {
 | 
			
		||||
                if (this._inDrag)
 | 
			
		||||
@@ -223,7 +225,7 @@ var WorkspacesView = class extends WorkspacesViewBase {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _updateScrollAdjustment(index) {
 | 
			
		||||
        if (this._scrolling)
 | 
			
		||||
        if (this._scrolling || this._gestureActive)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        this._animatingScroll = true;
 | 
			
		||||
@@ -300,6 +302,18 @@ var WorkspacesView = class extends WorkspacesViewBase {
 | 
			
		||||
        this._updateVisibility();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    startTouchGesture() {
 | 
			
		||||
        this._gestureActive = true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    endTouchGesture() {
 | 
			
		||||
        this._gestureActive = false;
 | 
			
		||||
 | 
			
		||||
        // Make sure title captions etc are shown as necessary
 | 
			
		||||
        this._scrollToActive();
 | 
			
		||||
        this._updateVisibility();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // sync the workspaces' positions to the value of the scroll adjustment
 | 
			
		||||
    // and change the active workspace if appropriate
 | 
			
		||||
    _onScroll(adj) {
 | 
			
		||||
@@ -310,7 +324,7 @@ var WorkspacesView = class extends WorkspacesViewBase {
 | 
			
		||||
        let active = workspaceManager.get_active_workspace_index();
 | 
			
		||||
        let current = Math.round(adj.value);
 | 
			
		||||
 | 
			
		||||
        if (active != current) {
 | 
			
		||||
        if (active != current && !this._gestureActive) {
 | 
			
		||||
            if (!this._workspaces[current]) {
 | 
			
		||||
                // The current workspace was destroyed. This could happen
 | 
			
		||||
                // when you are on the last empty workspace, and consolidate
 | 
			
		||||
@@ -391,6 +405,12 @@ var ExtraWorkspaceView = class extends WorkspacesViewBase {
 | 
			
		||||
 | 
			
		||||
    endSwipeScroll() {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    startTouchGesture() {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    endTouchGesture() {
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var DelegateFocusNavigator = GObject.registerClass(
 | 
			
		||||
@@ -430,35 +450,46 @@ var WorkspacesDisplay = class {
 | 
			
		||||
                    return false;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            for (let i = 0; i < this._workspacesViews.length; i++)
 | 
			
		||||
                this._workspacesViews[i].startSwipeScroll();
 | 
			
		||||
            this._startSwipeScroll();
 | 
			
		||||
            return true;
 | 
			
		||||
        });
 | 
			
		||||
        panAction.connect('gesture-cancel', () => {
 | 
			
		||||
            clickAction.release();
 | 
			
		||||
            for (let i = 0; i < this._workspacesViews.length; i++)
 | 
			
		||||
                this._workspacesViews[i].endSwipeScroll();
 | 
			
		||||
            this._endSwipeScroll();
 | 
			
		||||
        });
 | 
			
		||||
        panAction.connect('gesture-end', () => {
 | 
			
		||||
            clickAction.release();
 | 
			
		||||
            for (let i = 0; i < this._workspacesViews.length; i++)
 | 
			
		||||
                this._workspacesViews[i].endSwipeScroll();
 | 
			
		||||
            this._endSwipeScroll();
 | 
			
		||||
        });
 | 
			
		||||
        Main.overview.addAction(panAction);
 | 
			
		||||
        this.actor.bind_property('mapped', panAction, 'enabled', GObject.BindingFlags.SYNC_CREATE);
 | 
			
		||||
 | 
			
		||||
        let allowedModes = Shell.ActionMode.OVERVIEW;
 | 
			
		||||
        let switchGesture = new WindowManager.WorkspaceSwitchAction(allowedModes);
 | 
			
		||||
        switchGesture.connect('motion', this._onSwitchWorkspaceMotion.bind(this));
 | 
			
		||||
        switchGesture.connect('activated', this._onSwitchWorkspaceActivated.bind(this));
 | 
			
		||||
        switchGesture.connect('cancel', this._endTouchGesture.bind(this));
 | 
			
		||||
        Main.overview.addAction(switchGesture);
 | 
			
		||||
        this.actor.bind_property('mapped', switchGesture, 'enabled', GObject.BindingFlags.SYNC_CREATE);
 | 
			
		||||
 | 
			
		||||
        switchGesture = new WindowManager.TouchpadWorkspaceSwitchAction(global.stage, allowedModes);
 | 
			
		||||
        switchGesture.connect('motion', this._onSwitchWorkspaceMotion.bind(this));
 | 
			
		||||
        switchGesture.connect('activated', this._onSwitchWorkspaceActivated.bind(this));
 | 
			
		||||
        switchGesture.connect('cancel', this._endTouchGesture.bind(this));
 | 
			
		||||
        this.actor.connect('notify::mapped', () => {
 | 
			
		||||
            switchGesture.enabled = this.actor.mapped;
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        this._primaryIndex = Main.layoutManager.primaryIndex;
 | 
			
		||||
 | 
			
		||||
        this._workspacesViews = [];
 | 
			
		||||
        this._primaryScrollAdjustment = null;
 | 
			
		||||
        switchGesture.enabled = this.actor.mapped;
 | 
			
		||||
 | 
			
		||||
        this._settings = new Gio.Settings({ schema_id: MUTTER_SCHEMA });
 | 
			
		||||
        this._settings.connect('changed::workspaces-only-on-primary',
 | 
			
		||||
                               this._workspacesOnlyOnPrimaryChanged.bind(this));
 | 
			
		||||
        this._workspacesOnlyOnPrimaryChanged();
 | 
			
		||||
 | 
			
		||||
        this._switchWorkspaceNotifyId = 0;
 | 
			
		||||
 | 
			
		||||
        this._notifyOpacityId = 0;
 | 
			
		||||
        this._restackedNotifyId = 0;
 | 
			
		||||
        this._scrollEventId = 0;
 | 
			
		||||
@@ -474,6 +505,47 @@ var WorkspacesDisplay = class {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _startSwipeScroll() {
 | 
			
		||||
        for (let i = 0; i < this._workspacesViews.length; i++)
 | 
			
		||||
            this._workspacesViews[i].startSwipeScroll();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _endSwipeScroll() {
 | 
			
		||||
        for (let i = 0; i < this._workspacesViews.length; i++)
 | 
			
		||||
            this._workspacesViews[i].endSwipeScroll();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _startTouchGesture() {
 | 
			
		||||
        for (let i = 0; i < this._workspacesViews.length; i++)
 | 
			
		||||
            this._workspacesViews[i].startTouchGesture();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _endTouchGesture() {
 | 
			
		||||
        for (let i = 0; i < this._workspacesViews.length; i++)
 | 
			
		||||
            this._workspacesViews[i].endTouchGesture();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _onSwitchWorkspaceMotion(action, xRel, yRel) {
 | 
			
		||||
        // We don't have a way to hook into start of touchpad actions,
 | 
			
		||||
        // luckily this is safe to call repeatedly.
 | 
			
		||||
        this._startTouchGesture();
 | 
			
		||||
 | 
			
		||||
        let workspaceManager = global.workspace_manager;
 | 
			
		||||
        let active = workspaceManager.get_active_workspace_index();
 | 
			
		||||
        let adjustment = this._scrollAdjustment;
 | 
			
		||||
        adjustment.value = (active - yRel / this.actor.height) * adjustment.page_size;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _onSwitchWorkspaceActivated(action, direction) {
 | 
			
		||||
        let workspaceManager = global.workspace_manager;
 | 
			
		||||
        let activeWorkspace = workspaceManager.get_active_workspace();
 | 
			
		||||
        let newWs = activeWorkspace.get_neighbor(direction);
 | 
			
		||||
        if (newWs != activeWorkspace)
 | 
			
		||||
            newWs.activate(global.get_current_time());
 | 
			
		||||
 | 
			
		||||
        this._endTouchGesture();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    navigateFocus(from, direction) {
 | 
			
		||||
        return this._getPrimaryView().actor.navigate_focus(from, direction, false);
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										48
									
								
								meson.build
									
									
									
									
									
								
							
							
						
						
									
										48
									
								
								meson.build
									
									
									
									
									
								
							@@ -1,5 +1,5 @@
 | 
			
		||||
project('gnome-shell', 'c',
 | 
			
		||||
  version: '3.32.0',
 | 
			
		||||
  version: '3.33.2',
 | 
			
		||||
  meson_version: '>= 0.47.0',
 | 
			
		||||
  license: 'GPLv2+'
 | 
			
		||||
)
 | 
			
		||||
@@ -20,10 +20,10 @@ gcr_req = '>= 3.7.5'
 | 
			
		||||
gdesktop_req = '>= 3.7.90'
 | 
			
		||||
gio_req = '>= 2.56.0'
 | 
			
		||||
gi_req = '>= 1.49.1'
 | 
			
		||||
gjs_req = '>= 1.54.0'
 | 
			
		||||
gjs_req = '>= 1.57.2'
 | 
			
		||||
gtk_req = '>= 3.15.0'
 | 
			
		||||
json_glib_req = '>= 0.13.2'
 | 
			
		||||
mutter_req = '>= 3.32.0'
 | 
			
		||||
mutter_req = '>= 3.33.2'
 | 
			
		||||
polkit_req = '>= 0.100'
 | 
			
		||||
schemas_req = '>= 3.27.90'
 | 
			
		||||
startup_req = '>= 0.11'
 | 
			
		||||
@@ -167,6 +167,48 @@ cdata.set('HAVE_FDWALK',
 | 
			
		||||
          cc.has_function('fdwalk')
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
all_warnings = [
 | 
			
		||||
  '-fno-strict-aliasing',
 | 
			
		||||
  '-Wpointer-arith',
 | 
			
		||||
  '-Wmissing-declarations',
 | 
			
		||||
  '-Wimplicit-function-declaration',
 | 
			
		||||
  '-Wformat=2',
 | 
			
		||||
  '-Wformat-nonliteral',
 | 
			
		||||
  '-Wformat-security',
 | 
			
		||||
  '-Wstrict-prototypes',
 | 
			
		||||
  '-Wmissing-prototypes',
 | 
			
		||||
  '-Wnested-externs',
 | 
			
		||||
  '-Wold-style-definition',
 | 
			
		||||
  '-Wundef',
 | 
			
		||||
  '-Wunused',
 | 
			
		||||
  '-Wcast-align',
 | 
			
		||||
  '-Wmissing-noreturn',
 | 
			
		||||
  '-Wmissing-format-attribute',
 | 
			
		||||
  '-Wmissing-include-dirs',
 | 
			
		||||
  '-Wlogical-op',
 | 
			
		||||
  '-Wignored-qualifiers',
 | 
			
		||||
  '-Werror=redundant-decls',
 | 
			
		||||
  '-Werror=implicit',
 | 
			
		||||
  '-Werror=nonnull',
 | 
			
		||||
  '-Werror=init-self',
 | 
			
		||||
  '-Werror=main',
 | 
			
		||||
  '-Werror=missing-braces',
 | 
			
		||||
  '-Werror=sequence-point',
 | 
			
		||||
  '-Werror=return-type',
 | 
			
		||||
  '-Werror=trigraphs',
 | 
			
		||||
  '-Werror=array-bounds',
 | 
			
		||||
  '-Werror=write-strings',
 | 
			
		||||
  '-Werror=address',
 | 
			
		||||
  '-Werror=int-to-pointer-cast',
 | 
			
		||||
  '-Werror=pointer-to-int-cast',
 | 
			
		||||
  '-Werror=empty-body',
 | 
			
		||||
  '-Werror=write-strings',
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
supported_warnings = cc.get_supported_arguments(all_warnings)
 | 
			
		||||
 | 
			
		||||
add_project_arguments(supported_warnings, language: 'c')
 | 
			
		||||
 | 
			
		||||
config_h = configure_file(
 | 
			
		||||
  input: 'config.h.meson',
 | 
			
		||||
  output: 'config.h',
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										128
									
								
								po/de.po
									
									
									
									
									
								
							
							
						
						
									
										128
									
								
								po/de.po
									
									
									
									
									
								
							@@ -16,14 +16,14 @@
 | 
			
		||||
# Benjamin Steinwender <b@stbe.at>, 2013-2014.
 | 
			
		||||
# Bernd Homuth <dev@hmt.im>, 2014-2015, 2016, 2019.
 | 
			
		||||
# Franco Della-Monica <franco.della.monica@gmail.com>, 2016.
 | 
			
		||||
# Tim Sabsch <tim@sabsch.com>, 2018.
 | 
			
		||||
# Tim Sabsch <tim@sabsch.com>, 2018-2019.
 | 
			
		||||
#
 | 
			
		||||
msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: gnome-shell master\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
 | 
			
		||||
"POT-Creation-Date: 2019-03-02 19:56+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2019-03-02 21:13+0100\n"
 | 
			
		||||
"POT-Creation-Date: 2019-05-08 10:16+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2019-05-12 12:36+0200\n"
 | 
			
		||||
"Last-Translator: Tim Sabsch <tim@sabsch.com>\n"
 | 
			
		||||
"Language-Team: Deutsch <gnome-de@gnome.org>\n"
 | 
			
		||||
"Language: de\n"
 | 
			
		||||
@@ -390,11 +390,6 @@ msgstr ""
 | 
			
		||||
msgid "Network Login"
 | 
			
		||||
msgstr "Netzwerkanmeldung"
 | 
			
		||||
 | 
			
		||||
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
 | 
			
		||||
#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9
 | 
			
		||||
msgid "network-workgroup"
 | 
			
		||||
msgstr "network-workgroup"
 | 
			
		||||
 | 
			
		||||
#: js/extensionPrefs/main.js:116
 | 
			
		||||
msgid "Something’s gone wrong"
 | 
			
		||||
msgstr "Etwas ist schiefgelaufen"
 | 
			
		||||
@@ -542,7 +537,7 @@ msgstr "abmelden;verlassen"
 | 
			
		||||
#: js/misc/systemActions.js:109
 | 
			
		||||
msgctxt "search-result"
 | 
			
		||||
msgid "Suspend"
 | 
			
		||||
msgstr "In Bereitschaft versetzen"
 | 
			
		||||
msgstr "Bereitschaft"
 | 
			
		||||
 | 
			
		||||
#. Translators: A list of keywords that match the suspend action, separated by semicolons
 | 
			
		||||
#: js/misc/systemActions.js:112
 | 
			
		||||
@@ -762,12 +757,12 @@ msgstr "Zu Favoriten hinzufügen"
 | 
			
		||||
msgid "Show Details"
 | 
			
		||||
msgstr "Details anzeigen"
 | 
			
		||||
 | 
			
		||||
#: js/ui/appFavorites.js:141
 | 
			
		||||
#: js/ui/appFavorites.js:149
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s has been added to your favorites."
 | 
			
		||||
msgstr "%s wurde zu Ihren Favoriten hinzugefügt"
 | 
			
		||||
 | 
			
		||||
#: js/ui/appFavorites.js:175
 | 
			
		||||
#: js/ui/appFavorites.js:183
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s has been removed from your favorites."
 | 
			
		||||
msgstr "%s wurde aus Ihren Favoriten entfernt"
 | 
			
		||||
@@ -1053,7 +1048,7 @@ msgstr "Passwort der mobilen Breitbandverbindung"
 | 
			
		||||
msgid "A password is required to connect to “%s”."
 | 
			
		||||
msgstr "Es wird ein Passwort benötigt, um sich mit »%s« zu verbinden."
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1665
 | 
			
		||||
#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1664
 | 
			
		||||
msgid "Network Manager"
 | 
			
		||||
msgstr "Netzwerk-Verwaltung"
 | 
			
		||||
 | 
			
		||||
@@ -1125,23 +1120,23 @@ msgstr "Weltuhren hinzufügen …"
 | 
			
		||||
msgid "World Clocks"
 | 
			
		||||
msgstr "Weltuhren"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:222
 | 
			
		||||
#: js/ui/dateMenu.js:228
 | 
			
		||||
msgid "Weather"
 | 
			
		||||
msgstr "Wetter"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:305
 | 
			
		||||
#: js/ui/dateMenu.js:311
 | 
			
		||||
msgid "Select a location…"
 | 
			
		||||
msgstr "Ort auswählen …"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:313
 | 
			
		||||
#: js/ui/dateMenu.js:319
 | 
			
		||||
msgid "Loading…"
 | 
			
		||||
msgstr "Wird geladen …"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:323
 | 
			
		||||
#: js/ui/dateMenu.js:329
 | 
			
		||||
msgid "Go online for weather information"
 | 
			
		||||
msgstr "Gehen Sie Online, um Wetterinformationen beziehen zu können"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:325
 | 
			
		||||
#: js/ui/dateMenu.js:331
 | 
			
		||||
msgid "Weather information is currently unavailable"
 | 
			
		||||
msgstr "Wetterinformationen sind momentan nicht verfügbar"
 | 
			
		||||
 | 
			
		||||
@@ -1304,26 +1299,26 @@ msgid "Download and install “%s” from extensions.gnome.org?"
 | 
			
		||||
msgstr "»%s« von extensions.gnome.org herunterladen und installieren?"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is an application name like "Settings"
 | 
			
		||||
#: js/ui/inhibitShortcutsDialog.js:50
 | 
			
		||||
#: js/ui/inhibitShortcutsDialog.js:78
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s wants to inhibit shortcuts"
 | 
			
		||||
msgstr "%s möchte Tastenkombinationen sperren"
 | 
			
		||||
 | 
			
		||||
#: js/ui/inhibitShortcutsDialog.js:51
 | 
			
		||||
#: js/ui/inhibitShortcutsDialog.js:79
 | 
			
		||||
msgid "Application wants to inhibit shortcuts"
 | 
			
		||||
msgstr "Die Anwendung möchte Tastenkombinationen sperren"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a keyboard shortcut like "Super+x"
 | 
			
		||||
#: js/ui/inhibitShortcutsDialog.js:60
 | 
			
		||||
#: js/ui/inhibitShortcutsDialog.js:88
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "You can restore shortcuts by pressing %s."
 | 
			
		||||
msgstr "Sie können Tastenkombinationen durch Drücken von %s wiederherstellen."
 | 
			
		||||
 | 
			
		||||
#: js/ui/inhibitShortcutsDialog.js:65
 | 
			
		||||
#: js/ui/inhibitShortcutsDialog.js:93
 | 
			
		||||
msgid "Deny"
 | 
			
		||||
msgstr "Ablehnen"
 | 
			
		||||
 | 
			
		||||
#: js/ui/inhibitShortcutsDialog.js:71
 | 
			
		||||
#: js/ui/inhibitShortcutsDialog.js:100
 | 
			
		||||
msgid "Allow"
 | 
			
		||||
msgstr "Zulassen"
 | 
			
		||||
 | 
			
		||||
@@ -1376,13 +1371,13 @@ msgid "Leave On"
 | 
			
		||||
msgstr "Eingeschaltet lassen"
 | 
			
		||||
 | 
			
		||||
#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133
 | 
			
		||||
#: js/ui/status/network.js:1264
 | 
			
		||||
#: js/ui/status/network.js:1263
 | 
			
		||||
msgid "Turn On"
 | 
			
		||||
msgstr "Einschalten"
 | 
			
		||||
 | 
			
		||||
#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133
 | 
			
		||||
#: js/ui/status/network.js:128 js/ui/status/network.js:310
 | 
			
		||||
#: js/ui/status/network.js:1264 js/ui/status/network.js:1376
 | 
			
		||||
#: js/ui/status/network.js:1263 js/ui/status/network.js:1375
 | 
			
		||||
#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79
 | 
			
		||||
#: js/ui/status/rfkill.js:106
 | 
			
		||||
msgid "Turn Off"
 | 
			
		||||
@@ -1392,7 +1387,7 @@ msgstr "Ausschalten"
 | 
			
		||||
msgid "Leave Off"
 | 
			
		||||
msgstr "Ausgeschaltet lassen"
 | 
			
		||||
 | 
			
		||||
#: js/ui/keyboard.js:203
 | 
			
		||||
#: js/ui/keyboard.js:200
 | 
			
		||||
msgid "Region & Language Settings"
 | 
			
		||||
msgstr "Regions- und Spracheinstellungen"
 | 
			
		||||
 | 
			
		||||
@@ -1444,7 +1439,7 @@ msgstr "Quelle zeigen"
 | 
			
		||||
msgid "Web Page"
 | 
			
		||||
msgstr "Webseite"
 | 
			
		||||
 | 
			
		||||
#: js/ui/messageTray.js:1474
 | 
			
		||||
#: js/ui/messageTray.js:1480
 | 
			
		||||
msgid "System Information"
 | 
			
		||||
msgstr "Systeminformationen"
 | 
			
		||||
 | 
			
		||||
@@ -1528,11 +1523,11 @@ msgstr "Beenden"
 | 
			
		||||
 | 
			
		||||
#. Translators: If there is no suitable word for "Activities"
 | 
			
		||||
#. in your language, you can use the word for "Overview".
 | 
			
		||||
#: js/ui/panel.js:471
 | 
			
		||||
#: js/ui/panel.js:470
 | 
			
		||||
msgid "Activities"
 | 
			
		||||
msgstr "Aktivitäten"
 | 
			
		||||
 | 
			
		||||
#: js/ui/panel.js:746
 | 
			
		||||
#: js/ui/panel.js:745
 | 
			
		||||
msgctxt "System menu in the top bar"
 | 
			
		||||
msgid "System"
 | 
			
		||||
msgstr "System"
 | 
			
		||||
@@ -1541,15 +1536,6 @@ msgstr "System"
 | 
			
		||||
msgid "Top Bar"
 | 
			
		||||
msgstr "Oberes Panel"
 | 
			
		||||
 | 
			
		||||
#. Translators: this MUST be either "toggle-switch-us"
 | 
			
		||||
#. (for toggle switches containing the English words
 | 
			
		||||
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
 | 
			
		||||
#. switches containing "◯" and "|"). Other values will
 | 
			
		||||
#. simply result in invisible toggle switches.
 | 
			
		||||
#: js/ui/popupMenu.js:285
 | 
			
		||||
msgid "toggle-switch-us"
 | 
			
		||||
msgstr "toggle-switch-intl"
 | 
			
		||||
 | 
			
		||||
#: js/ui/runDialog.js:64
 | 
			
		||||
msgid "Enter a Command"
 | 
			
		||||
msgstr "Bitte geben Sie einen Befehl ein"
 | 
			
		||||
@@ -1589,7 +1575,7 @@ msgid_plural "%d new notifications"
 | 
			
		||||
msgstr[0] "%d neue Benachrichtigung"
 | 
			
		||||
msgstr[1] "%d neue Benachrichtigungen"
 | 
			
		||||
 | 
			
		||||
#: js/ui/screenShield.js:449 js/ui/status/system.js:270
 | 
			
		||||
#: js/ui/screenShield.js:449 js/ui/status/system.js:271
 | 
			
		||||
msgid "Lock"
 | 
			
		||||
msgstr "Sperren"
 | 
			
		||||
 | 
			
		||||
@@ -1604,11 +1590,11 @@ msgstr "GNOME muss den Bildschirm sperren"
 | 
			
		||||
#.
 | 
			
		||||
#. XXX: another option is to kick the user into the gdm login
 | 
			
		||||
#. screen, where we're not affected by grabs
 | 
			
		||||
#: js/ui/screenShield.js:834 js/ui/screenShield.js:1307
 | 
			
		||||
#: js/ui/screenShield.js:826 js/ui/screenShield.js:1299
 | 
			
		||||
msgid "Unable to lock"
 | 
			
		||||
msgstr "Sperrung fehlgeschlagen"
 | 
			
		||||
 | 
			
		||||
#: js/ui/screenShield.js:835 js/ui/screenShield.js:1308
 | 
			
		||||
#: js/ui/screenShield.js:827 js/ui/screenShield.js:1300
 | 
			
		||||
msgid "Lock was blocked by an application"
 | 
			
		||||
msgstr "Sperrung wurde von einer Anwendung blockiert"
 | 
			
		||||
 | 
			
		||||
@@ -1772,7 +1758,7 @@ msgid "<unknown>"
 | 
			
		||||
msgstr "<Unbekannt>"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a network identifier
 | 
			
		||||
#: js/ui/status/network.js:416 js/ui/status/network.js:1293
 | 
			
		||||
#: js/ui/status/network.js:416 js/ui/status/network.js:1292
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Off"
 | 
			
		||||
msgstr "%s ausgeschaltet"
 | 
			
		||||
@@ -1798,7 +1784,7 @@ msgid "%s Disconnecting"
 | 
			
		||||
msgstr "%s wird getrennt"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a network identifier
 | 
			
		||||
#: js/ui/status/network.js:434 js/ui/status/network.js:1285
 | 
			
		||||
#: js/ui/status/network.js:434 js/ui/status/network.js:1284
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Connecting"
 | 
			
		||||
msgstr "%s wird verbunden"
 | 
			
		||||
@@ -1838,7 +1824,7 @@ msgid "Mobile Broadband Settings"
 | 
			
		||||
msgstr "Einstellungen der mobilen Breitbandverbindung"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a network identifier
 | 
			
		||||
#: js/ui/status/network.js:553 js/ui/status/network.js:1290
 | 
			
		||||
#: js/ui/status/network.js:553 js/ui/status/network.js:1289
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Hardware Disabled"
 | 
			
		||||
msgstr "%s-Hardware ausgeschaltet"
 | 
			
		||||
@@ -1910,72 +1896,72 @@ msgid "Wi-Fi Settings"
 | 
			
		||||
msgstr "Drahtlosnetzwerk-Einstellungen"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a network identifier
 | 
			
		||||
#: js/ui/status/network.js:1281
 | 
			
		||||
#: js/ui/status/network.js:1280
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Hotspot Active"
 | 
			
		||||
msgstr "Hotspot %s eingeschaltet"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a network identifier
 | 
			
		||||
#: js/ui/status/network.js:1296
 | 
			
		||||
#: js/ui/status/network.js:1295
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Not Connected"
 | 
			
		||||
msgstr "%s nicht verbunden"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1393
 | 
			
		||||
#: js/ui/status/network.js:1392
 | 
			
		||||
msgid "connecting…"
 | 
			
		||||
msgstr "Verbindungsaufbau …"
 | 
			
		||||
 | 
			
		||||
#. Translators: this is for network connections that require some kind of key or password
 | 
			
		||||
#: js/ui/status/network.js:1396
 | 
			
		||||
#: js/ui/status/network.js:1395
 | 
			
		||||
msgid "authentication required"
 | 
			
		||||
msgstr "Anmeldung erforderlich"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1398
 | 
			
		||||
#: js/ui/status/network.js:1397
 | 
			
		||||
msgid "connection failed"
 | 
			
		||||
msgstr "Verbindung gescheitert"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1448
 | 
			
		||||
#: js/ui/status/network.js:1447
 | 
			
		||||
msgid "VPN Settings"
 | 
			
		||||
msgstr "VPN-Einstellungen"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1465
 | 
			
		||||
#: js/ui/status/network.js:1464
 | 
			
		||||
msgid "VPN"
 | 
			
		||||
msgstr "VPN"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1475
 | 
			
		||||
#: js/ui/status/network.js:1474
 | 
			
		||||
msgid "VPN Off"
 | 
			
		||||
msgstr "VPN ausgeschaltet"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1536 js/ui/status/rfkill.js:82
 | 
			
		||||
#: js/ui/status/network.js:1535 js/ui/status/rfkill.js:82
 | 
			
		||||
msgid "Network Settings"
 | 
			
		||||
msgstr "Netzwerkeinstellungen"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1565
 | 
			
		||||
#: js/ui/status/network.js:1564
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Wired Connection"
 | 
			
		||||
msgid_plural "%s Wired Connections"
 | 
			
		||||
msgstr[0] "%s Kabelverbindung"
 | 
			
		||||
msgstr[1] "%s Kabelverbindungen"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1569
 | 
			
		||||
#: js/ui/status/network.js:1568
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Wi-Fi Connection"
 | 
			
		||||
msgid_plural "%s Wi-Fi Connections"
 | 
			
		||||
msgstr[0] "%s Funknetzwerkverbindung"
 | 
			
		||||
msgstr[1] "%s Funknetzwerkverbindungen"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1573
 | 
			
		||||
#: js/ui/status/network.js:1572
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Modem Connection"
 | 
			
		||||
msgid_plural "%s Modem Connections"
 | 
			
		||||
msgstr[0] "%s Modem-Verbindung"
 | 
			
		||||
msgstr[1] "%s Modem-Verbindungen"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1702
 | 
			
		||||
#: js/ui/status/network.js:1705
 | 
			
		||||
msgid "Connection failed"
 | 
			
		||||
msgstr "Verbindung gescheitert"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1703
 | 
			
		||||
#: js/ui/status/network.js:1706
 | 
			
		||||
msgid "Activation of network connection failed"
 | 
			
		||||
msgstr "Aktivierung der Netzwerkverbindung ist gescheitert"
 | 
			
		||||
 | 
			
		||||
@@ -2057,15 +2043,15 @@ msgstr "Abmelden"
 | 
			
		||||
msgid "Account Settings"
 | 
			
		||||
msgstr "Kontoeinstellungen"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/system.js:255
 | 
			
		||||
#: js/ui/status/system.js:256
 | 
			
		||||
msgid "Orientation Lock"
 | 
			
		||||
msgstr "Hoch-/Querformats-Fixierung"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/system.js:281
 | 
			
		||||
#: js/ui/status/system.js:282
 | 
			
		||||
msgid "Suspend"
 | 
			
		||||
msgstr "In Bereitschaft versetzen"
 | 
			
		||||
msgstr "Bereitschaft"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/system.js:291
 | 
			
		||||
#: js/ui/status/system.js:292
 | 
			
		||||
msgid "Power Off"
 | 
			
		||||
msgstr "Ausschalten"
 | 
			
		||||
 | 
			
		||||
@@ -2183,7 +2169,7 @@ msgstr[1] ""
 | 
			
		||||
 | 
			
		||||
#. Translators: This represents the size of a window. The first number is
 | 
			
		||||
#. * the width of the window and the second is the height.
 | 
			
		||||
#: js/ui/windowManager.js:662
 | 
			
		||||
#: js/ui/windowManager.js:677
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%d × %d"
 | 
			
		||||
msgstr "%d × %d"
 | 
			
		||||
@@ -2256,11 +2242,6 @@ msgstr "Auf den Bildschirm nach rechts verschieben"
 | 
			
		||||
msgid "Evolution Calendar"
 | 
			
		||||
msgstr "Evolution-Kalender"
 | 
			
		||||
 | 
			
		||||
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
 | 
			
		||||
#: src/calendar-server/evolution-calendar.desktop.in:6
 | 
			
		||||
msgid "evolution"
 | 
			
		||||
msgstr "evolution"
 | 
			
		||||
 | 
			
		||||
#: src/main.c:408
 | 
			
		||||
msgid "Print version"
 | 
			
		||||
msgstr "Version ausgeben"
 | 
			
		||||
@@ -2279,12 +2260,12 @@ msgstr ""
 | 
			
		||||
msgid "List possible modes"
 | 
			
		||||
msgstr "Die möglichen Modi auflisten"
 | 
			
		||||
 | 
			
		||||
#: src/shell-app.c:260
 | 
			
		||||
#: src/shell-app.c:264
 | 
			
		||||
msgctxt "program"
 | 
			
		||||
msgid "Unknown"
 | 
			
		||||
msgstr "Unbekannt"
 | 
			
		||||
 | 
			
		||||
#: src/shell-app.c:511
 | 
			
		||||
#: src/shell-app.c:515
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Failed to launch “%s”"
 | 
			
		||||
msgstr "»%s« konnte nicht gestartet werden"
 | 
			
		||||
@@ -2323,6 +2304,15 @@ msgstr[1] "%u Eingänge"
 | 
			
		||||
msgid "System Sounds"
 | 
			
		||||
msgstr "Systemklänge"
 | 
			
		||||
 | 
			
		||||
#~ msgid "network-workgroup"
 | 
			
		||||
#~ msgstr "network-workgroup"
 | 
			
		||||
 | 
			
		||||
#~ msgid "toggle-switch-us"
 | 
			
		||||
#~ msgstr "toggle-switch-intl"
 | 
			
		||||
 | 
			
		||||
#~ msgid "evolution"
 | 
			
		||||
#~ msgstr "evolution"
 | 
			
		||||
 | 
			
		||||
#~ msgid "There was an error loading the preferences dialog for %s:"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "Beim Laden des Einstellungsdialogs für %s ist ein Fehler aufgetreten:"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										169
									
								
								po/eo.po
									
									
									
									
									
								
							
							
						
						
									
										169
									
								
								po/eo.po
									
									
									
									
									
								
							@@ -6,22 +6,22 @@
 | 
			
		||||
# Daniel PUENTES <blatberk@openmailbox.org>, 2015.
 | 
			
		||||
# Nicolas MAIA < >, 2015.
 | 
			
		||||
# Kristjan SCHMIDT <kristjan.schmidt@googlemail.com>, 2011, 2012, 2015, 2016, 2018.
 | 
			
		||||
# Carmen Bianca BAKKER <carmen@carmenbianca.eu>, 2018, 2019.
 | 
			
		||||
# Carmen Bianca BAKKER <carmen@carmenbianca.eu>, 2018-2019.
 | 
			
		||||
#
 | 
			
		||||
msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: gnome-shell master\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
 | 
			
		||||
"POT-Creation-Date: 2019-03-24 17:37+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2019-03-31 00:14+0100\n"
 | 
			
		||||
"Last-Translator: Carmen Bianca Bakker <carmen@carmenbianca.eu>\n"
 | 
			
		||||
"POT-Creation-Date: 2019-05-08 17:45+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2019-05-09 20:12+0200\n"
 | 
			
		||||
"Last-Translator: Carmen Bianca BAKKER <carmen@carmenbianca.eu>\n"
 | 
			
		||||
"Language-Team: Esperanto <gnome-eo-list@gnome.org>\n"
 | 
			
		||||
"Language: eo\n"
 | 
			
		||||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
 | 
			
		||||
"X-Generator: Poedit 2.2.1\n"
 | 
			
		||||
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
 | 
			
		||||
"X-Generator: Gtranslator 3.32.0\n"
 | 
			
		||||
"X-DamnedLies-Scope: partial\n"
 | 
			
		||||
"X-Project-Style: gnome\n"
 | 
			
		||||
 | 
			
		||||
@@ -383,7 +383,7 @@ msgstr "Foliumi en Programaro"
 | 
			
		||||
#: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55
 | 
			
		||||
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136
 | 
			
		||||
#: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188
 | 
			
		||||
#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888
 | 
			
		||||
#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:889
 | 
			
		||||
msgid "Cancel"
 | 
			
		||||
msgstr "Nuligi"
 | 
			
		||||
 | 
			
		||||
@@ -681,32 +681,37 @@ msgstr "Oftaj"
 | 
			
		||||
msgid "All"
 | 
			
		||||
msgstr "Ĉiuj"
 | 
			
		||||
 | 
			
		||||
#: js/ui/appDisplay.js:1737 js/ui/panel.js:83
 | 
			
		||||
#. Translators: This is the heading of a list of open windows
 | 
			
		||||
#: js/ui/appDisplay.js:1713 js/ui/panel.js:79
 | 
			
		||||
msgid "Open Windows"
 | 
			
		||||
msgstr "Malfermaj fenestroj"
 | 
			
		||||
 | 
			
		||||
#: js/ui/appDisplay.js:1732 js/ui/panel.js:86
 | 
			
		||||
msgid "New Window"
 | 
			
		||||
msgstr "Nova fenestro"
 | 
			
		||||
 | 
			
		||||
#: js/ui/appDisplay.js:1751
 | 
			
		||||
#: js/ui/appDisplay.js:1746
 | 
			
		||||
msgid "Launch using Dedicated Graphics Card"
 | 
			
		||||
msgstr "Lanĉi uzante dediĉitan vidkarton"
 | 
			
		||||
 | 
			
		||||
#: js/ui/appDisplay.js:1778 js/ui/dash.js:239
 | 
			
		||||
#: js/ui/appDisplay.js:1773 js/ui/dash.js:239
 | 
			
		||||
msgid "Remove from Favorites"
 | 
			
		||||
msgstr "Forigi el preferataj"
 | 
			
		||||
 | 
			
		||||
#: js/ui/appDisplay.js:1784
 | 
			
		||||
#: js/ui/appDisplay.js:1779
 | 
			
		||||
msgid "Add to Favorites"
 | 
			
		||||
msgstr "Aldoni al preferataj"
 | 
			
		||||
 | 
			
		||||
#: js/ui/appDisplay.js:1794 js/ui/panel.js:94
 | 
			
		||||
#: js/ui/appDisplay.js:1789 js/ui/panel.js:97
 | 
			
		||||
msgid "Show Details"
 | 
			
		||||
msgstr "Montri detalojn"
 | 
			
		||||
 | 
			
		||||
#: js/ui/appFavorites.js:141
 | 
			
		||||
#: js/ui/appFavorites.js:149
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s has been added to your favorites."
 | 
			
		||||
msgstr "%s estas aldonita de via preferataj aplikaĵoj."
 | 
			
		||||
 | 
			
		||||
#: js/ui/appFavorites.js:175
 | 
			
		||||
#: js/ui/appFavorites.js:183
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s has been removed from your favorites."
 | 
			
		||||
msgstr "%s estas forigita de via preferataj aplikaĵoj."
 | 
			
		||||
@@ -914,7 +919,7 @@ msgstr ""
 | 
			
		||||
"Alternative vi povas konekti per premi la “WPS”-butonon de via enkursigilo."
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219
 | 
			
		||||
#: js/ui/status/network.js:309 js/ui/status/network.js:891
 | 
			
		||||
#: js/ui/status/network.js:310 js/ui/status/network.js:892
 | 
			
		||||
msgid "Connect"
 | 
			
		||||
msgstr "Konekti"
 | 
			
		||||
 | 
			
		||||
@@ -944,7 +949,7 @@ msgstr "Servo: "
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685
 | 
			
		||||
msgid "Authentication required by wireless network"
 | 
			
		||||
msgstr "Aŭtentigo estas bezonata de sendrata reto"
 | 
			
		||||
msgstr "Sendrata reto bezonas aŭtentigon"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686
 | 
			
		||||
#, javascript-format
 | 
			
		||||
@@ -972,7 +977,7 @@ msgstr "PIN-kodo bezonata"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700
 | 
			
		||||
msgid "PIN code is needed for the mobile broadband device"
 | 
			
		||||
msgstr "PIN-kodo estas bezonata por la portebla larĝkapacita aparato"
 | 
			
		||||
msgstr "PIN-kodo necesas por la portebla larĝkapacita aparato"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/networkAgent.js:333
 | 
			
		||||
msgid "PIN: "
 | 
			
		||||
@@ -986,9 +991,9 @@ msgstr "Portebla larĝkapacita retopasvorto"
 | 
			
		||||
#: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "A password is required to connect to “%s”."
 | 
			
		||||
msgstr "Pasvorto estas bezonata por konekti al “%s”."
 | 
			
		||||
msgstr "Pasvorto necesas por konekti al “%s”."
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1664
 | 
			
		||||
#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1665
 | 
			
		||||
msgid "Network Manager"
 | 
			
		||||
msgstr "Retadministrilo"
 | 
			
		||||
 | 
			
		||||
@@ -1060,23 +1065,23 @@ msgstr "Aldoni mondajn horloĝojn…"
 | 
			
		||||
msgid "World Clocks"
 | 
			
		||||
msgstr "Mondaj horloĝoj"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:222
 | 
			
		||||
#: js/ui/dateMenu.js:228
 | 
			
		||||
msgid "Weather"
 | 
			
		||||
msgstr "Vetero"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:305
 | 
			
		||||
#: js/ui/dateMenu.js:311
 | 
			
		||||
msgid "Select a location…"
 | 
			
		||||
msgstr "Elekti lokon…"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:313
 | 
			
		||||
#: js/ui/dateMenu.js:319
 | 
			
		||||
msgid "Loading…"
 | 
			
		||||
msgstr "Ŝargante…"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:323
 | 
			
		||||
#: js/ui/dateMenu.js:329
 | 
			
		||||
msgid "Go online for weather information"
 | 
			
		||||
msgstr "Enretigi por veterinformoj"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:325
 | 
			
		||||
#: js/ui/dateMenu.js:331
 | 
			
		||||
msgid "Weather information is currently unavailable"
 | 
			
		||||
msgstr "Veterinformoj ĉimomente nehaveblas"
 | 
			
		||||
 | 
			
		||||
@@ -1305,13 +1310,13 @@ msgid "Leave On"
 | 
			
		||||
msgstr "Lasi ŝaltita"
 | 
			
		||||
 | 
			
		||||
#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133
 | 
			
		||||
#: js/ui/status/network.js:1263
 | 
			
		||||
#: js/ui/status/network.js:1264
 | 
			
		||||
msgid "Turn On"
 | 
			
		||||
msgstr "Ŝalti"
 | 
			
		||||
 | 
			
		||||
#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133
 | 
			
		||||
#: js/ui/status/network.js:128 js/ui/status/network.js:310
 | 
			
		||||
#: js/ui/status/network.js:1263 js/ui/status/network.js:1375
 | 
			
		||||
#: js/ui/status/network.js:128 js/ui/status/network.js:311
 | 
			
		||||
#: js/ui/status/network.js:1264 js/ui/status/network.js:1376
 | 
			
		||||
#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79
 | 
			
		||||
#: js/ui/status/rfkill.js:106
 | 
			
		||||
msgid "Turn Off"
 | 
			
		||||
@@ -1373,7 +1378,7 @@ msgstr "Montri fonton"
 | 
			
		||||
msgid "Web Page"
 | 
			
		||||
msgstr "Retpaĝo"
 | 
			
		||||
 | 
			
		||||
#: js/ui/messageTray.js:1480
 | 
			
		||||
#: js/ui/messageTray.js:1479
 | 
			
		||||
msgid "System Information"
 | 
			
		||||
msgstr "Sisteminformoj"
 | 
			
		||||
 | 
			
		||||
@@ -1452,34 +1457,25 @@ msgstr "Premu Esk-klavon por ĉesi"
 | 
			
		||||
msgid "Press any key to exit"
 | 
			
		||||
msgstr "Premu iun ajn klavon por ĉesi"
 | 
			
		||||
 | 
			
		||||
#: js/ui/panel.js:108
 | 
			
		||||
#: js/ui/panel.js:113
 | 
			
		||||
msgid "Quit"
 | 
			
		||||
msgstr "Ĉesi"
 | 
			
		||||
 | 
			
		||||
#. Translators: If there is no suitable word for "Activities"
 | 
			
		||||
#. in your language, you can use the word for "Overview".
 | 
			
		||||
#: js/ui/panel.js:471
 | 
			
		||||
#: js/ui/panel.js:468
 | 
			
		||||
msgid "Activities"
 | 
			
		||||
msgstr "Aktivecoj"
 | 
			
		||||
 | 
			
		||||
#: js/ui/panel.js:746
 | 
			
		||||
#: js/ui/panel.js:743
 | 
			
		||||
msgctxt "System menu in the top bar"
 | 
			
		||||
msgid "System"
 | 
			
		||||
msgstr "Sistemo"
 | 
			
		||||
 | 
			
		||||
#: js/ui/panel.js:867
 | 
			
		||||
#: js/ui/panel.js:861
 | 
			
		||||
msgid "Top Bar"
 | 
			
		||||
msgstr "Supra breto"
 | 
			
		||||
 | 
			
		||||
#. Translators: this MUST be either "toggle-switch-us"
 | 
			
		||||
#. (for toggle switches containing the English words
 | 
			
		||||
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
 | 
			
		||||
#. switches containing "◯" and "|"). Other values will
 | 
			
		||||
#. simply result in invisible toggle switches.
 | 
			
		||||
#: js/ui/popupMenu.js:285
 | 
			
		||||
msgid "toggle-switch-us"
 | 
			
		||||
msgstr "toggle-switch-intl"
 | 
			
		||||
 | 
			
		||||
#: js/ui/runDialog.js:64
 | 
			
		||||
msgid "Enter a Command"
 | 
			
		||||
msgstr "Enigu komandon"
 | 
			
		||||
@@ -1614,11 +1610,11 @@ msgstr "Saltaj klavoj"
 | 
			
		||||
msgid "Mouse Keys"
 | 
			
		||||
msgstr "Musklavoj"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/accessibility.js:151
 | 
			
		||||
#: js/ui/status/accessibility.js:135
 | 
			
		||||
msgid "High Contrast"
 | 
			
		||||
msgstr "Alta kontrasto"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/accessibility.js:182
 | 
			
		||||
#: js/ui/status/accessibility.js:177
 | 
			
		||||
msgid "Large Text"
 | 
			
		||||
msgstr "Granda teksto"
 | 
			
		||||
 | 
			
		||||
@@ -1626,7 +1622,7 @@ msgstr "Granda teksto"
 | 
			
		||||
msgid "Bluetooth"
 | 
			
		||||
msgstr "Bludento"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585
 | 
			
		||||
#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:586
 | 
			
		||||
msgid "Bluetooth Settings"
 | 
			
		||||
msgstr "Bludento-agordoj"
 | 
			
		||||
 | 
			
		||||
@@ -1697,13 +1693,13 @@ msgid "<unknown>"
 | 
			
		||||
msgstr "<nekonata>"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a network identifier
 | 
			
		||||
#: js/ui/status/network.js:416 js/ui/status/network.js:1292
 | 
			
		||||
#: js/ui/status/network.js:417 js/ui/status/network.js:1293
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Off"
 | 
			
		||||
msgstr "%s malŝaltita"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a network identifier
 | 
			
		||||
#: js/ui/status/network.js:419
 | 
			
		||||
#: js/ui/status/network.js:420
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Connected"
 | 
			
		||||
msgstr "%s konektita"
 | 
			
		||||
@@ -1711,189 +1707,189 @@ msgstr "%s konektita"
 | 
			
		||||
#. Translators: this is for network devices that are physically present but are not
 | 
			
		||||
#. under NetworkManager's control (and thus cannot be used in the menu);
 | 
			
		||||
#. %s is a network identifier
 | 
			
		||||
#: js/ui/status/network.js:424
 | 
			
		||||
#: js/ui/status/network.js:425
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Unmanaged"
 | 
			
		||||
msgstr "%s nemastrumita"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a network identifier
 | 
			
		||||
#: js/ui/status/network.js:427
 | 
			
		||||
#: js/ui/status/network.js:428
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Disconnecting"
 | 
			
		||||
msgstr "%s malkonektante"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a network identifier
 | 
			
		||||
#: js/ui/status/network.js:434 js/ui/status/network.js:1284
 | 
			
		||||
#: js/ui/status/network.js:435 js/ui/status/network.js:1285
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Connecting"
 | 
			
		||||
msgstr "%s konektante"
 | 
			
		||||
 | 
			
		||||
#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier
 | 
			
		||||
#: js/ui/status/network.js:437
 | 
			
		||||
#: js/ui/status/network.js:438
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Requires Authentication"
 | 
			
		||||
msgstr "%s postulas aŭtentigon"
 | 
			
		||||
 | 
			
		||||
#. Translators: this is for devices that require some kind of firmware or kernel
 | 
			
		||||
#. module, which is missing; %s is a network identifier
 | 
			
		||||
#: js/ui/status/network.js:445
 | 
			
		||||
#: js/ui/status/network.js:446
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "Firmware Missing For %s"
 | 
			
		||||
msgstr "Mikroprogramo mankas por %s"
 | 
			
		||||
 | 
			
		||||
#. Translators: this is for a network device that cannot be activated (for example it
 | 
			
		||||
#. is disabled by rfkill, or it has no coverage; %s is a network identifier
 | 
			
		||||
#: js/ui/status/network.js:449
 | 
			
		||||
#: js/ui/status/network.js:450
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Unavailable"
 | 
			
		||||
msgstr "%s nedisponebla"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a network identifier
 | 
			
		||||
#: js/ui/status/network.js:452
 | 
			
		||||
#: js/ui/status/network.js:453
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Connection Failed"
 | 
			
		||||
msgstr "%s konekto malsukcesis"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:464
 | 
			
		||||
#: js/ui/status/network.js:465
 | 
			
		||||
msgid "Wired Settings"
 | 
			
		||||
msgstr "Drataj agordoj"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:506
 | 
			
		||||
#: js/ui/status/network.js:507
 | 
			
		||||
msgid "Mobile Broadband Settings"
 | 
			
		||||
msgstr "Porteblaj larĝkapacitaj agordoj"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a network identifier
 | 
			
		||||
#: js/ui/status/network.js:553 js/ui/status/network.js:1289
 | 
			
		||||
#: js/ui/status/network.js:554 js/ui/status/network.js:1290
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Hardware Disabled"
 | 
			
		||||
msgstr "%s aparataro malŝaltita"
 | 
			
		||||
 | 
			
		||||
#. Translators: this is for a network device that cannot be activated
 | 
			
		||||
#. because it's disabled by rfkill (airplane mode); %s is a network identifier
 | 
			
		||||
#: js/ui/status/network.js:557
 | 
			
		||||
#: js/ui/status/network.js:558
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Disabled"
 | 
			
		||||
msgstr "%s malŝaltita"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:597
 | 
			
		||||
#: js/ui/status/network.js:598
 | 
			
		||||
msgid "Connect to Internet"
 | 
			
		||||
msgstr "Konekti al interreto"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:786
 | 
			
		||||
#: js/ui/status/network.js:787
 | 
			
		||||
msgid "Airplane Mode is On"
 | 
			
		||||
msgstr "Aviadila reĝimo ŝaltita"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:787
 | 
			
		||||
#: js/ui/status/network.js:788
 | 
			
		||||
msgid "Wi-Fi is disabled when airplane mode is on."
 | 
			
		||||
msgstr "Vifio malebliĝas se aviadila reĝimo estas ŝaltita."
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:788
 | 
			
		||||
#: js/ui/status/network.js:789
 | 
			
		||||
msgid "Turn Off Airplane Mode"
 | 
			
		||||
msgstr "Malŝalti aviadilan reĝimon"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:797
 | 
			
		||||
#: js/ui/status/network.js:798
 | 
			
		||||
msgid "Wi-Fi is Off"
 | 
			
		||||
msgstr "Vifio malŝaltita"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:798
 | 
			
		||||
#: js/ui/status/network.js:799
 | 
			
		||||
msgid "Wi-Fi needs to be turned on in order to connect to a network."
 | 
			
		||||
msgstr "Necesas ŝalti vifion por konekti al reto."
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:799
 | 
			
		||||
#: js/ui/status/network.js:800
 | 
			
		||||
msgid "Turn On Wi-Fi"
 | 
			
		||||
msgstr "Ŝalti vifion"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:824
 | 
			
		||||
#: js/ui/status/network.js:825
 | 
			
		||||
msgid "Wi-Fi Networks"
 | 
			
		||||
msgstr "Vifiaj retoj"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:826
 | 
			
		||||
#: js/ui/status/network.js:827
 | 
			
		||||
msgid "Select a network"
 | 
			
		||||
msgstr "Elekti reton"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:855
 | 
			
		||||
#: js/ui/status/network.js:856
 | 
			
		||||
msgid "No Networks"
 | 
			
		||||
msgstr "Neniu reto"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:876 js/ui/status/rfkill.js:104
 | 
			
		||||
#: js/ui/status/network.js:877 js/ui/status/rfkill.js:104
 | 
			
		||||
msgid "Use hardware switch to turn off"
 | 
			
		||||
msgstr "Uzi aparataran ŝaltilon por malŝalti"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1152
 | 
			
		||||
#: js/ui/status/network.js:1153
 | 
			
		||||
msgid "Select Network"
 | 
			
		||||
msgstr "Elekti reton"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1158
 | 
			
		||||
#: js/ui/status/network.js:1159
 | 
			
		||||
msgid "Wi-Fi Settings"
 | 
			
		||||
msgstr "Vifio-agordoj"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a network identifier
 | 
			
		||||
#: js/ui/status/network.js:1280
 | 
			
		||||
#: js/ui/status/network.js:1281
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Hotspot Active"
 | 
			
		||||
msgstr "%s retkaptejo aktiva"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a network identifier
 | 
			
		||||
#: js/ui/status/network.js:1295
 | 
			
		||||
#: js/ui/status/network.js:1296
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Not Connected"
 | 
			
		||||
msgstr "%s ne konektita"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1392
 | 
			
		||||
#: js/ui/status/network.js:1393
 | 
			
		||||
msgid "connecting…"
 | 
			
		||||
msgstr "konektante…"
 | 
			
		||||
 | 
			
		||||
#. Translators: this is for network connections that require some kind of key or password
 | 
			
		||||
#: js/ui/status/network.js:1395
 | 
			
		||||
#: js/ui/status/network.js:1396
 | 
			
		||||
msgid "authentication required"
 | 
			
		||||
msgstr "aŭtentigo necesas"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1397
 | 
			
		||||
#: js/ui/status/network.js:1398
 | 
			
		||||
msgid "connection failed"
 | 
			
		||||
msgstr "konekto malsukcesis"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1447
 | 
			
		||||
#: js/ui/status/network.js:1448
 | 
			
		||||
msgid "VPN Settings"
 | 
			
		||||
msgstr "VPR-agordoj"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1464
 | 
			
		||||
#: js/ui/status/network.js:1465
 | 
			
		||||
msgid "VPN"
 | 
			
		||||
msgstr "VPR"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1474
 | 
			
		||||
#: js/ui/status/network.js:1475
 | 
			
		||||
msgid "VPN Off"
 | 
			
		||||
msgstr "VPR malŝaltita"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1535 js/ui/status/rfkill.js:82
 | 
			
		||||
#: js/ui/status/network.js:1536 js/ui/status/rfkill.js:82
 | 
			
		||||
msgid "Network Settings"
 | 
			
		||||
msgstr "Ret-agordoj"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1564
 | 
			
		||||
#: js/ui/status/network.js:1565
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Wired Connection"
 | 
			
		||||
msgid_plural "%s Wired Connections"
 | 
			
		||||
msgstr[0] "%s drata konekto"
 | 
			
		||||
msgstr[1] "%s drataj konektoj"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1568
 | 
			
		||||
#: js/ui/status/network.js:1569
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Wi-Fi Connection"
 | 
			
		||||
msgid_plural "%s Wi-Fi Connections"
 | 
			
		||||
msgstr[0] "%s vifia konekto"
 | 
			
		||||
msgstr[1] "%s vifiaj konektoj"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1572
 | 
			
		||||
#: js/ui/status/network.js:1573
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Modem Connection"
 | 
			
		||||
msgid_plural "%s Modem Connections"
 | 
			
		||||
msgstr[0] "%s modema konekto"
 | 
			
		||||
msgstr[1] "%s modemaj konektoj"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1701
 | 
			
		||||
#: js/ui/status/network.js:1706
 | 
			
		||||
msgid "Connection failed"
 | 
			
		||||
msgstr "Konekto malsukcesis"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1702
 | 
			
		||||
#: js/ui/status/network.js:1707
 | 
			
		||||
msgid "Activation of network connection failed"
 | 
			
		||||
msgstr "Aktivigo de reto-konekto malsukcesis"
 | 
			
		||||
 | 
			
		||||
@@ -2098,7 +2094,7 @@ msgstr[1] "Agordaj ŝanĝoj malfaritos post %d sekundoj"
 | 
			
		||||
 | 
			
		||||
#. Translators: This represents the size of a window. The first number is
 | 
			
		||||
#. * the width of the window and the second is the height.
 | 
			
		||||
#: js/ui/windowManager.js:662
 | 
			
		||||
#: js/ui/windowManager.js:677
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%d × %d"
 | 
			
		||||
msgstr "%d × %d"
 | 
			
		||||
@@ -2231,6 +2227,9 @@ msgstr[1] "%u enigoj"
 | 
			
		||||
msgid "System Sounds"
 | 
			
		||||
msgstr "Sistemsonoj"
 | 
			
		||||
 | 
			
		||||
#~ msgid "toggle-switch-us"
 | 
			
		||||
#~ msgstr "toggle-switch-intl"
 | 
			
		||||
 | 
			
		||||
#~ msgid "network-workgroup"
 | 
			
		||||
#~ msgstr "network-workgroup"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										160
									
								
								po/es.po
									
									
									
									
									
								
							
							
						
						
									
										160
									
								
								po/es.po
									
									
									
									
									
								
							@@ -9,8 +9,8 @@ msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: gnome-shell.master\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
 | 
			
		||||
"POT-Creation-Date: 2019-03-24 17:37+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2019-02-06 11:27+0100\n"
 | 
			
		||||
"POT-Creation-Date: 2019-05-15 17:25+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2019-05-16 12:35+0200\n"
 | 
			
		||||
"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
 | 
			
		||||
"Language-Team: es <gnome-es-list@gnome.org>\n"
 | 
			
		||||
"Language: es\n"
 | 
			
		||||
@@ -18,7 +18,7 @@ msgstr ""
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
 | 
			
		||||
"X-Generator: Gtranslator 3.31.90\n"
 | 
			
		||||
"X-Generator: Gtranslator 3.32.0\n"
 | 
			
		||||
 | 
			
		||||
#: data/50-gnome-shell-system.xml:6
 | 
			
		||||
msgid "System"
 | 
			
		||||
@@ -431,7 +431,7 @@ msgstr "Buscar en Software"
 | 
			
		||||
#: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55
 | 
			
		||||
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136
 | 
			
		||||
#: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188
 | 
			
		||||
#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888
 | 
			
		||||
#: js/ui/shellMountOperation.js:325 js/ui/status/network.js:889
 | 
			
		||||
msgid "Cancel"
 | 
			
		||||
msgstr "Cancelar"
 | 
			
		||||
 | 
			
		||||
@@ -522,7 +522,8 @@ msgstr "Cerrar la sesión"
 | 
			
		||||
 | 
			
		||||
#. Translators: A list of keywords that match the logout action, separated by semicolons
 | 
			
		||||
#: js/misc/systemActions.js:105
 | 
			
		||||
msgid "logout;sign off"
 | 
			
		||||
#| msgid "logout;sign off"
 | 
			
		||||
msgid "logout;log out;sign off"
 | 
			
		||||
msgstr "cerrar;sesión;salir"
 | 
			
		||||
 | 
			
		||||
#. Translators: The name of the suspend action in search
 | 
			
		||||
@@ -728,32 +729,37 @@ msgstr "Frecuentes"
 | 
			
		||||
msgid "All"
 | 
			
		||||
msgstr "Todas"
 | 
			
		||||
 | 
			
		||||
#: js/ui/appDisplay.js:1737 js/ui/panel.js:83
 | 
			
		||||
#. Translators: This is the heading of a list of open windows
 | 
			
		||||
#: js/ui/appDisplay.js:1713 js/ui/panel.js:79
 | 
			
		||||
msgid "Open Windows"
 | 
			
		||||
msgstr "Ventanas abiertas"
 | 
			
		||||
 | 
			
		||||
#: js/ui/appDisplay.js:1732 js/ui/panel.js:86
 | 
			
		||||
msgid "New Window"
 | 
			
		||||
msgstr "Ventana nueva"
 | 
			
		||||
 | 
			
		||||
#: js/ui/appDisplay.js:1751
 | 
			
		||||
#: js/ui/appDisplay.js:1746
 | 
			
		||||
msgid "Launch using Dedicated Graphics Card"
 | 
			
		||||
msgstr "Lanzar usando la tarjeta gráfica dedicada"
 | 
			
		||||
 | 
			
		||||
#: js/ui/appDisplay.js:1778 js/ui/dash.js:239
 | 
			
		||||
#: js/ui/appDisplay.js:1773 js/ui/dash.js:239
 | 
			
		||||
msgid "Remove from Favorites"
 | 
			
		||||
msgstr "Quitar de los favoritos"
 | 
			
		||||
 | 
			
		||||
#: js/ui/appDisplay.js:1784
 | 
			
		||||
#: js/ui/appDisplay.js:1779
 | 
			
		||||
msgid "Add to Favorites"
 | 
			
		||||
msgstr "Añadir a los favoritos"
 | 
			
		||||
 | 
			
		||||
#: js/ui/appDisplay.js:1794 js/ui/panel.js:94
 | 
			
		||||
#: js/ui/appDisplay.js:1789 js/ui/panel.js:97
 | 
			
		||||
msgid "Show Details"
 | 
			
		||||
msgstr "Mostrar detalles"
 | 
			
		||||
 | 
			
		||||
#: js/ui/appFavorites.js:141
 | 
			
		||||
#: js/ui/appFavorites.js:149
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s has been added to your favorites."
 | 
			
		||||
msgstr "Se ha añadido %s a sus favoritos."
 | 
			
		||||
 | 
			
		||||
#: js/ui/appFavorites.js:175
 | 
			
		||||
#: js/ui/appFavorites.js:183
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s has been removed from your favorites."
 | 
			
		||||
msgstr "Se ha quitado %s de sus favoritos."
 | 
			
		||||
@@ -963,7 +969,7 @@ msgstr ""
 | 
			
		||||
"Alternativamente puede conectarse pulsando el botón «WPS» de su router."
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219
 | 
			
		||||
#: js/ui/status/network.js:309 js/ui/status/network.js:891
 | 
			
		||||
#: js/ui/status/network.js:310 js/ui/status/network.js:892
 | 
			
		||||
msgid "Connect"
 | 
			
		||||
msgstr "Conectar"
 | 
			
		||||
 | 
			
		||||
@@ -1038,7 +1044,7 @@ msgstr "Contraseña de la red de banda ancha móvil"
 | 
			
		||||
msgid "A password is required to connect to “%s”."
 | 
			
		||||
msgstr "Se requiere una contraseña para conectarse a «%s»."
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1664
 | 
			
		||||
#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1665
 | 
			
		||||
msgid "Network Manager"
 | 
			
		||||
msgstr "Gestor de la red"
 | 
			
		||||
 | 
			
		||||
@@ -1108,23 +1114,23 @@ msgstr "Añadir relojes del mundo…"
 | 
			
		||||
msgid "World Clocks"
 | 
			
		||||
msgstr "Relojes del mundo"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:222
 | 
			
		||||
#: js/ui/dateMenu.js:228
 | 
			
		||||
msgid "Weather"
 | 
			
		||||
msgstr "Meteorología"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:305
 | 
			
		||||
#: js/ui/dateMenu.js:311
 | 
			
		||||
msgid "Select a location…"
 | 
			
		||||
msgstr "Seleccionar ubicación…"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:313
 | 
			
		||||
#: js/ui/dateMenu.js:319
 | 
			
		||||
msgid "Loading…"
 | 
			
		||||
msgstr "Cargando…"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:323
 | 
			
		||||
#: js/ui/dateMenu.js:329
 | 
			
		||||
msgid "Go online for weather information"
 | 
			
		||||
msgstr "Conectarse para obtener la información meteorológica"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:325
 | 
			
		||||
#: js/ui/dateMenu.js:331
 | 
			
		||||
msgid "Weather information is currently unavailable"
 | 
			
		||||
msgstr "La información meteorológica no está disponible actualmente."
 | 
			
		||||
 | 
			
		||||
@@ -1359,13 +1365,13 @@ msgid "Leave On"
 | 
			
		||||
msgstr "Dejar activada"
 | 
			
		||||
 | 
			
		||||
#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133
 | 
			
		||||
#: js/ui/status/network.js:1263
 | 
			
		||||
#: js/ui/status/network.js:1264
 | 
			
		||||
msgid "Turn On"
 | 
			
		||||
msgstr "Encender"
 | 
			
		||||
 | 
			
		||||
#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133
 | 
			
		||||
#: js/ui/status/network.js:128 js/ui/status/network.js:310
 | 
			
		||||
#: js/ui/status/network.js:1263 js/ui/status/network.js:1375
 | 
			
		||||
#: js/ui/status/network.js:128 js/ui/status/network.js:311
 | 
			
		||||
#: js/ui/status/network.js:1264 js/ui/status/network.js:1376
 | 
			
		||||
#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79
 | 
			
		||||
#: js/ui/status/rfkill.js:106
 | 
			
		||||
msgid "Turn Off"
 | 
			
		||||
@@ -1427,7 +1433,7 @@ msgstr "Ver fuente"
 | 
			
		||||
msgid "Web Page"
 | 
			
		||||
msgstr "Página web"
 | 
			
		||||
 | 
			
		||||
#: js/ui/messageTray.js:1480
 | 
			
		||||
#: js/ui/messageTray.js:1479
 | 
			
		||||
msgid "System Information"
 | 
			
		||||
msgstr "Información del sistema"
 | 
			
		||||
 | 
			
		||||
@@ -1505,34 +1511,25 @@ msgstr "Pulse Esc para salir"
 | 
			
		||||
msgid "Press any key to exit"
 | 
			
		||||
msgstr "Pulse cualquier tecla para salir"
 | 
			
		||||
 | 
			
		||||
#: js/ui/panel.js:108
 | 
			
		||||
#: js/ui/panel.js:113
 | 
			
		||||
msgid "Quit"
 | 
			
		||||
msgstr "Salir"
 | 
			
		||||
 | 
			
		||||
#. Translators: If there is no suitable word for "Activities"
 | 
			
		||||
#. in your language, you can use the word for "Overview".
 | 
			
		||||
#: js/ui/panel.js:471
 | 
			
		||||
#: js/ui/panel.js:468
 | 
			
		||||
msgid "Activities"
 | 
			
		||||
msgstr "Actividades"
 | 
			
		||||
 | 
			
		||||
#: js/ui/panel.js:746
 | 
			
		||||
#: js/ui/panel.js:743
 | 
			
		||||
msgctxt "System menu in the top bar"
 | 
			
		||||
msgid "System"
 | 
			
		||||
msgstr "Sistema"
 | 
			
		||||
 | 
			
		||||
#: js/ui/panel.js:867
 | 
			
		||||
#: js/ui/panel.js:861
 | 
			
		||||
msgid "Top Bar"
 | 
			
		||||
msgstr "Barra superior"
 | 
			
		||||
 | 
			
		||||
#. Translators: this MUST be either "toggle-switch-us"
 | 
			
		||||
#. (for toggle switches containing the English words
 | 
			
		||||
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
 | 
			
		||||
#. switches containing "◯" and "|"). Other values will
 | 
			
		||||
#. simply result in invisible toggle switches.
 | 
			
		||||
#: js/ui/popupMenu.js:285
 | 
			
		||||
msgid "toggle-switch-us"
 | 
			
		||||
msgstr "toggle-switch-intl"
 | 
			
		||||
 | 
			
		||||
#: js/ui/runDialog.js:64
 | 
			
		||||
msgid "Enter a Command"
 | 
			
		||||
msgstr "Introducir un comando"
 | 
			
		||||
@@ -1667,11 +1664,11 @@ msgstr "Rechazo de teclas"
 | 
			
		||||
msgid "Mouse Keys"
 | 
			
		||||
msgstr "Teclas del ratón"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/accessibility.js:151
 | 
			
		||||
#: js/ui/status/accessibility.js:135
 | 
			
		||||
msgid "High Contrast"
 | 
			
		||||
msgstr "Contraste alto"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/accessibility.js:182
 | 
			
		||||
#: js/ui/status/accessibility.js:177
 | 
			
		||||
msgid "Large Text"
 | 
			
		||||
msgstr "Texto grande"
 | 
			
		||||
 | 
			
		||||
@@ -1679,7 +1676,7 @@ msgstr "Texto grande"
 | 
			
		||||
msgid "Bluetooth"
 | 
			
		||||
msgstr "Bluetooth"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585
 | 
			
		||||
#: js/ui/status/bluetooth.js:47 js/ui/status/network.js:586
 | 
			
		||||
msgid "Bluetooth Settings"
 | 
			
		||||
msgstr "Configuración de Bluetooth"
 | 
			
		||||
 | 
			
		||||
@@ -1752,13 +1749,13 @@ msgid "<unknown>"
 | 
			
		||||
msgstr "<desconocido>"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a network identifier
 | 
			
		||||
#: js/ui/status/network.js:416 js/ui/status/network.js:1292
 | 
			
		||||
#: js/ui/status/network.js:417 js/ui/status/network.js:1293
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Off"
 | 
			
		||||
msgstr "%s apagada"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a network identifier
 | 
			
		||||
#: js/ui/status/network.js:419
 | 
			
		||||
#: js/ui/status/network.js:420
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Connected"
 | 
			
		||||
msgstr "%s conectada"
 | 
			
		||||
@@ -1766,189 +1763,189 @@ msgstr "%s conectada"
 | 
			
		||||
#. Translators: this is for network devices that are physically present but are not
 | 
			
		||||
#. under NetworkManager's control (and thus cannot be used in the menu);
 | 
			
		||||
#. %s is a network identifier
 | 
			
		||||
#: js/ui/status/network.js:424
 | 
			
		||||
#: js/ui/status/network.js:425
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Unmanaged"
 | 
			
		||||
msgstr "%s sin gestionar"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a network identifier
 | 
			
		||||
#: js/ui/status/network.js:427
 | 
			
		||||
#: js/ui/status/network.js:428
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Disconnecting"
 | 
			
		||||
msgstr "Desconectando %s"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a network identifier
 | 
			
		||||
#: js/ui/status/network.js:434 js/ui/status/network.js:1284
 | 
			
		||||
#: js/ui/status/network.js:435 js/ui/status/network.js:1285
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Connecting"
 | 
			
		||||
msgstr "Conectando %s"
 | 
			
		||||
 | 
			
		||||
#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier
 | 
			
		||||
#: js/ui/status/network.js:437
 | 
			
		||||
#: js/ui/status/network.js:438
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Requires Authentication"
 | 
			
		||||
msgstr "%s requiere autenticación"
 | 
			
		||||
 | 
			
		||||
#. Translators: this is for devices that require some kind of firmware or kernel
 | 
			
		||||
#. module, which is missing; %s is a network identifier
 | 
			
		||||
#: js/ui/status/network.js:445
 | 
			
		||||
#: js/ui/status/network.js:446
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "Firmware Missing For %s"
 | 
			
		||||
msgstr "Falta el «firmware» para %s"
 | 
			
		||||
 | 
			
		||||
#. Translators: this is for a network device that cannot be activated (for example it
 | 
			
		||||
#. is disabled by rfkill, or it has no coverage; %s is a network identifier
 | 
			
		||||
#: js/ui/status/network.js:449
 | 
			
		||||
#: js/ui/status/network.js:450
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Unavailable"
 | 
			
		||||
msgstr "%s no disponible"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a network identifier
 | 
			
		||||
#: js/ui/status/network.js:452
 | 
			
		||||
#: js/ui/status/network.js:453
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Connection Failed"
 | 
			
		||||
msgstr "Falló la conexión %s"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:464
 | 
			
		||||
#: js/ui/status/network.js:465
 | 
			
		||||
msgid "Wired Settings"
 | 
			
		||||
msgstr "Configuración de red cableada"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:506
 | 
			
		||||
#: js/ui/status/network.js:507
 | 
			
		||||
msgid "Mobile Broadband Settings"
 | 
			
		||||
msgstr "Configuración de banda ancha móvil"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a network identifier
 | 
			
		||||
#: js/ui/status/network.js:553 js/ui/status/network.js:1289
 | 
			
		||||
#: js/ui/status/network.js:554 js/ui/status/network.js:1290
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Hardware Disabled"
 | 
			
		||||
msgstr "Hardware %s desactivado"
 | 
			
		||||
 | 
			
		||||
#. Translators: this is for a network device that cannot be activated
 | 
			
		||||
#. because it's disabled by rfkill (airplane mode); %s is a network identifier
 | 
			
		||||
#: js/ui/status/network.js:557
 | 
			
		||||
#: js/ui/status/network.js:558
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Disabled"
 | 
			
		||||
msgstr "%s desactivado"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:597
 | 
			
		||||
#: js/ui/status/network.js:598
 | 
			
		||||
msgid "Connect to Internet"
 | 
			
		||||
msgstr "Conectar a Internet"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:786
 | 
			
		||||
#: js/ui/status/network.js:787
 | 
			
		||||
msgid "Airplane Mode is On"
 | 
			
		||||
msgstr "El modo avión está activado"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:787
 | 
			
		||||
#: js/ui/status/network.js:788
 | 
			
		||||
msgid "Wi-Fi is disabled when airplane mode is on."
 | 
			
		||||
msgstr "La Wi-Fi se desactiva cuando se activa el modo avión."
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:788
 | 
			
		||||
#: js/ui/status/network.js:789
 | 
			
		||||
msgid "Turn Off Airplane Mode"
 | 
			
		||||
msgstr "Apagar el modo avión"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:797
 | 
			
		||||
#: js/ui/status/network.js:798
 | 
			
		||||
msgid "Wi-Fi is Off"
 | 
			
		||||
msgstr "La Wi-Fi está desactivada"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:798
 | 
			
		||||
#: js/ui/status/network.js:799
 | 
			
		||||
msgid "Wi-Fi needs to be turned on in order to connect to a network."
 | 
			
		||||
msgstr "Se debe activar la Wi-Fi para poder conectarse a la red."
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:799
 | 
			
		||||
#: js/ui/status/network.js:800
 | 
			
		||||
msgid "Turn On Wi-Fi"
 | 
			
		||||
msgstr "Activar la Wi-Fi"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:824
 | 
			
		||||
#: js/ui/status/network.js:825
 | 
			
		||||
msgid "Wi-Fi Networks"
 | 
			
		||||
msgstr "Redes Wi-Fi"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:826
 | 
			
		||||
#: js/ui/status/network.js:827
 | 
			
		||||
msgid "Select a network"
 | 
			
		||||
msgstr "Seleccionar una red"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:855
 | 
			
		||||
#: js/ui/status/network.js:856
 | 
			
		||||
msgid "No Networks"
 | 
			
		||||
msgstr "No hay redes"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:876 js/ui/status/rfkill.js:104
 | 
			
		||||
#: js/ui/status/network.js:877 js/ui/status/rfkill.js:104
 | 
			
		||||
msgid "Use hardware switch to turn off"
 | 
			
		||||
msgstr "Usar el interruptor hardware para apagar"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1152
 | 
			
		||||
#: js/ui/status/network.js:1153
 | 
			
		||||
msgid "Select Network"
 | 
			
		||||
msgstr "Seleccionar red"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1158
 | 
			
		||||
#: js/ui/status/network.js:1159
 | 
			
		||||
msgid "Wi-Fi Settings"
 | 
			
		||||
msgstr "Configuración de Wi-Fi"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a network identifier
 | 
			
		||||
#: js/ui/status/network.js:1280
 | 
			
		||||
#: js/ui/status/network.js:1281
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Hotspot Active"
 | 
			
		||||
msgstr "Punto de acceso %s activo"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a network identifier
 | 
			
		||||
#: js/ui/status/network.js:1295
 | 
			
		||||
#: js/ui/status/network.js:1296
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Not Connected"
 | 
			
		||||
msgstr "%s no conectado"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1392
 | 
			
		||||
#: js/ui/status/network.js:1393
 | 
			
		||||
msgid "connecting…"
 | 
			
		||||
msgstr "conectando…"
 | 
			
		||||
 | 
			
		||||
#. Translators: this is for network connections that require some kind of key or password
 | 
			
		||||
#: js/ui/status/network.js:1395
 | 
			
		||||
#: js/ui/status/network.js:1396
 | 
			
		||||
msgid "authentication required"
 | 
			
		||||
msgstr "se necesita autenticación"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1397
 | 
			
		||||
#: js/ui/status/network.js:1398
 | 
			
		||||
msgid "connection failed"
 | 
			
		||||
msgstr "falló la conexión"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1447
 | 
			
		||||
#: js/ui/status/network.js:1448
 | 
			
		||||
msgid "VPN Settings"
 | 
			
		||||
msgstr "Configuración de VPN"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1464
 | 
			
		||||
#: js/ui/status/network.js:1465
 | 
			
		||||
msgid "VPN"
 | 
			
		||||
msgstr "VPN"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1474
 | 
			
		||||
#: js/ui/status/network.js:1475
 | 
			
		||||
msgid "VPN Off"
 | 
			
		||||
msgstr "VPN apagada"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1535 js/ui/status/rfkill.js:82
 | 
			
		||||
#: js/ui/status/network.js:1536 js/ui/status/rfkill.js:82
 | 
			
		||||
msgid "Network Settings"
 | 
			
		||||
msgstr "Configuración de la red"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1564
 | 
			
		||||
#: js/ui/status/network.js:1565
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Wired Connection"
 | 
			
		||||
msgid_plural "%s Wired Connections"
 | 
			
		||||
msgstr[0] "%s conexión cableada"
 | 
			
		||||
msgstr[1] "%s conexiones cableadas"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1568
 | 
			
		||||
#: js/ui/status/network.js:1569
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Wi-Fi Connection"
 | 
			
		||||
msgid_plural "%s Wi-Fi Connections"
 | 
			
		||||
msgstr[0] "%s conexión inalámbrica"
 | 
			
		||||
msgstr[1] "%s conexiones inalámbricas"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1572
 | 
			
		||||
#: js/ui/status/network.js:1573
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Modem Connection"
 | 
			
		||||
msgid_plural "%s Modem Connections"
 | 
			
		||||
msgstr[0] "%s conexión por módem"
 | 
			
		||||
msgstr[1] "%s conexiones por módem"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1701
 | 
			
		||||
#: js/ui/status/network.js:1706
 | 
			
		||||
msgid "Connection failed"
 | 
			
		||||
msgstr "Falló la conexión"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1702
 | 
			
		||||
#: js/ui/status/network.js:1707
 | 
			
		||||
msgid "Activation of network connection failed"
 | 
			
		||||
msgstr "Falló la activación de la conexión de red"
 | 
			
		||||
 | 
			
		||||
@@ -2154,7 +2151,7 @@ msgstr[1] "La configuración se revertirá en %d segundos"
 | 
			
		||||
 | 
			
		||||
#. Translators: This represents the size of a window. The first number is
 | 
			
		||||
#. * the width of the window and the second is the height.
 | 
			
		||||
#: js/ui/windowManager.js:662
 | 
			
		||||
#: js/ui/windowManager.js:677
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%d × %d"
 | 
			
		||||
msgstr "%d × %d"
 | 
			
		||||
@@ -2289,6 +2286,9 @@ msgstr[1] "%u entradas"
 | 
			
		||||
msgid "System Sounds"
 | 
			
		||||
msgstr "Sonidos del sistema"
 | 
			
		||||
 | 
			
		||||
#~ msgid "toggle-switch-us"
 | 
			
		||||
#~ msgstr "toggle-switch-intl"
 | 
			
		||||
 | 
			
		||||
#~ msgid "network-workgroup"
 | 
			
		||||
#~ msgstr "network-workgroup"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										178
									
								
								po/id.po
									
									
									
									
									
								
							
							
						
						
									
										178
									
								
								po/id.po
									
									
									
									
									
								
							@@ -4,12 +4,13 @@
 | 
			
		||||
# Andika Triwidada <andika@gmail.com>, 2010-2014, 2017.
 | 
			
		||||
# Dirgita <dirgitadevina@yahoo.co.id>, 2011, 2012, 2014.
 | 
			
		||||
# Wibiharto <wibinem@yahoo.com>, 2011.
 | 
			
		||||
# Kukuh Syafaat <kukuhsyafaat@gnome.org>, 2017, 2018, 2019.
 | 
			
		||||
msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: gnome-shell master\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
 | 
			
		||||
"POT-Creation-Date: 2019-02-21 18:43+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2019-02-14 22:18+0700\n"
 | 
			
		||||
"POT-Creation-Date: 2019-04-17 19:29+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2019-04-25 14:54+0700\n"
 | 
			
		||||
"Last-Translator: Kukuh Syafaat <kukuhsyafaat@gnome.org>\n"
 | 
			
		||||
"Language-Team: Indonesian <gnome-l10n-id@googlegroups.com>\n"
 | 
			
		||||
"Language: id\n"
 | 
			
		||||
@@ -376,11 +377,6 @@ msgstr ""
 | 
			
		||||
msgid "Network Login"
 | 
			
		||||
msgstr "Log Masuk Jaringan"
 | 
			
		||||
 | 
			
		||||
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
 | 
			
		||||
#: data/org.gnome.Shell.PortalHelper.desktop.in.in:9
 | 
			
		||||
msgid "network-workgroup"
 | 
			
		||||
msgstr "network-workgroup"
 | 
			
		||||
 | 
			
		||||
#: js/extensionPrefs/main.js:116
 | 
			
		||||
msgid "Something’s gone wrong"
 | 
			
		||||
msgstr "Ada yang tidak beres"
 | 
			
		||||
@@ -461,7 +457,7 @@ msgstr "Tak masuk daftar?"
 | 
			
		||||
 | 
			
		||||
#. Translators: this message is shown below the username entry field
 | 
			
		||||
#. to clue the user in on how to login to the local network realm
 | 
			
		||||
#: js/gdm/loginDialog.js:880
 | 
			
		||||
#: js/gdm/loginDialog.js:884
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "(e.g., user or %s)"
 | 
			
		||||
msgstr "(cth., pengguna dari %s)"
 | 
			
		||||
@@ -469,12 +465,12 @@ msgstr "(cth., pengguna dari %s)"
 | 
			
		||||
#. TTLS and PEAP are actually much more complicated, but this complication
 | 
			
		||||
#. is not visible here since we only care about phase2 authentication
 | 
			
		||||
#. (and don't even care of which one)
 | 
			
		||||
#: js/gdm/loginDialog.js:885 js/ui/components/networkAgent.js:243
 | 
			
		||||
#: js/gdm/loginDialog.js:889 js/ui/components/networkAgent.js:243
 | 
			
		||||
#: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281
 | 
			
		||||
msgid "Username: "
 | 
			
		||||
msgstr "Nama pengguna: "
 | 
			
		||||
 | 
			
		||||
#: js/gdm/loginDialog.js:1223
 | 
			
		||||
#: js/gdm/loginDialog.js:1227
 | 
			
		||||
msgid "Login Window"
 | 
			
		||||
msgstr "Jendela Log Masuk"
 | 
			
		||||
 | 
			
		||||
@@ -728,32 +724,37 @@ msgstr "Sering"
 | 
			
		||||
msgid "All"
 | 
			
		||||
msgstr "Semua"
 | 
			
		||||
 | 
			
		||||
#: js/ui/appDisplay.js:1737 js/ui/panel.js:83
 | 
			
		||||
#. Translators: This is the heading of a list of open windows
 | 
			
		||||
#: js/ui/appDisplay.js:1713 js/ui/panel.js:79
 | 
			
		||||
msgid "Open Windows"
 | 
			
		||||
msgstr "Buka Jendela"
 | 
			
		||||
 | 
			
		||||
#: js/ui/appDisplay.js:1732 js/ui/panel.js:86
 | 
			
		||||
msgid "New Window"
 | 
			
		||||
msgstr "Jendela Baru"
 | 
			
		||||
 | 
			
		||||
#: js/ui/appDisplay.js:1751
 | 
			
		||||
#: js/ui/appDisplay.js:1746
 | 
			
		||||
msgid "Launch using Dedicated Graphics Card"
 | 
			
		||||
msgstr "Luncurkan menggunakan Kartu Grafis Terdedikasi"
 | 
			
		||||
 | 
			
		||||
#: js/ui/appDisplay.js:1778 js/ui/dash.js:239
 | 
			
		||||
#: js/ui/appDisplay.js:1773 js/ui/dash.js:239
 | 
			
		||||
msgid "Remove from Favorites"
 | 
			
		||||
msgstr "Hapus dari Favorit"
 | 
			
		||||
 | 
			
		||||
#: js/ui/appDisplay.js:1784
 | 
			
		||||
#: js/ui/appDisplay.js:1779
 | 
			
		||||
msgid "Add to Favorites"
 | 
			
		||||
msgstr "Tambah ke Favorit"
 | 
			
		||||
 | 
			
		||||
#: js/ui/appDisplay.js:1794 js/ui/panel.js:94
 | 
			
		||||
#: js/ui/appDisplay.js:1789 js/ui/panel.js:97
 | 
			
		||||
msgid "Show Details"
 | 
			
		||||
msgstr "Tampilkan Rincian"
 | 
			
		||||
 | 
			
		||||
#: js/ui/appFavorites.js:141
 | 
			
		||||
#: js/ui/appFavorites.js:149
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s has been added to your favorites."
 | 
			
		||||
msgstr "%s telah ditambahkan ke favorit Anda."
 | 
			
		||||
 | 
			
		||||
#: js/ui/appFavorites.js:175
 | 
			
		||||
#: js/ui/appFavorites.js:183
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s has been removed from your favorites."
 | 
			
		||||
msgstr "%s telah dihapus dari favorit Anda."
 | 
			
		||||
@@ -1039,7 +1040,7 @@ msgstr "Sandi jaringan data seluler"
 | 
			
		||||
msgid "A password is required to connect to “%s”."
 | 
			
		||||
msgstr "Perlu suatu sandi untuk menyambung ke \"%s\"."
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1665
 | 
			
		||||
#: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1664
 | 
			
		||||
msgid "Network Manager"
 | 
			
		||||
msgstr "Manajer Jaringan"
 | 
			
		||||
 | 
			
		||||
@@ -1109,23 +1110,23 @@ msgstr "Tambah jam dunia…"
 | 
			
		||||
msgid "World Clocks"
 | 
			
		||||
msgstr "Jam Dunia"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:222
 | 
			
		||||
#: js/ui/dateMenu.js:228
 | 
			
		||||
msgid "Weather"
 | 
			
		||||
msgstr "Cuaca"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:305
 | 
			
		||||
#: js/ui/dateMenu.js:311
 | 
			
		||||
msgid "Select a location…"
 | 
			
		||||
msgstr "Pilih lokasi…"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:313
 | 
			
		||||
#: js/ui/dateMenu.js:319
 | 
			
		||||
msgid "Loading…"
 | 
			
		||||
msgstr "Memuat…"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:323
 | 
			
		||||
#: js/ui/dateMenu.js:329
 | 
			
		||||
msgid "Go online for weather information"
 | 
			
		||||
msgstr "Pergi daring untuk informasi cuaca"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:325
 | 
			
		||||
#: js/ui/dateMenu.js:331
 | 
			
		||||
msgid "Weather information is currently unavailable"
 | 
			
		||||
msgstr "Informasi cuaca saat ini tidak tersedia"
 | 
			
		||||
 | 
			
		||||
@@ -1288,26 +1289,26 @@ msgid "Download and install “%s” from extensions.gnome.org?"
 | 
			
		||||
msgstr "Unduh dan pasang \"%s\" dari extensions.gnome.org?"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is an application name like "Settings"
 | 
			
		||||
#: js/ui/inhibitShortcutsDialog.js:50
 | 
			
		||||
#: js/ui/inhibitShortcutsDialog.js:78
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s wants to inhibit shortcuts"
 | 
			
		||||
msgstr "%s ingin mencegah pintasan"
 | 
			
		||||
 | 
			
		||||
#: js/ui/inhibitShortcutsDialog.js:51
 | 
			
		||||
#: js/ui/inhibitShortcutsDialog.js:79
 | 
			
		||||
msgid "Application wants to inhibit shortcuts"
 | 
			
		||||
msgstr "Aplikasi ingin mencegah pintasan"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a keyboard shortcut like "Super+x"
 | 
			
		||||
#: js/ui/inhibitShortcutsDialog.js:60
 | 
			
		||||
#: js/ui/inhibitShortcutsDialog.js:88
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "You can restore shortcuts by pressing %s."
 | 
			
		||||
msgstr "Anda dapat memulihkan pintasan dengan menekan %s."
 | 
			
		||||
 | 
			
		||||
#: js/ui/inhibitShortcutsDialog.js:65
 | 
			
		||||
#: js/ui/inhibitShortcutsDialog.js:93
 | 
			
		||||
msgid "Deny"
 | 
			
		||||
msgstr "Tolak"
 | 
			
		||||
 | 
			
		||||
#: js/ui/inhibitShortcutsDialog.js:71
 | 
			
		||||
#: js/ui/inhibitShortcutsDialog.js:100
 | 
			
		||||
msgid "Allow"
 | 
			
		||||
msgstr "Izinkan"
 | 
			
		||||
 | 
			
		||||
@@ -1358,13 +1359,13 @@ msgid "Leave On"
 | 
			
		||||
msgstr "Biarkan Menyala"
 | 
			
		||||
 | 
			
		||||
#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133
 | 
			
		||||
#: js/ui/status/network.js:1264
 | 
			
		||||
#: js/ui/status/network.js:1263
 | 
			
		||||
msgid "Turn On"
 | 
			
		||||
msgstr "Nyalakan"
 | 
			
		||||
 | 
			
		||||
#: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133
 | 
			
		||||
#: js/ui/status/network.js:128 js/ui/status/network.js:310
 | 
			
		||||
#: js/ui/status/network.js:1264 js/ui/status/network.js:1376
 | 
			
		||||
#: js/ui/status/network.js:1263 js/ui/status/network.js:1375
 | 
			
		||||
#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79
 | 
			
		||||
#: js/ui/status/rfkill.js:106
 | 
			
		||||
msgid "Turn Off"
 | 
			
		||||
@@ -1374,59 +1375,59 @@ msgstr "Matikan"
 | 
			
		||||
msgid "Leave Off"
 | 
			
		||||
msgstr "Biarkan Mati"
 | 
			
		||||
 | 
			
		||||
#: js/ui/keyboard.js:203
 | 
			
		||||
#: js/ui/keyboard.js:200
 | 
			
		||||
msgid "Region & Language Settings"
 | 
			
		||||
msgstr "Pengaturan Wilayah & Bahasa"
 | 
			
		||||
 | 
			
		||||
#: js/ui/lookingGlass.js:614
 | 
			
		||||
#: js/ui/lookingGlass.js:615
 | 
			
		||||
msgid "No extensions installed"
 | 
			
		||||
msgstr "Tak ada ekstensi terpasang"
 | 
			
		||||
 | 
			
		||||
#. Translators: argument is an extension UUID.
 | 
			
		||||
#: js/ui/lookingGlass.js:668
 | 
			
		||||
#: js/ui/lookingGlass.js:669
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s has not emitted any errors."
 | 
			
		||||
msgstr "%s tidak menampilkan galat apa pun."
 | 
			
		||||
 | 
			
		||||
#: js/ui/lookingGlass.js:674
 | 
			
		||||
#: js/ui/lookingGlass.js:675
 | 
			
		||||
msgid "Hide Errors"
 | 
			
		||||
msgstr "Sembunyikan Galat"
 | 
			
		||||
 | 
			
		||||
#: js/ui/lookingGlass.js:678 js/ui/lookingGlass.js:738
 | 
			
		||||
#: js/ui/lookingGlass.js:679 js/ui/lookingGlass.js:739
 | 
			
		||||
msgid "Show Errors"
 | 
			
		||||
msgstr "Tampilkan Galat"
 | 
			
		||||
 | 
			
		||||
#: js/ui/lookingGlass.js:687
 | 
			
		||||
#: js/ui/lookingGlass.js:688
 | 
			
		||||
msgid "Enabled"
 | 
			
		||||
msgstr "Diaktifkan"
 | 
			
		||||
 | 
			
		||||
#. translators:
 | 
			
		||||
#. * The device has been disabled
 | 
			
		||||
#: js/ui/lookingGlass.js:690 subprojects/gvc/gvc-mixer-control.c:1866
 | 
			
		||||
#: js/ui/lookingGlass.js:691 subprojects/gvc/gvc-mixer-control.c:1864
 | 
			
		||||
msgid "Disabled"
 | 
			
		||||
msgstr "Dinonaktifkan"
 | 
			
		||||
 | 
			
		||||
#: js/ui/lookingGlass.js:692
 | 
			
		||||
#: js/ui/lookingGlass.js:693
 | 
			
		||||
msgid "Error"
 | 
			
		||||
msgstr "Galat"
 | 
			
		||||
 | 
			
		||||
#: js/ui/lookingGlass.js:694
 | 
			
		||||
#: js/ui/lookingGlass.js:695
 | 
			
		||||
msgid "Out of date"
 | 
			
		||||
msgstr "Kadaluarsa"
 | 
			
		||||
 | 
			
		||||
#: js/ui/lookingGlass.js:696
 | 
			
		||||
#: js/ui/lookingGlass.js:697
 | 
			
		||||
msgid "Downloading"
 | 
			
		||||
msgstr "Mengunduh"
 | 
			
		||||
 | 
			
		||||
#: js/ui/lookingGlass.js:720
 | 
			
		||||
#: js/ui/lookingGlass.js:721
 | 
			
		||||
msgid "View Source"
 | 
			
		||||
msgstr "Tilik Sumber"
 | 
			
		||||
 | 
			
		||||
#: js/ui/lookingGlass.js:729
 | 
			
		||||
#: js/ui/lookingGlass.js:730
 | 
			
		||||
msgid "Web Page"
 | 
			
		||||
msgstr "Halaman Web"
 | 
			
		||||
 | 
			
		||||
#: js/ui/messageTray.js:1474
 | 
			
		||||
#: js/ui/messageTray.js:1480
 | 
			
		||||
msgid "System Information"
 | 
			
		||||
msgstr "Informasi Sistem"
 | 
			
		||||
 | 
			
		||||
@@ -1504,35 +1505,25 @@ msgstr "Tekan Esc untuk keluar"
 | 
			
		||||
msgid "Press any key to exit"
 | 
			
		||||
msgstr "Tekan tombol apa saja untuk keluar"
 | 
			
		||||
 | 
			
		||||
#: js/ui/panel.js:108
 | 
			
		||||
#: js/ui/panel.js:113
 | 
			
		||||
msgid "Quit"
 | 
			
		||||
msgstr "Keluar"
 | 
			
		||||
 | 
			
		||||
#. Translators: If there is no suitable word for "Activities"
 | 
			
		||||
#. in your language, you can use the word for "Overview".
 | 
			
		||||
#: js/ui/panel.js:466
 | 
			
		||||
#: js/ui/panel.js:468
 | 
			
		||||
msgid "Activities"
 | 
			
		||||
msgstr "Aktivitas"
 | 
			
		||||
 | 
			
		||||
#: js/ui/panel.js:741
 | 
			
		||||
#: js/ui/panel.js:743
 | 
			
		||||
msgctxt "System menu in the top bar"
 | 
			
		||||
msgid "System"
 | 
			
		||||
msgstr "Sistem"
 | 
			
		||||
 | 
			
		||||
#: js/ui/panel.js:861
 | 
			
		||||
#: js/ui/panel.js:864
 | 
			
		||||
msgid "Top Bar"
 | 
			
		||||
msgstr "Bar Atas"
 | 
			
		||||
 | 
			
		||||
# Dirgita: Hayo, enaknya pake I/O atau ON/OFF?^^
 | 
			
		||||
#. Translators: this MUST be either "toggle-switch-us"
 | 
			
		||||
#. (for toggle switches containing the English words
 | 
			
		||||
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
 | 
			
		||||
#. switches containing "◯" and "|"). Other values will
 | 
			
		||||
#. simply result in invisible toggle switches.
 | 
			
		||||
#: js/ui/popupMenu.js:285
 | 
			
		||||
msgid "toggle-switch-us"
 | 
			
		||||
msgstr "toggle-switch-intl"
 | 
			
		||||
 | 
			
		||||
#: js/ui/runDialog.js:64
 | 
			
		||||
msgid "Enter a Command"
 | 
			
		||||
msgstr "Ketikkan Perintah"
 | 
			
		||||
@@ -1569,7 +1560,7 @@ msgid_plural "%d new notifications"
 | 
			
		||||
msgstr[0] "%d pemberitahuan baru"
 | 
			
		||||
msgstr[1] "%d pemberitahuan baru"
 | 
			
		||||
 | 
			
		||||
#: js/ui/screenShield.js:449 js/ui/status/system.js:270
 | 
			
		||||
#: js/ui/screenShield.js:449 js/ui/status/system.js:271
 | 
			
		||||
msgid "Lock"
 | 
			
		||||
msgstr "Kunci"
 | 
			
		||||
 | 
			
		||||
@@ -1584,11 +1575,11 @@ msgstr "GNOME perlu mengunci layar"
 | 
			
		||||
#.
 | 
			
		||||
#. XXX: another option is to kick the user into the gdm login
 | 
			
		||||
#. screen, where we're not affected by grabs
 | 
			
		||||
#: js/ui/screenShield.js:834 js/ui/screenShield.js:1307
 | 
			
		||||
#: js/ui/screenShield.js:826 js/ui/screenShield.js:1299
 | 
			
		||||
msgid "Unable to lock"
 | 
			
		||||
msgstr "Tak bisa mengunci"
 | 
			
		||||
 | 
			
		||||
#: js/ui/screenShield.js:835 js/ui/screenShield.js:1308
 | 
			
		||||
#: js/ui/screenShield.js:827 js/ui/screenShield.js:1300
 | 
			
		||||
msgid "Lock was blocked by an application"
 | 
			
		||||
msgstr "Kunci diblokir oleh suatu aplikasi"
 | 
			
		||||
 | 
			
		||||
@@ -1750,7 +1741,7 @@ msgid "<unknown>"
 | 
			
		||||
msgstr "<tak dikenal>"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a network identifier
 | 
			
		||||
#: js/ui/status/network.js:416 js/ui/status/network.js:1293
 | 
			
		||||
#: js/ui/status/network.js:416 js/ui/status/network.js:1292
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Off"
 | 
			
		||||
msgstr "%s Mati"
 | 
			
		||||
@@ -1776,7 +1767,7 @@ msgid "%s Disconnecting"
 | 
			
		||||
msgstr "%s Memutus"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a network identifier
 | 
			
		||||
#: js/ui/status/network.js:434 js/ui/status/network.js:1285
 | 
			
		||||
#: js/ui/status/network.js:434 js/ui/status/network.js:1284
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Connecting"
 | 
			
		||||
msgstr "%s Menyambung"
 | 
			
		||||
@@ -1816,7 +1807,7 @@ msgid "Mobile Broadband Settings"
 | 
			
		||||
msgstr "Pengaturan Data Seluler"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a network identifier
 | 
			
		||||
#: js/ui/status/network.js:553 js/ui/status/network.js:1290
 | 
			
		||||
#: js/ui/status/network.js:553 js/ui/status/network.js:1289
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Hardware Disabled"
 | 
			
		||||
msgstr "%s Perangkat Keras Dinonaktifkan"
 | 
			
		||||
@@ -1881,72 +1872,72 @@ msgid "Wi-Fi Settings"
 | 
			
		||||
msgstr "Pengaturan Wi-Fi"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a network identifier
 | 
			
		||||
#: js/ui/status/network.js:1281
 | 
			
		||||
#: js/ui/status/network.js:1280
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Hotspot Active"
 | 
			
		||||
msgstr "%s Hotspot Aktif"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a network identifier
 | 
			
		||||
#: js/ui/status/network.js:1296
 | 
			
		||||
#: js/ui/status/network.js:1295
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Not Connected"
 | 
			
		||||
msgstr "%s Tak Tersambung"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1393
 | 
			
		||||
#: js/ui/status/network.js:1392
 | 
			
		||||
msgid "connecting…"
 | 
			
		||||
msgstr "menyambung…"
 | 
			
		||||
 | 
			
		||||
#. Translators: this is for network connections that require some kind of key or password
 | 
			
		||||
#: js/ui/status/network.js:1396
 | 
			
		||||
#: js/ui/status/network.js:1395
 | 
			
		||||
msgid "authentication required"
 | 
			
		||||
msgstr "diperlukan otentikasi"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1398
 | 
			
		||||
#: js/ui/status/network.js:1397
 | 
			
		||||
msgid "connection failed"
 | 
			
		||||
msgstr "koneksi gagal"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1448
 | 
			
		||||
#: js/ui/status/network.js:1447
 | 
			
		||||
msgid "VPN Settings"
 | 
			
		||||
msgstr "Pengaturan VPN"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1465
 | 
			
		||||
#: js/ui/status/network.js:1464
 | 
			
		||||
msgid "VPN"
 | 
			
		||||
msgstr "VPN"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1475
 | 
			
		||||
#: js/ui/status/network.js:1474
 | 
			
		||||
msgid "VPN Off"
 | 
			
		||||
msgstr "VPN Mati"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1536 js/ui/status/rfkill.js:82
 | 
			
		||||
#: js/ui/status/network.js:1535 js/ui/status/rfkill.js:82
 | 
			
		||||
msgid "Network Settings"
 | 
			
		||||
msgstr "Pengaturan Jaringan"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1565
 | 
			
		||||
#: js/ui/status/network.js:1564
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Wired Connection"
 | 
			
		||||
msgid_plural "%s Wired Connections"
 | 
			
		||||
msgstr[0] "%s Koneksi Kabel"
 | 
			
		||||
msgstr[1] "%s Koneksi Kabel"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1569
 | 
			
		||||
#: js/ui/status/network.js:1568
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Wi-Fi Connection"
 | 
			
		||||
msgid_plural "%s Wi-Fi Connections"
 | 
			
		||||
msgstr[0] "%s Koneksi Wi-Fi"
 | 
			
		||||
msgstr[1] "%s Koneksi Wi-Fi"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1573
 | 
			
		||||
#: js/ui/status/network.js:1572
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Modem Connection"
 | 
			
		||||
msgid_plural "%s Modem Connections"
 | 
			
		||||
msgstr[0] "%s Koneksi Modem"
 | 
			
		||||
msgstr[1] "%s Koneksi Modem"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1702
 | 
			
		||||
#: js/ui/status/network.js:1705
 | 
			
		||||
msgid "Connection failed"
 | 
			
		||||
msgstr "Koneksi gagal"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1703
 | 
			
		||||
#: js/ui/status/network.js:1706
 | 
			
		||||
msgid "Activation of network connection failed"
 | 
			
		||||
msgstr "Aktivasi koneksi jaringan gagal"
 | 
			
		||||
 | 
			
		||||
@@ -2028,15 +2019,15 @@ msgstr "Keluar"
 | 
			
		||||
msgid "Account Settings"
 | 
			
		||||
msgstr "Pengaturan Akun"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/system.js:255
 | 
			
		||||
#: js/ui/status/system.js:256
 | 
			
		||||
msgid "Orientation Lock"
 | 
			
		||||
msgstr "Kunci Orientasi"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/system.js:281
 | 
			
		||||
#: js/ui/status/system.js:282
 | 
			
		||||
msgid "Suspend"
 | 
			
		||||
msgstr "Suspensi"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/system.js:291
 | 
			
		||||
#: js/ui/status/system.js:292
 | 
			
		||||
msgid "Power Off"
 | 
			
		||||
msgstr "Matikan"
 | 
			
		||||
 | 
			
		||||
@@ -2152,7 +2143,7 @@ msgstr[1] "Perubahan tatanan akan dikembalikan dalam %d detik"
 | 
			
		||||
 | 
			
		||||
#. Translators: This represents the size of a window. The first number is
 | 
			
		||||
#. * the width of the window and the second is the height.
 | 
			
		||||
#: js/ui/windowManager.js:662
 | 
			
		||||
#: js/ui/windowManager.js:677
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%d × %d"
 | 
			
		||||
msgstr "%d × %d"
 | 
			
		||||
@@ -2225,11 +2216,6 @@ msgstr "Pindahkan ke Monitor Kanan"
 | 
			
		||||
msgid "Evolution Calendar"
 | 
			
		||||
msgstr "Evolution Kalender"
 | 
			
		||||
 | 
			
		||||
#. Translators: Do NOT translate or transliterate this text (this is an icon file name)!
 | 
			
		||||
#: src/calendar-server/evolution-calendar.desktop.in:6
 | 
			
		||||
msgid "evolution"
 | 
			
		||||
msgstr "evolution"
 | 
			
		||||
 | 
			
		||||
#: src/main.c:408
 | 
			
		||||
msgid "Print version"
 | 
			
		||||
msgstr "Versi Cetak"
 | 
			
		||||
@@ -2246,12 +2232,12 @@ msgstr "Menggunakan mode tertentu, mis. \"gdm\" untuk layar masuk"
 | 
			
		||||
msgid "List possible modes"
 | 
			
		||||
msgstr "Menampilkan mode yang mungkin"
 | 
			
		||||
 | 
			
		||||
#: src/shell-app.c:260
 | 
			
		||||
#: src/shell-app.c:264
 | 
			
		||||
msgctxt "program"
 | 
			
		||||
msgid "Unknown"
 | 
			
		||||
msgstr "Tak dikenal"
 | 
			
		||||
 | 
			
		||||
#: src/shell-app.c:511
 | 
			
		||||
#: src/shell-app.c:515
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Failed to launch “%s”"
 | 
			
		||||
msgstr "Gagal meluncurkan \"%s\""
 | 
			
		||||
@@ -2270,7 +2256,7 @@ msgstr "Dialog autentikasi ditolak oleh pengguna"
 | 
			
		||||
 | 
			
		||||
#. translators:
 | 
			
		||||
#. * The number of sound outputs on a particular device
 | 
			
		||||
#: subprojects/gvc/gvc-mixer-control.c:1873
 | 
			
		||||
#: subprojects/gvc/gvc-mixer-control.c:1871
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "%u Output"
 | 
			
		||||
msgid_plural "%u Outputs"
 | 
			
		||||
@@ -2279,17 +2265,27 @@ msgstr[1] "%u Keluaran"
 | 
			
		||||
 | 
			
		||||
#. translators:
 | 
			
		||||
#. * The number of sound inputs on a particular device
 | 
			
		||||
#: subprojects/gvc/gvc-mixer-control.c:1883
 | 
			
		||||
#: subprojects/gvc/gvc-mixer-control.c:1881
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "%u Input"
 | 
			
		||||
msgid_plural "%u Inputs"
 | 
			
		||||
msgstr[0] "%u Masukan"
 | 
			
		||||
msgstr[1] "%u Masukan"
 | 
			
		||||
 | 
			
		||||
#: subprojects/gvc/gvc-mixer-control.c:2738
 | 
			
		||||
#: subprojects/gvc/gvc-mixer-control.c:2736
 | 
			
		||||
msgid "System Sounds"
 | 
			
		||||
msgstr "Suara Sistem"
 | 
			
		||||
 | 
			
		||||
#~ msgid "network-workgroup"
 | 
			
		||||
#~ msgstr "network-workgroup"
 | 
			
		||||
 | 
			
		||||
# Dirgita: Hayo, enaknya pake I/O atau ON/OFF?^^
 | 
			
		||||
#~ msgid "toggle-switch-us"
 | 
			
		||||
#~ msgstr "toggle-switch-intl"
 | 
			
		||||
 | 
			
		||||
#~ msgid "evolution"
 | 
			
		||||
#~ msgstr "evolution"
 | 
			
		||||
 | 
			
		||||
#~ msgid "There was an error loading the preferences dialog for %s:"
 | 
			
		||||
#~ msgstr "Ada galat saat memuat dialog preferensi bagi %s:"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1083
									
								
								po/zh_CN.po
									
									
									
									
									
								
							
							
						
						
									
										1083
									
								
								po/zh_CN.po
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1078,7 +1078,7 @@ main (int    argc,
 | 
			
		||||
 | 
			
		||||
/* ---------------------------------------------------------------------------------------------------- */
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
static void __attribute__((format(printf, 1, 0)))
 | 
			
		||||
print_debug (const gchar *format, ...)
 | 
			
		||||
{
 | 
			
		||||
  gchar *s;
 | 
			
		||||
 
 | 
			
		||||
@@ -266,7 +266,7 @@ main (int    argc,
 | 
			
		||||
 | 
			
		||||
/* ---------------------------------------------------------------------------------------------------- */
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
static void __attribute__((format(printf, 1, 0)))
 | 
			
		||||
print_debug (const gchar *format, ...)
 | 
			
		||||
{
 | 
			
		||||
  gchar *s;
 | 
			
		||||
 
 | 
			
		||||
@@ -1069,9 +1069,9 @@ _shell_app_add_window (ShellApp        *app,
 | 
			
		||||
 | 
			
		||||
  app->running_state->window_sort_stale = TRUE;
 | 
			
		||||
  app->running_state->windows = g_slist_prepend (app->running_state->windows, g_object_ref (window));
 | 
			
		||||
  g_signal_connect (window, "unmanaged", G_CALLBACK(shell_app_on_unmanaged), app);
 | 
			
		||||
  g_signal_connect (window, "notify::user-time", G_CALLBACK(shell_app_on_user_time_changed), app);
 | 
			
		||||
  g_signal_connect (window, "notify::skip-taskbar", G_CALLBACK(shell_app_on_skip_taskbar_changed), app);
 | 
			
		||||
  g_signal_connect_object (window, "unmanaged", G_CALLBACK(shell_app_on_unmanaged), app, 0);
 | 
			
		||||
  g_signal_connect_object (window, "notify::user-time", G_CALLBACK(shell_app_on_user_time_changed), app, 0);
 | 
			
		||||
  g_signal_connect_object (window, "notify::skip-taskbar", G_CALLBACK(shell_app_on_skip_taskbar_changed), app, 0);
 | 
			
		||||
 | 
			
		||||
  shell_app_update_app_actions (app, window);
 | 
			
		||||
  shell_app_ensure_busy_watch (app);
 | 
			
		||||
@@ -1151,11 +1151,10 @@ _shell_app_handle_startup_sequence (ShellApp            *app,
 | 
			
		||||
  if (starting && shell_app_get_state (app) == SHELL_APP_STATE_STOPPED)
 | 
			
		||||
    {
 | 
			
		||||
      MetaDisplay *display = shell_global_get_display (shell_global_get ());
 | 
			
		||||
      MetaX11Display *x11_display = meta_display_get_x11_display (display);
 | 
			
		||||
 | 
			
		||||
      shell_app_state_transition (app, SHELL_APP_STATE_STARTING);
 | 
			
		||||
      meta_x11_display_focus_the_no_focus_window (x11_display,
 | 
			
		||||
                                                  meta_startup_sequence_get_timestamp (sequence));
 | 
			
		||||
      meta_display_unset_input_focus (display,
 | 
			
		||||
                                      meta_startup_sequence_get_timestamp (sequence));
 | 
			
		||||
      app->started_on_workspace = meta_startup_sequence_get_workspace (sequence);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -61,8 +61,6 @@ struct _ShellGlobal {
 | 
			
		||||
 | 
			
		||||
  MetaDisplay *meta_display;
 | 
			
		||||
  MetaWorkspaceManager *workspace_manager;
 | 
			
		||||
  GdkDisplay *gdk_display;
 | 
			
		||||
  MetaX11Display *x11_display;
 | 
			
		||||
  Display *xdisplay;
 | 
			
		||||
 | 
			
		||||
  char *session_mode;
 | 
			
		||||
@@ -642,6 +640,9 @@ shell_global_set_stage_input_region (ShellGlobal *global,
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (SHELL_IS_GLOBAL (global));
 | 
			
		||||
 | 
			
		||||
  if (meta_is_wayland_compositor ())
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  nrects = g_slist_length (rectangles);
 | 
			
		||||
  rects = g_new (XRectangle, nrects);
 | 
			
		||||
  for (r = rectangles, i = 0; r; r = r->next, i++)
 | 
			
		||||
@@ -846,10 +847,6 @@ _shell_global_set_plugin (ShellGlobal *global,
 | 
			
		||||
  display = meta_plugin_get_display (plugin);
 | 
			
		||||
  global->meta_display = display;
 | 
			
		||||
  global->workspace_manager = meta_display_get_workspace_manager (display);
 | 
			
		||||
  global->x11_display = meta_display_get_x11_display (display);
 | 
			
		||||
  global->xdisplay = meta_x11_display_get_xdisplay (global->x11_display);
 | 
			
		||||
 | 
			
		||||
  global->gdk_display = gdk_x11_lookup_xdisplay (global->xdisplay);
 | 
			
		||||
 | 
			
		||||
  global->stage = CLUTTER_STAGE (meta_get_stage_for_display (display));
 | 
			
		||||
 | 
			
		||||
@@ -859,10 +856,13 @@ _shell_global_set_plugin (ShellGlobal *global,
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      MetaX11Display *x11_display = meta_display_get_x11_display (display);
 | 
			
		||||
      global->xdisplay = meta_x11_display_get_xdisplay (x11_display);
 | 
			
		||||
      global->stage_xwindow = clutter_x11_get_stage_window (global->stage);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  st_entry_set_cursor_func (entry_cursor_func, global);
 | 
			
		||||
  st_clipboard_set_selection (meta_display_get_selection (display));
 | 
			
		||||
 | 
			
		||||
  g_signal_connect (global->stage, "notify::width",
 | 
			
		||||
                    G_CALLBACK (global_stage_notify_width), global);
 | 
			
		||||
 
 | 
			
		||||
@@ -149,7 +149,7 @@ shell_glsl_quad_constructed (GObject *object)
 | 
			
		||||
 | 
			
		||||
  priv->pipeline = cogl_pipeline_copy (klass->base_pipeline);
 | 
			
		||||
 | 
			
		||||
  cogl_pipeline_set_layer_null_texture (priv->pipeline, 0, COGL_TEXTURE_TYPE_2D);
 | 
			
		||||
  cogl_pipeline_set_layer_null_texture (priv->pipeline, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
 
 | 
			
		||||
@@ -186,9 +186,7 @@ shell_invert_lightness_effect_init (ShellInvertLightnessEffect *self)
 | 
			
		||||
      cogl_pipeline_add_layer_snippet (klass->base_pipeline, 0, snippet);
 | 
			
		||||
      cogl_object_unref (snippet);
 | 
			
		||||
 | 
			
		||||
      cogl_pipeline_set_layer_null_texture (klass->base_pipeline,
 | 
			
		||||
                                            0, /* layer number */
 | 
			
		||||
                                            COGL_TEXTURE_TYPE_2D);
 | 
			
		||||
      cogl_pipeline_set_layer_null_texture (klass->base_pipeline, 0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  self->pipeline = cogl_pipeline_copy (klass->base_pipeline);
 | 
			
		||||
 
 | 
			
		||||
@@ -117,7 +117,7 @@ remove_mnemonics (const GValue *value)
 | 
			
		||||
  label = g_value_get_string (value);
 | 
			
		||||
  g_return_val_if_fail (label != NULL, NULL);
 | 
			
		||||
 | 
			
		||||
  /* Stripped label will have the original label lenght at most */
 | 
			
		||||
  /* Stripped label will have the original label length at most */
 | 
			
		||||
  stripped_label = temp = g_new (gchar, strlen(label) + 1);
 | 
			
		||||
  g_assert (stripped_label != NULL);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -430,7 +430,7 @@ ClutterContent *
 | 
			
		||||
shell_util_get_content_for_window_actor (MetaWindowActor *window_actor,
 | 
			
		||||
                                         MetaRectangle   *window_rect)
 | 
			
		||||
{
 | 
			
		||||
  ClutterActor *texture;
 | 
			
		||||
  MetaShapedTexture *texture;
 | 
			
		||||
  ClutterContent *content;
 | 
			
		||||
  cairo_surface_t *surface;
 | 
			
		||||
  cairo_rectangle_int_t clip;
 | 
			
		||||
@@ -453,8 +453,7 @@ shell_util_get_content_for_window_actor (MetaWindowActor *window_actor,
 | 
			
		||||
  clip.width = ceilf (window_rect->width * resource_scale);
 | 
			
		||||
  clip.height = ceilf (window_rect->height * resource_scale);
 | 
			
		||||
 | 
			
		||||
  surface = meta_shaped_texture_get_image (META_SHAPED_TEXTURE (texture),
 | 
			
		||||
                                           &clip);
 | 
			
		||||
  surface = meta_shaped_texture_get_image (texture, &clip);
 | 
			
		||||
 | 
			
		||||
  content = clutter_canvas_new ();
 | 
			
		||||
  clutter_canvas_set_size (CLUTTER_CANVAS (content),
 | 
			
		||||
 
 | 
			
		||||
@@ -18,6 +18,7 @@ st_headers = [
 | 
			
		||||
  'st-scrollable.h',
 | 
			
		||||
  'st-scroll-bar.h',
 | 
			
		||||
  'st-scroll-view.h',
 | 
			
		||||
  'st-scroll-view-fade.h',
 | 
			
		||||
  'st-settings.h',
 | 
			
		||||
  'st-shadow.h',
 | 
			
		||||
  'st-texture-cache.h',
 | 
			
		||||
@@ -73,6 +74,7 @@ st_sources = [
 | 
			
		||||
  'st-scrollable.c',
 | 
			
		||||
  'st-scroll-bar.c',
 | 
			
		||||
  'st-scroll-view.c',
 | 
			
		||||
  'st-scroll-view-fade.c',
 | 
			
		||||
  'st-settings.c',
 | 
			
		||||
  'st-shadow.c',
 | 
			
		||||
  'st-texture-cache.c',
 | 
			
		||||
@@ -94,11 +96,6 @@ st_enums = gnome.mkenums_simple('st-enum-types',
 | 
			
		||||
 | 
			
		||||
st_gir_sources = st_sources + st_private_headers + st_headers + st_enums
 | 
			
		||||
 | 
			
		||||
st_non_gir_sources = [
 | 
			
		||||
  'st-scroll-view-fade.c',
 | 
			
		||||
  'st-scroll-view-fade.h'
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
data_to_c = find_program(meson.source_root() + '/src/data-to-c.pl')
 | 
			
		||||
 | 
			
		||||
custom_target('scroll-view-fade-glsl',
 | 
			
		||||
@@ -123,9 +120,9 @@ st_cflags = [
 | 
			
		||||
 | 
			
		||||
# Currently meson requires a shared library for building girs
 | 
			
		||||
libst = shared_library('st-1.0',
 | 
			
		||||
  sources: st_gir_sources + st_non_gir_sources,
 | 
			
		||||
  sources: st_gir_sources,
 | 
			
		||||
  c_args: st_cflags,
 | 
			
		||||
  dependencies: [clutter_dep, gtk_dep, croco_dep, x11_dep, m_dep],
 | 
			
		||||
  dependencies: [clutter_dep, gtk_dep, croco_dep, mutter_dep, m_dep],
 | 
			
		||||
  build_rpath: mutter_typelibdir,
 | 
			
		||||
  install_rpath: mutter_typelibdir,
 | 
			
		||||
  install_dir: pkglibdir,
 | 
			
		||||
@@ -152,7 +149,7 @@ libst_gir = gnome.generate_gir(libst,
 | 
			
		||||
  sources: st_gir_sources,
 | 
			
		||||
  nsversion: '1.0',
 | 
			
		||||
  namespace: 'St',
 | 
			
		||||
  includes: ['Clutter-' + mutter_api_version, 'Cally-' + mutter_api_version, 'Gtk-3.0'],
 | 
			
		||||
  includes: ['Clutter-' + mutter_api_version, 'Cally-' + mutter_api_version, 'Meta-' + mutter_api_version, 'Gtk-3.0'],
 | 
			
		||||
  dependencies: [mutter_dep],
 | 
			
		||||
  include_directories: include_directories('..'),
 | 
			
		||||
  extra_args: ['-DST_COMPILATION', '--quiet'],
 | 
			
		||||
 
 | 
			
		||||
@@ -19,251 +19,49 @@
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * SECTION:st-clipboard
 | 
			
		||||
 * @short_description: a simple representation of the X clipboard
 | 
			
		||||
 * @short_description: a simple representation of the clipboard
 | 
			
		||||
 *
 | 
			
		||||
 * #StCliboard is a very simple object representation of the clipboard
 | 
			
		||||
 * available to applications. Text is always assumed to be UTF-8 and non-text
 | 
			
		||||
 * items are not handled.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "config.h"
 | 
			
		||||
 | 
			
		||||
#include "st-clipboard.h"
 | 
			
		||||
#include <X11/Xlib.h>
 | 
			
		||||
#include <X11/Xatom.h>
 | 
			
		||||
#include <gdk/gdk.h>
 | 
			
		||||
#include <gdk/gdkx.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
struct _StClipboardPrivate
 | 
			
		||||
{
 | 
			
		||||
  Window clipboard_window;
 | 
			
		||||
  gchar *clipboard_text;
 | 
			
		||||
#include <meta/display.h>
 | 
			
		||||
#include <meta/meta-selection-source-memory.h>
 | 
			
		||||
#include <meta/meta-selection.h>
 | 
			
		||||
 | 
			
		||||
  Atom  *supported_targets;
 | 
			
		||||
  gint   n_targets;
 | 
			
		||||
};
 | 
			
		||||
G_DEFINE_TYPE (StClipboard, st_clipboard, G_TYPE_OBJECT)
 | 
			
		||||
 | 
			
		||||
G_DEFINE_TYPE_WITH_PRIVATE (StClipboard, st_clipboard, G_TYPE_OBJECT)
 | 
			
		||||
 | 
			
		||||
typedef struct _EventFilterData EventFilterData;
 | 
			
		||||
struct _EventFilterData
 | 
			
		||||
typedef struct _TransferData TransferData;
 | 
			
		||||
struct _TransferData
 | 
			
		||||
{
 | 
			
		||||
  StClipboard            *clipboard;
 | 
			
		||||
  StClipboardCallbackFunc callback;
 | 
			
		||||
  gpointer                user_data;
 | 
			
		||||
  GOutputStream          *stream;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static Atom __atom_primary = None;
 | 
			
		||||
static Atom __atom_clip = None;
 | 
			
		||||
static Atom __utf8_string = None;
 | 
			
		||||
static Atom __atom_targets = None;
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
st_clipboard_dispose (GObject *object)
 | 
			
		||||
{
 | 
			
		||||
  G_OBJECT_CLASS (st_clipboard_parent_class)->dispose (object);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
st_clipboard_finalize (GObject *object)
 | 
			
		||||
{
 | 
			
		||||
  StClipboardPrivate *priv = ((StClipboard *) object)->priv;
 | 
			
		||||
 | 
			
		||||
  g_free (priv->clipboard_text);
 | 
			
		||||
  priv->clipboard_text = NULL;
 | 
			
		||||
 | 
			
		||||
  g_free (priv->supported_targets);
 | 
			
		||||
  priv->supported_targets = NULL;
 | 
			
		||||
  priv->n_targets = 0;
 | 
			
		||||
 | 
			
		||||
  G_OBJECT_CLASS (st_clipboard_parent_class)->finalize (object);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static GdkFilterReturn
 | 
			
		||||
st_clipboard_provider (GdkXEvent *xevent_p,
 | 
			
		||||
                       GdkEvent  *gev,
 | 
			
		||||
                       void      *user_data)
 | 
			
		||||
{
 | 
			
		||||
  StClipboard *clipboard = user_data;
 | 
			
		||||
  XEvent *xev = (XEvent *) xevent_p;
 | 
			
		||||
  XSelectionEvent notify_event;
 | 
			
		||||
  XSelectionRequestEvent *req_event;
 | 
			
		||||
  GdkDisplay *display = gdk_display_get_default ();
 | 
			
		||||
 | 
			
		||||
  if (xev->type != SelectionRequest ||
 | 
			
		||||
      xev->xany.window != clipboard->priv->clipboard_window ||
 | 
			
		||||
      !clipboard->priv->clipboard_text)
 | 
			
		||||
    return GDK_FILTER_CONTINUE;
 | 
			
		||||
 | 
			
		||||
  req_event = &xev->xselectionrequest;
 | 
			
		||||
 | 
			
		||||
  gdk_x11_display_error_trap_push (display);
 | 
			
		||||
 | 
			
		||||
  if (req_event->target == __atom_targets)
 | 
			
		||||
    {
 | 
			
		||||
      XChangeProperty (req_event->display,
 | 
			
		||||
                       req_event->requestor,
 | 
			
		||||
                       req_event->property,
 | 
			
		||||
                       XA_ATOM,
 | 
			
		||||
                       32,
 | 
			
		||||
                       PropModeReplace,
 | 
			
		||||
                       (guchar*) clipboard->priv->supported_targets,
 | 
			
		||||
                       clipboard->priv->n_targets);
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      XChangeProperty (req_event->display,
 | 
			
		||||
                       req_event->requestor,
 | 
			
		||||
                       req_event->property,
 | 
			
		||||
                       req_event->target,
 | 
			
		||||
                       8,
 | 
			
		||||
                       PropModeReplace,
 | 
			
		||||
                       (guchar*) clipboard->priv->clipboard_text,
 | 
			
		||||
                       strlen (clipboard->priv->clipboard_text));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  notify_event.type = SelectionNotify;
 | 
			
		||||
  notify_event.display = req_event->display;
 | 
			
		||||
  notify_event.requestor = req_event->requestor;
 | 
			
		||||
  notify_event.selection = req_event->selection;
 | 
			
		||||
  notify_event.target = req_event->target;
 | 
			
		||||
  notify_event.time = req_event->time;
 | 
			
		||||
 | 
			
		||||
  if (req_event->property == None)
 | 
			
		||||
    notify_event.property = req_event->target;
 | 
			
		||||
  else
 | 
			
		||||
    notify_event.property = req_event->property;
 | 
			
		||||
 | 
			
		||||
  /* notify the requestor that they have a copy of the selection */
 | 
			
		||||
  XSendEvent (req_event->display, req_event->requestor, False, 0,
 | 
			
		||||
              (XEvent *) ¬ify_event);
 | 
			
		||||
  /* Make it happen non async */
 | 
			
		||||
  XSync (GDK_DISPLAY_XDISPLAY (display), FALSE);
 | 
			
		||||
 | 
			
		||||
  if (gdk_x11_display_error_trap_pop (display))
 | 
			
		||||
    {
 | 
			
		||||
      /* FIXME: Warn here on fail ? */
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return GDK_FILTER_REMOVE;
 | 
			
		||||
}
 | 
			
		||||
const char *supported_mimetypes[] = {
 | 
			
		||||
  "text/plain;charset=utf-8",
 | 
			
		||||
  "UTF8_STRING",
 | 
			
		||||
  "text/plain",
 | 
			
		||||
  "STRING",
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static MetaSelection *meta_selection = NULL;
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
st_clipboard_class_init (StClipboardClass *klass)
 | 
			
		||||
{
 | 
			
		||||
  GObjectClass *object_class = G_OBJECT_CLASS (klass);
 | 
			
		||||
 | 
			
		||||
  object_class->dispose = st_clipboard_dispose;
 | 
			
		||||
  object_class->finalize = st_clipboard_finalize;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
st_clipboard_init (StClipboard *self)
 | 
			
		||||
{
 | 
			
		||||
  GdkDisplay *gdk_display;
 | 
			
		||||
  Display *dpy;
 | 
			
		||||
  StClipboardPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  priv = self->priv = st_clipboard_get_instance_private (self);
 | 
			
		||||
 | 
			
		||||
  gdk_display = gdk_display_get_default ();
 | 
			
		||||
  dpy = GDK_DISPLAY_XDISPLAY (gdk_display);
 | 
			
		||||
 | 
			
		||||
  priv->clipboard_window =
 | 
			
		||||
    XCreateSimpleWindow (dpy,
 | 
			
		||||
                         gdk_x11_get_default_root_xwindow (),
 | 
			
		||||
                         -1, -1, 1, 1, 0, 0, 0);
 | 
			
		||||
 | 
			
		||||
  /* Only create once */
 | 
			
		||||
  if (__atom_primary == None)
 | 
			
		||||
    __atom_primary = XInternAtom (dpy, "PRIMARY", 0);
 | 
			
		||||
 | 
			
		||||
  if (__atom_clip == None)
 | 
			
		||||
    __atom_clip = XInternAtom (dpy, "CLIPBOARD", 0);
 | 
			
		||||
 | 
			
		||||
  if (__utf8_string == None)
 | 
			
		||||
    __utf8_string = XInternAtom (dpy, "UTF8_STRING", 0);
 | 
			
		||||
 | 
			
		||||
  if (__atom_targets == None)
 | 
			
		||||
    __atom_targets = XInternAtom (dpy, "TARGETS", 0);
 | 
			
		||||
 | 
			
		||||
  priv->n_targets = 2;
 | 
			
		||||
  priv->supported_targets = g_new (Atom, priv->n_targets);
 | 
			
		||||
 | 
			
		||||
  priv->supported_targets[0] = __utf8_string;
 | 
			
		||||
  priv->supported_targets[1] = __atom_targets;
 | 
			
		||||
 | 
			
		||||
  gdk_window_add_filter (NULL, /* all windows */
 | 
			
		||||
                         st_clipboard_provider,
 | 
			
		||||
                         self);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static GdkFilterReturn
 | 
			
		||||
st_clipboard_x11_event_filter (GdkXEvent *xevent_p,
 | 
			
		||||
                               GdkEvent  *gev,
 | 
			
		||||
                               void      *user_data)
 | 
			
		||||
{
 | 
			
		||||
  XEvent *xev = (XEvent *) xevent_p;
 | 
			
		||||
  EventFilterData *filter_data = user_data;
 | 
			
		||||
  StClipboardPrivate *priv = filter_data->clipboard->priv;
 | 
			
		||||
  Atom actual_type;
 | 
			
		||||
  int actual_format, result;
 | 
			
		||||
  unsigned long nitems, bytes_after;
 | 
			
		||||
  unsigned char *data = NULL;
 | 
			
		||||
  GdkDisplay *display = gdk_display_get_default ();
 | 
			
		||||
 | 
			
		||||
  if(xev->type != SelectionNotify ||
 | 
			
		||||
     xev->xany.window != priv->clipboard_window)
 | 
			
		||||
    return GDK_FILTER_CONTINUE;
 | 
			
		||||
 | 
			
		||||
  if (xev->xselection.property == None)
 | 
			
		||||
    {
 | 
			
		||||
      /* clipboard empty */
 | 
			
		||||
      filter_data->callback (filter_data->clipboard,
 | 
			
		||||
                             NULL,
 | 
			
		||||
                             filter_data->user_data);
 | 
			
		||||
 | 
			
		||||
      gdk_window_remove_filter (NULL,
 | 
			
		||||
                                st_clipboard_x11_event_filter,
 | 
			
		||||
                                filter_data);
 | 
			
		||||
      g_free (filter_data);
 | 
			
		||||
      return GDK_FILTER_REMOVE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  gdk_x11_display_error_trap_push (display);
 | 
			
		||||
 | 
			
		||||
  result = XGetWindowProperty (xev->xselection.display,
 | 
			
		||||
                               xev->xselection.requestor,
 | 
			
		||||
                               xev->xselection.property,
 | 
			
		||||
                               0L, G_MAXINT,
 | 
			
		||||
                               True,
 | 
			
		||||
                               AnyPropertyType,
 | 
			
		||||
                               &actual_type,
 | 
			
		||||
                               &actual_format,
 | 
			
		||||
                               &nitems,
 | 
			
		||||
                               &bytes_after,
 | 
			
		||||
                               &data);
 | 
			
		||||
 | 
			
		||||
  if (gdk_x11_display_error_trap_pop (display) || result != Success)
 | 
			
		||||
    {
 | 
			
		||||
      /* FIXME: handle failure better */
 | 
			
		||||
      g_warning ("Clipboard: prop retrival failed");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  filter_data->callback (filter_data->clipboard, (char*) data,
 | 
			
		||||
                         filter_data->user_data);
 | 
			
		||||
 | 
			
		||||
  gdk_window_remove_filter (NULL,
 | 
			
		||||
                            st_clipboard_x11_event_filter,
 | 
			
		||||
                            filter_data);
 | 
			
		||||
 | 
			
		||||
  g_free (filter_data);
 | 
			
		||||
 | 
			
		||||
  if (data)
 | 
			
		||||
    XFree (data);
 | 
			
		||||
 | 
			
		||||
  return GDK_FILTER_REMOVE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -287,10 +85,57 @@ st_clipboard_get_default (void)
 | 
			
		||||
  return default_clipboard;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Atom
 | 
			
		||||
atom_for_clipboard_type (StClipboardType type)
 | 
			
		||||
static gboolean
 | 
			
		||||
convert_type (StClipboardType    type,
 | 
			
		||||
              MetaSelectionType *type_out)
 | 
			
		||||
{
 | 
			
		||||
  return type == ST_CLIPBOARD_TYPE_CLIPBOARD ? __atom_clip : __atom_primary;
 | 
			
		||||
  if (type == ST_CLIPBOARD_TYPE_PRIMARY)
 | 
			
		||||
    *type_out = META_SELECTION_PRIMARY;
 | 
			
		||||
  else if (type == ST_CLIPBOARD_TYPE_CLIPBOARD)
 | 
			
		||||
    *type_out = META_SELECTION_CLIPBOARD;
 | 
			
		||||
  else
 | 
			
		||||
    return FALSE;
 | 
			
		||||
 | 
			
		||||
  return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static const char *
 | 
			
		||||
pick_mimetype (MetaSelection     *meta_selection,
 | 
			
		||||
               MetaSelectionType  selection_type)
 | 
			
		||||
{
 | 
			
		||||
  const char *selected_mimetype = NULL;
 | 
			
		||||
  GList *mimetypes;
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  mimetypes = meta_selection_get_mimetypes (meta_selection, selection_type);
 | 
			
		||||
 | 
			
		||||
  for (i = 0; i < G_N_ELEMENTS (supported_mimetypes); i++)
 | 
			
		||||
    {
 | 
			
		||||
      if (g_list_find_custom (mimetypes, supported_mimetypes[i],
 | 
			
		||||
                              (GCompareFunc) g_strcmp0))
 | 
			
		||||
        {
 | 
			
		||||
          selected_mimetype = supported_mimetypes[i];
 | 
			
		||||
          break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  g_list_free_full (mimetypes, g_free);
 | 
			
		||||
  return selected_mimetype;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
transfer_cb (MetaSelection *selection,
 | 
			
		||||
             GAsyncResult  *res,
 | 
			
		||||
             TransferData  *data)
 | 
			
		||||
{
 | 
			
		||||
  const gchar *text = NULL;
 | 
			
		||||
 | 
			
		||||
  if (meta_selection_transfer_finish (selection, res, NULL))
 | 
			
		||||
    text = g_memory_output_stream_get_data (G_MEMORY_OUTPUT_STREAM (data->stream));
 | 
			
		||||
 | 
			
		||||
  data->callback (data->clipboard, text, data->user_data);
 | 
			
		||||
  g_object_unref (data->stream);
 | 
			
		||||
  g_free (data);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -310,37 +155,35 @@ st_clipboard_get_text (StClipboard            *clipboard,
 | 
			
		||||
                       StClipboardCallbackFunc callback,
 | 
			
		||||
                       gpointer                user_data)
 | 
			
		||||
{
 | 
			
		||||
  EventFilterData *data;
 | 
			
		||||
  GdkDisplay *gdk_display;
 | 
			
		||||
  Display *dpy;
 | 
			
		||||
  MetaSelectionType selection_type;
 | 
			
		||||
  TransferData *data;
 | 
			
		||||
  const char *mimetype = NULL;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (ST_IS_CLIPBOARD (clipboard));
 | 
			
		||||
  g_return_if_fail (meta_selection != NULL);
 | 
			
		||||
  g_return_if_fail (callback != NULL);
 | 
			
		||||
 | 
			
		||||
  data = g_new0 (EventFilterData, 1);
 | 
			
		||||
  if (convert_type (type, &selection_type))
 | 
			
		||||
    mimetype = pick_mimetype (meta_selection, selection_type);
 | 
			
		||||
 | 
			
		||||
  if (!mimetype)
 | 
			
		||||
    {
 | 
			
		||||
      callback (clipboard, NULL, user_data);
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  data = g_new0 (TransferData, 1);
 | 
			
		||||
  data->clipboard = clipboard;
 | 
			
		||||
  data->callback = callback;
 | 
			
		||||
  data->user_data = user_data;
 | 
			
		||||
  data->stream = g_memory_output_stream_new_resizable ();
 | 
			
		||||
 | 
			
		||||
  gdk_window_add_filter (NULL, /* all windows */
 | 
			
		||||
                         st_clipboard_x11_event_filter,
 | 
			
		||||
                         data);
 | 
			
		||||
 | 
			
		||||
  gdk_display = gdk_display_get_default ();
 | 
			
		||||
  dpy = GDK_DISPLAY_XDISPLAY (gdk_display);
 | 
			
		||||
 | 
			
		||||
  gdk_x11_display_error_trap_push (gdk_display);
 | 
			
		||||
 | 
			
		||||
  XConvertSelection (dpy,
 | 
			
		||||
                     atom_for_clipboard_type (type),
 | 
			
		||||
                     __utf8_string, __utf8_string,
 | 
			
		||||
                     clipboard->priv->clipboard_window,
 | 
			
		||||
                     CurrentTime);
 | 
			
		||||
 | 
			
		||||
  if (gdk_x11_display_error_trap_pop (gdk_display))
 | 
			
		||||
    {
 | 
			
		||||
      /* FIXME */
 | 
			
		||||
    }
 | 
			
		||||
  meta_selection_transfer_async (meta_selection,
 | 
			
		||||
                                 selection_type,
 | 
			
		||||
                                 mimetype, -1,
 | 
			
		||||
                                 data->stream, NULL,
 | 
			
		||||
                                 (GAsyncReadyCallback) transfer_cb,
 | 
			
		||||
                                 data);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -356,31 +199,26 @@ st_clipboard_set_text (StClipboard     *clipboard,
 | 
			
		||||
                       StClipboardType  type,
 | 
			
		||||
                       const gchar     *text)
 | 
			
		||||
{
 | 
			
		||||
  StClipboardPrivate *priv;
 | 
			
		||||
  GdkDisplay *gdk_display;
 | 
			
		||||
  Display *dpy;
 | 
			
		||||
  MetaSelectionType selection_type;
 | 
			
		||||
  MetaSelectionSource *source;
 | 
			
		||||
  GBytes *bytes;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (ST_IS_CLIPBOARD (clipboard));
 | 
			
		||||
  g_return_if_fail (meta_selection != NULL);
 | 
			
		||||
  g_return_if_fail (text != NULL);
 | 
			
		||||
 | 
			
		||||
  priv = clipboard->priv;
 | 
			
		||||
  if (!convert_type (type, &selection_type))
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  /* make a copy of the text */
 | 
			
		||||
  g_free (priv->clipboard_text);
 | 
			
		||||
  priv->clipboard_text = g_strdup (text);
 | 
			
		||||
  bytes = g_bytes_new_take (g_strdup (text), strlen (text));
 | 
			
		||||
  source = meta_selection_source_memory_new ("text/plain;charset=utf-8", bytes);
 | 
			
		||||
  g_bytes_unref (bytes);
 | 
			
		||||
 | 
			
		||||
  /* tell X we own the clipboard selection */
 | 
			
		||||
  gdk_display = gdk_display_get_default ();
 | 
			
		||||
  dpy = GDK_DISPLAY_XDISPLAY (gdk_display);
 | 
			
		||||
 | 
			
		||||
  gdk_x11_display_error_trap_push (gdk_display);
 | 
			
		||||
 | 
			
		||||
  XSetSelectionOwner (dpy, atom_for_clipboard_type (type), priv->clipboard_window, CurrentTime);
 | 
			
		||||
 | 
			
		||||
  XSync (dpy, FALSE);
 | 
			
		||||
 | 
			
		||||
  if (gdk_x11_display_error_trap_pop (gdk_display))
 | 
			
		||||
    {
 | 
			
		||||
      /* FIXME */
 | 
			
		||||
    }
 | 
			
		||||
  meta_selection_set_owner (meta_selection, selection_type, source);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
st_clipboard_set_selection (MetaSelection *selection)
 | 
			
		||||
{
 | 
			
		||||
  meta_selection = selection;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -25,6 +25,7 @@
 | 
			
		||||
#define _ST_CLIPBOARD_H
 | 
			
		||||
 | 
			
		||||
#include <glib-object.h>
 | 
			
		||||
#include <meta/meta-selection.h>
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
@@ -32,7 +33,6 @@ G_BEGIN_DECLS
 | 
			
		||||
G_DECLARE_FINAL_TYPE (StClipboard, st_clipboard, ST, CLIPBOARD, GObject)
 | 
			
		||||
 | 
			
		||||
typedef struct _StClipboard StClipboard;
 | 
			
		||||
typedef struct _StClipboardPrivate StClipboardPrivate;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * StClipboard:
 | 
			
		||||
@@ -44,7 +44,6 @@ struct _StClipboard
 | 
			
		||||
{
 | 
			
		||||
  /*< private >*/
 | 
			
		||||
  GObject parent;
 | 
			
		||||
  StClipboardPrivate *priv;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
typedef enum {
 | 
			
		||||
@@ -74,6 +73,8 @@ void st_clipboard_set_text (StClipboard             *clipboard,
 | 
			
		||||
                            StClipboardType          type,
 | 
			
		||||
                            const gchar             *text);
 | 
			
		||||
 | 
			
		||||
void st_clipboard_set_selection (MetaSelection *selection);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
#endif /* _ST_CLIPBOARD_H */
 | 
			
		||||
 
 | 
			
		||||
@@ -204,9 +204,7 @@ _st_create_texture_pipeline (CoglTexture *src_texture)
 | 
			
		||||
        clutter_backend_get_cogl_context (clutter_get_default_backend ());
 | 
			
		||||
 | 
			
		||||
      texture_pipeline_template = cogl_pipeline_new (ctx);
 | 
			
		||||
      cogl_pipeline_set_layer_null_texture (texture_pipeline_template,
 | 
			
		||||
                                            0, /* layer */
 | 
			
		||||
                                            COGL_TEXTURE_TYPE_2D);
 | 
			
		||||
      cogl_pipeline_set_layer_null_texture (texture_pipeline_template, 0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  pipeline = cogl_pipeline_copy (texture_pipeline_template);
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user