Compare commits
	
		
			126 Commits
		
	
	
		
			3.32.0
			...
			wip/carlos
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					7f66aede01 | ||
| 
						 | 
					bd5a1121d6 | ||
| 
						 | 
					03117d65b2 | ||
| 
						 | 
					5520bb3890 | ||
| 
						 | 
					4e6b2eb72a | ||
| 
						 | 
					2e5295b3a9 | ||
| 
						 | 
					3121c9aa29 | ||
| 
						 | 
					1ebbd7c768 | ||
| 
						 | 
					8572bb97c7 | ||
| 
						 | 
					d5ebd8c816 | ||
| 
						 | 
					ed999ce926 | ||
| 
						 | 
					50b7739076 | ||
| 
						 | 
					94995e9c1e | ||
| 
						 | 
					fb04dafb0b | ||
| 
						 | 
					d57234bec9 | ||
| 
						 | 
					38da54fb02 | ||
| 
						 | 
					bbd3275dad | ||
| 
						 | 
					3a3f9aa008 | ||
| 
						 | 
					3c54e863e6 | ||
| 
						 | 
					a63ba61194 | ||
| 
						 | 
					ab9710ee7b | ||
| 
						 | 
					43cef45229 | ||
| 
						 | 
					8db4f3c67f | ||
| 
						 | 
					594a070029 | ||
| 
						 | 
					c2e04e3cfa | ||
| 
						 | 
					293f50e8e5 | ||
| 
						 | 
					df7fea3407 | ||
| 
						 | 
					563412698a | ||
| 
						 | 
					2b30146c6c | ||
| 
						 | 
					0f531d8c44 | ||
| 
						 | 
					218c87994b | ||
| 
						 | 
					f74c07b9ac | ||
| 
						 | 
					59edea4bb4 | ||
| 
						 | 
					4d4d5a0b16 | ||
| 
						 | 
					03c4930883 | ||
| 
						 | 
					9593e20425 | ||
| 
						 | 
					2b1d6e607f | ||
| 
						 | 
					1dff32e48a | ||
| 
						 | 
					1e3a174de9 | ||
| 
						 | 
					7bb84dae80 | ||
| 
						 | 
					44fcb9e9af | ||
| 
						 | 
					2d30e310bc | ||
| 
						 | 
					be2d630348 | ||
| 
						 | 
					bea6045aae | ||
| 
						 | 
					ad491e7922 | ||
| 
						 | 
					fedb8e706a | ||
| 
						 | 
					1be933bc49 | ||
| 
						 | 
					526bb72f3d | ||
| 
						 | 
					49c95cff6c | ||
| 
						 | 
					56a361650c | ||
| 
						 | 
					d4763b157d | ||
| 
						 | 
					d2dc072ba9 | ||
| 
						 | 
					ffaca00594 | ||
| 
						 | 
					9090b7dc3d | ||
| 
						 | 
					a540fe4130 | ||
| 
						 | 
					5be61bbb68 | ||
| 
						 | 
					8e51fee5c1 | ||
| 
						 | 
					9d6fcfdc85 | ||
| 
						 | 
					5f5a3b78a5 | ||
| 
						 | 
					4e5ca6d376 | ||
| 
						 | 
					2fab75f448 | ||
| 
						 | 
					22883f2fa2 | ||
| 
						 | 
					5d9f80bc73 | ||
| 
						 | 
					f7d117488b | ||
| 
						 | 
					244a329ee7 | ||
| 
						 | 
					044572cb60 | ||
| 
						 | 
					746875258d | ||
| 
						 | 
					4892a87dfe | ||
| 
						 | 
					8b9c8ddb1e | ||
| 
						 | 
					eb9000576c | ||
| 
						 | 
					862aaf341e | ||
| 
						 | 
					a5c75ff58b | ||
| 
						 | 
					4541fb9819 | ||
| 
						 | 
					9f8edd980c | ||
| 
						 | 
					e5b9043435 | ||
| 
						 | 
					c0012c2ea4 | ||
| 
						 | 
					b77e4975f0 | ||
| 
						 | 
					e83f2344f6 | ||
| 
						 | 
					de6512be1a | ||
| 
						 | 
					0b72ff1896 | ||
| 
						 | 
					fea0192772 | ||
| 
						 | 
					f81ac498fb | ||
| 
						 | 
					5357e0a18c | ||
| 
						 | 
					d7632bbd3d | ||
| 
						 | 
					1b5e91e4b3 | ||
| 
						 | 
					727195c767 | ||
| 
						 | 
					9158f55360 | ||
| 
						 | 
					8146e9d527 | ||
| 
						 | 
					4247251020 | ||
| 
						 | 
					7eee0e0ed6 | ||
| 
						 | 
					4f0851ca77 | ||
| 
						 | 
					911ae49767 | ||
| 
						 | 
					5af81d4057 | ||
| 
						 | 
					c435889baa | ||
| 
						 | 
					49f79d9d5d | ||
| 
						 | 
					1767cd0f6c | ||
| 
						 | 
					3e0915521a | ||
| 
						 | 
					a298943fac | ||
| 
						 | 
					df9ddf96a5 | ||
| 
						 | 
					4fa5d701d5 | ||
| 
						 | 
					b05683d586 | ||
| 
						 | 
					2f3f3fbcdb | ||
| 
						 | 
					611605a67f | ||
| 
						 | 
					0427a782be | ||
| 
						 | 
					32baff5906 | ||
| 
						 | 
					0089143d06 | ||
| 
						 | 
					05e55cee23 | ||
| 
						 | 
					31e7f0340f | ||
| 
						 | 
					6e317a54fd | ||
| 
						 | 
					9c1f62c38c | ||
| 
						 | 
					1341d5557f | ||
| 
						 | 
					b7d79a5f06 | ||
| 
						 | 
					62233a4db4 | ||
| 
						 | 
					4a7e2ddff5 | ||
| 
						 | 
					fb737ebde0 | ||
| 
						 | 
					bf77cb44e7 | ||
| 
						 | 
					c72e2bb4a9 | ||
| 
						 | 
					68c182b1df | ||
| 
						 | 
					348d303794 | ||
| 
						 | 
					ede0fd8660 | ||
| 
						 | 
					187c2193e8 | ||
| 
						 | 
					706bdd8059 | ||
| 
						 | 
					436861edc8 | ||
| 
						 | 
					9729a2e772 | ||
| 
						 | 
					6b924c00c5 | ||
| 
						 | 
					b90f4d29a4 | 
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -80,3 +80,4 @@ tests/run-test.sh
 | 
			
		||||
*~
 | 
			
		||||
*.patch
 | 
			
		||||
*.sw?
 | 
			
		||||
.vscode
 | 
			
		||||
 
 | 
			
		||||
@@ -15,10 +15,10 @@ variables:
 | 
			
		||||
        - merge_requests
 | 
			
		||||
 | 
			
		||||
check_commit_log:
 | 
			
		||||
    image: registry.fedoraproject.org/fedora:latest
 | 
			
		||||
    image: registry.gitlab.gnome.org/gnome/mutter/master:v1
 | 
			
		||||
    stage: review
 | 
			
		||||
    before_script:
 | 
			
		||||
        - dnf install -y git
 | 
			
		||||
    variables:
 | 
			
		||||
        GIT_DEPTH: "100"
 | 
			
		||||
    script:
 | 
			
		||||
        - ./.gitlab-ci/check-commit-log.sh
 | 
			
		||||
    only:
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										31
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						
									
										31
									
								
								NEWS
									
									
									
									
									
								
							@@ -1,3 +1,34 @@
 | 
			
		||||
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>
 | 
			
		||||
 
 | 
			
		||||
@@ -16,7 +16,7 @@ $link_visited_color: if($variant == 'light', darken($selected_bg_color, 20%), li
 | 
			
		||||
$top_hilight: $borders_edge;
 | 
			
		||||
 | 
			
		||||
$warning_color: #f57900;
 | 
			
		||||
$error_color: #cc0000;
 | 
			
		||||
$error_color: #ff8080;
 | 
			
		||||
$success_color: if($variant == 'light', #33d17a, darken(#33d17a, 10%));
 | 
			
		||||
$destructive_color: if($variant == 'light', #e01b24, darken(#e01b24, 10%));
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -157,18 +157,13 @@ StScrollBar {
 | 
			
		||||
 | 
			
		||||
/* Switches */
 | 
			
		||||
.toggle-switch {
 | 
			
		||||
  width: 65px;
 | 
			
		||||
  width: 46px;
 | 
			
		||||
  height: 22px;
 | 
			
		||||
  background-size: contain;
 | 
			
		||||
  background-image: url("resource:///org/gnome/shell/theme/toggle-off-intl.svg");
 | 
			
		||||
  &:checked { background-image: url("resource:///org/gnome/shell/theme/toggle-on-intl.svg"); }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
  @each $v in us, intl {
 | 
			
		||||
    .toggle-switch-#{$v} {
 | 
			
		||||
      background-image: url("resource:///org/gnome/shell/theme/toggle-off-#{$v}.svg");
 | 
			
		||||
      &:checked { background-image: url("resource:///org/gnome/shell/theme/toggle-on-#{$v}.svg"); }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
/* links */
 | 
			
		||||
.shell-link {
 | 
			
		||||
  color: $link_color;
 | 
			
		||||
@@ -392,7 +387,7 @@ StScrollBar {
 | 
			
		||||
 | 
			
		||||
  .prompt-dialog-error-label {
 | 
			
		||||
    font-size: 10pt;
 | 
			
		||||
    color: $error_color;
 | 
			
		||||
    color: $warning_color;
 | 
			
		||||
    padding-bottom: 8px;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -1142,6 +1137,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 +1150,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 +1231,14 @@ StScrollBar {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .window-clone-border {
 | 
			
		||||
    border: 4px solid $selected_bg_color;
 | 
			
		||||
    border-radius: 4px;
 | 
			
		||||
    $_bg: transparentize(white, 0.65);
 | 
			
		||||
    border: 5px solid $_bg;
 | 
			
		||||
    border-radius: 6px;
 | 
			
		||||
    // For window decorations with round corners we can't match
 | 
			
		||||
    // the exact shape when the window is scaled. So apply a shadow
 | 
			
		||||
    // to fix that case
 | 
			
		||||
    box-shadow: inset 0px 0px 0px 1px $selected_bg_color;
 | 
			
		||||
  }
 | 
			
		||||
    box-shadow: inset 0 0 0 1px $_bg;
 | 
			
		||||
}
 | 
			
		||||
  .window-caption {
 | 
			
		||||
    spacing: 25px;
 | 
			
		||||
    color: $selected_fg_color;
 | 
			
		||||
@@ -1453,13 +1453,13 @@ StScrollBar {
 | 
			
		||||
      height: 12px;
 | 
			
		||||
      background-color: transparent;
 | 
			
		||||
      border: 2px solid rgba(255, 255, 255, 0.4);
 | 
			
		||||
      border-radius:12px;
 | 
			
		||||
      border-radius: 12px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    &:hover .page-indicator-icon { border-color: white; }
 | 
			
		||||
    &:active .page-indicator-icon { border: none; margin: 2px; background-color:#fff; }
 | 
			
		||||
    &:active .page-indicator-icon { border: none; margin: 2px; background-color: white; }
 | 
			
		||||
    &:checked .page-indicator-icon,
 | 
			
		||||
    &:checked:active { background-color: #fff;}
 | 
			
		||||
    &:checked:active .page-indicator-icon { background-color: white;}
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .no-frequent-applications-label { @extend %status_text; }
 | 
			
		||||
 
 | 
			
		||||
@@ -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);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -366,7 +366,7 @@ class CloseButton extends St.Button {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _computeBoxPointerOffset() {
 | 
			
		||||
        if (!this._boxPointer || !this._boxPointer.actor.get_stage())
 | 
			
		||||
        if (!this._boxPointer || !this._boxPointer.get_stage())
 | 
			
		||||
            return 0;
 | 
			
		||||
 | 
			
		||||
        let side = this._boxPointer.arrowSide;
 | 
			
		||||
 
 | 
			
		||||
@@ -30,6 +30,14 @@ var WeatherClient = class {
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (this._permStore.g_name_owner == null) {
 | 
			
		||||
                // Failed to auto-start, likely because xdg-desktop-portal
 | 
			
		||||
                // isn't installed; don't restrict access to location service
 | 
			
		||||
                this._weatherAuthorized = true;
 | 
			
		||||
                this._updateAutoLocation();
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            this._permStore.LookupRemote('gnome', 'geolocation', (res, error) => {
 | 
			
		||||
                if (error)
 | 
			
		||||
                    log('Error looking up permission: ' + error.message);
 | 
			
		||||
 
 | 
			
		||||
@@ -10,7 +10,7 @@ const Scripting = imports.ui.scripting;
 | 
			
		||||
// someone should be able to get an idea of how well the shell is performing
 | 
			
		||||
// on a particular system.
 | 
			
		||||
 | 
			
		||||
let METRICS = {
 | 
			
		||||
var METRICS = {
 | 
			
		||||
    overviewLatencyFirst:
 | 
			
		||||
    { description: "Time to first frame after triggering overview, first time",
 | 
			
		||||
      units: "us" },
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
const { Clutter, Gio, Gtk, Shell } = imports.gi;
 | 
			
		||||
const { Clutter, Gio, Shell } = imports.gi;
 | 
			
		||||
const Main = imports.ui.main;
 | 
			
		||||
const Scripting = imports.ui.scripting;
 | 
			
		||||
 | 
			
		||||
let METRICS = {
 | 
			
		||||
var METRICS = {
 | 
			
		||||
    timeToDesktop:
 | 
			
		||||
    { description: "Time from starting graphical.target to desktop showing",
 | 
			
		||||
      units: "us" },
 | 
			
		||||
@@ -104,7 +104,10 @@ function *run() {
 | 
			
		||||
    yield Scripting.waitLeisure();
 | 
			
		||||
    Scripting.scriptEvent('desktopShown');
 | 
			
		||||
 | 
			
		||||
    Gtk.Settings.get_default().gtk_enable_animations = false;
 | 
			
		||||
    let interfaceSettings = new Gio.Settings({
 | 
			
		||||
        schema_id: 'org.gnome.desktop.interface'
 | 
			
		||||
    });
 | 
			
		||||
    interfaceSettings.set_boolean('enable-animations', false);
 | 
			
		||||
 | 
			
		||||
    Scripting.scriptEvent('overviewShowStart');
 | 
			
		||||
    Main.overview.show();
 | 
			
		||||
@@ -200,7 +203,7 @@ function *run() {
 | 
			
		||||
 | 
			
		||||
    yield Scripting.sleep(1000);
 | 
			
		||||
 | 
			
		||||
    Gtk.Settings.get_default().gtk_enable_animations = true;
 | 
			
		||||
    interfaceSettings.set_boolean('enable-animations', true);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
let overviewShowStart;
 | 
			
		||||
 
 | 
			
		||||
@@ -477,8 +477,8 @@ var CyclerList = GObject.registerClass({
 | 
			
		||||
var CyclerPopup = GObject.registerClass(
 | 
			
		||||
class CyclerPopup extends SwitcherPopup.SwitcherPopup {
 | 
			
		||||
    _init() {
 | 
			
		||||
        if (new.target === CyclerPopup)
 | 
			
		||||
            throw new TypeError('Cannot instantiate abstract class ' + new.target.name);
 | 
			
		||||
        if (this.constructor.name === CyclerPopup.prototype.constructor.name)
 | 
			
		||||
            throw new TypeError(`Cannot instantiate abstract class ${this.constructor.name}`);
 | 
			
		||||
 | 
			
		||||
        super._init();
 | 
			
		||||
 | 
			
		||||
@@ -619,9 +619,8 @@ class WindowSwitcherPopup extends SwitcherPopup.SwitcherPopup {
 | 
			
		||||
var WindowCyclerPopup = GObject.registerClass(
 | 
			
		||||
class WindowCyclerPopup extends CyclerPopup {
 | 
			
		||||
    _init() {
 | 
			
		||||
        super._init();
 | 
			
		||||
 | 
			
		||||
        this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell.window-switcher' });
 | 
			
		||||
        super._init();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _getWindows() {
 | 
			
		||||
 
 | 
			
		||||
@@ -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,
 | 
			
		||||
@@ -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',
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -25,7 +25,7 @@ var BackgroundMenu = class BackgroundMenu extends PopupMenu.PopupMenu {
 | 
			
		||||
function addBackgroundMenu(actor, layoutManager) {
 | 
			
		||||
    actor.reactive = true;
 | 
			
		||||
    actor._backgroundMenu = new BackgroundMenu(layoutManager);
 | 
			
		||||
    actor._backgroundManager = new PopupMenu.PopupMenuManager({ actor: actor });
 | 
			
		||||
    actor._backgroundManager = new PopupMenu.PopupMenuManager(actor);
 | 
			
		||||
    actor._backgroundManager.addMenu(actor._backgroundMenu);
 | 
			
		||||
 | 
			
		||||
    function openMenu(x, y) {
 | 
			
		||||
 
 | 
			
		||||
@@ -121,7 +121,8 @@ var BarLevel = class {
 | 
			
		||||
        cr.lineTo(x, (height - barLevelHeight) / 2);
 | 
			
		||||
        cr.lineTo(x, (height + barLevelHeight) / 2);
 | 
			
		||||
        cr.lineTo(barLevelBorderRadius + barLevelBorderWidth, (height + barLevelHeight) / 2);
 | 
			
		||||
        Clutter.cairo_set_source_color(cr, barLevelActiveColor);
 | 
			
		||||
        if (this._value > 0)
 | 
			
		||||
          Clutter.cairo_set_source_color(cr, barLevelActiveColor);
 | 
			
		||||
        cr.fillPreserve();
 | 
			
		||||
        Clutter.cairo_set_source_color(cr, barLevelActiveBorderColor);
 | 
			
		||||
        cr.setLineWidth(barLevelBorderWidth);
 | 
			
		||||
@@ -143,17 +144,19 @@ var BarLevel = class {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /* end progress bar arc */
 | 
			
		||||
        if (this._value <= this._overdriveStart)
 | 
			
		||||
            Clutter.cairo_set_source_color(cr, barLevelActiveColor);
 | 
			
		||||
        else
 | 
			
		||||
            Clutter.cairo_set_source_color(cr, barLevelOverdriveColor);
 | 
			
		||||
        cr.arc(endX, height / 2, barLevelBorderRadius, TAU * 3 / 4, TAU * 1 / 4);
 | 
			
		||||
        cr.lineTo(Math.floor(endX), (height + barLevelHeight) / 2);
 | 
			
		||||
        cr.lineTo(Math.floor(endX), (height - barLevelHeight) / 2);
 | 
			
		||||
        cr.lineTo(endX, (height - barLevelHeight) / 2);
 | 
			
		||||
        cr.fillPreserve();
 | 
			
		||||
        cr.setLineWidth(barLevelBorderWidth);
 | 
			
		||||
        cr.stroke();
 | 
			
		||||
        if (this._value > 0) {
 | 
			
		||||
          if (this._value <= this._overdriveStart)
 | 
			
		||||
              Clutter.cairo_set_source_color(cr, barLevelActiveColor);
 | 
			
		||||
          else
 | 
			
		||||
              Clutter.cairo_set_source_color(cr, barLevelOverdriveColor);
 | 
			
		||||
          cr.arc(endX, height / 2, barLevelBorderRadius, TAU * 3 / 4, TAU * 1 / 4);
 | 
			
		||||
          cr.lineTo(Math.floor(endX), (height + barLevelHeight) / 2);
 | 
			
		||||
          cr.lineTo(Math.floor(endX), (height - barLevelHeight) / 2);
 | 
			
		||||
          cr.lineTo(endX, (height - barLevelHeight) / 2);
 | 
			
		||||
          cr.fillPreserve();
 | 
			
		||||
          cr.setLineWidth(barLevelBorderWidth);
 | 
			
		||||
          cr.stroke();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /* draw overdrive separator */
 | 
			
		||||
        if (overdriveActive) {
 | 
			
		||||
 
 | 
			
		||||
@@ -24,7 +24,7 @@ var POPUP_ANIMATION_TIME = 0.15;
 | 
			
		||||
 * placed.  The arrow position may be controlled via
 | 
			
		||||
 * setArrowOrigin(). The arrow side might be temporarily flipped
 | 
			
		||||
 * depending on the box size and source position to keep the box
 | 
			
		||||
 * totally inside the monitor if possible.
 | 
			
		||||
 * totally inside the monitor workarea if possible.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
var BoxPointer = GObject.registerClass({
 | 
			
		||||
@@ -33,8 +33,6 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
    _init(arrowSide, binProperties) {
 | 
			
		||||
        super._init();
 | 
			
		||||
 | 
			
		||||
        this.actor = this;
 | 
			
		||||
 | 
			
		||||
        this.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS);
 | 
			
		||||
 | 
			
		||||
        this._arrowSide = arrowSide;
 | 
			
		||||
@@ -47,10 +45,6 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
        this._border.connect('repaint', this._drawBorder.bind(this));
 | 
			
		||||
        this.add_actor(this._border);
 | 
			
		||||
        this.bin.raise(this._border);
 | 
			
		||||
        this._xOffset = 0;
 | 
			
		||||
        this._yOffset = 0;
 | 
			
		||||
        this._xPosition = 0;
 | 
			
		||||
        this._yPosition = 0;
 | 
			
		||||
        this._sourceAlignment = 0.5;
 | 
			
		||||
        this._capturedEventId = 0;
 | 
			
		||||
        this._muteInput();
 | 
			
		||||
@@ -118,23 +112,23 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
        if (animate & PopupAnimation.SLIDE) {
 | 
			
		||||
            switch (this._arrowSide) {
 | 
			
		||||
                case St.Side.TOP:
 | 
			
		||||
                    this.yOffset = -rise;
 | 
			
		||||
                    this.translation_y = -rise;
 | 
			
		||||
                    break;
 | 
			
		||||
                case St.Side.BOTTOM:
 | 
			
		||||
                    this.yOffset = rise;
 | 
			
		||||
                    this.translation_y = rise;
 | 
			
		||||
                    break;
 | 
			
		||||
                case St.Side.LEFT:
 | 
			
		||||
                    this.xOffset = -rise;
 | 
			
		||||
                    this.translation_x = -rise;
 | 
			
		||||
                    break;
 | 
			
		||||
                case St.Side.RIGHT:
 | 
			
		||||
                    this.xOffset = rise;
 | 
			
		||||
                    this.translation_x = rise;
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Tweener.addTween(this, { opacity: 255,
 | 
			
		||||
                                 xOffset: 0,
 | 
			
		||||
                                 yOffset: 0,
 | 
			
		||||
                                 translation_x: 0,
 | 
			
		||||
                                 translation_y: 0,
 | 
			
		||||
                                 transition: 'linear',
 | 
			
		||||
                                 onComplete: () => {
 | 
			
		||||
                                     this._unmuteInput();
 | 
			
		||||
@@ -148,8 +142,8 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
        if (!this.visible)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        let xOffset = 0;
 | 
			
		||||
        let yOffset = 0;
 | 
			
		||||
        let translationX = 0;
 | 
			
		||||
        let translationY = 0;
 | 
			
		||||
        let themeNode = this.get_theme_node();
 | 
			
		||||
        let rise = themeNode.get_length('-arrow-rise');
 | 
			
		||||
        let fade = (animate & PopupAnimation.FADE);
 | 
			
		||||
@@ -158,16 +152,16 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
        if (animate & PopupAnimation.SLIDE) {
 | 
			
		||||
            switch (this._arrowSide) {
 | 
			
		||||
                case St.Side.TOP:
 | 
			
		||||
                    yOffset = rise;
 | 
			
		||||
                    translationY = rise;
 | 
			
		||||
                    break;
 | 
			
		||||
                case St.Side.BOTTOM:
 | 
			
		||||
                    yOffset = -rise;
 | 
			
		||||
                    translationY = -rise;
 | 
			
		||||
                    break;
 | 
			
		||||
                case St.Side.LEFT:
 | 
			
		||||
                    xOffset = rise;
 | 
			
		||||
                    translationX = rise;
 | 
			
		||||
                    break;
 | 
			
		||||
                case St.Side.RIGHT:
 | 
			
		||||
                    xOffset = -rise;
 | 
			
		||||
                    translationX = -rise;
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@@ -176,15 +170,15 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
 | 
			
		||||
        Tweener.removeTweens(this);
 | 
			
		||||
        Tweener.addTween(this, { opacity: fade ? 0 : 255,
 | 
			
		||||
                                 xOffset: xOffset,
 | 
			
		||||
                                 yOffset: yOffset,
 | 
			
		||||
                                 translation_x: translationX,
 | 
			
		||||
                                 translation_y: translationY,
 | 
			
		||||
                                 transition: 'linear',
 | 
			
		||||
                                 time: animationTime,
 | 
			
		||||
                                 onComplete: () => {
 | 
			
		||||
                                     this.hide();
 | 
			
		||||
                                     this.opacity = 0;
 | 
			
		||||
                                     this.xOffset = 0;
 | 
			
		||||
                                     this.yOffset = 0;
 | 
			
		||||
                                     this.translation_x = 0;
 | 
			
		||||
                                     this.translation_y = 0;
 | 
			
		||||
                                     if (onComplete)
 | 
			
		||||
                                         onComplete();
 | 
			
		||||
                                 }
 | 
			
		||||
@@ -477,11 +471,15 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
    _reposition() {
 | 
			
		||||
        let sourceActor = this._sourceActor;
 | 
			
		||||
        let alignment = this._arrowAlignment;
 | 
			
		||||
        let monitorIndex = Main.layoutManager.findIndexForActor(sourceActor);
 | 
			
		||||
 | 
			
		||||
        this._sourceAllocation = Shell.util_get_transformed_allocation(sourceActor);
 | 
			
		||||
        this._workArea = Main.layoutManager.getWorkAreaForMonitor(monitorIndex);
 | 
			
		||||
 | 
			
		||||
        // Position correctly relative to the sourceActor
 | 
			
		||||
        let sourceNode = sourceActor.get_theme_node();
 | 
			
		||||
        let sourceContentBox = sourceNode.get_content_box(sourceActor.get_allocation_box());
 | 
			
		||||
        let sourceAllocation = Shell.util_get_transformed_allocation(sourceActor);
 | 
			
		||||
        let sourceAllocation = this._sourceAllocation;
 | 
			
		||||
        let sourceCenterX = sourceAllocation.x1 + sourceContentBox.x1 + (sourceContentBox.x2 - sourceContentBox.x1) * this._sourceAlignment;
 | 
			
		||||
        let sourceCenterY = sourceAllocation.y1 + sourceContentBox.y1 + (sourceContentBox.y2 - sourceContentBox.y1) * this._sourceAlignment;
 | 
			
		||||
        let [minWidth, minHeight, natWidth, natHeight] = this.get_preferred_size();
 | 
			
		||||
@@ -489,7 +487,7 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
        // We also want to keep it onscreen, and separated from the
 | 
			
		||||
        // edge by the same distance as the main part of the box is
 | 
			
		||||
        // separated from its sourceActor
 | 
			
		||||
        let monitor = Main.layoutManager.findMonitorForActor(sourceActor);
 | 
			
		||||
        let workarea = this._workArea;
 | 
			
		||||
        let themeNode = this.get_theme_node();
 | 
			
		||||
        let borderWidth = themeNode.get_length('-arrow-border-width');
 | 
			
		||||
        let arrowBase = themeNode.get_length('-arrow-base');
 | 
			
		||||
@@ -539,8 +537,8 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
        case St.Side.BOTTOM:
 | 
			
		||||
            resX = sourceCenterX - (halfMargin + (natWidth - margin) * alignment);
 | 
			
		||||
 | 
			
		||||
            resX = Math.max(resX, monitor.x + padding);
 | 
			
		||||
            resX = Math.min(resX, monitor.x + monitor.width - (padding + natWidth));
 | 
			
		||||
            resX = Math.max(resX, workarea.x + padding);
 | 
			
		||||
            resX = Math.min(resX, workarea.x + workarea.width - (padding + natWidth));
 | 
			
		||||
 | 
			
		||||
            arrowOrigin = sourceCenterX - resX;
 | 
			
		||||
            if (arrowOrigin <= (x1 + (borderRadius + halfBase))) {
 | 
			
		||||
@@ -558,8 +556,8 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
        case St.Side.RIGHT:
 | 
			
		||||
            resY = sourceCenterY - (halfMargin + (natHeight - margin) * alignment);
 | 
			
		||||
 | 
			
		||||
            resY = Math.max(resY, monitor.y + padding);
 | 
			
		||||
            resY = Math.min(resY, monitor.y + monitor.height - (padding + natHeight));
 | 
			
		||||
            resY = Math.max(resY, workarea.y + padding);
 | 
			
		||||
            resY = Math.min(resY, workarea.y + workarea.height - (padding + natHeight));
 | 
			
		||||
 | 
			
		||||
            arrowOrigin = sourceCenterY - resY;
 | 
			
		||||
            if (arrowOrigin <= (y1 + (borderRadius + halfBase))) {
 | 
			
		||||
@@ -583,9 +581,9 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
            parent = parent.get_parent();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._xPosition = Math.floor(x);
 | 
			
		||||
        this._yPosition = Math.floor(y);
 | 
			
		||||
        this._shiftActor();
 | 
			
		||||
        // Actually set the position
 | 
			
		||||
        this.x = Math.floor(x);
 | 
			
		||||
        this.y = Math.floor(y);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // @origin: Coordinate specifying middle of the arrow, along
 | 
			
		||||
@@ -608,44 +606,30 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _shiftActor() {
 | 
			
		||||
        // Since the position of the BoxPointer depends on the allocated size
 | 
			
		||||
        // of the BoxPointer and the position of the source actor, trying
 | 
			
		||||
        // to position the BoxPointer via the x/y properties will result in
 | 
			
		||||
        // allocation loops and warnings. Instead we do the positioning via
 | 
			
		||||
        // the anchor point, which is independent of allocation, and leave
 | 
			
		||||
        // x == y == 0.
 | 
			
		||||
        this.set_anchor_point(-(this._xPosition + this._xOffset),
 | 
			
		||||
                              -(this._yPosition + this._yOffset));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _calculateArrowSide(arrowSide) {
 | 
			
		||||
        let sourceAllocation = Shell.util_get_transformed_allocation(this._sourceActor);
 | 
			
		||||
        let sourceAllocation = this._sourceAllocation;
 | 
			
		||||
        let [minWidth, minHeight, boxWidth, boxHeight] = this.get_preferred_size();
 | 
			
		||||
        let monitorActor = this.sourceActor;
 | 
			
		||||
        if (!monitorActor)
 | 
			
		||||
            monitorActor = this;
 | 
			
		||||
        let monitor = Main.layoutManager.findMonitorForActor(monitorActor);
 | 
			
		||||
        let workarea = this._workArea;
 | 
			
		||||
 | 
			
		||||
        switch (arrowSide) {
 | 
			
		||||
        case St.Side.TOP:
 | 
			
		||||
            if (sourceAllocation.y2 + boxHeight > monitor.y + monitor.height &&
 | 
			
		||||
                boxHeight < sourceAllocation.y1 - monitor.y)
 | 
			
		||||
            if (sourceAllocation.y2 + boxHeight > workarea.y + workarea.height &&
 | 
			
		||||
                boxHeight < sourceAllocation.y1 - workarea.y)
 | 
			
		||||
                return St.Side.BOTTOM;
 | 
			
		||||
            break;
 | 
			
		||||
        case St.Side.BOTTOM:
 | 
			
		||||
            if (sourceAllocation.y1 - boxHeight < monitor.y &&
 | 
			
		||||
                boxHeight < monitor.y + monitor.height - sourceAllocation.y2)
 | 
			
		||||
            if (sourceAllocation.y1 - boxHeight < workarea.y &&
 | 
			
		||||
                boxHeight < workarea.y + workarea.height - sourceAllocation.y2)
 | 
			
		||||
                return St.Side.TOP;
 | 
			
		||||
            break;
 | 
			
		||||
        case St.Side.LEFT:
 | 
			
		||||
            if (sourceAllocation.x2 + boxWidth > monitor.x + monitor.width &&
 | 
			
		||||
                boxWidth < sourceAllocation.x1 - monitor.x)
 | 
			
		||||
            if (sourceAllocation.x2 + boxWidth > workarea.x + workarea.width &&
 | 
			
		||||
                boxWidth < sourceAllocation.x1 - workarea.x)
 | 
			
		||||
                return St.Side.RIGHT;
 | 
			
		||||
            break;
 | 
			
		||||
        case St.Side.RIGHT:
 | 
			
		||||
            if (sourceAllocation.x1 - boxWidth < monitor.x &&
 | 
			
		||||
                boxWidth < monitor.x + monitor.width - sourceAllocation.x2)
 | 
			
		||||
            if (sourceAllocation.x1 - boxWidth < workarea.x &&
 | 
			
		||||
                boxWidth < workarea.x + workarea.width - sourceAllocation.x2)
 | 
			
		||||
                return St.Side.LEFT;
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
@@ -667,24 +651,6 @@ var BoxPointer = GObject.registerClass({
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    set xOffset(offset) {
 | 
			
		||||
        this._xOffset = offset;
 | 
			
		||||
        this._shiftActor();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get xOffset() {
 | 
			
		||||
        return this._xOffset;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    set yOffset(offset) {
 | 
			
		||||
        this._yOffset = offset;
 | 
			
		||||
        this._shiftActor();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get yOffset() {
 | 
			
		||||
        return this._yOffset;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    updateArrowSide(side) {
 | 
			
		||||
        this._arrowSide = side;
 | 
			
		||||
        this._border.queue_repaint();
 | 
			
		||||
 
 | 
			
		||||
@@ -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];
 | 
			
		||||
 
 | 
			
		||||
@@ -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';
 | 
			
		||||
 
 | 
			
		||||
@@ -306,6 +306,9 @@ var _Draggable = class _Draggable {
 | 
			
		||||
     * for the draggable.
 | 
			
		||||
     */
 | 
			
		||||
    startDrag(stageX, stageY, time, sequence, device) {
 | 
			
		||||
        if (currentDraggable)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        if (device == undefined) {
 | 
			
		||||
            let event = Clutter.get_current_event();
 | 
			
		||||
 | 
			
		||||
@@ -447,7 +450,8 @@ var _Draggable = class _Draggable {
 | 
			
		||||
        let [stageX, stageY] = event.get_coords();
 | 
			
		||||
 | 
			
		||||
        // See if the user has moved the mouse enough to trigger a drag
 | 
			
		||||
        let threshold = St.Settings.get().drag_threshold;
 | 
			
		||||
        let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
 | 
			
		||||
        let threshold = St.Settings.get().drag_threshold * scaleFactor;
 | 
			
		||||
        if (!currentDraggable &&
 | 
			
		||||
            (Math.abs(stageX - this._dragStartX) > threshold ||
 | 
			
		||||
             Math.abs(stageY - this._dragStartY) > threshold)) {
 | 
			
		||||
 
 | 
			
		||||
@@ -96,6 +96,15 @@ function init() {
 | 
			
		||||
    Clutter.Actor.prototype.toString = function() {
 | 
			
		||||
        return St.describe_actor(this);
 | 
			
		||||
    };
 | 
			
		||||
    // Deprecation warning for former JS classes turned into an actor subclass
 | 
			
		||||
    Object.defineProperty(Clutter.Actor.prototype, 'actor', {
 | 
			
		||||
        get() {
 | 
			
		||||
            let klass = this.constructor.name;
 | 
			
		||||
            let { stack } = new Error();
 | 
			
		||||
            log(`Usage of object.actor is deprecated for ${klass}\n${stack}`);
 | 
			
		||||
            return this;
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    let origToString = Object.prototype.toString;
 | 
			
		||||
    Object.prototype.toString = function() {
 | 
			
		||||
 
 | 
			
		||||
@@ -272,7 +272,7 @@ var CandidatePopup = class CandidatePopup {
 | 
			
		||||
 | 
			
		||||
    _setDummyCursorGeometry(x, y, w, h) {
 | 
			
		||||
        Main.layoutManager.setDummyCursorGeometry(x, y, w, h);
 | 
			
		||||
        if (this._boxPointer.actor.visible)
 | 
			
		||||
        if (this._boxPointer.visible)
 | 
			
		||||
            this._boxPointer.setPosition(Main.layoutManager.dummyCursor, 0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -285,7 +285,7 @@ var CandidatePopup = class CandidatePopup {
 | 
			
		||||
        if (isVisible) {
 | 
			
		||||
            this._boxPointer.setPosition(Main.layoutManager.dummyCursor, 0);
 | 
			
		||||
            this._boxPointer.open(BoxPointer.PopupAnimation.NONE);
 | 
			
		||||
            this._boxPointer.actor.raise_top();
 | 
			
		||||
            this._boxPointer.raise_top();
 | 
			
		||||
        } else {
 | 
			
		||||
            this._boxPointer.close(BoxPointer.PopupAnimation.NONE);
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -43,8 +43,6 @@ class BaseIcon extends St.Bin {
 | 
			
		||||
                      x_fill: true,
 | 
			
		||||
                      y_fill: true });
 | 
			
		||||
 | 
			
		||||
        this.actor = this;
 | 
			
		||||
 | 
			
		||||
        this.connect('destroy', this._onDestroy.bind(this));
 | 
			
		||||
 | 
			
		||||
        this._box = new St.BoxLayout({ vertical: true });
 | 
			
		||||
@@ -104,6 +102,7 @@ class BaseIcon extends St.Bin {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    vfunc_style_changed() {
 | 
			
		||||
        super.vfunc_style_changed();
 | 
			
		||||
        let node = this.get_theme_node();
 | 
			
		||||
 | 
			
		||||
        let size;
 | 
			
		||||
@@ -187,8 +186,6 @@ var IconGrid = GObject.registerClass({
 | 
			
		||||
        super._init({ style_class: 'icon-grid',
 | 
			
		||||
                      y_align: Clutter.ActorAlign.START });
 | 
			
		||||
 | 
			
		||||
        this.actor = this;
 | 
			
		||||
 | 
			
		||||
        params = Params.parse(params, { rowLimit: null,
 | 
			
		||||
                                        columnLimit: null,
 | 
			
		||||
                                        minRows: 1,
 | 
			
		||||
 
 | 
			
		||||
@@ -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));
 | 
			
		||||
@@ -1162,7 +1162,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 +1202,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();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -1353,7 +1355,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 +1382,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 +1442,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 +1472,13 @@ 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._currentPage = null;
 | 
			
		||||
        this._groups = {};
 | 
			
		||||
        this._onGroupChanged();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -1513,12 +1521,12 @@ var Keyboard = class Keyboard {
 | 
			
		||||
        let activeGroupName = this._keyboardController.getCurrentGroup();
 | 
			
		||||
        let layers = this._groups[activeGroupName];
 | 
			
		||||
 | 
			
		||||
        if (this._current_page != null) {
 | 
			
		||||
            this._setCurrentLevelLatched(this._current_page, false);
 | 
			
		||||
            this._current_page.hide();
 | 
			
		||||
        if (this._currentPage != null) {
 | 
			
		||||
            this._setCurrentLevelLatched(this._currentPage, false);
 | 
			
		||||
            this._currentPage.hide();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._current_page = layers[activeLevel];
 | 
			
		||||
        this._currentPage = layers[activeLevel];
 | 
			
		||||
        this._updateCurrentPageVisible();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -160,6 +160,19 @@ var Monitor = class Monitor {
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const UiActor = GObject.registerClass(
 | 
			
		||||
class UiActor extends St.Widget {
 | 
			
		||||
    vfunc_get_preferred_width (forHeight) {
 | 
			
		||||
        let width = global.stage.width;
 | 
			
		||||
        return [width, width];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    vfunc_get_preferred_height (forWidth) {
 | 
			
		||||
        let height = global.stage.height;
 | 
			
		||||
        return [height, height];
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
const defaultParams = {
 | 
			
		||||
    trackFullscreen: false,
 | 
			
		||||
    affectsStruts: false,
 | 
			
		||||
@@ -200,12 +213,8 @@ var LayoutManager = GObject.registerClass({
 | 
			
		||||
        global.stage.no_clear_hint = true;
 | 
			
		||||
 | 
			
		||||
        // Set up stage hierarchy to group all UI actors under one container.
 | 
			
		||||
        this.uiGroup = new St.Widget({ name: 'uiGroup' });
 | 
			
		||||
        this.uiGroup = new UiActor({ name: 'uiGroup' });
 | 
			
		||||
        this.uiGroup.set_flags(Clutter.ActorFlags.NO_LAYOUT);
 | 
			
		||||
        this.uiGroup.add_constraint(new Clutter.BindConstraint({
 | 
			
		||||
            source: global.stage,
 | 
			
		||||
            coordinate: Clutter.BindCoordinate.ALL,
 | 
			
		||||
        }));
 | 
			
		||||
 | 
			
		||||
        global.stage.remove_actor(global.window_group);
 | 
			
		||||
        this.uiGroup.add_actor(global.window_group);
 | 
			
		||||
@@ -243,7 +252,7 @@ var LayoutManager = GObject.registerClass({
 | 
			
		||||
 | 
			
		||||
        // 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);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 | 
			
		||||
 | 
			
		||||
const { Atspi, Clutter, Cogl, GDesktopEnums,
 | 
			
		||||
const { Atspi, Clutter, GDesktopEnums,
 | 
			
		||||
        Gio, GLib, GObject, Meta, Shell, St } = imports.gi;
 | 
			
		||||
const Mainloop = imports.mainloop;
 | 
			
		||||
const Signals = imports.signals;
 | 
			
		||||
@@ -18,9 +18,6 @@ var NO_CHANGE = 0.0;
 | 
			
		||||
var POINTER_REST_TIME = 1000; // milliseconds
 | 
			
		||||
 | 
			
		||||
// Settings
 | 
			
		||||
const APPLICATIONS_SCHEMA       = 'org.gnome.desktop.a11y.applications';
 | 
			
		||||
const SHOW_KEY                  = 'screen-magnifier-enabled';
 | 
			
		||||
 | 
			
		||||
const MAGNIFIER_SCHEMA          = 'org.gnome.desktop.a11y.magnifier';
 | 
			
		||||
const SCREEN_POSITION_KEY       = 'screen-position';
 | 
			
		||||
const MAG_FACTOR_KEY            = 'mag-factor';
 | 
			
		||||
@@ -56,22 +53,19 @@ var MouseSpriteContent = GObject.registerClass({
 | 
			
		||||
 | 
			
		||||
    vfunc_get_preferred_size() {
 | 
			
		||||
        if (!this._texture)
 | 
			
		||||
            return [0, 0];
 | 
			
		||||
            return [false, 0, 0];
 | 
			
		||||
 | 
			
		||||
        return [this._texture.get_width(), this._texture.get_height()];
 | 
			
		||||
        return [true, this._texture.get_width(), this._texture.get_height()];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    vfunc_paint_content(actor, node) {
 | 
			
		||||
        if (!this._texture)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        let color = new Cogl.Color();
 | 
			
		||||
        color.init_from_4ub(0, 0, 0, 0);
 | 
			
		||||
 | 
			
		||||
        let color = Clutter.Color.get_static(Clutter.StaticColor.WHITE);
 | 
			
		||||
        let [minFilter, magFilter] = actor.get_content_scaling_filters();
 | 
			
		||||
        let textureNode = new Clutter.TextureNode(this._texture,
 | 
			
		||||
                                                  color,
 | 
			
		||||
                                                  Clutter.ScalingFilter.NEAREST,
 | 
			
		||||
                                                  Clutter.ScalingFilter.NEAREST);
 | 
			
		||||
                                                  color, minFilter, magFilter);
 | 
			
		||||
        textureNode.set_name('MouseSpriteContent');
 | 
			
		||||
        node.add_child(textureNode);
 | 
			
		||||
 | 
			
		||||
@@ -86,8 +80,14 @@ var MouseSpriteContent = GObject.registerClass({
 | 
			
		||||
        if (this._texture == coglTexture)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        let oldTexture = this._texture;
 | 
			
		||||
        this._texture = coglTexture;
 | 
			
		||||
        this.invalidate();
 | 
			
		||||
 | 
			
		||||
        if (!oldTexture || !coglTexture ||
 | 
			
		||||
            oldTexture.get_width() != coglTexture.get_width() ||
 | 
			
		||||
            oldTexture.get_height() != coglTexture.get_height())
 | 
			
		||||
            this.invalidate_size();
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
@@ -102,7 +102,6 @@ var Magnifier = class Magnifier {
 | 
			
		||||
 | 
			
		||||
        this._mouseSprite = new Clutter.Actor({ request_mode: Clutter.RequestMode.CONTENT_SIZE });
 | 
			
		||||
        this._mouseSprite.content = new MouseSpriteContent();
 | 
			
		||||
        this._updateSpriteTexture();
 | 
			
		||||
 | 
			
		||||
        this._cursorRoot = new Clutter.Actor();
 | 
			
		||||
        this._cursorRoot.add_actor(this._mouseSprite);
 | 
			
		||||
@@ -115,14 +114,16 @@ var Magnifier = class Magnifier {
 | 
			
		||||
 | 
			
		||||
        let aZoomRegion = new ZoomRegion(this, this._cursorRoot);
 | 
			
		||||
        this._zoomRegions.push(aZoomRegion);
 | 
			
		||||
        let showAtLaunch = this._settingsInit(aZoomRegion);
 | 
			
		||||
        this._settingsInit(aZoomRegion);
 | 
			
		||||
        aZoomRegion.scrollContentsTo(this.xMouse, this.yMouse);
 | 
			
		||||
 | 
			
		||||
        cursorTracker.connect('cursor-changed', this._updateMouseSprite.bind(this));
 | 
			
		||||
        St.Settings.get().connect('notify::magnifier-active', () => {
 | 
			
		||||
            this.setActive(St.Settings.get().magnifier_active);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        // Export to dbus.
 | 
			
		||||
        magDBusService = new MagnifierDBus.ShellMagnifier();
 | 
			
		||||
        this.setActive(showAtLaunch);
 | 
			
		||||
        this.setActive(St.Settings.get().magnifier_active);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -155,9 +156,15 @@ var Magnifier = class Magnifier {
 | 
			
		||||
 | 
			
		||||
        if (isActive != activate) {
 | 
			
		||||
            if (activate) {
 | 
			
		||||
                this._updateMouseSprite();
 | 
			
		||||
                this._cursorSpriteChangedId =
 | 
			
		||||
                    this._cursorTracker.connect('cursor-changed',
 | 
			
		||||
                                                this._updateMouseSprite.bind(this));
 | 
			
		||||
                Meta.disable_unredirect_for_display(global.display);
 | 
			
		||||
                this.startTrackingMouse();
 | 
			
		||||
            } else {
 | 
			
		||||
                this._cursorTracker.disconnect(this._cursorSpriteChangedId);
 | 
			
		||||
                this._mouseSprite.content.texture = null;
 | 
			
		||||
                Meta.enable_unredirect_for_display(global.display);
 | 
			
		||||
                this.stopTrackingMouse();
 | 
			
		||||
            }
 | 
			
		||||
@@ -495,13 +502,8 @@ var Magnifier = class Magnifier {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _settingsInit(zoomRegion) {
 | 
			
		||||
        this._appSettings = new Gio.Settings({ schema_id: APPLICATIONS_SCHEMA });
 | 
			
		||||
        this._settings = new Gio.Settings({ schema_id: MAGNIFIER_SCHEMA });
 | 
			
		||||
 | 
			
		||||
        this._appSettings.connect('changed::' + SHOW_KEY, () => {
 | 
			
		||||
            this.setActive(this._appSettings.get_boolean(SHOW_KEY));
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        this._settings.connect('changed::' + SCREEN_POSITION_KEY,
 | 
			
		||||
                               this._updateScreenPosition.bind(this));
 | 
			
		||||
        this._settings.connect('changed::' + MAG_FACTOR_KEY,
 | 
			
		||||
@@ -608,8 +610,6 @@ var Magnifier = class Magnifier {
 | 
			
		||||
        let showCrosshairs = this._settings.get_boolean(SHOW_CROSS_HAIRS_KEY);
 | 
			
		||||
        this.addCrosshairs();
 | 
			
		||||
        this.setCrosshairsVisible(showCrosshairs);
 | 
			
		||||
 | 
			
		||||
        return this._appSettings.get_boolean(SHOW_KEY);
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
    _updateScreenPosition() {
 | 
			
		||||
@@ -756,13 +756,41 @@ var ZoomRegion = class ZoomRegion {
 | 
			
		||||
 | 
			
		||||
        this._pointerIdleMonitor = Meta.IdleMonitor.get_for_device(Meta.VIRTUAL_CORE_POINTER_ID);
 | 
			
		||||
        this._scrollContentsTimerId = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
        Main.layoutManager.connect('monitors-changed',
 | 
			
		||||
                                   this._monitorsChanged.bind(this));
 | 
			
		||||
        this._focusCaretTracker.connect('caret-moved',
 | 
			
		||||
                                    this._updateCaret.bind(this));
 | 
			
		||||
        this._focusCaretTracker.connect('focus-changed',
 | 
			
		||||
                                    this._updateFocus.bind(this));
 | 
			
		||||
    _connectSignals() {
 | 
			
		||||
        if (this._signalConnections)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        this._signalConnections = [];
 | 
			
		||||
        let id = Main.layoutManager.connect('monitors-changed',
 | 
			
		||||
                                            this._monitorsChanged.bind(this));
 | 
			
		||||
        this._signalConnections.push([Main.layoutManager, id]);
 | 
			
		||||
 | 
			
		||||
        id = this._focusCaretTracker.connect('caret-moved', this._updateCaret.bind(this));
 | 
			
		||||
        this._signalConnections.push([this._focusCaretTracker, id]);
 | 
			
		||||
 | 
			
		||||
        id = this._focusCaretTracker.connect('focus-changed', this._updateFocus.bind(this));
 | 
			
		||||
        this._signalConnections.push([this._focusCaretTracker, id]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _disconnectSignals() {
 | 
			
		||||
        for (let [obj, id] of this._signalConnections)
 | 
			
		||||
            obj.disconnect(id);
 | 
			
		||||
 | 
			
		||||
        delete this._signalConnections;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _updateScreenPosition() {
 | 
			
		||||
        if (this._screenPosition == GDesktopEnums.MagnifierScreenPosition.NONE)
 | 
			
		||||
            this._setViewPort({
 | 
			
		||||
                x: this._viewPortX,
 | 
			
		||||
                y: this._viewPortY,
 | 
			
		||||
                width: this._viewPortWidth,
 | 
			
		||||
                height: this._viewPortHeight
 | 
			
		||||
            });
 | 
			
		||||
        else
 | 
			
		||||
            this.setScreenPosition(this._screenPosition);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _updateFocus(caller, event) {
 | 
			
		||||
@@ -810,10 +838,13 @@ var ZoomRegion = class ZoomRegion {
 | 
			
		||||
            this._createActors();
 | 
			
		||||
            if (this._isMouseOverRegion())
 | 
			
		||||
                this._magnifier.hideSystemCursor();
 | 
			
		||||
            this._updateScreenPosition();
 | 
			
		||||
            this._updateMagViewGeometry();
 | 
			
		||||
            this._updateCloneGeometry();
 | 
			
		||||
            this._updateMousePosition();
 | 
			
		||||
            this._connectSignals();
 | 
			
		||||
        } else {
 | 
			
		||||
            this._disconnectSignals();
 | 
			
		||||
            this._destroyActors();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -1563,18 +1594,8 @@ var ZoomRegion = class ZoomRegion {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _monitorsChanged() {
 | 
			
		||||
        if (!this.isActive())
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        this._background.set_size(global.screen_width, global.screen_height);
 | 
			
		||||
 | 
			
		||||
        if (this._screenPosition == GDesktopEnums.MagnifierScreenPosition.NONE)
 | 
			
		||||
            this._setViewPort({ x: this._viewPortX,
 | 
			
		||||
                                y: this._viewPortY,
 | 
			
		||||
                                width: this._viewPortWidth,
 | 
			
		||||
                                height: this._viewPortHeight });
 | 
			
		||||
        else
 | 
			
		||||
            this.setScreenPosition(this._screenPosition);
 | 
			
		||||
        this._updateScreenPosition();
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -211,13 +211,6 @@ function _initializeUI() {
 | 
			
		||||
 | 
			
		||||
    _startDate = new Date();
 | 
			
		||||
 | 
			
		||||
    let perfModuleName = GLib.getenv("SHELL_PERF_MODULE");
 | 
			
		||||
    if (perfModuleName) {
 | 
			
		||||
        let perfOutput = GLib.getenv("SHELL_PERF_OUTPUT");
 | 
			
		||||
        let module = eval('imports.perf.' + perfModuleName + ';');
 | 
			
		||||
        Scripting.runPerfScript(module, perfOutput);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ExtensionDownloader.init();
 | 
			
		||||
    ExtensionSystem.init();
 | 
			
		||||
 | 
			
		||||
@@ -239,6 +232,13 @@ function _initializeUI() {
 | 
			
		||||
            Shell.Global.log_structured('GNOME Shell started at ' + _startDate,
 | 
			
		||||
                                        ['MESSAGE_ID=' + GNOMESHELL_STARTED_MESSAGE_ID]);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let perfModuleName = GLib.getenv("SHELL_PERF_MODULE");
 | 
			
		||||
        if (perfModuleName) {
 | 
			
		||||
            let perfOutput = GLib.getenv("SHELL_PERF_OUTPUT");
 | 
			
		||||
            let module = eval('imports.perf.' + perfModuleName + ';');
 | 
			
		||||
            Scripting.runPerfScript(module, perfOutput);
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
 
 | 
			
		||||
@@ -95,28 +95,6 @@ var OsdMonitorLabeler = class {
 | 
			
		||||
 | 
			
		||||
        this._reset();
 | 
			
		||||
 | 
			
		||||
        for (let id in params) {
 | 
			
		||||
            let monitor = this._monitorManager.get_monitor_for_output(id);
 | 
			
		||||
            if (monitor == -1)
 | 
			
		||||
                continue;
 | 
			
		||||
            this._monitorLabels.get(monitor).push(params[id].deep_unpack());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // In mirrored display setups, more than one physical outputs
 | 
			
		||||
        // might be showing the same logical monitor. In that case, we
 | 
			
		||||
        // join each output's labels on the same OSD widget.
 | 
			
		||||
        for (let [monitor, labels] of this._monitorLabels.entries()) {
 | 
			
		||||
            labels.sort();
 | 
			
		||||
            this._osdLabels.push(new OsdMonitorLabel(monitor, labels.join(' ')));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    show2(client, params) {
 | 
			
		||||
        if (!this._trackClient(client))
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        this._reset();
 | 
			
		||||
 | 
			
		||||
        for (let connector in params) {
 | 
			
		||||
            let monitor = this._monitorManager.get_monitor_for_connector(connector);
 | 
			
		||||
            if (monitor == -1)
 | 
			
		||||
 
 | 
			
		||||
@@ -369,17 +369,15 @@ class DashSpacer extends St.Widget {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    vfunc_get_preferred_width(forHeight) {
 | 
			
		||||
        let box = this.get_allocation_box();
 | 
			
		||||
        let minWidth = super.vfunc_get_preferred_width(forHeight)[0];
 | 
			
		||||
        let natWidth = box.x2 - box.x1;
 | 
			
		||||
        return [minWidth, natWidth];
 | 
			
		||||
        if (this._bindConstraint)
 | 
			
		||||
            return this._bindConstraint.source.get_preferred_width(forHeight);
 | 
			
		||||
        return super.vfunc_get_preferred_width(forHeight);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    vfunc_get_preferred_height(forWidth) {
 | 
			
		||||
        let box = this.get_allocation_box();
 | 
			
		||||
        let minHeight = super.vfunc_get_preferred_height(forWidth)[0];
 | 
			
		||||
        let natHeight = box.y2 - box.y1;
 | 
			
		||||
        return [minHeight, natHeight];
 | 
			
		||||
        if (this._bindConstraint)
 | 
			
		||||
            return this._bindConstraint.source.get_preferred_height(forWidth);
 | 
			
		||||
        return super.vfunc_get_preferred_height(forWidth);
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -374,12 +374,12 @@ var PadDiagram = GObject.registerClass({
 | 
			
		||||
        svgData += this._cssString();
 | 
			
		||||
        svgData += this._wrappingSvgFooter();
 | 
			
		||||
 | 
			
		||||
        let handle = new Rsvg.Handle();
 | 
			
		||||
        handle.set_base_uri(GLib.path_get_dirname(this._imagePath));
 | 
			
		||||
        handle.write(svgData);
 | 
			
		||||
        handle.close();
 | 
			
		||||
        let istream = new Gio.MemoryInputStream();
 | 
			
		||||
        istream.add_bytes(new GLib.Bytes(svgData));
 | 
			
		||||
 | 
			
		||||
        return handle;
 | 
			
		||||
        return Rsvg.Handle.new_from_stream_sync(istream,
 | 
			
		||||
                                                Gio.File.new_for_path(this._imagePath),
 | 
			
		||||
                                                0, null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _updateDiagramScale() {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										105
									
								
								js/ui/panel.js
									
									
									
									
									
								
							
							
						
						
									
										105
									
								
								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();
 | 
			
		||||
        });
 | 
			
		||||
@@ -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();
 | 
			
		||||
@@ -809,6 +806,7 @@ class AggregateMenu extends PanelMenu.Button {
 | 
			
		||||
        menuLayout.addSizeChild(this._location.menu.actor);
 | 
			
		||||
        menuLayout.addSizeChild(this._rfkill.menu.actor);
 | 
			
		||||
        menuLayout.addSizeChild(this._power.menu.actor);
 | 
			
		||||
        menuLayout.addSizeChild(this._system.buttonGroup);
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
@@ -827,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;
 | 
			
		||||
@@ -882,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;
 | 
			
		||||
@@ -976,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,
 | 
			
		||||
@@ -1021,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();
 | 
			
		||||
@@ -1043,7 +1027,7 @@ class Panel extends St.Widget {
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        let menu = indicator.menu;
 | 
			
		||||
        if (!indicator.actor.reactive)
 | 
			
		||||
        if (!indicator.reactive)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        menu.close();
 | 
			
		||||
@@ -1201,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
 | 
			
		||||
 
 | 
			
		||||
@@ -277,12 +277,6 @@ var Switch = class {
 | 
			
		||||
        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"));
 | 
			
		||||
        this.setToggleState(state);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -403,8 +397,8 @@ var PopupImageMenuItem = class extends PopupBaseMenuItem {
 | 
			
		||||
 | 
			
		||||
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;
 | 
			
		||||
@@ -859,7 +853,7 @@ var PopupMenu = class extends PopupMenuBase {
 | 
			
		||||
        if (this._activeMenuItem)
 | 
			
		||||
            this._activeMenuItem.setActive(false);
 | 
			
		||||
 | 
			
		||||
        if (this._boxPointer.actor.visible) {
 | 
			
		||||
        if (this._boxPointer.visible) {
 | 
			
		||||
            this._boxPointer.close(animate, () => {
 | 
			
		||||
                this.emit('menu-closed');
 | 
			
		||||
            });
 | 
			
		||||
@@ -1186,7 +1180,7 @@ var PopupMenuManager = class {
 | 
			
		||||
        grabParams = Params.parse(grabParams,
 | 
			
		||||
                                  { actionMode: Shell.ActionMode.POPUP });
 | 
			
		||||
        this._owner = owner;
 | 
			
		||||
        this._grabHelper = new GrabHelper.GrabHelper(owner.actor, grabParams);
 | 
			
		||||
        this._grabHelper = new GrabHelper.GrabHelper(owner, grabParams);
 | 
			
		||||
        this._menus = [];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -810,16 +810,8 @@ var ScreenShield = class {
 | 
			
		||||
 | 
			
		||||
        this._maybeCancelDialog();
 | 
			
		||||
 | 
			
		||||
        if (this._longLightbox.actor.visible ||
 | 
			
		||||
            this._isActive) {
 | 
			
		||||
            // We're either shown and active, or in the process of
 | 
			
		||||
            // showing.
 | 
			
		||||
            // The latter is a very unlikely condition (it requires
 | 
			
		||||
            // idle-delay < 20), but in any case we have nothing
 | 
			
		||||
            // to do at this point: either isActive is true, or
 | 
			
		||||
            // it will soon be.
 | 
			
		||||
            // isActive can also be true if the lightbox is hidden,
 | 
			
		||||
            // in case the shield is down and the user hasn't unlocked yet
 | 
			
		||||
        if (this._longLightbox.actor.visible) {
 | 
			
		||||
            // We're in the process of showing.
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 | 
			
		||||
 | 
			
		||||
const { Clutter, Gio, GLib, Gtk, Meta, Shell, St } = imports.gi;
 | 
			
		||||
const { Clutter, Gio, GLib, Meta, Shell, St } = imports.gi;
 | 
			
		||||
const Signals = imports.signals;
 | 
			
		||||
 | 
			
		||||
const GrabHelper = imports.ui.grabHelper;
 | 
			
		||||
@@ -227,8 +227,6 @@ var SelectArea = class {
 | 
			
		||||
        this._lastY = 0;
 | 
			
		||||
        this._result = null;
 | 
			
		||||
 | 
			
		||||
        this._initRubberbandColors();
 | 
			
		||||
 | 
			
		||||
        this._group = new St.Widget({ visible: false,
 | 
			
		||||
                                      reactive: true,
 | 
			
		||||
                                      x: 0,
 | 
			
		||||
@@ -248,10 +246,10 @@ var SelectArea = class {
 | 
			
		||||
                                                      coordinate: Clutter.BindCoordinate.ALL });
 | 
			
		||||
        this._group.add_constraint(constraint);
 | 
			
		||||
 | 
			
		||||
        this._rubberband = new Clutter.Rectangle({ color: this._background,
 | 
			
		||||
                                                   has_border: true,
 | 
			
		||||
                                                   border_width: 1,
 | 
			
		||||
                                                   border_color: this._border });
 | 
			
		||||
        this._rubberband = new St.Widget({
 | 
			
		||||
            style_class: 'select-area-rubberband',
 | 
			
		||||
            visible: false
 | 
			
		||||
        });
 | 
			
		||||
        this._group.add_actor(this._rubberband);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -265,25 +263,6 @@ var SelectArea = class {
 | 
			
		||||
        this._group.visible = true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _initRubberbandColors() {
 | 
			
		||||
        function colorFromRGBA(rgba) {
 | 
			
		||||
            return new Clutter.Color({ red: rgba.red * 255,
 | 
			
		||||
                                       green: rgba.green * 255,
 | 
			
		||||
                                       blue: rgba.blue * 255,
 | 
			
		||||
                                       alpha: rgba.alpha * 255 });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let path = new Gtk.WidgetPath();
 | 
			
		||||
        path.append_type(Gtk.IconView);
 | 
			
		||||
 | 
			
		||||
        let context = new Gtk.StyleContext();
 | 
			
		||||
        context.set_path(path);
 | 
			
		||||
        context.add_class('rubberband');
 | 
			
		||||
 | 
			
		||||
        this._background = colorFromRGBA(context.get_background_color(Gtk.StateFlags.NORMAL));
 | 
			
		||||
        this._border = colorFromRGBA(context.get_border_color(Gtk.StateFlags.NORMAL));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _getGeometry() {
 | 
			
		||||
        return { x: Math.min(this._startX, this._lastX),
 | 
			
		||||
                 y: Math.min(this._startY, this._lastY),
 | 
			
		||||
@@ -302,6 +281,7 @@ var SelectArea = class {
 | 
			
		||||
 | 
			
		||||
        this._rubberband.set_position(geometry.x, geometry.y);
 | 
			
		||||
        this._rubberband.set_size(geometry.width, geometry.height);
 | 
			
		||||
        this._rubberband.show();
 | 
			
		||||
 | 
			
		||||
        return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -37,16 +37,13 @@ const { loadInterfaceXML } = imports.misc.fileUtils;
 | 
			
		||||
 * 'yield Scripting.sleep(500);'
 | 
			
		||||
 */
 | 
			
		||||
function sleep(milliseconds) {
 | 
			
		||||
    let cb;
 | 
			
		||||
 | 
			
		||||
    let id = Mainloop.timeout_add(milliseconds, () => {
 | 
			
		||||
        if (cb)
 | 
			
		||||
            cb();
 | 
			
		||||
        return GLib.SOURCE_REMOVE;
 | 
			
		||||
    return new Promise(resolve => {
 | 
			
		||||
        let id = Mainloop.timeout_add(milliseconds, () => {
 | 
			
		||||
            resolve();
 | 
			
		||||
            return GLib.SOURCE_REMOVE;
 | 
			
		||||
        });
 | 
			
		||||
        GLib.Source.set_name_by_id(id, '[gnome-shell] sleep');
 | 
			
		||||
    });
 | 
			
		||||
    GLib.Source.set_name_by_id(id, '[gnome-shell] sleep');
 | 
			
		||||
 | 
			
		||||
    return callback => { cb = callback; };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -57,14 +54,9 @@ function sleep(milliseconds) {
 | 
			
		||||
 * 'yield Scripting.waitLeisure();'
 | 
			
		||||
 */
 | 
			
		||||
function waitLeisure() {
 | 
			
		||||
    let cb;
 | 
			
		||||
 | 
			
		||||
    global.run_at_leisure(() => {
 | 
			
		||||
       if (cb)
 | 
			
		||||
           cb();
 | 
			
		||||
    return new Promise(resolve => {
 | 
			
		||||
        global.run_at_leisure(resolve);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    return callback => { cb = callback; };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const PerfHelperIface = loadInterfaceXML('org.gnome.Shell.PerfHelper');
 | 
			
		||||
@@ -82,25 +74,16 @@ function _getPerfHelper() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function _callRemote(obj, method, ...args) {
 | 
			
		||||
    let cb;
 | 
			
		||||
    let errcb;
 | 
			
		||||
    return new Promise((resolve, reject) => {
 | 
			
		||||
        args.push((result, excp) => {
 | 
			
		||||
            if (excp)
 | 
			
		||||
                reject(excp);
 | 
			
		||||
            else
 | 
			
		||||
                resolve();
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
    args.push((result, excp) => {
 | 
			
		||||
         if (excp) {
 | 
			
		||||
             if (errcb)
 | 
			
		||||
                 errcb(excp);
 | 
			
		||||
         } else {
 | 
			
		||||
             if (cb)
 | 
			
		||||
                 cb();
 | 
			
		||||
         }
 | 
			
		||||
        method.apply(obj, args);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    method.apply(obj, args);
 | 
			
		||||
 | 
			
		||||
    return (callback, error_callback) => {
 | 
			
		||||
        cb = callback;
 | 
			
		||||
        errcb = error_callback;
 | 
			
		||||
    };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -192,27 +175,6 @@ function collectStatistics() {
 | 
			
		||||
    Shell.PerfLog.get_default().collect_statistics();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function _step(g, finish, onError) {
 | 
			
		||||
    try {
 | 
			
		||||
        let waitFunction = g.next();
 | 
			
		||||
        waitFunction(() => {
 | 
			
		||||
                         _step(g, finish, onError);
 | 
			
		||||
                     },
 | 
			
		||||
                     err => {
 | 
			
		||||
                         if (onError)
 | 
			
		||||
                             onError(err);
 | 
			
		||||
                     });
 | 
			
		||||
    } catch (err) {
 | 
			
		||||
        if (err instanceof StopIteration) {
 | 
			
		||||
            if (finish)
 | 
			
		||||
                finish();
 | 
			
		||||
        } else {
 | 
			
		||||
            if (onError)
 | 
			
		||||
                onError(err);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function _collect(scriptModule, outputFile) {
 | 
			
		||||
    let eventHandlers = {};
 | 
			
		||||
 | 
			
		||||
@@ -348,23 +310,23 @@ function _collect(scriptModule, outputFile) {
 | 
			
		||||
 * After running the script and collecting statistics from the
 | 
			
		||||
 * event log, GNOME Shell will exit.
 | 
			
		||||
 **/
 | 
			
		||||
function runPerfScript(scriptModule, outputFile) {
 | 
			
		||||
async function runPerfScript(scriptModule, outputFile) {
 | 
			
		||||
    Shell.PerfLog.get_default().set_enabled(true);
 | 
			
		||||
 | 
			
		||||
    let g = scriptModule.run();
 | 
			
		||||
    for (let step of scriptModule.run()) {
 | 
			
		||||
        try {
 | 
			
		||||
            await step;
 | 
			
		||||
        } catch (err) {
 | 
			
		||||
            log(`Script failed: ${err}\n${err.stack}`);
 | 
			
		||||
            Meta.exit(Meta.ExitCode.ERROR);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _step(g,
 | 
			
		||||
          () => {
 | 
			
		||||
              try {
 | 
			
		||||
                  _collect(scriptModule, outputFile);
 | 
			
		||||
              } catch (err) {
 | 
			
		||||
                  log("Script failed: " + err + "\n" + err.stack);
 | 
			
		||||
                  Meta.exit(Meta.ExitCode.ERROR);
 | 
			
		||||
              }
 | 
			
		||||
              Meta.exit(Meta.ExitCode.SUCCESS);
 | 
			
		||||
          },
 | 
			
		||||
         err => {
 | 
			
		||||
             log("Script failed: " + err + "\n" + err.stack);
 | 
			
		||||
             Meta.exit(Meta.ExitCode.ERROR);
 | 
			
		||||
         });
 | 
			
		||||
    try {
 | 
			
		||||
        _collect(scriptModule, outputFile);
 | 
			
		||||
    } catch (err) {
 | 
			
		||||
        log(`Script failed: ${err}\n${err.stack}`);
 | 
			
		||||
        Meta.exit(Meta.ExitCode.ERROR);
 | 
			
		||||
    }
 | 
			
		||||
    Meta.exit(Meta.ExitCode.SUCCESS);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -79,14 +79,17 @@ var GnomeShell = class {
 | 
			
		||||
        for (let param in params)
 | 
			
		||||
            params[param] = params[param].deep_unpack();
 | 
			
		||||
 | 
			
		||||
        let { monitor: monitorIndex,
 | 
			
		||||
        let { connector,
 | 
			
		||||
              label,
 | 
			
		||||
              level,
 | 
			
		||||
              max_level: maxLevel,
 | 
			
		||||
              icon: serializedIcon } = params;
 | 
			
		||||
 | 
			
		||||
        if (monitorIndex === undefined)
 | 
			
		||||
            monitorIndex = -1;
 | 
			
		||||
        let monitorIndex = -1;
 | 
			
		||||
        if (connector) {
 | 
			
		||||
            let monitorManager = Meta.MonitorManager.get();
 | 
			
		||||
            monitorIndex = monitorManager.get_monitor_for_connector(connector);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let icon = null;
 | 
			
		||||
        if (serializedIcon)
 | 
			
		||||
@@ -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);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
@@ -125,8 +125,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 +822,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);
 | 
			
		||||
@@ -908,11 +908,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);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
 | 
			
		||||
@@ -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 = '';
 | 
			
		||||
 | 
			
		||||
@@ -1673,7 +1674,11 @@ var NMApplet = class extends PanelMenu.SystemIndicator {
 | 
			
		||||
    _readDevices() {
 | 
			
		||||
        let devices = this._client.get_devices() || [ ];
 | 
			
		||||
        for (let i = 0; i < devices.length; ++i) {
 | 
			
		||||
            this._deviceAdded(this._client, devices[i], true);
 | 
			
		||||
            try {
 | 
			
		||||
                this._deviceAdded(this._client, devices[i], true);
 | 
			
		||||
            } catch (e) {
 | 
			
		||||
                log(`Failed to add device ${devices[i]}: ${e}`);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        this._syncDeviceNames();
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -236,6 +236,7 @@ var Indicator = class extends PanelMenu.SystemIndicator {
 | 
			
		||||
 | 
			
		||||
        item = new PopupMenu.PopupBaseMenuItem({ reactive: false,
 | 
			
		||||
                                                 can_focus: false });
 | 
			
		||||
        this.buttonGroup = item.actor;
 | 
			
		||||
 | 
			
		||||
        let app = this._settingsApp = Shell.AppSystem.get_default().lookup_app(
 | 
			
		||||
            'gnome-control-center.desktop'
 | 
			
		||||
 
 | 
			
		||||
@@ -33,8 +33,8 @@ function primaryModifier(mask) {
 | 
			
		||||
var SwitcherPopup = GObject.registerClass(
 | 
			
		||||
class SwitcherPopup extends St.Widget {
 | 
			
		||||
    _init(items) {
 | 
			
		||||
        if (new.target === SwitcherPopup)
 | 
			
		||||
            throw new TypeError('Cannot instantiate abstract class ' + new.target.name);
 | 
			
		||||
        if (this.constructor.name === SwitcherPopup.prototype.constructor.name)
 | 
			
		||||
            throw new TypeError(`Cannot instantiate abstract class ${this.constructor.name}`);
 | 
			
		||||
 | 
			
		||||
        super._init({ style_class: 'switcher-popup',
 | 
			
		||||
                      reactive: true,
 | 
			
		||||
 
 | 
			
		||||
@@ -46,15 +46,14 @@ var Avatar = class {
 | 
			
		||||
        if (iconFile) {
 | 
			
		||||
            let file = Gio.File.new_for_path(iconFile);
 | 
			
		||||
            this.actor.child = null;
 | 
			
		||||
            this.actor.style = 'background-image: url("%s");'.format(iconFile);
 | 
			
		||||
            this.actor.style = `
 | 
			
		||||
                background-image: url("${iconFile}");
 | 
			
		||||
                background-size: ${this._iconSize}px`;
 | 
			
		||||
        } else {
 | 
			
		||||
            this.actor.style = null;
 | 
			
		||||
            this.actor.child = new St.Icon({ icon_name: 'avatar-default-symbolic',
 | 
			
		||||
                                             icon_size: this._iconSize });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
 | 
			
		||||
        this.actor.set_size(this._iconSize * scaleFactor, this._iconSize * scaleFactor);
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -456,13 +456,28 @@ var TilePreview = class {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var TouchpadWorkspaceSwitchAction = class {
 | 
			
		||||
    constructor(actor) {
 | 
			
		||||
    constructor(actor, allowedModes) {
 | 
			
		||||
        this._allowedModes = allowedModes;
 | 
			
		||||
        this._dx = 0;
 | 
			
		||||
        this._dy = 0;
 | 
			
		||||
        this._enabled = true;
 | 
			
		||||
        actor.connect('captured-event', this._handleEvent.bind(this));
 | 
			
		||||
	this._touchpadSettings = new Gio.Settings({schema_id: 'org.gnome.desktop.peripherals.touchpad'});
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get enabled() {
 | 
			
		||||
        return this._enabled;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    set enabled(enabled) {
 | 
			
		||||
        if (this._enabled == enabled)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        this._enabled = enabled;
 | 
			
		||||
        if (!enabled)
 | 
			
		||||
            this.emit('cancel');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _checkActivated() {
 | 
			
		||||
        let dir;
 | 
			
		||||
 | 
			
		||||
@@ -482,15 +497,16 @@ var TouchpadWorkspaceSwitchAction = class {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _handleEvent(actor, event) {
 | 
			
		||||
        let allowedModes = Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW;
 | 
			
		||||
 | 
			
		||||
        if (event.type() != Clutter.EventType.TOUCHPAD_SWIPE)
 | 
			
		||||
            return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
 | 
			
		||||
        if (event.get_touchpad_gesture_finger_count() != 4)
 | 
			
		||||
            return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
 | 
			
		||||
        if ((allowedModes & Main.actionMode) == 0)
 | 
			
		||||
        if ((this._allowedModes & Main.actionMode) == 0)
 | 
			
		||||
            return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
 | 
			
		||||
        if (!this._enabled)
 | 
			
		||||
            return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
 | 
			
		||||
        if (event.get_gesture_phase() == Clutter.TouchpadGesturePhase.UPDATE) {
 | 
			
		||||
@@ -523,10 +539,11 @@ var WorkspaceSwitchAction = GObject.registerClass({
 | 
			
		||||
               'motion':    { param_types: [GObject.TYPE_DOUBLE, GObject.TYPE_DOUBLE] },
 | 
			
		||||
               'cancel':    { param_types: [] }},
 | 
			
		||||
}, class WorkspaceSwitchAction extends Clutter.SwipeAction {
 | 
			
		||||
    _init() {
 | 
			
		||||
    _init(allowedModes) {
 | 
			
		||||
        super._init();
 | 
			
		||||
        this.set_n_touch_points(4);
 | 
			
		||||
        this._swept = false;
 | 
			
		||||
        this._allowedModes = allowedModes;
 | 
			
		||||
 | 
			
		||||
        global.display.connect('grab-op-begin', () => {
 | 
			
		||||
            this.cancel();
 | 
			
		||||
@@ -534,14 +551,12 @@ var WorkspaceSwitchAction = GObject.registerClass({
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    vfunc_gesture_prepare(actor) {
 | 
			
		||||
        let allowedModes = Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW;
 | 
			
		||||
 | 
			
		||||
        this._swept = false;
 | 
			
		||||
 | 
			
		||||
        if (!super.vfunc_gesture_prepare(actor))
 | 
			
		||||
            return false;
 | 
			
		||||
 | 
			
		||||
        return (allowedModes & Main.actionMode);
 | 
			
		||||
        return (this._allowedModes & Main.actionMode);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    vfunc_gesture_progress(actor) {
 | 
			
		||||
@@ -1043,14 +1058,15 @@ var WindowManager = class {
 | 
			
		||||
        global.workspace_manager.override_workspace_layout(Meta.DisplayCorner.TOPLEFT,
 | 
			
		||||
                                                           false, -1, 1);
 | 
			
		||||
 | 
			
		||||
        let gesture = new WorkspaceSwitchAction();
 | 
			
		||||
        let allowedModes = Shell.ActionMode.NORMAL;
 | 
			
		||||
        let gesture = new WorkspaceSwitchAction(allowedModes);
 | 
			
		||||
        gesture.connect('motion', this._switchWorkspaceMotion.bind(this));
 | 
			
		||||
        gesture.connect('activated', this._actionSwitchWorkspace.bind(this));
 | 
			
		||||
        gesture.connect('cancel', this._switchWorkspaceCancel.bind(this));
 | 
			
		||||
        global.stage.add_action(gesture);
 | 
			
		||||
 | 
			
		||||
        // This is not a normal Clutter.GestureAction, doesn't need add_action()
 | 
			
		||||
        gesture = new TouchpadWorkspaceSwitchAction(global.stage);
 | 
			
		||||
        gesture = new TouchpadWorkspaceSwitchAction(global.stage, allowedModes);
 | 
			
		||||
        gesture.connect('motion', this._switchWorkspaceMotion.bind(this));
 | 
			
		||||
        gesture.connect('activated', this._actionSwitchWorkspace.bind(this));
 | 
			
		||||
        gesture.connect('cancel', this._switchWorkspaceCancel.bind(this));
 | 
			
		||||
@@ -1202,6 +1218,10 @@ var WindowManager = class {
 | 
			
		||||
            // Same for OR windows
 | 
			
		||||
            if (window.is_override_redirect())
 | 
			
		||||
                return;
 | 
			
		||||
            // Sticky windows don't need moving, in fact moving would
 | 
			
		||||
            // unstick them
 | 
			
		||||
            if (window.on_all_workspaces)
 | 
			
		||||
                return;
 | 
			
		||||
            // Windows on workspaces below pos don't need moving
 | 
			
		||||
            let index = window.get_workspace().index();
 | 
			
		||||
            if (index < pos)
 | 
			
		||||
@@ -1468,8 +1488,13 @@ var WindowManager = class {
 | 
			
		||||
        if (this._clearAnimationInfo(actor))
 | 
			
		||||
            this._shellwm.completed_size_change(actor);
 | 
			
		||||
 | 
			
		||||
        let destroyId = actor.connect('destroy', () => {
 | 
			
		||||
            this._clearAnimationInfo(actor);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        actor.__animationInfo = { clone: actorClone,
 | 
			
		||||
                                  oldRect: oldFrameRect };
 | 
			
		||||
                                  oldRect: oldFrameRect,
 | 
			
		||||
                                  destroyId: destroyId };
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _sizeChangedWindow(shellwm, actor) {
 | 
			
		||||
@@ -1530,6 +1555,7 @@ var WindowManager = class {
 | 
			
		||||
    _clearAnimationInfo(actor) {
 | 
			
		||||
        if (actor.__animationInfo) {
 | 
			
		||||
            actor.__animationInfo.clone.destroy();
 | 
			
		||||
            actor.disconnect(actor.__animationInfo.destroyId);
 | 
			
		||||
            delete actor.__animationInfo;
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
@@ -1844,17 +1870,25 @@ var WindowManager = class {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _getPositionForDirection(direction) {
 | 
			
		||||
    _getPositionForDirection(direction, fromWs, toWs) {
 | 
			
		||||
        let xDest = 0, yDest = 0;
 | 
			
		||||
 | 
			
		||||
        let oldWsIsFullscreen = fromWs.list_windows().some(w => w.is_fullscreen());
 | 
			
		||||
        let newWsIsFullscreen = toWs.list_windows().some(w => w.is_fullscreen());
 | 
			
		||||
 | 
			
		||||
        // We have to shift windows up or down by the height of the panel to prevent having a
 | 
			
		||||
        // visible gap between the windows while switching workspaces. Since fullscreen windows
 | 
			
		||||
        // hide the panel, they don't need to be shifted up or down.
 | 
			
		||||
        let shiftHeight = Main.panel.height;
 | 
			
		||||
 | 
			
		||||
        if (direction == Meta.MotionDirection.UP ||
 | 
			
		||||
            direction == Meta.MotionDirection.UP_LEFT ||
 | 
			
		||||
            direction == Meta.MotionDirection.UP_RIGHT)
 | 
			
		||||
            yDest = -global.screen_height + Main.panel.height;
 | 
			
		||||
            yDest = -global.screen_height + (oldWsIsFullscreen ? 0 : shiftHeight);
 | 
			
		||||
        else if (direction == Meta.MotionDirection.DOWN ||
 | 
			
		||||
            direction == Meta.MotionDirection.DOWN_LEFT ||
 | 
			
		||||
            direction == Meta.MotionDirection.DOWN_RIGHT)
 | 
			
		||||
            yDest = global.screen_height - Main.panel.height;
 | 
			
		||||
            yDest = global.screen_height - (newWsIsFullscreen ? 0 : shiftHeight);
 | 
			
		||||
 | 
			
		||||
        if (direction == Meta.MotionDirection.LEFT ||
 | 
			
		||||
            direction == Meta.MotionDirection.UP_LEFT ||
 | 
			
		||||
@@ -1912,7 +1946,7 @@ var WindowManager = class {
 | 
			
		||||
            switchData.container.add_actor(info.actor);
 | 
			
		||||
            info.actor.raise_top();
 | 
			
		||||
 | 
			
		||||
            let [x, y] = this._getPositionForDirection(dir);
 | 
			
		||||
            let [x, y] = this._getPositionForDirection(dir, curWs, ws);
 | 
			
		||||
            info.actor.set_position(x, y);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -1998,7 +2032,11 @@ var WindowManager = class {
 | 
			
		||||
 | 
			
		||||
        this._switchData.inProgress = true;
 | 
			
		||||
 | 
			
		||||
        let [xDest, yDest] = this._getPositionForDirection(direction);
 | 
			
		||||
        let workspaceManager = global.workspace_manager;
 | 
			
		||||
        let fromWs = workspaceManager.get_workspace_by_index(from);
 | 
			
		||||
        let toWs = workspaceManager.get_workspace_by_index(to);
 | 
			
		||||
 | 
			
		||||
        let [xDest, yDest] = this._getPositionForDirection(direction, fromWs, toWs);
 | 
			
		||||
 | 
			
		||||
        /* @direction is the direction that the "camera" moves, so the
 | 
			
		||||
         * screen contents have to move one screen's worth in the
 | 
			
		||||
 
 | 
			
		||||
@@ -173,7 +173,7 @@ var WindowMenu = class extends PopupMenu.PopupMenu {
 | 
			
		||||
 | 
			
		||||
var WindowMenuManager = class {
 | 
			
		||||
    constructor() {
 | 
			
		||||
        this._manager = new PopupMenu.PopupMenuManager({ actor: Main.layoutManager.dummyCursor });
 | 
			
		||||
        this._manager = new PopupMenu.PopupMenuManager(Main.layoutManager.dummyCursor);
 | 
			
		||||
 | 
			
		||||
        this._sourceActor = new St.Widget({ reactive: true, visible: false });
 | 
			
		||||
        this._sourceActor.connect('button-press-event', () => {
 | 
			
		||||
 
 | 
			
		||||
@@ -786,8 +786,8 @@ var WindowPositionFlags = {
 | 
			
		||||
 | 
			
		||||
var LayoutStrategy = class {
 | 
			
		||||
    constructor(monitor, rowSpacing, columnSpacing) {
 | 
			
		||||
        if (new.target === LayoutStrategy)
 | 
			
		||||
            throw new TypeError('Cannot instantiate abstract type ' + new.target.name);
 | 
			
		||||
        if (this.constructor === LayoutStrategy)
 | 
			
		||||
            throw new TypeError(`Cannot instantiate abstract type ${this.constructor.name}`);
 | 
			
		||||
 | 
			
		||||
        this._monitor = monitor;
 | 
			
		||||
        this._rowSpacing = rowSpacing;
 | 
			
		||||
 
 | 
			
		||||
@@ -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,6 +83,7 @@ var WorkspacesView = class extends WorkspacesViewBase {
 | 
			
		||||
 | 
			
		||||
        this._animating = false; // tweening
 | 
			
		||||
        this._scrolling = false; // swipe-scrolling
 | 
			
		||||
        this._gestureActive = false; // touch(pad) gestures
 | 
			
		||||
        this._animatingScroll = false; // programatically updating the adjustment
 | 
			
		||||
 | 
			
		||||
        let activeWorkspaceIndex = workspaceManager.get_active_workspace_index();
 | 
			
		||||
@@ -211,7 +213,7 @@ var WorkspacesView = class extends WorkspacesViewBase {
 | 
			
		||||
 | 
			
		||||
        for (let w = 0; w < this._workspaces.length; w++) {
 | 
			
		||||
            let workspace = this._workspaces[w];
 | 
			
		||||
            if (this._animating || this._scrolling) {
 | 
			
		||||
            if (this._animating || this._scrolling || this._gestureActive) {
 | 
			
		||||
                workspace.actor.show();
 | 
			
		||||
            } else {
 | 
			
		||||
                if (this._inDrag)
 | 
			
		||||
@@ -223,7 +225,7 @@ var WorkspacesView = class extends WorkspacesViewBase {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _updateScrollAdjustment(index) {
 | 
			
		||||
        if (this._scrolling)
 | 
			
		||||
        if (this._scrolling || this._gestureActive)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        this._animatingScroll = true;
 | 
			
		||||
@@ -300,6 +302,18 @@ var WorkspacesView = class extends WorkspacesViewBase {
 | 
			
		||||
        this._updateVisibility();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    startTouchGesture() {
 | 
			
		||||
        this._gestureActive = true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    endTouchGesture() {
 | 
			
		||||
        this._gestureActive = false;
 | 
			
		||||
 | 
			
		||||
        // Make sure title captions etc are shown as necessary
 | 
			
		||||
        this._scrollToActive();
 | 
			
		||||
        this._updateVisibility();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // sync the workspaces' positions to the value of the scroll adjustment
 | 
			
		||||
    // and change the active workspace if appropriate
 | 
			
		||||
    _onScroll(adj) {
 | 
			
		||||
@@ -310,7 +324,7 @@ var WorkspacesView = class extends WorkspacesViewBase {
 | 
			
		||||
        let active = workspaceManager.get_active_workspace_index();
 | 
			
		||||
        let current = Math.round(adj.value);
 | 
			
		||||
 | 
			
		||||
        if (active != current) {
 | 
			
		||||
        if (active != current && !this._gestureActive) {
 | 
			
		||||
            if (!this._workspaces[current]) {
 | 
			
		||||
                // The current workspace was destroyed. This could happen
 | 
			
		||||
                // when you are on the last empty workspace, and consolidate
 | 
			
		||||
@@ -391,6 +405,12 @@ var ExtraWorkspaceView = class extends WorkspacesViewBase {
 | 
			
		||||
 | 
			
		||||
    endSwipeScroll() {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    startTouchGesture() {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    endTouchGesture() {
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var DelegateFocusNavigator = GObject.registerClass(
 | 
			
		||||
@@ -430,27 +450,41 @@ var WorkspacesDisplay = class {
 | 
			
		||||
                    return false;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            for (let i = 0; i < this._workspacesViews.length; i++)
 | 
			
		||||
                this._workspacesViews[i].startSwipeScroll();
 | 
			
		||||
            this._startSwipeScroll();
 | 
			
		||||
            return true;
 | 
			
		||||
        });
 | 
			
		||||
        panAction.connect('gesture-cancel', () => {
 | 
			
		||||
            clickAction.release();
 | 
			
		||||
            for (let i = 0; i < this._workspacesViews.length; i++)
 | 
			
		||||
                this._workspacesViews[i].endSwipeScroll();
 | 
			
		||||
            this._endSwipeScroll();
 | 
			
		||||
        });
 | 
			
		||||
        panAction.connect('gesture-end', () => {
 | 
			
		||||
            clickAction.release();
 | 
			
		||||
            for (let i = 0; i < this._workspacesViews.length; i++)
 | 
			
		||||
                this._workspacesViews[i].endSwipeScroll();
 | 
			
		||||
            this._endSwipeScroll();
 | 
			
		||||
        });
 | 
			
		||||
        Main.overview.addAction(panAction);
 | 
			
		||||
        this.actor.bind_property('mapped', panAction, 'enabled', GObject.BindingFlags.SYNC_CREATE);
 | 
			
		||||
 | 
			
		||||
        let allowedModes = Shell.ActionMode.OVERVIEW;
 | 
			
		||||
        let switchGesture = new WindowManager.WorkspaceSwitchAction(allowedModes);
 | 
			
		||||
        switchGesture.connect('motion', this._onSwitchWorkspaceMotion.bind(this));
 | 
			
		||||
        switchGesture.connect('activated', this._onSwitchWorkspaceActivated.bind(this));
 | 
			
		||||
        switchGesture.connect('cancel', this._endTouchGesture.bind(this));
 | 
			
		||||
        Main.overview.addAction(switchGesture);
 | 
			
		||||
        this.actor.bind_property('mapped', switchGesture, 'enabled', GObject.BindingFlags.SYNC_CREATE);
 | 
			
		||||
 | 
			
		||||
        switchGesture = new WindowManager.TouchpadWorkspaceSwitchAction(global.stage, allowedModes);
 | 
			
		||||
        switchGesture.connect('motion', this._onSwitchWorkspaceMotion.bind(this));
 | 
			
		||||
        switchGesture.connect('activated', this._onSwitchWorkspaceActivated.bind(this));
 | 
			
		||||
        switchGesture.connect('cancel', this._endTouchGesture.bind(this));
 | 
			
		||||
        this.actor.connect('notify::mapped', () => {
 | 
			
		||||
            switchGesture.enabled = this.actor.mapped;
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        this._primaryIndex = Main.layoutManager.primaryIndex;
 | 
			
		||||
 | 
			
		||||
        this._workspacesViews = [];
 | 
			
		||||
        this._primaryScrollAdjustment = null;
 | 
			
		||||
        switchGesture.enabled = this.actor.mapped;
 | 
			
		||||
 | 
			
		||||
        this._settings = new Gio.Settings({ schema_id: MUTTER_SCHEMA });
 | 
			
		||||
        this._settings.connect('changed::workspaces-only-on-primary',
 | 
			
		||||
@@ -474,6 +508,47 @@ var WorkspacesDisplay = class {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _startSwipeScroll() {
 | 
			
		||||
        for (let i = 0; i < this._workspacesViews.length; i++)
 | 
			
		||||
            this._workspacesViews[i].startSwipeScroll();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _endSwipeScroll() {
 | 
			
		||||
        for (let i = 0; i < this._workspacesViews.length; i++)
 | 
			
		||||
            this._workspacesViews[i].endSwipeScroll();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _startTouchGesture() {
 | 
			
		||||
        for (let i = 0; i < this._workspacesViews.length; i++)
 | 
			
		||||
            this._workspacesViews[i].startTouchGesture();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _endTouchGesture() {
 | 
			
		||||
        for (let i = 0; i < this._workspacesViews.length; i++)
 | 
			
		||||
            this._workspacesViews[i].endTouchGesture();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _onSwitchWorkspaceMotion(action, xRel, yRel) {
 | 
			
		||||
        // We don't have a way to hook into start of touchpad actions,
 | 
			
		||||
        // luckily this is safe to call repeatedly.
 | 
			
		||||
        this._startTouchGesture();
 | 
			
		||||
 | 
			
		||||
        let workspaceManager = global.workspace_manager;
 | 
			
		||||
        let active = workspaceManager.get_active_workspace_index();
 | 
			
		||||
        let adjustment = this._scrollAdjustment;
 | 
			
		||||
        adjustment.value = (active - yRel / this.actor.height) * adjustment.page_size;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _onSwitchWorkspaceActivated(action, direction) {
 | 
			
		||||
        let workspaceManager = global.workspace_manager;
 | 
			
		||||
        let activeWorkspace = workspaceManager.get_active_workspace();
 | 
			
		||||
        let newWs = activeWorkspace.get_neighbor(direction);
 | 
			
		||||
        if (newWs != activeWorkspace)
 | 
			
		||||
            newWs.activate(global.get_current_time());
 | 
			
		||||
 | 
			
		||||
        this._endTouchGesture();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    navigateFocus(from, direction) {
 | 
			
		||||
        return this._getPrimaryView().actor.navigate_focus(from, direction, false);
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										44
									
								
								meson.build
									
									
									
									
									
								
							
							
						
						
									
										44
									
								
								meson.build
									
									
									
									
									
								
							@@ -1,5 +1,5 @@
 | 
			
		||||
project('gnome-shell', 'c',
 | 
			
		||||
  version: '3.32.0',
 | 
			
		||||
  version: '3.32.1',
 | 
			
		||||
  meson_version: '>= 0.47.0',
 | 
			
		||||
  license: 'GPLv2+'
 | 
			
		||||
)
 | 
			
		||||
@@ -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',
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1043
									
								
								po/en_GB.po
									
									
									
									
									
								
							
							
						
						
									
										1043
									
								
								po/en_GB.po
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										193
									
								
								po/eo.po
									
									
									
									
									
								
							
							
						
						
									
										193
									
								
								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-02-21 18:43+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2019-02-22 13:19+0100\n"
 | 
			
		||||
"POT-Creation-Date: 2019-04-17 19:29+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2019-05-01 16:29+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"
 | 
			
		||||
 | 
			
		||||
@@ -185,8 +185,8 @@ msgstr "Klavkombino por malfermi la “Montri aplikaĵojn”-vidon"
 | 
			
		||||
msgid ""
 | 
			
		||||
"Keybinding to open the “Show Applications” view of the Activities Overview."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Klavkombino por malfermi la “Montri aplikaĵojn” vidon de la aktivecoj "
 | 
			
		||||
"superrigardo."
 | 
			
		||||
"Klavkombino por malfermi la “Montri aplikaĵojn” vidon de la Aktivecoj-"
 | 
			
		||||
"Superrigardo."
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.shell.gschema.xml.in:124
 | 
			
		||||
msgid "Keybinding to open the overview"
 | 
			
		||||
@@ -194,7 +194,7 @@ msgstr "Klavkombino por malfermi la superrigardon"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.shell.gschema.xml.in:125
 | 
			
		||||
msgid "Keybinding to open the Activities Overview."
 | 
			
		||||
msgstr "Klavkombino por malfermi la aktivecoj superrigardon."
 | 
			
		||||
msgstr "Klavkombino por malfermi la Aktivecoj-Superrigardon."
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.shell.gschema.xml.in:131
 | 
			
		||||
msgid "Keybinding to toggle the visibility of the notification list"
 | 
			
		||||
@@ -334,11 +334,6 @@ msgstr "En musa reĝimo, prokrasti ŝanĝi fokuson ĝis la musmontrilo haltas"
 | 
			
		||||
msgid "Network Login"
 | 
			
		||||
msgstr "Reta saluto"
 | 
			
		||||
 | 
			
		||||
#. 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 "Io fiaskis"
 | 
			
		||||
@@ -419,7 +414,7 @@ msgstr "Ĉu ne en listo?"
 | 
			
		||||
 | 
			
		||||
#. 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 "(ekzemple, uzanto aŭ %s)"
 | 
			
		||||
@@ -427,12 +422,12 @@ msgstr "(ekzemple, uzanto aŭ %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 "Uzantonomo: "
 | 
			
		||||
 | 
			
		||||
#: js/gdm/loginDialog.js:1223
 | 
			
		||||
#: js/gdm/loginDialog.js:1227
 | 
			
		||||
msgid "Login Window"
 | 
			
		||||
msgstr "Salutfenestro"
 | 
			
		||||
 | 
			
		||||
@@ -686,32 +681,38 @@ 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 "Windows"
 | 
			
		||||
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."
 | 
			
		||||
@@ -993,7 +994,7 @@ msgstr "Portebla larĝkapacita retopasvorto"
 | 
			
		||||
msgid "A password is required to connect to “%s”."
 | 
			
		||||
msgstr "Pasvorto estas bezonata por konekti al “%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 "Retadministrilo"
 | 
			
		||||
 | 
			
		||||
@@ -1065,23 +1066,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"
 | 
			
		||||
 | 
			
		||||
@@ -1240,26 +1241,26 @@ msgid "Download and install “%s” from extensions.gnome.org?"
 | 
			
		||||
msgstr "Ĉu elŝuti kaj instali “%s” de 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 volas malebligi klavkombinojn"
 | 
			
		||||
 | 
			
		||||
#: js/ui/inhibitShortcutsDialog.js:51
 | 
			
		||||
#: js/ui/inhibitShortcutsDialog.js:79
 | 
			
		||||
msgid "Application wants to inhibit shortcuts"
 | 
			
		||||
msgstr "Aplikaĵo volas malebligi klavkombinojn"
 | 
			
		||||
 | 
			
		||||
#. 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 "Vi povas restaŭri klavkombinojn per premi %s."
 | 
			
		||||
 | 
			
		||||
#: js/ui/inhibitShortcutsDialog.js:65
 | 
			
		||||
#: js/ui/inhibitShortcutsDialog.js:93
 | 
			
		||||
msgid "Deny"
 | 
			
		||||
msgstr "Rifuzi"
 | 
			
		||||
 | 
			
		||||
#: js/ui/inhibitShortcutsDialog.js:71
 | 
			
		||||
#: js/ui/inhibitShortcutsDialog.js:100
 | 
			
		||||
msgid "Allow"
 | 
			
		||||
msgstr "Akcepti"
 | 
			
		||||
 | 
			
		||||
@@ -1310,13 +1311,13 @@ msgid "Leave On"
 | 
			
		||||
msgstr "Lasi ŝaltita"
 | 
			
		||||
 | 
			
		||||
#: 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 "Ŝ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: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"
 | 
			
		||||
@@ -1326,59 +1327,59 @@ msgstr "Malŝalti"
 | 
			
		||||
msgid "Leave Off"
 | 
			
		||||
msgstr "Lasi malŝaltita"
 | 
			
		||||
 | 
			
		||||
#: js/ui/keyboard.js:203
 | 
			
		||||
#: js/ui/keyboard.js:200
 | 
			
		||||
msgid "Region & Language Settings"
 | 
			
		||||
msgstr "Regiono & lingvo agordoj"
 | 
			
		||||
 | 
			
		||||
#: js/ui/lookingGlass.js:614
 | 
			
		||||
#: js/ui/lookingGlass.js:615
 | 
			
		||||
msgid "No extensions installed"
 | 
			
		||||
msgstr "Neniu kromprogramo instalita"
 | 
			
		||||
 | 
			
		||||
#. 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 ne eligintaj ajnaj eraroj."
 | 
			
		||||
 | 
			
		||||
#: js/ui/lookingGlass.js:674
 | 
			
		||||
#: js/ui/lookingGlass.js:675
 | 
			
		||||
msgid "Hide Errors"
 | 
			
		||||
msgstr "Kaŝi erarojn"
 | 
			
		||||
 | 
			
		||||
#: js/ui/lookingGlass.js:678 js/ui/lookingGlass.js:738
 | 
			
		||||
#: js/ui/lookingGlass.js:679 js/ui/lookingGlass.js:739
 | 
			
		||||
msgid "Show Errors"
 | 
			
		||||
msgstr "Montri erarojn"
 | 
			
		||||
 | 
			
		||||
#: js/ui/lookingGlass.js:687
 | 
			
		||||
#: js/ui/lookingGlass.js:688
 | 
			
		||||
msgid "Enabled"
 | 
			
		||||
msgstr "Enŝaltita"
 | 
			
		||||
 | 
			
		||||
#. 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 "Elŝaltita"
 | 
			
		||||
 | 
			
		||||
#: js/ui/lookingGlass.js:692
 | 
			
		||||
#: js/ui/lookingGlass.js:693
 | 
			
		||||
msgid "Error"
 | 
			
		||||
msgstr "Eraro"
 | 
			
		||||
 | 
			
		||||
#: js/ui/lookingGlass.js:694
 | 
			
		||||
#: js/ui/lookingGlass.js:695
 | 
			
		||||
msgid "Out of date"
 | 
			
		||||
msgstr "Neaktuala"
 | 
			
		||||
 | 
			
		||||
#: js/ui/lookingGlass.js:696
 | 
			
		||||
#: js/ui/lookingGlass.js:697
 | 
			
		||||
msgid "Downloading"
 | 
			
		||||
msgstr "Elŝutante"
 | 
			
		||||
 | 
			
		||||
#: js/ui/lookingGlass.js:720
 | 
			
		||||
#: js/ui/lookingGlass.js:721
 | 
			
		||||
msgid "View Source"
 | 
			
		||||
msgstr "Montri fonton"
 | 
			
		||||
 | 
			
		||||
#: js/ui/lookingGlass.js:729
 | 
			
		||||
#: js/ui/lookingGlass.js:730
 | 
			
		||||
msgid "Web Page"
 | 
			
		||||
msgstr "Retpaĝo"
 | 
			
		||||
 | 
			
		||||
#: js/ui/messageTray.js:1474
 | 
			
		||||
#: js/ui/messageTray.js:1480
 | 
			
		||||
msgid "System Information"
 | 
			
		||||
msgstr "Sisteminformoj"
 | 
			
		||||
 | 
			
		||||
@@ -1404,13 +1405,14 @@ msgstr "Malfari"
 | 
			
		||||
msgid "Overview"
 | 
			
		||||
msgstr "Superrigardo"
 | 
			
		||||
 | 
			
		||||
# Imperativo
 | 
			
		||||
#. Translators: this is the text displayed
 | 
			
		||||
#. in the search entry when no search is
 | 
			
		||||
#. active; it should not exceed ~30
 | 
			
		||||
#. characters.
 | 
			
		||||
#: js/ui/overview.js:226
 | 
			
		||||
msgid "Type to search…"
 | 
			
		||||
msgstr "Tajpi por serĉi…"
 | 
			
		||||
msgstr "Tajpu por serĉi…"
 | 
			
		||||
 | 
			
		||||
#: js/ui/padOsd.js:92
 | 
			
		||||
msgid "New shortcut…"
 | 
			
		||||
@@ -1456,34 +1458,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:466
 | 
			
		||||
#: js/ui/panel.js:468
 | 
			
		||||
msgid "Activities"
 | 
			
		||||
msgstr "Aktivecoj"
 | 
			
		||||
 | 
			
		||||
#: js/ui/panel.js:741
 | 
			
		||||
#: js/ui/panel.js:743
 | 
			
		||||
msgctxt "System menu in the top bar"
 | 
			
		||||
msgid "System"
 | 
			
		||||
msgstr "Sistemo"
 | 
			
		||||
 | 
			
		||||
#: js/ui/panel.js:861
 | 
			
		||||
#: js/ui/panel.js:864
 | 
			
		||||
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"
 | 
			
		||||
@@ -1520,7 +1513,7 @@ msgid_plural "%d new notifications"
 | 
			
		||||
msgstr[0] "%d nova sciigo"
 | 
			
		||||
msgstr[1] "%d novaj sciigoj"
 | 
			
		||||
 | 
			
		||||
#: 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 "Ŝlosi"
 | 
			
		||||
 | 
			
		||||
@@ -1535,11 +1528,11 @@ msgstr "GNOME bezonas ŝlosi la ekranon"
 | 
			
		||||
#.
 | 
			
		||||
#. 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 "Ne eblas ŝlosi"
 | 
			
		||||
 | 
			
		||||
#: 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 "Ŝloso estis blokita de aplikaĵo"
 | 
			
		||||
 | 
			
		||||
@@ -1701,7 +1694,7 @@ msgid "<unknown>"
 | 
			
		||||
msgstr "<nekonata>"
 | 
			
		||||
 | 
			
		||||
#. 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 malŝaltita"
 | 
			
		||||
@@ -1727,7 +1720,7 @@ msgid "%s Disconnecting"
 | 
			
		||||
msgstr "%s malkonektante"
 | 
			
		||||
 | 
			
		||||
#. 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 konektante"
 | 
			
		||||
@@ -1767,7 +1760,7 @@ 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:1290
 | 
			
		||||
#: js/ui/status/network.js:553 js/ui/status/network.js:1289
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Hardware Disabled"
 | 
			
		||||
msgstr "%s aparataro malŝaltita"
 | 
			
		||||
@@ -1832,72 +1825,72 @@ msgid "Wi-Fi Settings"
 | 
			
		||||
msgstr "Vifio-agordoj"
 | 
			
		||||
 | 
			
		||||
#. 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 retkaptejo aktiva"
 | 
			
		||||
 | 
			
		||||
#. 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 nekonektita"
 | 
			
		||||
msgstr "%s ne konektita"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1393
 | 
			
		||||
#: js/ui/status/network.js:1392
 | 
			
		||||
msgid "connecting…"
 | 
			
		||||
msgstr "konektante…"
 | 
			
		||||
 | 
			
		||||
#. 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 "aŭtentigo necesas"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1398
 | 
			
		||||
#: js/ui/status/network.js:1397
 | 
			
		||||
msgid "connection failed"
 | 
			
		||||
msgstr "konekto malsukcesis"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1448
 | 
			
		||||
#: js/ui/status/network.js:1447
 | 
			
		||||
msgid "VPN Settings"
 | 
			
		||||
msgstr "VPR-agordoj"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1465
 | 
			
		||||
#: js/ui/status/network.js:1464
 | 
			
		||||
msgid "VPN"
 | 
			
		||||
msgstr "VPR"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1475
 | 
			
		||||
#: js/ui/status/network.js:1474
 | 
			
		||||
msgid "VPN Off"
 | 
			
		||||
msgstr "VPR malŝaltita"
 | 
			
		||||
 | 
			
		||||
#: 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 "Ret-agordoj"
 | 
			
		||||
 | 
			
		||||
#: 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 drata konekto"
 | 
			
		||||
msgstr[1] "%s drataj konektoj"
 | 
			
		||||
 | 
			
		||||
#: 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 vifia konekto"
 | 
			
		||||
msgstr[1] "%s vifiaj konektoj"
 | 
			
		||||
 | 
			
		||||
#: 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 modema konekto"
 | 
			
		||||
msgstr[1] "%s modemaj konektoj"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1702
 | 
			
		||||
#: js/ui/status/network.js:1705
 | 
			
		||||
msgid "Connection failed"
 | 
			
		||||
msgstr "Konekto malsukcesis"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1703
 | 
			
		||||
#: js/ui/status/network.js:1706
 | 
			
		||||
msgid "Activation of network connection failed"
 | 
			
		||||
msgstr "Aktivigo de reto-konekto malsukcesis"
 | 
			
		||||
 | 
			
		||||
@@ -1979,15 +1972,15 @@ msgstr "Adiaŭi"
 | 
			
		||||
msgid "Account Settings"
 | 
			
		||||
msgstr "Kontoagordoj"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/system.js:255
 | 
			
		||||
#: js/ui/status/system.js:256
 | 
			
		||||
msgid "Orientation Lock"
 | 
			
		||||
msgstr "Orientiĝa ŝloso"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/system.js:281
 | 
			
		||||
#: js/ui/status/system.js:282
 | 
			
		||||
msgid "Suspend"
 | 
			
		||||
msgstr "Dormeti"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/system.js:291
 | 
			
		||||
#: js/ui/status/system.js:292
 | 
			
		||||
msgid "Power Off"
 | 
			
		||||
msgstr "Malŝalti"
 | 
			
		||||
 | 
			
		||||
@@ -2102,7 +2095,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"
 | 
			
		||||
@@ -2175,11 +2168,6 @@ msgstr "Movi al dekstra ekrano"
 | 
			
		||||
msgid "Evolution Calendar"
 | 
			
		||||
msgstr "Evolucio-kalendaro"
 | 
			
		||||
 | 
			
		||||
#. 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 "Presi version"
 | 
			
		||||
@@ -2196,12 +2184,12 @@ msgstr "Uzi specifan reĝimon, ekz. “gdm” por la salut-ekrano"
 | 
			
		||||
msgid "List possible modes"
 | 
			
		||||
msgstr "Listigi eblajn reĝimojn"
 | 
			
		||||
 | 
			
		||||
#: src/shell-app.c:260
 | 
			
		||||
#: src/shell-app.c:264
 | 
			
		||||
msgctxt "program"
 | 
			
		||||
msgid "Unknown"
 | 
			
		||||
msgstr "Nekonata"
 | 
			
		||||
 | 
			
		||||
#: src/shell-app.c:511
 | 
			
		||||
#: src/shell-app.c:515
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Failed to launch “%s”"
 | 
			
		||||
msgstr "Malsukcesis lanĉi “%s”"
 | 
			
		||||
@@ -2220,7 +2208,7 @@ msgstr "La uzanto malakceptis la aŭtentigan dialogon"
 | 
			
		||||
 | 
			
		||||
#. 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"
 | 
			
		||||
@@ -2229,17 +2217,26 @@ msgstr[1] "%u eligoj"
 | 
			
		||||
 | 
			
		||||
#. 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 enigo"
 | 
			
		||||
msgstr[1] "%u enigoj"
 | 
			
		||||
 | 
			
		||||
#: subprojects/gvc/gvc-mixer-control.c:2738
 | 
			
		||||
#: subprojects/gvc/gvc-mixer-control.c:2736
 | 
			
		||||
msgid "System Sounds"
 | 
			
		||||
msgstr "Sistemsonoj"
 | 
			
		||||
 | 
			
		||||
#~ msgid "toggle-switch-us"
 | 
			
		||||
#~ msgstr "toggle-switch-intl"
 | 
			
		||||
 | 
			
		||||
#~ msgid "network-workgroup"
 | 
			
		||||
#~ msgstr "network-workgroup"
 | 
			
		||||
 | 
			
		||||
#~ msgid "evolution"
 | 
			
		||||
#~ msgstr "evolution"
 | 
			
		||||
 | 
			
		||||
#~ msgid "There was an error loading the preferences dialog for %s:"
 | 
			
		||||
#~ msgstr "Eraro okazis dum ŝarĝado de la agorda dialogo de %s:"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										114
									
								
								po/fr.po
									
									
									
									
									
								
							
							
						
						
									
										114
									
								
								po/fr.po
									
									
									
									
									
								
							@@ -14,23 +14,23 @@
 | 
			
		||||
# Alain Lojewski <allomervan@gmail.com>, 2014-2018.
 | 
			
		||||
# Erwan Georget <egeorget@opmbx.org>, 2016.
 | 
			
		||||
# Claude Paroz <claude@2xlibre.net>, 2010-2011, 2016.
 | 
			
		||||
# Charles Monzat <charles.monzat@numericable.fr>, 2016-2018.
 | 
			
		||||
# Julien Humbert <julroy67@gmail.com>, 2019.
 | 
			
		||||
# Charles Monzat <charles.monzat@free.fr>, 2016-2019.
 | 
			
		||||
#
 | 
			
		||||
msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: gnome-shell master fr\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
 | 
			
		||||
"POT-Creation-Date: 2019-02-28 03:16+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2019-02-28 08:29+0100\n"
 | 
			
		||||
"Last-Translator: Julien Humbert <julroy67@gmail.com>\n"
 | 
			
		||||
"Language-Team: français <gnomefr@traduc.org>\n"
 | 
			
		||||
"POT-Creation-Date: 2019-03-13 20:47+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2019-03-17 19:15+0100\n"
 | 
			
		||||
"Last-Translator: Charles Monzat <charles.monzat@free.fr>\n"
 | 
			
		||||
"Language-Team: GNOME French Team <gnomefr@traduc.org>\n"
 | 
			
		||||
"Language: fr\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"
 | 
			
		||||
 | 
			
		||||
#: data/50-gnome-shell-system.xml:6
 | 
			
		||||
msgid "System"
 | 
			
		||||
@@ -482,7 +482,7 @@ msgstr "Absent de la liste ?"
 | 
			
		||||
 | 
			
		||||
#. 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 "(par ex. utilisateur ou %s)"
 | 
			
		||||
@@ -490,12 +490,12 @@ msgstr "(par ex. utilisateur ou %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 "Nom d’utilisateur : "
 | 
			
		||||
 | 
			
		||||
#: js/gdm/loginDialog.js:1223
 | 
			
		||||
#: js/gdm/loginDialog.js:1227
 | 
			
		||||
msgid "Login Window"
 | 
			
		||||
msgstr "Fenêtre de connexion"
 | 
			
		||||
 | 
			
		||||
@@ -1075,7 +1075,7 @@ msgstr "Mot de passe de la connexion mobile"
 | 
			
		||||
msgid "A password is required to connect to “%s”."
 | 
			
		||||
msgstr "Un mot de passe est requis pour se connecter à « %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 "Gestionnaire de réseau"
 | 
			
		||||
 | 
			
		||||
@@ -1335,26 +1335,26 @@ msgid "Download and install “%s” from extensions.gnome.org?"
 | 
			
		||||
msgstr "Télécharger et installer « %s » à partir de 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 veut neutraliser les raccourcis"
 | 
			
		||||
 | 
			
		||||
#: js/ui/inhibitShortcutsDialog.js:51
 | 
			
		||||
#: js/ui/inhibitShortcutsDialog.js:79
 | 
			
		||||
msgid "Application wants to inhibit shortcuts"
 | 
			
		||||
msgstr "L’application veut neutraliser les raccourcis"
 | 
			
		||||
 | 
			
		||||
#. 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 "Pour restaurer les raccourcis, appuyez sur %s."
 | 
			
		||||
 | 
			
		||||
#: js/ui/inhibitShortcutsDialog.js:65
 | 
			
		||||
#: js/ui/inhibitShortcutsDialog.js:93
 | 
			
		||||
msgid "Deny"
 | 
			
		||||
msgstr "Refuser"
 | 
			
		||||
 | 
			
		||||
#: js/ui/inhibitShortcutsDialog.js:71
 | 
			
		||||
#: js/ui/inhibitShortcutsDialog.js:100
 | 
			
		||||
msgid "Allow"
 | 
			
		||||
msgstr "Autoriser"
 | 
			
		||||
 | 
			
		||||
@@ -1407,13 +1407,13 @@ msgid "Leave On"
 | 
			
		||||
msgstr "Laisser activé"
 | 
			
		||||
 | 
			
		||||
#: 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 "Activer"
 | 
			
		||||
 | 
			
		||||
#: 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"
 | 
			
		||||
@@ -1423,59 +1423,59 @@ msgstr "Éteindre"
 | 
			
		||||
msgid "Leave Off"
 | 
			
		||||
msgstr "Laisser éteint"
 | 
			
		||||
 | 
			
		||||
#: js/ui/keyboard.js:203
 | 
			
		||||
#: js/ui/keyboard.js:200
 | 
			
		||||
msgid "Region & Language Settings"
 | 
			
		||||
msgstr "Paramètres de langue et région"
 | 
			
		||||
 | 
			
		||||
#: js/ui/lookingGlass.js:614
 | 
			
		||||
#: js/ui/lookingGlass.js:615
 | 
			
		||||
msgid "No extensions installed"
 | 
			
		||||
msgstr "Aucune extension installée"
 | 
			
		||||
 | 
			
		||||
#. 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 n’a émis aucune erreur."
 | 
			
		||||
 | 
			
		||||
#: js/ui/lookingGlass.js:674
 | 
			
		||||
#: js/ui/lookingGlass.js:675
 | 
			
		||||
msgid "Hide Errors"
 | 
			
		||||
msgstr "Masquer les erreurs"
 | 
			
		||||
 | 
			
		||||
#: js/ui/lookingGlass.js:678 js/ui/lookingGlass.js:738
 | 
			
		||||
#: js/ui/lookingGlass.js:679 js/ui/lookingGlass.js:739
 | 
			
		||||
msgid "Show Errors"
 | 
			
		||||
msgstr "Afficher les erreurs"
 | 
			
		||||
 | 
			
		||||
#: js/ui/lookingGlass.js:687
 | 
			
		||||
#: js/ui/lookingGlass.js:688
 | 
			
		||||
msgid "Enabled"
 | 
			
		||||
msgstr "Activé"
 | 
			
		||||
 | 
			
		||||
#. 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 "Désactivé"
 | 
			
		||||
 | 
			
		||||
#: js/ui/lookingGlass.js:692
 | 
			
		||||
#: js/ui/lookingGlass.js:693
 | 
			
		||||
msgid "Error"
 | 
			
		||||
msgstr "Erreur"
 | 
			
		||||
 | 
			
		||||
#: js/ui/lookingGlass.js:694
 | 
			
		||||
#: js/ui/lookingGlass.js:695
 | 
			
		||||
msgid "Out of date"
 | 
			
		||||
msgstr "Périmé"
 | 
			
		||||
 | 
			
		||||
#: js/ui/lookingGlass.js:696
 | 
			
		||||
#: js/ui/lookingGlass.js:697
 | 
			
		||||
msgid "Downloading"
 | 
			
		||||
msgstr "Téléchargement"
 | 
			
		||||
 | 
			
		||||
#: js/ui/lookingGlass.js:720
 | 
			
		||||
#: js/ui/lookingGlass.js:721
 | 
			
		||||
msgid "View Source"
 | 
			
		||||
msgstr "Afficher la source"
 | 
			
		||||
 | 
			
		||||
#: js/ui/lookingGlass.js:729
 | 
			
		||||
#: js/ui/lookingGlass.js:730
 | 
			
		||||
msgid "Web Page"
 | 
			
		||||
msgstr "Page Web"
 | 
			
		||||
 | 
			
		||||
#: js/ui/messageTray.js:1474
 | 
			
		||||
#: js/ui/messageTray.js:1480
 | 
			
		||||
msgid "System Information"
 | 
			
		||||
msgstr "Informations du système"
 | 
			
		||||
 | 
			
		||||
@@ -1559,16 +1559,16 @@ msgstr "Quitter"
 | 
			
		||||
 | 
			
		||||
#. 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:471
 | 
			
		||||
msgid "Activities"
 | 
			
		||||
msgstr "Activités"
 | 
			
		||||
 | 
			
		||||
#: js/ui/panel.js:741
 | 
			
		||||
#: js/ui/panel.js:746
 | 
			
		||||
msgctxt "System menu in the top bar"
 | 
			
		||||
msgid "System"
 | 
			
		||||
msgstr "Système"
 | 
			
		||||
 | 
			
		||||
#: js/ui/panel.js:861
 | 
			
		||||
#: js/ui/panel.js:866
 | 
			
		||||
msgid "Top Bar"
 | 
			
		||||
msgstr "Barre supérieure"
 | 
			
		||||
 | 
			
		||||
@@ -1800,7 +1800,7 @@ msgid "<unknown>"
 | 
			
		||||
msgstr "<inconnu>"
 | 
			
		||||
 | 
			
		||||
#. 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 éteint"
 | 
			
		||||
@@ -1826,7 +1826,7 @@ msgid "%s Disconnecting"
 | 
			
		||||
msgstr "Déconnexion de %s en cours"
 | 
			
		||||
 | 
			
		||||
#. 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 "Connexion de %s en cours"
 | 
			
		||||
@@ -1866,7 +1866,7 @@ msgid "Mobile Broadband Settings"
 | 
			
		||||
msgstr "Paramètres connexion mobile"
 | 
			
		||||
 | 
			
		||||
#. 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 "Équipement %s désactivé"
 | 
			
		||||
@@ -1931,72 +1931,72 @@ msgid "Wi-Fi Settings"
 | 
			
		||||
msgstr "Paramètres 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 "Point d’accès %s actif"
 | 
			
		||||
 | 
			
		||||
#. 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 non connecté"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1393
 | 
			
		||||
#: js/ui/status/network.js:1392
 | 
			
		||||
msgid "connecting…"
 | 
			
		||||
msgstr "connexion…"
 | 
			
		||||
 | 
			
		||||
#. 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 "authentification nécessaire"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1398
 | 
			
		||||
#: js/ui/status/network.js:1397
 | 
			
		||||
msgid "connection failed"
 | 
			
		||||
msgstr "échec de connexion"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1448
 | 
			
		||||
#: js/ui/status/network.js:1447
 | 
			
		||||
msgid "VPN Settings"
 | 
			
		||||
msgstr "Paramètres 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 désactivé"
 | 
			
		||||
 | 
			
		||||
#: 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 "Paramètres du réseau"
 | 
			
		||||
 | 
			
		||||
#: 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 connexion filaire."
 | 
			
		||||
msgstr[1] "%s connexions filaires."
 | 
			
		||||
 | 
			
		||||
#: 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 connexion Wi-Fi."
 | 
			
		||||
msgstr[1] "%s connexions 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 connexion à un modem."
 | 
			
		||||
msgstr[1] "%s connexions à des modems."
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1702
 | 
			
		||||
#: js/ui/status/network.js:1701
 | 
			
		||||
msgid "Connection failed"
 | 
			
		||||
msgstr "Échec de connexion"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1703
 | 
			
		||||
#: js/ui/status/network.js:1702
 | 
			
		||||
msgid "Activation of network connection failed"
 | 
			
		||||
msgstr "L’activation de la connexion réseau a échoué"
 | 
			
		||||
 | 
			
		||||
@@ -2049,7 +2049,7 @@ msgstr "%d∶%02d avant chargement complet (%d %%)"
 | 
			
		||||
#: js/ui/status/power.js:117 js/ui/status/power.js:119
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%d %%"
 | 
			
		||||
msgstr "%d %%"
 | 
			
		||||
msgstr "%d %%"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/remoteAccess.js:42
 | 
			
		||||
msgid "Screen is Being Shared"
 | 
			
		||||
@@ -2298,12 +2298,12 @@ msgstr ""
 | 
			
		||||
msgid "List possible modes"
 | 
			
		||||
msgstr "Lister les modes possibles"
 | 
			
		||||
 | 
			
		||||
#: src/shell-app.c:260
 | 
			
		||||
#: src/shell-app.c:264
 | 
			
		||||
msgctxt "program"
 | 
			
		||||
msgid "Unknown"
 | 
			
		||||
msgstr "Inconnu"
 | 
			
		||||
 | 
			
		||||
#: src/shell-app.c:511
 | 
			
		||||
#: src/shell-app.c:515
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid "Failed to launch “%s”"
 | 
			
		||||
msgstr "Impossible de lancer « %s »"
 | 
			
		||||
@@ -2322,7 +2322,7 @@ msgstr "La fenêtre d’authentification a été écartée par l’utilisateur"
 | 
			
		||||
 | 
			
		||||
#. 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"
 | 
			
		||||
@@ -2331,14 +2331,14 @@ msgstr[1] "%u sorties"
 | 
			
		||||
 | 
			
		||||
#. 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 entrée"
 | 
			
		||||
msgstr[1] "%u entrées"
 | 
			
		||||
 | 
			
		||||
#: subprojects/gvc/gvc-mixer-control.c:2738
 | 
			
		||||
#: subprojects/gvc/gvc-mixer-control.c:2736
 | 
			
		||||
msgid "System Sounds"
 | 
			
		||||
msgstr "Sons système"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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:"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										144
									
								
								po/tg.po
									
									
									
									
									
								
							
							
						
						
									
										144
									
								
								po/tg.po
									
									
									
									
									
								
							@@ -8,7 +8,7 @@ msgstr ""
 | 
			
		||||
"Project-Id-Version: Tajik Gnome\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
 | 
			
		||||
"POT-Creation-Date: 2019-03-02 10:57+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2019-03-06 20:14+0500\n"
 | 
			
		||||
"PO-Revision-Date: 2019-03-13 21:44+0500\n"
 | 
			
		||||
"Last-Translator: Victor Ibragimov <victor.ibragimov@gmail.com>\n"
 | 
			
		||||
"Language-Team: \n"
 | 
			
		||||
"Language: tg\n"
 | 
			
		||||
@@ -32,7 +32,7 @@ msgstr "Марказонидани огоҳии фаъол"
 | 
			
		||||
 | 
			
		||||
#: data/50-gnome-shell-system.xml:15
 | 
			
		||||
msgid "Show the overview"
 | 
			
		||||
msgstr "Намоиш додани хулоса"
 | 
			
		||||
msgstr "Намоиш додани ҷамъбаст"
 | 
			
		||||
 | 
			
		||||
#: data/50-gnome-shell-system.xml:18
 | 
			
		||||
msgid "Show all applications"
 | 
			
		||||
@@ -82,7 +82,7 @@ msgstr "Ғайрифаъол кардани васеъшавиҳои корба
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.shell.gschema.xml.in:27
 | 
			
		||||
msgid "Disable all extensions the user has enabled without affecting the “enabled-extension” setting."
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Ҳамаи васеъшавиҳое, ки корбар фаъол кард, бе расонидани таъсир ба танзими “васеъшавиии-фаъол” ғайрифаъол карда мешаванд."
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.shell.gschema.xml.in:34
 | 
			
		||||
msgid "Disables the validation of extension version compatibility"
 | 
			
		||||
@@ -188,11 +188,11 @@ msgstr "Тугмабандӣ барои иваз кардани намоёнии
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.shell.gschema.xml.in:138
 | 
			
		||||
msgid "Keybinding to focus the active notification"
 | 
			
		||||
msgstr "Тугмабандӣ барои гузоштани фокус ба огоҳии фаъол"
 | 
			
		||||
msgstr "Тугмабандӣ барои марказонидани огоҳии фаъол"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.shell.gschema.xml.in:139
 | 
			
		||||
msgid "Keybinding to focus the active notification."
 | 
			
		||||
msgstr "Тугмабандӣ барои гузоштани фокус ба огоҳии фаъол."
 | 
			
		||||
msgstr "Тугмабандӣ барои марказонидани огоҳии фаъол."
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.shell.gschema.xml.in:145
 | 
			
		||||
msgid "Keybinding that pauses and resumes all running tweens, for debugging purposes"
 | 
			
		||||
@@ -245,11 +245,11 @@ msgstr "Гузариш ба барномаи 9"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.shell.gschema.xml.in:190
 | 
			
		||||
msgid "Which keyboard to use"
 | 
			
		||||
msgstr "Клавиатураро интихоб кунед"
 | 
			
		||||
msgstr "Клавиатураро интихоб намоед"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.shell.gschema.xml.in:191
 | 
			
		||||
msgid "The type of keyboard to use."
 | 
			
		||||
msgstr "Намуди клавиатура барои истифода."
 | 
			
		||||
msgstr "Навъи клавиатурае, ки истифода мешавад."
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.shell.gschema.xml.in:202
 | 
			
		||||
#: data/org.gnome.shell.gschema.xml.in:229
 | 
			
		||||
@@ -308,15 +308,15 @@ msgstr "Воридшавии шабакавӣ"
 | 
			
		||||
#. 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 ""
 | 
			
		||||
msgstr "network-workgroup"
 | 
			
		||||
 | 
			
		||||
#: js/extensionPrefs/main.js:116
 | 
			
		||||
msgid "Something’s gone wrong"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Чизе нодуруст ба миён омад"
 | 
			
		||||
 | 
			
		||||
#: js/extensionPrefs/main.js:123
 | 
			
		||||
msgid "We’re very sorry, but there’s been a problem: the settings for this extension can’t be displayed. We recommend that you report the issue to the extension authors."
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Мутаассифона, хатое ба вуҷуд омад: танзимот барои ин васеъшавӣ нишон дода намешавад. Тавсия дода мешавад, ки шумо дар бораи хато ба муаллифони васеъшавӣ гузориш диҳед."
 | 
			
		||||
 | 
			
		||||
#: js/extensionPrefs/main.js:130
 | 
			
		||||
#| msgid "Show Details"
 | 
			
		||||
@@ -330,7 +330,7 @@ msgstr "Намоиш додани хатоҳо"
 | 
			
		||||
 | 
			
		||||
#: js/extensionPrefs/main.js:185
 | 
			
		||||
msgid "Homepage"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Саҳифаи асосӣ"
 | 
			
		||||
 | 
			
		||||
#: js/extensionPrefs/main.js:186
 | 
			
		||||
#| msgid "UUIDs of extensions to enable"
 | 
			
		||||
@@ -340,15 +340,15 @@ msgstr "Рамзҳои UUID барои пасвандҳои фаъолшаван
 | 
			
		||||
#: js/extensionPrefs/main.js:449
 | 
			
		||||
#| msgid "No extensions installed"
 | 
			
		||||
msgid "No Extensions Installed"
 | 
			
		||||
msgstr "Ягон пасванд насб нашудааст"
 | 
			
		||||
msgstr "Ягон васеъшавӣ насб нашудааст"
 | 
			
		||||
 | 
			
		||||
#: js/extensionPrefs/main.js:459
 | 
			
		||||
msgid "Extensions can be installed through Software or <a href=\"https://extensions.gnome.org\">extensions.gnome.org</a>."
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Васеъшавиҳо ба воситаи низоми нармафзор ё <a href=\"https://extensions.gnome.org\">extensions.gnome.org</a> ҷорӣ карда мешаванд."
 | 
			
		||||
 | 
			
		||||
#: js/extensionPrefs/main.js:474
 | 
			
		||||
msgid "Browse in Software"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Намоиш дар низоми нармафзор"
 | 
			
		||||
 | 
			
		||||
#: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55
 | 
			
		||||
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136
 | 
			
		||||
@@ -430,7 +430,7 @@ msgstr ""
 | 
			
		||||
#: js/misc/systemActions.js:95
 | 
			
		||||
msgctxt "search-result"
 | 
			
		||||
msgid "Lock Screen"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Қулф кардани экран"
 | 
			
		||||
 | 
			
		||||
#. Translators: A list of keywords that match the lock screen action, separated by semicolons
 | 
			
		||||
#: js/misc/systemActions.js:98
 | 
			
		||||
@@ -454,13 +454,13 @@ msgstr ""
 | 
			
		||||
#| msgid "Suspend"
 | 
			
		||||
msgctxt "search-result"
 | 
			
		||||
msgid "Suspend"
 | 
			
		||||
msgstr "Таваққуф кардан"
 | 
			
		||||
msgstr "Таваққуф кардани низом"
 | 
			
		||||
 | 
			
		||||
#. Translators: A list of keywords that match the suspend action, separated by semicolons
 | 
			
		||||
#: js/misc/systemActions.js:112
 | 
			
		||||
#| msgid "Suspend"
 | 
			
		||||
msgid "suspend;sleep"
 | 
			
		||||
msgstr "Таваққуф"
 | 
			
		||||
msgstr "таваққуф;хоб"
 | 
			
		||||
 | 
			
		||||
#. Translators: The name of the switch user action in search
 | 
			
		||||
#: js/misc/systemActions.js:116
 | 
			
		||||
@@ -473,14 +473,14 @@ msgstr "Иваз кардани корбар"
 | 
			
		||||
#: js/misc/systemActions.js:119
 | 
			
		||||
#| msgid "Switch User"
 | 
			
		||||
msgid "switch user"
 | 
			
		||||
msgstr "Таъвизи корбар"
 | 
			
		||||
msgstr "ивази корбар"
 | 
			
		||||
 | 
			
		||||
#. Translators: The name of the lock orientation action in search
 | 
			
		||||
#: js/misc/systemActions.js:123
 | 
			
		||||
#| msgid "Orientation Lock"
 | 
			
		||||
msgctxt "search-result"
 | 
			
		||||
msgid "Lock Orientation"
 | 
			
		||||
msgstr "Қулфи самт"
 | 
			
		||||
msgstr "Қулфи самти экран"
 | 
			
		||||
 | 
			
		||||
#. Translators: A list of keywords that match the lock orientation action, separated by semicolons
 | 
			
		||||
#: js/misc/systemActions.js:126
 | 
			
		||||
@@ -504,7 +504,7 @@ msgstr "Иҷрокунии “%s” қатъ шудааст:"
 | 
			
		||||
 | 
			
		||||
#: js/misc/util.js:175
 | 
			
		||||
msgid "Just now"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Ҳоли ҳозир"
 | 
			
		||||
 | 
			
		||||
#: js/misc/util.js:177
 | 
			
		||||
#, javascript-format
 | 
			
		||||
@@ -533,29 +533,29 @@ msgstr "Дирӯз"
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%d day ago"
 | 
			
		||||
msgid_plural "%d days ago"
 | 
			
		||||
msgstr[0] ""
 | 
			
		||||
msgstr[1] ""
 | 
			
		||||
msgstr[0] "%d рӯз пеш"
 | 
			
		||||
msgstr[1] "%d рӯз пеш"
 | 
			
		||||
 | 
			
		||||
#: js/misc/util.js:188
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%d week ago"
 | 
			
		||||
msgid_plural "%d weeks ago"
 | 
			
		||||
msgstr[0] ""
 | 
			
		||||
msgstr[1] ""
 | 
			
		||||
msgstr[0] "%d ҳафта пеш"
 | 
			
		||||
msgstr[1] "%d ҳафта пеш"
 | 
			
		||||
 | 
			
		||||
#: js/misc/util.js:191
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%d month ago"
 | 
			
		||||
msgid_plural "%d months ago"
 | 
			
		||||
msgstr[0] ""
 | 
			
		||||
msgstr[1] ""
 | 
			
		||||
msgstr[0] "%d моҳ пеш"
 | 
			
		||||
msgstr[1] "%d моҳ пеш"
 | 
			
		||||
 | 
			
		||||
#: js/misc/util.js:193
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%d year ago"
 | 
			
		||||
msgid_plural "%d years ago"
 | 
			
		||||
msgstr[0] ""
 | 
			
		||||
msgstr[1] ""
 | 
			
		||||
msgstr[0] "%d сол пеш"
 | 
			
		||||
msgstr[1] "%d сол пеш"
 | 
			
		||||
 | 
			
		||||
#. Translators: Time in 24h format
 | 
			
		||||
#: js/misc/util.js:223
 | 
			
		||||
@@ -635,22 +635,22 @@ msgstr "%B %d %Y, %l∶%M %p"
 | 
			
		||||
#: js/portalHelper/main.js:40
 | 
			
		||||
#| msgid "Hotspot Active"
 | 
			
		||||
msgid "Hotspot Login"
 | 
			
		||||
msgstr "Hotspot фаъол аст"
 | 
			
		||||
msgstr "Воридшавӣ ба нуқтаи пайваст"
 | 
			
		||||
 | 
			
		||||
#: js/portalHelper/main.js:86
 | 
			
		||||
msgid "Your connection to this hotspot login is not secure. Passwords or other information you enter on this page can be viewed by people nearby."
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Пайвасти воридшавии шумо ба нуқтаи пайвасти ҷорӣ бехатар намебошад. Ниҳонвожаҳо ё маълумоти дигаре, ки дар ин саҳифа ворид карда мешавад, метавонанд бо одамони дар гидру атроф ошкор карда шаванд."
 | 
			
		||||
 | 
			
		||||
#. No support for non-modal system dialogs, so ignore the option
 | 
			
		||||
#. let modal = options['modal'] || true;
 | 
			
		||||
#: js/ui/accessDialog.js:37 js/ui/status/location.js:360
 | 
			
		||||
msgid "Deny Access"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Манъ кардани дастрасӣ"
 | 
			
		||||
 | 
			
		||||
#: js/ui/accessDialog.js:38 js/ui/status/location.js:363
 | 
			
		||||
#| msgid "Always grant access"
 | 
			
		||||
msgid "Grant Access"
 | 
			
		||||
msgstr "Ҳамеша иҷозат додан"
 | 
			
		||||
msgstr "Иҷозат додани дастрасӣ"
 | 
			
		||||
 | 
			
		||||
#: js/ui/appDisplay.js:660
 | 
			
		||||
msgid "Frequently used applications will appear here"
 | 
			
		||||
@@ -697,7 +697,7 @@ msgstr "%s аз баргузидаҳои шумо тоза шудааст."
 | 
			
		||||
#: js/ui/audioDeviceSelection.js:42
 | 
			
		||||
#| msgid "Send Files to Device…"
 | 
			
		||||
msgid "Select Audio Device"
 | 
			
		||||
msgstr "Фиристодани файлҳо ба дастгоҳ..."
 | 
			
		||||
msgstr "Интихоби дастгоҳи аудиоӣ"
 | 
			
		||||
 | 
			
		||||
#: js/ui/audioDeviceSelection.js:53
 | 
			
		||||
msgid "Sound Settings"
 | 
			
		||||
@@ -705,11 +705,11 @@ msgstr "Танзимоти садо"
 | 
			
		||||
 | 
			
		||||
#: js/ui/audioDeviceSelection.js:62
 | 
			
		||||
msgid "Headphones"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Гӯшмонакҳо"
 | 
			
		||||
 | 
			
		||||
#: js/ui/audioDeviceSelection.js:64
 | 
			
		||||
msgid "Headset"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Гӯшмонак бо микрофон"
 | 
			
		||||
 | 
			
		||||
#: js/ui/audioDeviceSelection.js:66 js/ui/status/volume.js:247
 | 
			
		||||
msgid "Microphone"
 | 
			
		||||
@@ -717,7 +717,7 @@ msgstr "Микрофон"
 | 
			
		||||
 | 
			
		||||
#: js/ui/backgroundMenu.js:13
 | 
			
		||||
msgid "Change Background…"
 | 
			
		||||
msgstr "Тағйир додани пазсамина..."
 | 
			
		||||
msgstr "Тағйир додани пазсамина…"
 | 
			
		||||
 | 
			
		||||
#: js/ui/backgroundMenu.js:15 js/ui/status/nightLight.js:43
 | 
			
		||||
msgid "Display Settings"
 | 
			
		||||
@@ -800,7 +800,7 @@ msgstr "%OB"
 | 
			
		||||
#.
 | 
			
		||||
#: js/ui/calendar.js:342
 | 
			
		||||
msgid "%OB %Y"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "%OB %Y"
 | 
			
		||||
 | 
			
		||||
#: js/ui/calendar.js:399
 | 
			
		||||
msgid "Previous month"
 | 
			
		||||
@@ -854,14 +854,14 @@ msgstr "Ягон рӯйдод нест"
 | 
			
		||||
 | 
			
		||||
#: js/ui/calendar.js:1075
 | 
			
		||||
msgid "Clear"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Пок кардан"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is an application name
 | 
			
		||||
#: js/ui/closeDialog.js:42
 | 
			
		||||
#, javascript-format
 | 
			
		||||
#| msgid "“%s” is ready"
 | 
			
		||||
msgid "“%s” is not responding."
 | 
			
		||||
msgstr "“%s” омода аст"
 | 
			
		||||
msgstr "“%s” ҷавоб намедиҳад."
 | 
			
		||||
 | 
			
		||||
#: js/ui/closeDialog.js:43
 | 
			
		||||
msgid "You may choose to wait a short while for it to continue or force the application to quit entirely."
 | 
			
		||||
@@ -869,11 +869,11 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: js/ui/closeDialog.js:59
 | 
			
		||||
msgid "Force Quit"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Маҷбуран пӯшида шавад"
 | 
			
		||||
 | 
			
		||||
#: js/ui/closeDialog.js:62
 | 
			
		||||
msgid "Wait"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Интизор шавед"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/automountManager.js:86
 | 
			
		||||
msgid "External drive connected"
 | 
			
		||||
@@ -910,24 +910,24 @@ msgstr "Пайваст шудан"
 | 
			
		||||
#: js/ui/components/networkAgent.js:246 js/ui/components/networkAgent.js:265
 | 
			
		||||
#: js/ui/components/networkAgent.js:285 js/ui/components/networkAgent.js:295
 | 
			
		||||
msgid "Password: "
 | 
			
		||||
msgstr "Ниҳонвожа:"
 | 
			
		||||
msgstr "Ниҳонвожа: "
 | 
			
		||||
 | 
			
		||||
#. static WEP
 | 
			
		||||
#: js/ui/components/networkAgent.js:216
 | 
			
		||||
msgid "Key: "
 | 
			
		||||
msgstr "Калид:"
 | 
			
		||||
msgstr "Калид: "
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271
 | 
			
		||||
msgid "Private key password: "
 | 
			
		||||
msgstr "Пароли калиди шахсӣ:"
 | 
			
		||||
msgstr "Ниҳонвожаи калиди шахсӣ: "
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/networkAgent.js:269
 | 
			
		||||
msgid "Identity: "
 | 
			
		||||
msgstr "Шахсият:"
 | 
			
		||||
msgstr "Шахсият: "
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/networkAgent.js:283
 | 
			
		||||
msgid "Service: "
 | 
			
		||||
msgstr "Хидмат:"
 | 
			
		||||
msgstr "Хидмат: "
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685
 | 
			
		||||
msgid "Authentication required by wireless network"
 | 
			
		||||
@@ -944,7 +944,7 @@ msgstr "Санҷиши ҳаққонияти 802.1X-и симдор"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/networkAgent.js:319
 | 
			
		||||
msgid "Network name: "
 | 
			
		||||
msgstr "Номи шабака:"
 | 
			
		||||
msgstr "Номи шабака: "
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/networkAgent.js:324 js/ui/components/networkAgent.js:693
 | 
			
		||||
msgid "DSL authentication"
 | 
			
		||||
@@ -960,7 +960,7 @@ msgstr "Барои дастгоҳи паҳннавори мобилӣ рамзи
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/networkAgent.js:333
 | 
			
		||||
msgid "PIN: "
 | 
			
		||||
msgstr "PIN:"
 | 
			
		||||
msgstr "PIN: "
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:706
 | 
			
		||||
msgid "Mobile broadband network password"
 | 
			
		||||
@@ -1051,12 +1051,12 @@ msgstr "Обу ҳаво"
 | 
			
		||||
#: js/ui/dateMenu.js:305
 | 
			
		||||
#| msgid "Select a network"
 | 
			
		||||
msgid "Select a location…"
 | 
			
		||||
msgstr "Интихоб кардани шабака"
 | 
			
		||||
msgstr "Интихоби ҷойгиршавӣ…"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:313
 | 
			
		||||
#| msgid "Searching…"
 | 
			
		||||
msgid "Loading…"
 | 
			
		||||
msgstr "Ҷустуҷӯ рафта истодааст..."
 | 
			
		||||
msgstr "Бор шуда истодааст…"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:323
 | 
			
		||||
msgid "Go online for weather information"
 | 
			
		||||
@@ -1274,7 +1274,7 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: js/ui/kbdA11yDialog.js:57
 | 
			
		||||
msgid "Leave On"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Ҳамеша фаъол"
 | 
			
		||||
 | 
			
		||||
#: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133
 | 
			
		||||
#: js/ui/status/network.js:1264
 | 
			
		||||
@@ -1287,11 +1287,11 @@ msgstr "Фаъол кардан"
 | 
			
		||||
#: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79
 | 
			
		||||
#: js/ui/status/rfkill.js:106
 | 
			
		||||
msgid "Turn Off"
 | 
			
		||||
msgstr "Хомӯш кардан"
 | 
			
		||||
msgstr "Ғайрифаъол кардан"
 | 
			
		||||
 | 
			
		||||
#: js/ui/kbdA11yDialog.js:65
 | 
			
		||||
msgid "Leave Off"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Ҳамеша ғайрифаъол"
 | 
			
		||||
 | 
			
		||||
#: js/ui/keyboard.js:203
 | 
			
		||||
msgid "Region & Language Settings"
 | 
			
		||||
@@ -1327,7 +1327,7 @@ msgstr "Ғайрифаъол"
 | 
			
		||||
 | 
			
		||||
#: js/ui/lookingGlass.js:693
 | 
			
		||||
msgid "Error"
 | 
			
		||||
msgstr "Хатогӣ"
 | 
			
		||||
msgstr "Хато"
 | 
			
		||||
 | 
			
		||||
#: js/ui/lookingGlass.js:695
 | 
			
		||||
msgid "Out of date"
 | 
			
		||||
@@ -1372,7 +1372,7 @@ msgstr "Ботил сохтан"
 | 
			
		||||
#. activities. See also note for "Activities" string.
 | 
			
		||||
#: js/ui/overview.js:100
 | 
			
		||||
msgid "Overview"
 | 
			
		||||
msgstr "Хулоса"
 | 
			
		||||
msgstr "Ҷамъбаст"
 | 
			
		||||
 | 
			
		||||
#. Translators: this is the text displayed
 | 
			
		||||
#. in the search entry when no search is
 | 
			
		||||
@@ -1380,20 +1380,20 @@ msgstr "Хулоса"
 | 
			
		||||
#. characters.
 | 
			
		||||
#: js/ui/overview.js:226
 | 
			
		||||
msgid "Type to search…"
 | 
			
		||||
msgstr "Ҷустуҷӯ кардан..."
 | 
			
		||||
msgstr "Барои ҷустуҷӯ чизеро чоп намоед…"
 | 
			
		||||
 | 
			
		||||
#: js/ui/padOsd.js:92
 | 
			
		||||
msgid "New shortcut…"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Миёнбури нав…"
 | 
			
		||||
 | 
			
		||||
#: js/ui/padOsd.js:141
 | 
			
		||||
#| msgid "Applications"
 | 
			
		||||
msgid "Application defined"
 | 
			
		||||
msgstr "Барномаҳо"
 | 
			
		||||
msgstr "Барномаи муайяншуда"
 | 
			
		||||
 | 
			
		||||
#: js/ui/padOsd.js:142
 | 
			
		||||
msgid "Show on-screen help"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Намоиш додани кумаки экранӣ"
 | 
			
		||||
 | 
			
		||||
#: js/ui/padOsd.js:143
 | 
			
		||||
#| msgid "Switch User"
 | 
			
		||||
@@ -1406,7 +1406,7 @@ msgstr ""
 | 
			
		||||
 | 
			
		||||
#: js/ui/padOsd.js:209
 | 
			
		||||
msgid "Done"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Тайёр"
 | 
			
		||||
 | 
			
		||||
#: js/ui/padOsd.js:721
 | 
			
		||||
msgid "Edit…"
 | 
			
		||||
@@ -1414,19 +1414,19 @@ msgstr "Таҳрир кардан…"
 | 
			
		||||
 | 
			
		||||
#: js/ui/padOsd.js:763 js/ui/padOsd.js:868
 | 
			
		||||
msgid "None"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Ҳеҷ"
 | 
			
		||||
 | 
			
		||||
#: js/ui/padOsd.js:822
 | 
			
		||||
msgid "Press a button to configure"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Барои идома тугмаеро пахш намоед"
 | 
			
		||||
 | 
			
		||||
#: js/ui/padOsd.js:823
 | 
			
		||||
msgid "Press Esc to exit"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Барои баромад тугмаи Esc-ро пахш намоед"
 | 
			
		||||
 | 
			
		||||
#: js/ui/padOsd.js:826
 | 
			
		||||
msgid "Press any key to exit"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Барои баромад тугмаи дилхоҳро пахш намоед"
 | 
			
		||||
 | 
			
		||||
#: js/ui/panel.js:108
 | 
			
		||||
msgid "Quit"
 | 
			
		||||
@@ -1446,7 +1446,7 @@ msgstr "Низом"
 | 
			
		||||
 | 
			
		||||
#: js/ui/panel.js:861
 | 
			
		||||
msgid "Top Bar"
 | 
			
		||||
msgstr "Панели боло"
 | 
			
		||||
msgstr "Лавҳаии болоӣ"
 | 
			
		||||
 | 
			
		||||
#. Translators: this MUST be either "toggle-switch-us"
 | 
			
		||||
#. (for toggle switches containing the English words
 | 
			
		||||
@@ -1519,7 +1519,7 @@ msgstr "Қулф аз тарави барнома баста шудааст"
 | 
			
		||||
 | 
			
		||||
#: js/ui/search.js:635
 | 
			
		||||
msgid "Searching…"
 | 
			
		||||
msgstr "Ҷустуҷӯ рафта истодааст..."
 | 
			
		||||
msgstr "Дар ҳоли ҷустуҷӯ…"
 | 
			
		||||
 | 
			
		||||
#: js/ui/search.js:637
 | 
			
		||||
msgid "No results."
 | 
			
		||||
@@ -1836,7 +1836,7 @@ msgstr "%s пайваст нашудааст"
 | 
			
		||||
#: js/ui/status/network.js:1393
 | 
			
		||||
#| msgid "Connecting"
 | 
			
		||||
msgid "connecting…"
 | 
			
		||||
msgstr "Пайвастшавӣ"
 | 
			
		||||
msgstr "пайваст шуда истодааст…"
 | 
			
		||||
 | 
			
		||||
#. Translators: this is for network connections that require some kind of key or password
 | 
			
		||||
#: js/ui/status/network.js:1396
 | 
			
		||||
@@ -1894,7 +1894,7 @@ msgstr "Пайваст қатъ шудааст"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1703
 | 
			
		||||
msgid "Activation of network connection failed"
 | 
			
		||||
msgstr "Фаъолсозии пайвасти шабака қатъ шудааст."
 | 
			
		||||
msgstr "Фаъолсозии пайвасти шабака қатъ шуд"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/nightLight.js:60
 | 
			
		||||
#| msgid "Networking is disabled"
 | 
			
		||||
@@ -1929,7 +1929,7 @@ msgstr ""
 | 
			
		||||
#. to estimate battery life
 | 
			
		||||
#: js/ui/status/power.js:70 js/ui/status/power.js:76
 | 
			
		||||
msgid "Estimating…"
 | 
			
		||||
msgstr "Ҳисоб шуда истодааст..."
 | 
			
		||||
msgstr "Ҳисоб шуда истодааст…"
 | 
			
		||||
 | 
			
		||||
#. Translators: this is <hours>:<minutes> Remaining (<percentage>)
 | 
			
		||||
#: js/ui/status/power.js:84
 | 
			
		||||
@@ -1948,7 +1948,7 @@ msgstr "%d∶%02d то пур шудан (%d%%)"
 | 
			
		||||
#: js/ui/status/power.js:117 js/ui/status/power.js:119
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%d %%"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "%d %%"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/remoteAccess.js:42
 | 
			
		||||
msgid "Screen is Being Shared"
 | 
			
		||||
@@ -1978,11 +1978,11 @@ msgstr "Баромад аз мизи корӣ"
 | 
			
		||||
#: js/ui/status/system.js:227
 | 
			
		||||
#| msgid "Sound Settings"
 | 
			
		||||
msgid "Account Settings"
 | 
			
		||||
msgstr "Танзимоти садо"
 | 
			
		||||
msgstr "Танзимоти ҳисоб"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/system.js:255
 | 
			
		||||
msgid "Orientation Lock"
 | 
			
		||||
msgstr "Қулфи самт"
 | 
			
		||||
msgstr "Қулфи самти экран"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/system.js:281
 | 
			
		||||
msgid "Suspend"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1007
									
								
								po/zh_TW.po
									
									
									
									
									
								
							
							
						
						
									
										1007
									
								
								po/zh_TW.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);
 | 
			
		||||
@@ -1183,13 +1183,26 @@ _shell_app_handle_startup_sequence (ShellApp            *app,
 | 
			
		||||
gboolean
 | 
			
		||||
shell_app_request_quit (ShellApp   *app)
 | 
			
		||||
{
 | 
			
		||||
  GActionGroup *group = NULL;
 | 
			
		||||
  GSList *iter;
 | 
			
		||||
 | 
			
		||||
  if (shell_app_get_state (app) != SHELL_APP_STATE_RUNNING)
 | 
			
		||||
    return FALSE;
 | 
			
		||||
 | 
			
		||||
  /* TODO - check for an XSMP connection; we could probably use that */
 | 
			
		||||
  /* First, check whether the app exports an explicit "quit" action
 | 
			
		||||
   * that we can activate on the bus
 | 
			
		||||
   */
 | 
			
		||||
  group = G_ACTION_GROUP (app->running_state->muxer);
 | 
			
		||||
 | 
			
		||||
  if (g_action_group_has_action (group, "app.quit") &&
 | 
			
		||||
      g_action_group_get_action_parameter_type (group, "app.quit") == NULL)
 | 
			
		||||
    {
 | 
			
		||||
      g_action_group_activate_action (group, "app.quit", NULL);
 | 
			
		||||
 | 
			
		||||
      return TRUE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* Otherwise, fall back to closing all the app's windows */
 | 
			
		||||
  for (iter = app->running_state->windows; iter; iter = iter->next)
 | 
			
		||||
    {
 | 
			
		||||
      MetaWindow *win = iter->data;
 | 
			
		||||
 
 | 
			
		||||
@@ -863,6 +863,7 @@ _shell_global_set_plugin (ShellGlobal *global,
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  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);
 | 
			
		||||
 
 | 
			
		||||
@@ -17,15 +17,13 @@
 | 
			
		||||
#include <meta/meta-cursor-tracker.h>
 | 
			
		||||
#include <meta/display.h>
 | 
			
		||||
#include <meta/compositor-mutter.h>
 | 
			
		||||
#include <st/st.h>
 | 
			
		||||
 | 
			
		||||
#include "shell-global.h"
 | 
			
		||||
#include "shell-recorder-src.h"
 | 
			
		||||
#include "shell-recorder.h"
 | 
			
		||||
#include "shell-util.h"
 | 
			
		||||
 | 
			
		||||
#define A11Y_APPS_SCHEMA "org.gnome.desktop.a11y.applications"
 | 
			
		||||
#define MAGNIFIER_ACTIVE_KEY "screen-magnifier-enabled"
 | 
			
		||||
 | 
			
		||||
typedef enum {
 | 
			
		||||
  RECORDER_STATE_CLOSED,
 | 
			
		||||
  RECORDER_STATE_RECORDING
 | 
			
		||||
@@ -58,7 +56,6 @@ struct _ShellRecorder {
 | 
			
		||||
  int pointer_x;
 | 
			
		||||
  int pointer_y;
 | 
			
		||||
 | 
			
		||||
  GSettings *a11y_settings;
 | 
			
		||||
  gboolean draw_cursor;
 | 
			
		||||
  MetaCursorTracker *cursor_tracker;
 | 
			
		||||
  cairo_surface_t *cursor_image;
 | 
			
		||||
@@ -213,8 +210,6 @@ shell_recorder_init (ShellRecorder *recorder)
 | 
			
		||||
 | 
			
		||||
  recorder->memory_target = get_memory_target();
 | 
			
		||||
 | 
			
		||||
  recorder->a11y_settings = g_settings_new (A11Y_APPS_SCHEMA);
 | 
			
		||||
 | 
			
		||||
  recorder->state = RECORDER_STATE_CLOSED;
 | 
			
		||||
  recorder->framerate = DEFAULT_FRAMES_PER_SECOND;
 | 
			
		||||
  recorder->draw_cursor = TRUE;
 | 
			
		||||
@@ -239,8 +234,6 @@ shell_recorder_finalize (GObject  *object)
 | 
			
		||||
 | 
			
		||||
  recorder_remove_redraw_timeout (recorder);
 | 
			
		||||
 | 
			
		||||
  g_clear_object (&recorder->a11y_settings);
 | 
			
		||||
 | 
			
		||||
  G_OBJECT_CLASS (shell_recorder_parent_class)->finalize (object);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -465,9 +458,16 @@ recorder_record_frame (ShellRecorder *recorder,
 | 
			
		||||
 | 
			
		||||
  GST_BUFFER_PTS(buffer) = now;
 | 
			
		||||
 | 
			
		||||
  if (recorder->draw_cursor &&
 | 
			
		||||
      !g_settings_get_boolean (recorder->a11y_settings, MAGNIFIER_ACTIVE_KEY))
 | 
			
		||||
    recorder_draw_cursor (recorder, buffer);
 | 
			
		||||
  if (recorder->draw_cursor)
 | 
			
		||||
    {
 | 
			
		||||
      StSettings *settings = st_settings_get ();
 | 
			
		||||
      gboolean magnifier_active = FALSE;
 | 
			
		||||
 | 
			
		||||
      g_object_get (settings, "magnifier-active", &magnifier_active, NULL);
 | 
			
		||||
 | 
			
		||||
      if (magnifier_active)
 | 
			
		||||
        recorder_draw_cursor (recorder, buffer);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  shell_recorder_src_add_buffer (SHELL_RECORDER_SRC (recorder->current_pipeline->src), buffer);
 | 
			
		||||
  gst_buffer_unref (buffer);
 | 
			
		||||
 
 | 
			
		||||
@@ -7,14 +7,12 @@
 | 
			
		||||
#include <meta/meta-plugin.h>
 | 
			
		||||
#include <meta/meta-shaped-texture.h>
 | 
			
		||||
#include <meta/meta-cursor-tracker.h>
 | 
			
		||||
#include <st/st.h>
 | 
			
		||||
 | 
			
		||||
#include "shell-global.h"
 | 
			
		||||
#include "shell-screenshot.h"
 | 
			
		||||
#include "shell-util.h"
 | 
			
		||||
 | 
			
		||||
#define A11Y_APPS_SCHEMA "org.gnome.desktop.a11y.applications"
 | 
			
		||||
#define MAGNIFIER_ACTIVE_KEY "screen-magnifier-enabled"
 | 
			
		||||
 | 
			
		||||
typedef struct _ShellScreenshotPrivate  ShellScreenshotPrivate;
 | 
			
		||||
 | 
			
		||||
struct _ShellScreenshot
 | 
			
		||||
@@ -202,6 +200,9 @@ write_screenshot_thread (GTask        *result,
 | 
			
		||||
                                            cairo_image_surface_get_height (priv->image));
 | 
			
		||||
      creation_time = g_date_time_format (priv->datetime, "%c");
 | 
			
		||||
 | 
			
		||||
      if (!creation_time)
 | 
			
		||||
        creation_time = g_date_time_format (priv->datetime, "%FT%T%z");
 | 
			
		||||
 | 
			
		||||
      if (gdk_pixbuf_save_to_stream (pixbuf, stream, "png", NULL, NULL,
 | 
			
		||||
                                     "tEXt::Software", "gnome-screenshot",
 | 
			
		||||
                                     "tEXt::Creation Time", creation_time,
 | 
			
		||||
@@ -268,9 +269,12 @@ should_draw_cursor_image (ShellScreenshotMode mode)
 | 
			
		||||
{
 | 
			
		||||
  if (mode == SHELL_SCREENSHOT_WINDOW || !meta_is_wayland_compositor ())
 | 
			
		||||
    {
 | 
			
		||||
      g_autoptr (GSettings) settings = g_settings_new (A11Y_APPS_SCHEMA);
 | 
			
		||||
      StSettings *settings = st_settings_get ();
 | 
			
		||||
      gboolean magnifier_active = FALSE;
 | 
			
		||||
 | 
			
		||||
      if (!g_settings_get_boolean (settings, MAGNIFIER_ACTIVE_KEY))
 | 
			
		||||
      g_object_get (settings, "magnifier-active", &magnifier_active, NULL);
 | 
			
		||||
 | 
			
		||||
      if (!magnifier_active)
 | 
			
		||||
        return TRUE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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),
 | 
			
		||||
 
 | 
			
		||||
@@ -125,7 +125,7 @@ st_cflags = [
 | 
			
		||||
libst = shared_library('st-1.0',
 | 
			
		||||
  sources: st_gir_sources + st_non_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 +152,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 */
 | 
			
		||||
 
 | 
			
		||||
@@ -206,8 +206,8 @@ st_icon_style_changed (StWidget *widget)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  priv->theme_icon_size = (int)(0.5 + st_theme_node_get_length (theme_node, "icon-size"));
 | 
			
		||||
  st_icon_update_icon_size (self);
 | 
			
		||||
  st_icon_update (self);
 | 
			
		||||
  if (st_icon_update_icon_size (self))
 | 
			
		||||
    st_icon_update (self);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
 
 | 
			
		||||
@@ -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);
 | 
			
		||||
 
 | 
			
		||||
@@ -30,6 +30,7 @@
 | 
			
		||||
#define KEY_DRAG_THRESHOLD    "drag-threshold"
 | 
			
		||||
#define KEY_GTK_THEME         "gtk-theme"
 | 
			
		||||
#define KEY_GTK_ICON_THEME    "icon-theme"
 | 
			
		||||
#define KEY_MAGNIFIER_ACTIVE "screen-magnifier-enabled"
 | 
			
		||||
 | 
			
		||||
enum {
 | 
			
		||||
  PROP_0,
 | 
			
		||||
@@ -38,6 +39,7 @@ enum {
 | 
			
		||||
  PROP_DRAG_THRESHOLD,
 | 
			
		||||
  PROP_GTK_THEME,
 | 
			
		||||
  PROP_GTK_ICON_THEME,
 | 
			
		||||
  PROP_MAGNIFIER_ACTIVE,
 | 
			
		||||
  N_PROPS
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -48,11 +50,13 @@ struct _StSettings
 | 
			
		||||
  GObject parent_object;
 | 
			
		||||
  GSettings *interface_settings;
 | 
			
		||||
  GSettings *mouse_settings;
 | 
			
		||||
  GSettings *a11y_settings;
 | 
			
		||||
 | 
			
		||||
  gchar *gtk_theme;
 | 
			
		||||
  gchar *gtk_icon_theme;
 | 
			
		||||
  gboolean enable_animations;
 | 
			
		||||
  gboolean primary_paste;
 | 
			
		||||
  gboolean magnifier_active;
 | 
			
		||||
  gint drag_threshold;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -105,6 +109,9 @@ st_settings_get_property (GObject    *object,
 | 
			
		||||
    case PROP_GTK_ICON_THEME:
 | 
			
		||||
      g_value_set_string (value, settings->gtk_icon_theme);
 | 
			
		||||
      break;
 | 
			
		||||
    case PROP_MAGNIFIER_ACTIVE:
 | 
			
		||||
      g_value_set_boolean (value, settings->magnifier_active);
 | 
			
		||||
      break;
 | 
			
		||||
    default:
 | 
			
		||||
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 | 
			
		||||
    }
 | 
			
		||||
@@ -144,6 +151,11 @@ st_settings_class_init (StSettingsClass *klass)
 | 
			
		||||
                                                    "GTK+ Icon Theme",
 | 
			
		||||
                                                    "",
 | 
			
		||||
                                                    G_PARAM_READABLE);
 | 
			
		||||
  props[PROP_MAGNIFIER_ACTIVE] = g_param_spec_boolean("magnifier-active",
 | 
			
		||||
                                                      "Magnifier is active",
 | 
			
		||||
                                                      "Weather the a11y magnifier is active",
 | 
			
		||||
                                                      FALSE,
 | 
			
		||||
                                                      G_PARAM_READABLE);
 | 
			
		||||
 | 
			
		||||
  g_object_class_install_properties (object_class, N_PROPS, props);
 | 
			
		||||
}
 | 
			
		||||
@@ -190,6 +202,18 @@ on_mouse_settings_changed (GSettings   *g_settings,
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
on_a11y_settings_changed (GSettings   *g_settings,
 | 
			
		||||
                          const gchar *key,
 | 
			
		||||
                          StSettings  *settings)
 | 
			
		||||
{
 | 
			
		||||
  if (g_str_equal (key, KEY_MAGNIFIER_ACTIVE))
 | 
			
		||||
    {
 | 
			
		||||
      settings->magnifier_active = g_settings_get_boolean (g_settings, key);
 | 
			
		||||
      g_object_notify_by_pspec (G_OBJECT (settings), props[PROP_MAGNIFIER_ACTIVE]);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
st_settings_init (StSettings *settings)
 | 
			
		||||
{
 | 
			
		||||
@@ -201,6 +225,10 @@ st_settings_init (StSettings *settings)
 | 
			
		||||
  g_signal_connect (settings->interface_settings, "changed",
 | 
			
		||||
                    G_CALLBACK (on_mouse_settings_changed), settings);
 | 
			
		||||
 | 
			
		||||
  settings->a11y_settings = g_settings_new ("org.gnome.desktop.a11y.applications");
 | 
			
		||||
  g_signal_connect (settings->a11y_settings, "changed",
 | 
			
		||||
                    G_CALLBACK (on_a11y_settings_changed), settings);
 | 
			
		||||
 | 
			
		||||
  settings->enable_animations = g_settings_get_boolean (settings->interface_settings,
 | 
			
		||||
                                                        KEY_ENABLE_ANIMATIONS);
 | 
			
		||||
  settings->primary_paste = g_settings_get_boolean (settings->interface_settings,
 | 
			
		||||
@@ -211,6 +239,8 @@ st_settings_init (StSettings *settings)
 | 
			
		||||
                                                    KEY_GTK_ICON_THEME);
 | 
			
		||||
  settings->drag_threshold = g_settings_get_int (settings->mouse_settings,
 | 
			
		||||
                                                 KEY_DRAG_THRESHOLD);
 | 
			
		||||
  settings->magnifier_active = g_settings_get_boolean (settings->a11y_settings,
 | 
			
		||||
                                                       KEY_MAGNIFIER_ACTIVE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 
 | 
			
		||||
@@ -24,6 +24,8 @@
 | 
			
		||||
#ifndef __ST_SETTINGS_H__
 | 
			
		||||
#define __ST_SETTINGS_H__
 | 
			
		||||
 | 
			
		||||
#include <glib-object.h>
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
#define ST_TYPE_SETTINGS (st_settings_get_type ())
 | 
			
		||||
@@ -31,4 +33,6 @@ G_DECLARE_FINAL_TYPE (StSettings, st_settings, ST, SETTINGS, GObject)
 | 
			
		||||
 | 
			
		||||
StSettings * st_settings_get (void);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
#endif /* __ST_SETTINGS_H__ */
 | 
			
		||||
 
 | 
			
		||||
@@ -496,15 +496,31 @@ pixbuf_to_st_content_image (GdkPixbuf *pixbuf,
 | 
			
		||||
  ClutterContent *image;
 | 
			
		||||
  g_autoptr(GError) error = NULL;
 | 
			
		||||
 | 
			
		||||
  if (width < 0)
 | 
			
		||||
    width = ceilf (gdk_pixbuf_get_width (pixbuf) / resource_scale);
 | 
			
		||||
  else
 | 
			
		||||
    width *= paint_scale;
 | 
			
		||||
  float native_width, native_height;
 | 
			
		||||
 | 
			
		||||
  if (height < 0)
 | 
			
		||||
    height = ceilf (gdk_pixbuf_get_width (pixbuf) / resource_scale);
 | 
			
		||||
  native_width = ceilf (gdk_pixbuf_get_width (pixbuf) / resource_scale);
 | 
			
		||||
  native_height = ceilf (gdk_pixbuf_get_height (pixbuf) / resource_scale);
 | 
			
		||||
 | 
			
		||||
  if (width < 0 && height < 0)
 | 
			
		||||
    {
 | 
			
		||||
      width = native_width;
 | 
			
		||||
      height = native_height;
 | 
			
		||||
    }
 | 
			
		||||
  else if (width < 0)
 | 
			
		||||
    {
 | 
			
		||||
      height *= paint_scale;
 | 
			
		||||
      width = native_width * (height / native_height);
 | 
			
		||||
    }
 | 
			
		||||
  else if (height < 0)
 | 
			
		||||
    {
 | 
			
		||||
      width *= paint_scale;
 | 
			
		||||
      height = native_height * (width / native_width);
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    height *= paint_scale;
 | 
			
		||||
    {
 | 
			
		||||
      width *= paint_scale;
 | 
			
		||||
      height *= paint_scale;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  image = st_image_content_new_with_preferred_size (width, height);
 | 
			
		||||
  clutter_image_set_data (CLUTTER_IMAGE (image),
 | 
			
		||||
 
 | 
			
		||||
@@ -107,6 +107,8 @@ struct _StThemeNode {
 | 
			
		||||
  int box_shadow_min_width;
 | 
			
		||||
  int box_shadow_min_height;
 | 
			
		||||
 | 
			
		||||
  guint stylesheets_changed_id;
 | 
			
		||||
 | 
			
		||||
  CoglPipeline *border_slices_texture;
 | 
			
		||||
  CoglPipeline *border_slices_pipeline;
 | 
			
		||||
  CoglPipeline *background_texture;
 | 
			
		||||
 
 | 
			
		||||
@@ -119,6 +119,10 @@ st_theme_node_transition_new (StThemeNode *from_node,
 | 
			
		||||
  return transition;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * st_theme_node_transition_get_new_paint_state: (skip)
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
StThemeNodePaintState *
 | 
			
		||||
st_theme_node_transition_get_new_paint_state (StThemeNodeTransition *transition)
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
@@ -111,9 +111,11 @@ st_theme_node_dispose (GObject *gobject)
 | 
			
		||||
      node->icon_colors = NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (node->theme)
 | 
			
		||||
    g_signal_handlers_disconnect_by_func (node->theme,
 | 
			
		||||
                                          on_custom_stylesheets_changed, node);
 | 
			
		||||
  if (node->theme && node->stylesheets_changed_id)
 | 
			
		||||
    {
 | 
			
		||||
      g_signal_handler_disconnect (node->theme, node->stylesheets_changed_id);
 | 
			
		||||
      node->stylesheets_changed_id = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  st_theme_node_paint_state_free (&node->cached_state);
 | 
			
		||||
 | 
			
		||||
@@ -230,8 +232,9 @@ st_theme_node_new (StThemeContext    *context,
 | 
			
		||||
  if (theme != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      node->theme = g_object_ref (theme);
 | 
			
		||||
      g_signal_connect (node->theme, "custom-stylesheets-changed",
 | 
			
		||||
                        G_CALLBACK (on_custom_stylesheets_changed), node);
 | 
			
		||||
      node->stylesheets_changed_id =
 | 
			
		||||
        g_signal_connect (node->theme, "custom-stylesheets-changed",
 | 
			
		||||
                          G_CALLBACK (on_custom_stylesheets_changed), node);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  node->element_type = element_type;
 | 
			
		||||
@@ -1136,10 +1139,14 @@ get_length_from_term_int (StThemeNode *node,
 | 
			
		||||
{
 | 
			
		||||
  double value;
 | 
			
		||||
  GetFromTermResult result;
 | 
			
		||||
  int scale_factor;
 | 
			
		||||
 | 
			
		||||
  result = get_length_from_term (node, term, use_parent_font, &value);
 | 
			
		||||
  if (result == VALUE_FOUND)
 | 
			
		||||
    *length = (int) (0.5 + value);
 | 
			
		||||
    {
 | 
			
		||||
      g_object_get (node->context, "scale-factor", &scale_factor, NULL);
 | 
			
		||||
      *length = (int) ((value / scale_factor) + 0.5) * scale_factor;
 | 
			
		||||
    }
 | 
			
		||||
  return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -579,7 +579,11 @@ get_root_theme_node (ClutterStage *stage)
 | 
			
		||||
StThemeNode *
 | 
			
		||||
st_widget_get_theme_node (StWidget *widget)
 | 
			
		||||
{
 | 
			
		||||
  StWidgetPrivate *priv = st_widget_get_instance_private (widget);
 | 
			
		||||
  StWidgetPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (ST_IS_WIDGET (widget), NULL);
 | 
			
		||||
 | 
			
		||||
  priv = st_widget_get_instance_private (widget);
 | 
			
		||||
 | 
			
		||||
  if (priv->theme_node == NULL)
 | 
			
		||||
    {
 | 
			
		||||
@@ -1714,7 +1718,7 @@ st_widget_recompute_style (StWidget    *widget,
 | 
			
		||||
  StThemeNode *new_theme_node = st_widget_get_theme_node (widget);
 | 
			
		||||
  int transition_duration;
 | 
			
		||||
  StSettings *settings;
 | 
			
		||||
  gboolean paint_equal;
 | 
			
		||||
  gboolean paint_equal, geometry_equal = FALSE;
 | 
			
		||||
  gboolean animations_enabled;
 | 
			
		||||
 | 
			
		||||
  if (new_theme_node == old_theme_node)
 | 
			
		||||
@@ -1725,8 +1729,9 @@ st_widget_recompute_style (StWidget    *widget,
 | 
			
		||||
 | 
			
		||||
  _st_theme_node_apply_margins (new_theme_node, CLUTTER_ACTOR (widget));
 | 
			
		||||
 | 
			
		||||
  if (!old_theme_node ||
 | 
			
		||||
      !st_theme_node_geometry_equal (old_theme_node, new_theme_node))
 | 
			
		||||
  if (old_theme_node)
 | 
			
		||||
    geometry_equal = st_theme_node_geometry_equal (old_theme_node, new_theme_node);
 | 
			
		||||
  if (!geometry_equal)
 | 
			
		||||
    clutter_actor_queue_relayout ((ClutterActor *) widget);
 | 
			
		||||
 | 
			
		||||
  transition_duration = st_theme_node_get_transition_duration (new_theme_node);
 | 
			
		||||
@@ -1778,7 +1783,11 @@ st_widget_recompute_style (StWidget    *widget,
 | 
			
		||||
        st_theme_node_paint_state_invalidate (current_paint_state (widget));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  g_signal_emit (widget, signals[STYLE_CHANGED], 0);
 | 
			
		||||
  if (!paint_equal || !geometry_equal)
 | 
			
		||||
    g_signal_emit (widget, signals[STYLE_CHANGED], 0);
 | 
			
		||||
  else
 | 
			
		||||
    notify_children_of_style_change ((ClutterActor *) widget);
 | 
			
		||||
 | 
			
		||||
  priv->is_style_dirty = FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -70,7 +70,7 @@ static guint manager_signals[LAST_SIGNAL];
 | 
			
		||||
#define SYSTEM_TRAY_ORIENTATION_VERT 1
 | 
			
		||||
 | 
			
		||||
#ifdef GDK_WINDOWING_X11
 | 
			
		||||
static gboolean na_tray_manager_check_running_screen_x11 ();
 | 
			
		||||
static gboolean na_tray_manager_check_running_screen_x11 (void);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
static void na_tray_manager_finalize     (GObject      *object);
 | 
			
		||||
@@ -808,7 +808,7 @@ na_tray_manager_manage_screen (NaTrayManager *manager)
 | 
			
		||||
#ifdef GDK_WINDOWING_X11
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
na_tray_manager_check_running_screen_x11 ()
 | 
			
		||||
na_tray_manager_check_running_screen_x11 (void)
 | 
			
		||||
{
 | 
			
		||||
  GdkDisplay *display;
 | 
			
		||||
  GdkScreen *screen;
 | 
			
		||||
@@ -833,7 +833,7 @@ na_tray_manager_check_running_screen_x11 ()
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
na_tray_manager_check_running ()
 | 
			
		||||
na_tray_manager_check_running (void)
 | 
			
		||||
{
 | 
			
		||||
#ifdef GDK_WINDOWING_X11
 | 
			
		||||
  return na_tray_manager_check_running_screen_x11 ();
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user