Compare commits
	
		
			145 Commits
		
	
	
		
			wip/jimmac
			...
			wip/fmuell
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 253d234b50 | ||
|   | c168bd4e01 | ||
|   | 339797dbb4 | ||
|   | 6c7dcd5ffd | ||
|   | 94f12fa764 | ||
|   | b197a1affb | ||
|   | 51655be6a3 | ||
|   | 9697c209c0 | ||
|   | 6ecb0a4546 | ||
|   | 30861d4800 | ||
|   | a23391ea28 | ||
|   | 58e0b80cac | ||
|   | 41dd744b74 | ||
|   | bdf66d7b62 | ||
|   | 4258ae3ec2 | ||
|   | 9b379c49ba | ||
|   | 7e70dd8453 | ||
|   | 2e209a82f9 | ||
|   | ab0ecc469f | ||
|   | 7d75ddf635 | ||
|   | 271e43a1ed | ||
|   | 2702a82896 | ||
|   | 8ad33d8752 | ||
|   | d84bbb8770 | ||
|   | c0c2edf2e1 | ||
|   | de0c3251dd | ||
|   | 0afd600ea4 | ||
|   | 598407b14a | ||
|   | d9bfa16f05 | ||
|   | 03117d65b2 | ||
|   | 5520bb3890 | ||
|   | 4e6b2eb72a | ||
|   | 2e5295b3a9 | ||
|   | 3121c9aa29 | ||
|   | 1ebbd7c768 | ||
|   | 8572bb97c7 | ||
|   | d5ebd8c816 | ||
|   | ed999ce926 | ||
|   | 50b7739076 | ||
|   | 94995e9c1e | ||
|   | fb04dafb0b | ||
|   | d57234bec9 | ||
|   | 38da54fb02 | ||
|   | bbd3275dad | ||
|   | 3a3f9aa008 | ||
|   | 3c54e863e6 | ||
|   | a63ba61194 | ||
|   | ab9710ee7b | ||
|   | 43cef45229 | ||
|   | 8db4f3c67f | ||
|   | 594a070029 | ||
|   | c2e04e3cfa | ||
|   | 293f50e8e5 | ||
|   | df7fea3407 | ||
|   | 563412698a | ||
|   | 2b30146c6c | ||
|   | 0f531d8c44 | ||
|   | 218c87994b | ||
|   | f74c07b9ac | ||
|   | 59edea4bb4 | ||
|   | 4d4d5a0b16 | ||
|   | 03c4930883 | ||
|   | 9593e20425 | ||
|   | 2b1d6e607f | ||
|   | 1dff32e48a | ||
|   | 1e3a174de9 | ||
|   | 7bb84dae80 | ||
|   | 44fcb9e9af | ||
|   | 2d30e310bc | ||
|   | be2d630348 | ||
|   | bea6045aae | ||
|   | ad491e7922 | ||
|   | fedb8e706a | ||
|   | 1be933bc49 | ||
|   | 526bb72f3d | ||
|   | 49c95cff6c | ||
|   | 56a361650c | ||
|   | d4763b157d | ||
|   | d2dc072ba9 | ||
|   | ffaca00594 | ||
|   | 9090b7dc3d | ||
|   | a540fe4130 | ||
|   | 5be61bbb68 | ||
|   | 8e51fee5c1 | ||
|   | 9d6fcfdc85 | ||
|   | 5f5a3b78a5 | ||
|   | 4e5ca6d376 | ||
|   | 2fab75f448 | ||
|   | 22883f2fa2 | ||
|   | 5d9f80bc73 | ||
|   | f7d117488b | ||
|   | 244a329ee7 | ||
|   | 044572cb60 | ||
|   | 746875258d | ||
|   | 4892a87dfe | ||
|   | 8b9c8ddb1e | ||
|   | eb9000576c | ||
|   | 862aaf341e | ||
|   | a5c75ff58b | ||
|   | 4541fb9819 | ||
|   | 9f8edd980c | ||
|   | e5b9043435 | ||
|   | c0012c2ea4 | ||
|   | b77e4975f0 | ||
|   | e83f2344f6 | ||
|   | de6512be1a | ||
|   | 0b72ff1896 | ||
|   | 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 | 
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -80,3 +80,4 @@ tests/run-test.sh | |||||||
| *~ | *~ | ||||||
| *.patch | *.patch | ||||||
| *.sw? | *.sw? | ||||||
|  | .vscode | ||||||
|   | |||||||
| @@ -15,10 +15,10 @@ variables: | |||||||
|         - merge_requests |         - merge_requests | ||||||
|  |  | ||||||
| check_commit_log: | check_commit_log: | ||||||
|     image: registry.fedoraproject.org/fedora:latest |     image: registry.gitlab.gnome.org/gnome/mutter/master:v1 | ||||||
|     stage: review |     stage: review | ||||||
|     before_script: |     variables: | ||||||
|         - dnf install -y git |         GIT_DEPTH: "100" | ||||||
|     script: |     script: | ||||||
|         - ./.gitlab-ci/check-commit-log.sh |         - ./.gitlab-ci/check-commit-log.sh | ||||||
|     only: |     only: | ||||||
|   | |||||||
| @@ -17,15 +17,19 @@ if [ "$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" ]; then | |||||||
|   merge_request_branch=$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME |   merge_request_branch=$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME | ||||||
|  |  | ||||||
|   echo Looking for $merge_request_branch on remote ... |   echo Looking for $merge_request_branch on remote ... | ||||||
|   if git fetch $merge_request_remote $merge_request_branch >/dev/null 2>&1; then |   if git fetch -q $merge_request_remote $merge_request_branch 2>/dev/null; then | ||||||
|     mutter_target=FETCH_HEAD |     mutter_target=FETCH_HEAD | ||||||
|  |   else | ||||||
|  |     mutter_target=origin/$CI_MERGE_REQUEST_TARGET_BRANCH_NAME | ||||||
|  |     echo Using $mutter_target instead | ||||||
|   fi |   fi | ||||||
| fi | fi | ||||||
|  |  | ||||||
| if [ -z "$mutter_target" ]; then | if [ -z "$mutter_target" ]; then | ||||||
|   mutter_target=$(git branch -r -l $shell_branch) |   mutter_target=$(git branch -r -l origin/$shell_branch) | ||||||
|  |   mutter_target=${mutter_target:-$(git branch -r -l ${shell_branch#remotes/})} | ||||||
|   mutter_target=${mutter_target:-origin/master} |   mutter_target=${mutter_target:-origin/master} | ||||||
|   echo Using $mutter_target instead |   echo Using $mutter_target instead | ||||||
| fi | fi | ||||||
|  |  | ||||||
| git checkout $mutter_target | git checkout -q $mutter_target | ||||||
|   | |||||||
							
								
								
									
										60
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						
									
										60
									
								
								NEWS
									
									
									
									
									
								
							| @@ -1,3 +1,63 @@ | |||||||
|  | 3.33.1 | ||||||
|  | ====== | ||||||
|  | * Refine the app menu [Florian; #968] | ||||||
|  | * Refine window preview style [Feichtmeier; !461] | ||||||
|  | * Only emit ::style-changed on actual changes [Carlos; #1153] | ||||||
|  | * Disable emoji on-screen keyboard support on X11 [Florian; #1172] | ||||||
|  | * Fix tablet button mapping overlay [Carlos; #1220] | ||||||
|  | * Don't crash for world clock locations with no timezone [Florian; #1062] | ||||||
|  | * Don't leak old on-screen keyboard layout groups [Carlos; mutter#556] | ||||||
|  | * Fix ellipsization in dialog subtitles/bodies [Marco; !531] | ||||||
|  | * Fix glitch of fullscreen window in workspace switch animation [Jonas D.; !322] | ||||||
|  | * Fix distortion of some image contents [Florian; !525] | ||||||
|  | * Allow dragging unfocused tiled/maximized windows from top bar [Dylan; #679290] | ||||||
|  | * Handle network interface name changes [Fabrice; !534] | ||||||
|  | * Avoid unnecessary style changes when computing :first/:last-child | ||||||
|  |   [Florian; !529] | ||||||
|  | * Misc. bug fixes and cleanups [Florian, Marco, Robert, Georges, Carlos, Simon, | ||||||
|  |   Jonas D.; !487, !441, !502, !503, !504, !506, #822, !551, !512, !509, !511, | ||||||
|  |   #1054, !524, #1065, !331, !540] | ||||||
|  |  | ||||||
|  | Contributors: | ||||||
|  |   Fabrice Bellet, Jonas Dreßler, Feichtmeier, Carlos Garnacho, Robert Mader, | ||||||
|  |   Dylan McCall, Simon McVittie, Florian Müllner, Georges Basile Stavracas Neto, | ||||||
|  |   Marco Trevisan (Treviño) | ||||||
|  |  | ||||||
|  | Translators: | ||||||
|  |   Daniel Mustieles [es], Kukuh Syafaat [id], Fabio Tomat [fur], | ||||||
|  |   Carmen Bianca BAKKER [eo], Dingzhong Chen [zh_CN], Tim Sabsch [de] | ||||||
|  |  | ||||||
|  | 3.32.1 | ||||||
|  | ====== | ||||||
|  | * Fix avatar scaling on login screen [Florian; #1024] | ||||||
|  | * Fix distortion of desktop zoom [Florian; #646] | ||||||
|  | * Fix mouse cursor visibility when using desktop zoom [Florian, Marco; #1020] | ||||||
|  | * Fix screen dimming after wake-up on lock screen [Xiaoguang; #900] | ||||||
|  | * Fix Alt+Esc switcher [Florian; #1064] | ||||||
|  | * Respect struts for popover placement [Andrea; #1102] | ||||||
|  | * Fix app icons updates after theme changes [Florian; #1117] | ||||||
|  | * Fix desktop zoom after resolution changes [Marco; #1120] | ||||||
|  | * Implement stick-to-finger workspace switch overview gestures [Florian; #516] | ||||||
|  | * Make World Clocks offsets relative to local time [Florian; #1157] | ||||||
|  | * Fix top app icon disappearing from dash [Florian; #1053] | ||||||
|  | * Update switch style to match new Adwaita [Jakub; !496] | ||||||
|  | * Ensure CSS units are pixel-aligned when scaling is used [Carlos; #91] | ||||||
|  | * Misc. bug fixes and cleanups [Florian, Jakub, Robert, Alex, Carlos, Phil, | ||||||
|  |   Marco, Benjamin, AsciiWolf, Ray, verdre; !444, #1016, #1018, !449, #1036, | ||||||
|  |   !455, #1094, !440, #1023, #624, #1017, !476, !473, !480, #1130, !485, !481, | ||||||
|  |   !490, !489, #1151, !435, #1160, !482, #1150, #1166, !384] | ||||||
|  |  | ||||||
|  | Contributors: | ||||||
|  |   AsciiWolf, Andrea Azzarone, Benjamin Berg, Carlos Garnacho, Victor Ibragimov, | ||||||
|  |   Robert Mader, Alex Monday, Florian Müllner, Jakub Steiner, Ray Strode, | ||||||
|  |   Marco Trevisan (Treviño), verdre, Xiaoguang Wang, Phil Wyett | ||||||
|  |  | ||||||
|  | Translators: | ||||||
|  |   Victor Ibragimov [tg, af, et, ja], Bruce Cowan [en_GB], Piotr Drąg [tg], | ||||||
|  |   Charles Monzat [fr], Khaled Hosny [ar], Goran Vidović [hr], | ||||||
|  |   Cheng-Chia Tseng [zh_TW], Carmen Bianca BAKKER [eo], Daniel Mustieles [es], | ||||||
|  |   Dušan Kazik [sk] | ||||||
|  |  | ||||||
| 3.32.0 | 3.32.0 | ||||||
| ====== | ====== | ||||||
| * Fix sizing issues in on-screen-keyboard emoji panel [Carlos; !439] | * Fix sizing issues in on-screen-keyboard emoji panel [Carlos; !439] | ||||||
|   | |||||||
| @@ -9,9 +9,6 @@ | |||||||
|     <method name="ShowOSD"> |     <method name="ShowOSD"> | ||||||
|       <arg type="a{sv}" direction="in" name="params"/> |       <arg type="a{sv}" direction="in" name="params"/> | ||||||
|     </method> |     </method> | ||||||
|     <method name="ShowMonitorLabels"> |  | ||||||
|       <arg type="a{uv}" direction="in" name="params"/> |  | ||||||
|     </method> |  | ||||||
|     <method name="ShowMonitorLabels2"> |     <method name="ShowMonitorLabels2"> | ||||||
|       <arg type="a{sv}" direction="in" name="params"/> |       <arg type="a{sv}" direction="in" name="params"/> | ||||||
|     </method> |     </method> | ||||||
|   | |||||||
| @@ -21,10 +21,8 @@ | |||||||
|     <file>noise-texture.png</file> |     <file>noise-texture.png</file> | ||||||
|     <file>pad-osd.css</file> |     <file>pad-osd.css</file> | ||||||
|     <file>process-working.svg</file> |     <file>process-working.svg</file> | ||||||
|     <file>toggle-off-us.svg</file> |  | ||||||
|     <file>toggle-off-intl.svg</file> |     <file>toggle-off-intl.svg</file> | ||||||
|     <file>toggle-off-hc.svg</file> |     <file>toggle-off-hc.svg</file> | ||||||
|     <file>toggle-on-us.svg</file> |  | ||||||
|     <file>toggle-on-intl.svg</file> |     <file>toggle-on-intl.svg</file> | ||||||
|     <file>toggle-on-hc.svg</file> |     <file>toggle-on-hc.svg</file> | ||||||
|   </gresource> |   </gresource> | ||||||
|   | |||||||
| @@ -157,16 +157,11 @@ StScrollBar { | |||||||
|  |  | ||||||
| /* Switches */ | /* Switches */ | ||||||
| .toggle-switch { | .toggle-switch { | ||||||
|   width: 65px; |   width: 46px; | ||||||
|   height: 22px; |   height: 22px; | ||||||
|   background-size: contain; |   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 */ | /* links */ | ||||||
| @@ -1142,6 +1137,12 @@ StScrollBar { | |||||||
|  |  | ||||||
| .ripple-box:rtl { border-radius: 0 0 0 52px; } // just a simple change to the border radius position | .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 | // not really top bar only | ||||||
| .popup-menu-arrow { icon-size: 1.09em; } | .popup-menu-arrow { icon-size: 1.09em; } | ||||||
| .popup-menu-icon { icon-size: 1.09em; } | .popup-menu-icon { icon-size: 1.09em; } | ||||||
| @@ -1149,25 +1150,23 @@ StScrollBar { | |||||||
| //close buttons | //close buttons | ||||||
|  |  | ||||||
| .window-close { | .window-close { | ||||||
|   background-color: white; |   background-color: $selected_bg_color; | ||||||
|  |   color: white; | ||||||
|   border-radius: 24px; |   border-radius: 24px; | ||||||
|   border: 4px solid $selected_bg_color; |   border: 2px solid $selected_bg_color; | ||||||
|   box-shadow: inset 0 -2px 0 0 transparentize($selected_bg_color, 0.9); |  | ||||||
|   color: $selected_bg_color; |  | ||||||
|   height: 24px; |   height: 24px; | ||||||
|   width: 24px; |   width: 24px; | ||||||
|   -shell-close-overlap: 14px; |   -shell-close-overlap: 11px; | ||||||
|  |   box-shadow: -1px 1px 5px 0px transparentize(black, 0.5); | ||||||
|  |  | ||||||
|   &:hover { |   &:hover { | ||||||
|     background-color: $selected_bg_color; |     background-color: lighten($selected_bg_color, 5%); | ||||||
|     border-color: white; |     border-color: lighten($selected_bg_color, 5%); | ||||||
|     color: white; |  | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   &:active { |   &:active { | ||||||
|     background-color: mix(white, $selected_bg_color, 75%); |     background-color: darken($selected_bg_color, 5%); | ||||||
|     border-color: $selected_bg_color; |     border-color: darken($selected_bg_color, 5%); | ||||||
|     color: $selected_bg_color; |  | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -1232,12 +1231,13 @@ StScrollBar { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   .window-clone-border { |   .window-clone-border { | ||||||
|     border: 4px solid $selected_bg_color; |     $_bg: transparentize(white, 0.65); | ||||||
|     border-radius: 4px; |     border: 5px solid $_bg; | ||||||
|  |     border-radius: 6px; | ||||||
|     // For window decorations with round corners we can't match |     // For window decorations with round corners we can't match | ||||||
|     // the exact shape when the window is scaled. So apply a shadow |     // the exact shape when the window is scaled. So apply a shadow | ||||||
|     // to fix that case |     // to fix that case | ||||||
|     box-shadow: inset 0px 0px 0px 1px $selected_bg_color; |     box-shadow: inset 0 0 0 1px $_bg; | ||||||
| } | } | ||||||
|   .window-caption { |   .window-caption { | ||||||
|     spacing: 25px; |     spacing: 25px; | ||||||
|   | |||||||
| @@ -10,124 +10,62 @@ | |||||||
|    xmlns:xlink="http://www.w3.org/1999/xlink" |    xmlns:xlink="http://www.w3.org/1999/xlink" | ||||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" |    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" |    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||||
|    width="65" |    width="46" | ||||||
|    height="22" |    height="22" | ||||||
|    id="svg2857" |    viewBox="0 0 46 22" | ||||||
|    version="1.1" |    version="1.1" | ||||||
|    inkscape:version="0.48.5 r10040" |    id="svg2751" | ||||||
|    sodipodi:docname="toggle-off-us.svg"> |    inkscape:version="0.92.4 5da689c313, 2019-01-14" | ||||||
|  |    sodipodi:docname="toggle-off-intl.svg"> | ||||||
|   <defs |   <defs | ||||||
|      id="defs2859"> |      id="defs2745"> | ||||||
|     <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 |     <linearGradient | ||||||
|        inkscape:collect="always" |        inkscape:collect="always" | ||||||
|        xlink:href="#linearGradient76469-7-7-4" |        id="linearGradient3329"> | ||||||
|        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 |       <stop | ||||||
|          style="stop-color:#2e3232;stop-opacity:1" |          style="stop-color:#39393a;stop-opacity:1;" | ||||||
|          offset="0" |          offset="0" | ||||||
|          id="stop76471-7-1-5" /> |          id="stop3325" /> | ||||||
|       <stop |       <stop | ||||||
|          style="stop-color:#3e4545;stop-opacity:1" |          style="stop-color:#302f30;stop-opacity:1" | ||||||
|          offset="1" |          offset="1" | ||||||
|          id="stop76473-9-0-0" /> |          id="stop3327" /> | ||||||
|     </linearGradient> |  | ||||||
|     <inkscape:path-effect |  | ||||||
|        effect="spiro" |  | ||||||
|        id="path-effect77541-4" |  | ||||||
|        is_visible="true" /> |  | ||||||
|     <inkscape:path-effect |  | ||||||
|        effect="spiro" |  | ||||||
|        id="path-effect77541-4-0" |  | ||||||
|        is_visible="true" /> |  | ||||||
|     <linearGradient |  | ||||||
|        inkscape:collect="always" |  | ||||||
|        xlink:href="#linearGradient37802-8" |  | ||||||
|        id="linearGradient12311-3-1-0-5-4" |  | ||||||
|        gradientUnits="userSpaceOnUse" |  | ||||||
|        gradientTransform="matrix(1.5918367,0,0,0.85714285,-256.56122,59.071426)" |  | ||||||
|        x1="610.13782" |  | ||||||
|        y1="501.43866" |  | ||||||
|        x2="610.13782" |  | ||||||
|        y2="492.52756" /> |  | ||||||
|     <linearGradient |  | ||||||
|        id="linearGradient37802-8" |  | ||||||
|        inkscape:collect="always"> |  | ||||||
|       <stop |  | ||||||
|          id="stop37804-1" |  | ||||||
|          offset="0" |  | ||||||
|          style="stop-color:#2c2c2c;stop-opacity:1" /> |  | ||||||
|       <stop |  | ||||||
|          id="stop37806-8" |  | ||||||
|          offset="1" |  | ||||||
|          style="stop-color:#16191a;stop-opacity:1" /> |  | ||||||
|     </linearGradient> |     </linearGradient> | ||||||
|     <linearGradient |     <linearGradient | ||||||
|        y2="492.52756" |        inkscape:collect="always" | ||||||
|        x2="610.13782" |        xlink:href="#linearGradient3329" | ||||||
|        y1="501.43866" |        id="linearGradient3331" | ||||||
|        x1="610.13782" |        x1="53" | ||||||
|        gradientTransform="matrix(1.5918367,0,0,0.85714285,-900.56122,-423.92857)" |        y1="294.42917" | ||||||
|  |        x2="53" | ||||||
|  |        y2="309.80417" | ||||||
|        gradientUnits="userSpaceOnUse" |        gradientUnits="userSpaceOnUse" | ||||||
|        id="linearGradient13602" |        gradientTransform="translate(-42.760724)" /> | ||||||
|        xlink:href="#linearGradient37802-8" |  | ||||||
|        inkscape:collect="always" /> |  | ||||||
|   </defs> |   </defs> | ||||||
|   <sodipodi:namedview |   <sodipodi:namedview | ||||||
|      id="base" |      id="base" | ||||||
|      pagecolor="#000000" |      pagecolor="#535353" | ||||||
|      bordercolor="#666666" |      bordercolor="#666666" | ||||||
|      borderopacity="1.0" |      borderopacity="1.0" | ||||||
|      inkscape:pageopacity="1" |      inkscape:pageopacity="1" | ||||||
|      inkscape:pageshadow="2" |      inkscape:pageshadow="2" | ||||||
|      inkscape:zoom="1" |      inkscape:zoom="1" | ||||||
|      inkscape:cx="-5.0602834" |      inkscape:cx="-19.436775" | ||||||
|      inkscape:cy="16.473273" |      inkscape:cy="-13.499723" | ||||||
|      inkscape:document-units="px" |      inkscape:document-units="px" | ||||||
|      inkscape:current-layer="g37994" |      inkscape:current-layer="layer1" | ||||||
|      showgrid="false" |      showgrid="false" | ||||||
|      inkscape:window-width="2560" |      units="px" | ||||||
|      inkscape:window-height="1375" |      inkscape:pagecheckerboard="true" | ||||||
|      inkscape:window-x="0" |  | ||||||
|      inkscape:window-y="27" |  | ||||||
|      inkscape:window-maximized="1" |  | ||||||
|      borderlayer="true" |      borderlayer="true" | ||||||
|      inkscape:showpageshadow="false" |      inkscape:showpageshadow="false" | ||||||
|      inkscape:snap-nodes="false" |  | ||||||
|      inkscape:snap-bbox="true" |  | ||||||
|      showborder="false"> |      showborder="false"> | ||||||
|     <inkscape:grid |     <inkscape:grid | ||||||
|        type="xygrid" |        type="xygrid" | ||||||
|        id="grid12954" |        id="grid3298" /> | ||||||
|        empspacing="5" |  | ||||||
|        visible="true" |  | ||||||
|        enabled="true" |  | ||||||
|        snapvisiblegridlinesonly="true" /> |  | ||||||
|   </sodipodi:namedview> |   </sodipodi:namedview> | ||||||
|   <metadata |   <metadata | ||||||
|      id="metadata2862"> |      id="metadata2748"> | ||||||
|     <rdf:RDF> |     <rdf:RDF> | ||||||
|       <cc:Work |       <cc:Work | ||||||
|          rdf:about=""> |          rdf:about=""> | ||||||
| @@ -142,68 +80,24 @@ | |||||||
|      inkscape:label="Layer 1" |      inkscape:label="Layer 1" | ||||||
|      inkscape:groupmode="layer" |      inkscape:groupmode="layer" | ||||||
|      id="layer1" |      id="layer1" | ||||||
|      transform="translate(-444.64286,-781.36218)"> |      transform="translate(0,-291.17916)"> | ||||||
|     <g |  | ||||||
|        transform="matrix(0.6526046,0,0,0.80554422,99.592644,-636.32172)" |  | ||||||
|        id="g37994"> |  | ||||||
|       <g |  | ||||||
|          id="g37996" |  | ||||||
|          transform="translate(-115,1277)"> |  | ||||||
|     <rect |     <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" |        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="rect13475" |        id="rect3296" | ||||||
|            width="98" |        width="44.446434" | ||||||
|            height="25" |        height="20.910645" | ||||||
|            x="644.5" |        x="0.625" | ||||||
|            y="484.61118" |        y="291.71494" | ||||||
|            rx="4.7429576" |        rx="10.455324" | ||||||
|            ry="3.8424656" /> |        ry="10.073335" /> | ||||||
|     <rect |     <rect | ||||||
|            ry="3.8424656" |        ry="10.455322" | ||||||
|            rx="4.7429576" |        rx="10.455322" | ||||||
|            y="483.5" |        y="291.71494" | ||||||
|            x="644.5" |        x="0.5428465" | ||||||
|            height="25" |        height="20.910645" | ||||||
|            width="98" |        width="21.142862" | ||||||
|            id="rect38000" |        id="rect3300" | ||||||
|            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" /> |        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> |  | ||||||
|       <g |  | ||||||
|          transform="translate(-49.946213,-1.890275)" |  | ||||||
|          id="g38002"> |  | ||||||
|         <g |  | ||||||
|            transform="translate(-115,1247)" |  | ||||||
|            style="display:inline" |  | ||||||
|            id="g38004"> |  | ||||||
|           <rect |  | ||||||
|              ry="3.7972314" |  | ||||||
|              rx="4.6871223" |  | ||||||
|              y="515.5" |  | ||||||
|              x="694.53046" |  | ||||||
|              height="25" |  | ||||||
|              width="45.969578" |  | ||||||
|              id="rect38006" |  | ||||||
|              style="color:#000000;fill:url(#linearGradient38024);fill-opacity:1;fill-rule:nonzero;stroke:#1f2020;stroke-width:1.37920964;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> |  | ||||||
|           <path |  | ||||||
|              sodipodi:nodetypes="cc" |  | ||||||
|              style="opacity:0.1;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" |  | ||||||
|              d="m 699.09675,516.7365 36.86904,0" |  | ||||||
|              id="path38016" |  | ||||||
|              inkscape:path-effect="#path-effect77541-4" |  | ||||||
|              inkscape:original-d="m 699.09675,516.7365 36.86904,0" |  | ||||||
|              inkscape:connector-curvature="0" /> |  | ||||||
|         </g> |  | ||||||
|       </g> |  | ||||||
|       <path |  | ||||||
|          sodipodi:type="arc" |  | ||||||
|          style="color:#000000;fill:none;stroke:#ffffff;stroke-width:2.15627193;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" |  | ||||||
|          id="path13479" |  | ||||||
|          sodipodi:cx="16.4375" |  | ||||||
|          sodipodi:cy="10.8125" |  | ||||||
|          sodipodi:rx="4.3125" |  | ||||||
|          sodipodi:ry="4.3125" |  | ||||||
|          d="m 20.75,10.8125 a 4.3125,4.3125 0 1 1 -8.625,0 4.3125,4.3125 0 1 1 8.625,0 z" |  | ||||||
|          transform="matrix(1.4212691,0,0,1.1514287,577.38488,1761.1138)" /> |  | ||||||
|     </g> |  | ||||||
|   </g> |   </g> | ||||||
| </svg> | </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:xlink="http://www.w3.org/1999/xlink" | ||||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" |    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" |    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||||
|    width="65" |    width="46" | ||||||
|    height="22" |    height="22" | ||||||
|    id="svg2857" |    viewBox="0 0 46 22" | ||||||
|    version="1.1" |    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"> |    sodipodi:docname="toggle-on-intl.svg"> | ||||||
|   <defs |   <defs | ||||||
|      id="defs2859"> |      id="defs2745"> | ||||||
|     <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 |     <linearGradient | ||||||
|        inkscape:collect="always" |        inkscape:collect="always" | ||||||
|        xlink:href="#linearGradient77461" |        id="linearGradient3329"> | ||||||
|        id="linearGradient77551" |  | ||||||
|        gradientUnits="userSpaceOnUse" |  | ||||||
|        gradientTransform="matrix(1.3066667,0,0,1,-841.64667,-483)" |  | ||||||
|        x1="1164.7644" |  | ||||||
|        y1="962.93695" |  | ||||||
|        x2="1164.7644" |  | ||||||
|        y2="970.51404" /> |  | ||||||
|     <linearGradient |  | ||||||
|        id="linearGradient77461" |  | ||||||
|        inkscape:collect="always"> |  | ||||||
|       <stop |       <stop | ||||||
|          id="stop77463" |          style="stop-color:#39393a;stop-opacity:1;" | ||||||
|          offset="0" |          offset="0" | ||||||
|          style="stop-color:#182f4c;stop-opacity:1" /> |          id="stop3325" /> | ||||||
|       <stop |       <stop | ||||||
|          id="stop77465" |          style="stop-color:#302f30;stop-opacity:1" | ||||||
|          offset="1" |          offset="1" | ||||||
|          style="stop-color:#205b9a;stop-opacity:1" /> |          id="stop3327" /> | ||||||
|     </linearGradient> |     </linearGradient> | ||||||
|     <linearGradient |     <linearGradient | ||||||
|        inkscape:collect="always" |        inkscape:collect="always" | ||||||
|        xlink:href="#linearGradient76469-7-7-4" |        xlink:href="#linearGradient3329" | ||||||
|        id="linearGradient38024" |        id="linearGradient3331" | ||||||
|  |        x1="53" | ||||||
|  |        y1="294.42917" | ||||||
|  |        x2="53" | ||||||
|  |        y2="309.80417" | ||||||
|        gradientUnits="userSpaceOnUse" |        gradientUnits="userSpaceOnUse" | ||||||
|        gradientTransform="matrix(1.0215462,0,0,1.0322581,717.22867,428.68472)" |        gradientTransform="translate(-19)" /> | ||||||
|        x1="6" |  | ||||||
|        y1="102.95528" |  | ||||||
|        x2="6" |  | ||||||
|        y2="84.505203" /> |  | ||||||
|     <linearGradient |  | ||||||
|        inkscape:collect="always" |  | ||||||
|        id="linearGradient76469-7-7-4"> |  | ||||||
|       <stop |  | ||||||
|          style="stop-color:#2e3232;stop-opacity:1" |  | ||||||
|          offset="0" |  | ||||||
|          id="stop76471-7-1-5" /> |  | ||||||
|       <stop |  | ||||||
|          style="stop-color:#3e4545;stop-opacity:1" |  | ||||||
|          offset="1" |  | ||||||
|          id="stop76473-9-0-0" /> |  | ||||||
|     </linearGradient> |  | ||||||
|     <inkscape:path-effect |  | ||||||
|        effect="spiro" |  | ||||||
|        id="path-effect77541-4" |  | ||||||
|        is_visible="true" /> |  | ||||||
|   </defs> |   </defs> | ||||||
|   <sodipodi:namedview |   <sodipodi:namedview | ||||||
|      id="base" |      id="base" | ||||||
|      pagecolor="#000000" |      pagecolor="#535353" | ||||||
|      bordercolor="#666666" |      bordercolor="#666666" | ||||||
|      borderopacity="1.0" |      borderopacity="1.0" | ||||||
|      inkscape:pageopacity="1" |      inkscape:pageopacity="1" | ||||||
|      inkscape:pageshadow="2" |      inkscape:pageshadow="2" | ||||||
|      inkscape:zoom="1" |      inkscape:zoom="1" | ||||||
|      inkscape:cx="37.410841" |      inkscape:cx="13.588971" | ||||||
|      inkscape:cy="16.009314" |      inkscape:cy="14.124546" | ||||||
|      inkscape:document-units="px" |      inkscape:document-units="px" | ||||||
|      inkscape:current-layer="g37994" |      inkscape:current-layer="layer1" | ||||||
|      showgrid="false" |      showgrid="false" | ||||||
|      inkscape:window-width="2560" |      units="px" | ||||||
|      inkscape:window-height="1376" |      inkscape:pagecheckerboard="true" | ||||||
|      inkscape:window-x="0" |  | ||||||
|      inkscape:window-y="27" |  | ||||||
|      inkscape:window-maximized="1" |  | ||||||
|      borderlayer="true" |      borderlayer="true" | ||||||
|      inkscape:showpageshadow="false" |      inkscape:showpageshadow="false" | ||||||
|      inkscape:snap-nodes="false" |  | ||||||
|      inkscape:snap-bbox="true" |  | ||||||
|      showborder="false"> |      showborder="false"> | ||||||
|     <inkscape:grid |     <inkscape:grid | ||||||
|        type="xygrid" |        type="xygrid" | ||||||
|        id="grid12954" |        id="grid3298" /> | ||||||
|        empspacing="5" |  | ||||||
|        visible="true" |  | ||||||
|        enabled="true" |  | ||||||
|        snapvisiblegridlinesonly="true" /> |  | ||||||
|   </sodipodi:namedview> |   </sodipodi:namedview> | ||||||
|   <metadata |   <metadata | ||||||
|      id="metadata2862"> |      id="metadata2748"> | ||||||
|     <rdf:RDF> |     <rdf:RDF> | ||||||
|       <cc:Work |       <cc:Work | ||||||
|          rdf:about=""> |          rdf:about=""> | ||||||
|         <dc:format>image/svg+xml</dc:format> |         <dc:format>image/svg+xml</dc:format> | ||||||
|         <dc:type |         <dc:type | ||||||
|            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> |            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | ||||||
|         <dc:title /> |         <dc:title></dc:title> | ||||||
|       </cc:Work> |       </cc:Work> | ||||||
|     </rdf:RDF> |     </rdf:RDF> | ||||||
|   </metadata> |   </metadata> | ||||||
| @@ -128,65 +80,24 @@ | |||||||
|      inkscape:label="Layer 1" |      inkscape:label="Layer 1" | ||||||
|      inkscape:groupmode="layer" |      inkscape:groupmode="layer" | ||||||
|      id="layer1" |      id="layer1" | ||||||
|      transform="translate(-444.64286,-781.36218)"> |      transform="translate(0,-291.17916)"> | ||||||
|     <g |  | ||||||
|        transform="matrix(0.6526046,0,0,0.80554422,99.592644,-636.32172)" |  | ||||||
|        id="g37994"> |  | ||||||
|       <g |  | ||||||
|          id="g37996" |  | ||||||
|          transform="translate(-115,1277)"> |  | ||||||
|     <rect |     <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" |        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="rect13475" |        id="rect3296" | ||||||
|            width="98" |        width="44.446434" | ||||||
|            height="25" |        height="20.910645" | ||||||
|            x="644.5" |        x="0.625" | ||||||
|            y="484.61118" |        y="291.71494" | ||||||
|            rx="4.7429576" |        rx="10.455324" | ||||||
|            ry="3.8424656" /> |        ry="10.073335" /> | ||||||
|     <rect |     <rect | ||||||
|            ry="3.8424656" |        ry="10.455322" | ||||||
|            rx="4.7429576" |        rx="10.455322" | ||||||
|            y="483.5" |        y="291.71494" | ||||||
|            x="644.5" |        x="24.30357" | ||||||
|            height="25" |        height="20.910645" | ||||||
|            width="98" |        width="21.142862" | ||||||
|            id="rect38000" |        id="rect3300" | ||||||
|            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" /> |        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> |  | ||||||
|       <g |  | ||||||
|          transform="translate(2.0625,-2)" |  | ||||||
|          id="g38002"> |  | ||||||
|         <g |  | ||||||
|            transform="translate(-115,1247)" |  | ||||||
|            style="display:inline" |  | ||||||
|            id="g38004"> |  | ||||||
|           <rect |  | ||||||
|              ry="3.7972314" |  | ||||||
|              rx="4.6871223" |  | ||||||
|              y="515.5" |  | ||||||
|              x="694.53046" |  | ||||||
|              height="25" |  | ||||||
|              width="45.969578" |  | ||||||
|              id="rect38006" |  | ||||||
|              style="color:#000000;fill:url(#linearGradient38024);fill-opacity:1;fill-rule:nonzero;stroke:#1f2020;stroke-width:1.37920964;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> |  | ||||||
|           <path |  | ||||||
|              sodipodi:nodetypes="cc" |  | ||||||
|              style="opacity:0.1;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" |  | ||||||
|              d="m 699.09675,516.7365 36.86904,0" |  | ||||||
|              id="path38016" |  | ||||||
|              inkscape:path-effect="#path-effect77541-4" |  | ||||||
|              inkscape:original-d="m 699.09675,516.7365 36.86904,0" |  | ||||||
|              inkscape:connector-curvature="0" /> |  | ||||||
|         </g> |  | ||||||
|       </g> |  | ||||||
|       <rect |  | ||||||
|          style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" |  | ||||||
|          id="rect13678" |  | ||||||
|          width="3.0646207" |  | ||||||
|          height="12.414008" |  | ||||||
|          x="554.77728" |  | ||||||
|          y="1767.3566" /> |  | ||||||
|     </g> |  | ||||||
|   </g> |   </g> | ||||||
| </svg> | </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,7 +551,7 @@ class ExtensionRow extends Gtk.ListBoxRow { | |||||||
|  |  | ||||||
|         let button = new Gtk.Button({ valign: Gtk.Align.CENTER, |         let button = new Gtk.Button({ valign: Gtk.Align.CENTER, | ||||||
|                                       no_show_all: true }); |                                       no_show_all: true }); | ||||||
|         button.add(new Gtk.Image({ icon_name: 'emblem-system-symbolic', |         button.set_image(new Gtk.Image({ icon_name: 'emblem-system-symbolic', | ||||||
|                                          icon_size: Gtk.IconSize.BUTTON, |                                          icon_size: Gtk.IconSize.BUTTON, | ||||||
|                                          visible: true })); |                                          visible: true })); | ||||||
|         button.get_style_context().add_class('circular'); |         button.get_style_context().add_class('circular'); | ||||||
|   | |||||||
| @@ -325,7 +325,7 @@ var SessionMenuButton = class { | |||||||
|                  this._button.remove_style_pseudo_class('active'); |                  this._button.remove_style_pseudo_class('active'); | ||||||
|         }); |         }); | ||||||
|  |  | ||||||
|         this._manager = new PopupMenu.PopupMenuManager({ actor: this._button }, |         this._manager = new PopupMenu.PopupMenuManager(this._button, | ||||||
|                                                        { actionMode: Shell.ActionMode.NONE }); |                                                        { actionMode: Shell.ActionMode.NONE }); | ||||||
|         this._manager.addMenu(this._menu); |         this._manager.addMenu(this._menu); | ||||||
|  |  | ||||||
| @@ -652,7 +652,7 @@ var LoginDialog = GObject.registerClass({ | |||||||
|                      bannerAllocation.x2 = Math.floor(centerX - centerGap / 2); |                      bannerAllocation.x2 = Math.floor(centerX - centerGap / 2); | ||||||
|                      bannerAllocation.x1 = Math.floor(bannerAllocation.x2 - wideBannerWidth); |                      bannerAllocation.x1 = Math.floor(bannerAllocation.x2 - wideBannerWidth); | ||||||
|  |  | ||||||
|                      // figure out how tall it would like to be and try to accomodate |                      // figure out how tall it would like to be and try to accommodate | ||||||
|                      // but don't let it get too close to the logo |                      // but don't let it get too close to the logo | ||||||
|                      let [wideMinHeight, wideBannerHeight] = this._bannerView.get_preferred_height(wideBannerWidth); |                      let [wideMinHeight, wideBannerHeight] = this._bannerView.get_preferred_height(wideBannerWidth); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -88,42 +88,42 @@ const SystemActions = GObject.registerClass({ | |||||||
|                             name: C_("search-result", "Power Off"), |                             name: C_("search-result", "Power Off"), | ||||||
|                             iconName: 'system-shutdown-symbolic', |                             iconName: 'system-shutdown-symbolic', | ||||||
|                             // Translators: A list of keywords that match the power-off action, separated by semicolons |                             // Translators: A list of keywords that match the power-off action, separated by semicolons | ||||||
|                             keywords: _("power off;shutdown;reboot;restart").split(';'), |                             keywords: _("power off;shutdown;reboot;restart").split(/[; ]/), | ||||||
|                             available: false }); |                             available: false }); | ||||||
|         this._actions.set(LOCK_SCREEN_ACTION_ID, |         this._actions.set(LOCK_SCREEN_ACTION_ID, | ||||||
|                           { // Translators: The name of the lock screen action in search |                           { // Translators: The name of the lock screen action in search | ||||||
|                             name: C_("search-result", "Lock Screen"), |                             name: C_("search-result", "Lock Screen"), | ||||||
|                             iconName: 'system-lock-screen-symbolic', |                             iconName: 'system-lock-screen-symbolic', | ||||||
|                             // Translators: A list of keywords that match the lock screen action, separated by semicolons |                             // Translators: A list of keywords that match the lock screen action, separated by semicolons | ||||||
|                             keywords: _("lock screen").split(';'), |                             keywords: _("lock screen").split(/[; ]/), | ||||||
|                             available: false }); |                             available: false }); | ||||||
|         this._actions.set(LOGOUT_ACTION_ID, |         this._actions.set(LOGOUT_ACTION_ID, | ||||||
|                           { // Translators: The name of the logout action in search |                           { // Translators: The name of the logout action in search | ||||||
|                             name: C_("search-result", "Log Out"), |                             name: C_("search-result", "Log Out"), | ||||||
|                             iconName: 'application-exit-symbolic', |                             iconName: 'application-exit-symbolic', | ||||||
|                             // Translators: A list of keywords that match the logout action, separated by semicolons |                             // Translators: A list of keywords that match the logout action, separated by semicolons | ||||||
|                             keywords: _("logout;sign off").split(';'), |                             keywords: _("logout;log out;sign off").split(/[; ]/), | ||||||
|                             available: false }); |                             available: false }); | ||||||
|         this._actions.set(SUSPEND_ACTION_ID, |         this._actions.set(SUSPEND_ACTION_ID, | ||||||
|                           { // Translators: The name of the suspend action in search |                           { // Translators: The name of the suspend action in search | ||||||
|                             name: C_("search-result", "Suspend"), |                             name: C_("search-result", "Suspend"), | ||||||
|                             iconName: 'media-playback-pause-symbolic', |                             iconName: 'media-playback-pause-symbolic', | ||||||
|                             // Translators: A list of keywords that match the suspend action, separated by semicolons |                             // Translators: A list of keywords that match the suspend action, separated by semicolons | ||||||
|                             keywords: _("suspend;sleep").split(';'), |                             keywords: _("suspend;sleep").split(/[; ]/), | ||||||
|                             available: false }); |                             available: false }); | ||||||
|         this._actions.set(SWITCH_USER_ACTION_ID, |         this._actions.set(SWITCH_USER_ACTION_ID, | ||||||
|                           { // Translators: The name of the switch user action in search |                           { // Translators: The name of the switch user action in search | ||||||
|                             name: C_("search-result", "Switch User"), |                             name: C_("search-result", "Switch User"), | ||||||
|                             iconName: 'system-switch-user-symbolic', |                             iconName: 'system-switch-user-symbolic', | ||||||
|                             // Translators: A list of keywords that match the switch user action, separated by semicolons |                             // Translators: A list of keywords that match the switch user action, separated by semicolons | ||||||
|                             keywords: _("switch user").split(';'), |                             keywords: _("switch user").split(/[; ]/), | ||||||
|                             available: false }); |                             available: false }); | ||||||
|         this._actions.set(LOCK_ORIENTATION_ACTION_ID, |         this._actions.set(LOCK_ORIENTATION_ACTION_ID, | ||||||
|                           { // Translators: The name of the lock orientation action in search |                           { // Translators: The name of the lock orientation action in search | ||||||
|                             name: C_("search-result", "Lock Orientation"), |                             name: C_("search-result", "Lock Orientation"), | ||||||
|                             iconName: '', |                             iconName: '', | ||||||
|                             // Translators: A list of keywords that match the lock orientation action, separated by semicolons |                             // Translators: A list of keywords that match the lock orientation action, separated by semicolons | ||||||
|                             keywords: _("lock orientation;screen;rotation").split(';'), |                             keywords: _("lock orientation;screen;rotation").split(/[; ]/), | ||||||
|                             available: false }); |                             available: false }); | ||||||
|  |  | ||||||
|         this._loginScreenSettings = new Gio.Settings({ schema_id: LOGIN_SCREEN_SCHEMA }); |         this._loginScreenSettings = new Gio.Settings({ schema_id: LOGIN_SCREEN_SCHEMA }); | ||||||
| @@ -262,7 +262,7 @@ const SystemActions = GObject.registerClass({ | |||||||
|         let results = []; |         let results = []; | ||||||
|  |  | ||||||
|         for (let [key, {available, keywords}] of this._actions) |         for (let [key, {available, keywords}] of this._actions) | ||||||
|             if (available && terms.every(t => keywords.some(k => (k.indexOf(t) >= 0)))) |             if (available && terms.every(t => keywords.some(k => k.startsWith(t)))) | ||||||
|                 results.push(key); |                 results.push(key); | ||||||
|  |  | ||||||
|         return results; |         return results; | ||||||
|   | |||||||
| @@ -366,7 +366,7 @@ class CloseButton extends St.Button { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     _computeBoxPointerOffset() { |     _computeBoxPointerOffset() { | ||||||
|         if (!this._boxPointer || !this._boxPointer.actor.get_stage()) |         if (!this._boxPointer || !this._boxPointer.get_stage()) | ||||||
|             return 0; |             return 0; | ||||||
|  |  | ||||||
|         let side = this._boxPointer.arrowSide; |         let side = this._boxPointer.arrowSide; | ||||||
|   | |||||||
| @@ -30,6 +30,14 @@ var WeatherClient = class { | |||||||
|                 return; |                 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) => { |             this._permStore.LookupRemote('gnome', 'geolocation', (res, error) => { | ||||||
|                 if (error) |                 if (error) | ||||||
|                     log('Error looking up permission: ' + error.message); |                     log('Error looking up permission: ' + error.message); | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ const Scripting = imports.ui.scripting; | |||||||
| // someone should be able to get an idea of how well the shell is performing | // someone should be able to get an idea of how well the shell is performing | ||||||
| // on a particular system. | // on a particular system. | ||||||
|  |  | ||||||
| let METRICS = { | var METRICS = { | ||||||
|     overviewLatencyFirst: |     overviewLatencyFirst: | ||||||
|     { description: "Time to first frame after triggering overview, first time", |     { description: "Time to first frame after triggering overview, first time", | ||||||
|       units: "us" }, |       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 Main = imports.ui.main; | ||||||
| const Scripting = imports.ui.scripting; | const Scripting = imports.ui.scripting; | ||||||
|  |  | ||||||
| let METRICS = { | var METRICS = { | ||||||
|     timeToDesktop: |     timeToDesktop: | ||||||
|     { description: "Time from starting graphical.target to desktop showing", |     { description: "Time from starting graphical.target to desktop showing", | ||||||
|       units: "us" }, |       units: "us" }, | ||||||
| @@ -104,7 +104,10 @@ function *run() { | |||||||
|     yield Scripting.waitLeisure(); |     yield Scripting.waitLeisure(); | ||||||
|     Scripting.scriptEvent('desktopShown'); |     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'); |     Scripting.scriptEvent('overviewShowStart'); | ||||||
|     Main.overview.show(); |     Main.overview.show(); | ||||||
| @@ -200,7 +203,7 @@ function *run() { | |||||||
|  |  | ||||||
|     yield Scripting.sleep(1000); |     yield Scripting.sleep(1000); | ||||||
|  |  | ||||||
|     Gtk.Settings.get_default().gtk_enable_animations = true; |     interfaceSettings.set_boolean('enable-animations', true); | ||||||
| } | } | ||||||
|  |  | ||||||
| let overviewShowStart; | let overviewShowStart; | ||||||
|   | |||||||
| @@ -474,12 +474,10 @@ var CyclerList = GObject.registerClass({ | |||||||
|     } |     } | ||||||
| }); | }); | ||||||
|  |  | ||||||
| var CyclerPopup = GObject.registerClass( | var CyclerPopup = GObject.registerClass({ | ||||||
| class CyclerPopup extends SwitcherPopup.SwitcherPopup { |     GTypeFlags: GObject.TypeFlags.ABSTRACT | ||||||
|  | }, class CyclerPopup extends SwitcherPopup.SwitcherPopup { | ||||||
|     _init() { |     _init() { | ||||||
|         if (new.target === CyclerPopup) |  | ||||||
|             throw new TypeError('Cannot instantiate abstract class ' + new.target.name); |  | ||||||
|  |  | ||||||
|         super._init(); |         super._init(); | ||||||
|  |  | ||||||
|         this._items = this._getWindows(); |         this._items = this._getWindows(); | ||||||
| @@ -619,9 +617,8 @@ class WindowSwitcherPopup extends SwitcherPopup.SwitcherPopup { | |||||||
| var WindowCyclerPopup = GObject.registerClass( | var WindowCyclerPopup = GObject.registerClass( | ||||||
| class WindowCyclerPopup extends CyclerPopup { | class WindowCyclerPopup extends CyclerPopup { | ||||||
|     _init() { |     _init() { | ||||||
|         super._init(); |  | ||||||
|  |  | ||||||
|         this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell.window-switcher' }); |         this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell.window-switcher' }); | ||||||
|  |         super._init(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     _getWindows() { |     _getWindows() { | ||||||
|   | |||||||
| @@ -98,8 +98,8 @@ function clamp(value, min, max) { | |||||||
|  |  | ||||||
| class BaseAppView { | class BaseAppView { | ||||||
|     constructor(params, gridParams) { |     constructor(params, gridParams) { | ||||||
|         if (new.target === BaseAppView) |         if (this.constructor === BaseAppView) | ||||||
|             throw new TypeError('Cannot instantiate abstract class ' + new.target.name); |             throw new TypeError(`Cannot instantiate abstract class ${this.constructor.name}`); | ||||||
|  |  | ||||||
|         gridParams = Params.parse(gridParams, { xAlign: St.Align.MIDDLE, |         gridParams = Params.parse(gridParams, { xAlign: St.Align.MIDDLE, | ||||||
|                                                 columnLimit: MAX_COLUMNS, |                                                 columnLimit: MAX_COLUMNS, | ||||||
| @@ -414,7 +414,7 @@ var AllView = class AllView extends BaseAppView { | |||||||
|         this._refilterApps(); |         this._refilterApps(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     // Overriden from BaseAppView |     // Overridden from BaseAppView | ||||||
|     animate(animationDirection, onComplete) { |     animate(animationDirection, onComplete) { | ||||||
|         this._scrollView.reactive = false; |         this._scrollView.reactive = false; | ||||||
|         let completionFunc = () => { |         let completionFunc = () => { | ||||||
| @@ -1017,7 +1017,7 @@ var FolderView = class FolderView extends BaseAppView { | |||||||
|         Util.ensureActorVisibleInScrollView(this.actor, actor); |         Util.ensureActorVisibleInScrollView(this.actor, actor); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     // Overriden from BaseAppView |     // Overridden from BaseAppView | ||||||
|     animate(animationDirection) { |     animate(animationDirection) { | ||||||
|         this._grid.animatePulse(animationDirection); |         this._grid.animatePulse(animationDirection); | ||||||
|     } |     } | ||||||
| @@ -1081,7 +1081,7 @@ var FolderView = class FolderView extends BaseAppView { | |||||||
|  |  | ||||||
|         let contentBox = this.actor.get_theme_node().get_content_box(pageBox); |         let contentBox = this.actor.get_theme_node().get_content_box(pageBox); | ||||||
|         // We only can show icons inside the collection view boxPointer |         // We only can show icons inside the collection view boxPointer | ||||||
|         // so we have to substract the required padding etc of the boxpointer |         // so we have to subtract the required padding etc of the boxpointer | ||||||
|         return [(contentBox.x2 - contentBox.x1) - 2 * this._offsetForEachSide, (contentBox.y2 - contentBox.y1) - 2 * this._offsetForEachSide]; |         return [(contentBox.x2 - contentBox.x1) - 2 * this._offsetForEachSide, (contentBox.y2 - contentBox.y1) - 2 * this._offsetForEachSide]; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -1301,15 +1301,15 @@ var AppFolderPopup = class AppFolderPopup { | |||||||
|                                                        x_expand: true, |                                                        x_expand: true, | ||||||
|                                                        x_align: St.Align.START }); |                                                        x_align: St.Align.START }); | ||||||
|  |  | ||||||
|         this._boxPointer.actor.style_class = 'app-folder-popup'; |         this._boxPointer.style_class = 'app-folder-popup'; | ||||||
|         this.actor.add_actor(this._boxPointer.actor); |         this.actor.add_actor(this._boxPointer); | ||||||
|         this._boxPointer.bin.set_child(this._view.actor); |         this._boxPointer.bin.set_child(this._view.actor); | ||||||
|  |  | ||||||
|         this.closeButton = Util.makeCloseButton(this._boxPointer); |         this.closeButton = Util.makeCloseButton(this._boxPointer); | ||||||
|         this.closeButton.connect('clicked', this.popdown.bind(this)); |         this.closeButton.connect('clicked', this.popdown.bind(this)); | ||||||
|         this.actor.add_actor(this.closeButton); |         this.actor.add_actor(this.closeButton); | ||||||
|  |  | ||||||
|         this._boxPointer.actor.bind_property('opacity', this.closeButton, 'opacity', |         this._boxPointer.bind_property('opacity', this.closeButton, 'opacity', | ||||||
|                                        GObject.BindingFlags.SYNC_CREATE); |                                        GObject.BindingFlags.SYNC_CREATE); | ||||||
|  |  | ||||||
|         global.focus_manager.add_group(this.actor); |         global.focus_manager.add_group(this.actor); | ||||||
| @@ -1479,7 +1479,7 @@ var AppIcon = class AppIcon { | |||||||
|         this.actor.connect('popup-menu', this._onKeyboardPopupMenu.bind(this)); |         this.actor.connect('popup-menu', this._onKeyboardPopupMenu.bind(this)); | ||||||
|  |  | ||||||
|         this._menu = null; |         this._menu = null; | ||||||
|         this._menuManager = new PopupMenu.PopupMenuManager(this); |         this._menuManager = new PopupMenu.PopupMenuManager(this.actor); | ||||||
|  |  | ||||||
|         if (isDraggable) { |         if (isDraggable) { | ||||||
|             this._draggable = DND.makeDraggable(this.actor); |             this._draggable = DND.makeDraggable(this.actor); | ||||||
| @@ -1707,25 +1707,20 @@ var AppIconMenu = class AppIconMenu extends PopupMenu.PopupMenu { | |||||||
|             w => !w.skip_taskbar |             w => !w.skip_taskbar | ||||||
|         ); |         ); | ||||||
|  |  | ||||||
|         // Display the app windows menu items and the separator between windows |         if (windows.length > 0) | ||||||
|         // of the current desktop and other windows. |             this.addMenuItem( | ||||||
|         let workspaceManager = global.workspace_manager; |                 /* Translators: This is the heading of a list of open windows */ | ||||||
|         let activeWorkspace = workspaceManager.get_active_workspace(); |                 new PopupMenu.PopupSeparatorMenuItem(_("Open Windows")) | ||||||
|         let separatorShown = windows.length > 0 && windows[0].get_workspace() != activeWorkspace; |             ); | ||||||
|  |  | ||||||
|         for (let i = 0; i < windows.length; i++) { |         windows.forEach(window => { | ||||||
|             let window = windows[i]; |  | ||||||
|             if (!separatorShown && window.get_workspace() != activeWorkspace) { |  | ||||||
|                 this._appendSeparator(); |  | ||||||
|                 separatorShown = true; |  | ||||||
|             } |  | ||||||
|             let title = window.title ? window.title |             let title = window.title ? window.title | ||||||
|                                      : this._source.app.get_name(); |                                      : this._source.app.get_name(); | ||||||
|             let item = this._appendMenuItem(title); |             let item = this._appendMenuItem(title); | ||||||
|             item.connect('activate', () => { |             item.connect('activate', () => { | ||||||
|                 this.emit('activate-window', window); |                 this.emit('activate-window', window); | ||||||
|             }); |             }); | ||||||
|         } |         }); | ||||||
|  |  | ||||||
|         if (!this._source.app.is_window_backed()) { |         if (!this._source.app.is_window_backed()) { | ||||||
|             this._appendSeparator(); |             this._appendSeparator(); | ||||||
|   | |||||||
| @@ -14,39 +14,47 @@ const RENAMED_DESKTOP_IDS = { | |||||||
|     'epiphany.desktop': 'org.gnome.Epiphany.desktop', |     'epiphany.desktop': 'org.gnome.Epiphany.desktop', | ||||||
|     'evolution.desktop': 'org.gnome.Evolution.desktop', |     'evolution.desktop': 'org.gnome.Evolution.desktop', | ||||||
|     'file-roller.desktop': 'org.gnome.FileRoller.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', |     'gcalctool.desktop': 'org.gnome.Calculator.desktop', | ||||||
|     'geary.desktop': 'org.gnome.Geary.desktop', |     'geary.desktop': 'org.gnome.Geary.desktop', | ||||||
|     'gedit.desktop': 'org.gnome.gedit.desktop', |     'gedit.desktop': 'org.gnome.gedit.desktop', | ||||||
|     'glchess.desktop': 'gnome-chess.desktop', |     'glchess.desktop': 'org.gnome.Chess.desktop', | ||||||
|     'glines.desktop': 'five-or-more.desktop', |     'glines.desktop': 'org.gnome.five-or-more.desktop', | ||||||
|     'gnect.desktop': 'four-in-a-row.desktop', |     'gnect.desktop': 'org.gnome.Four-in-a-row.desktop', | ||||||
|     'gnibbles.desktop': 'org.gnome.Nibbles.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-boxes.desktop': 'org.gnome.Boxes.desktop', | ||||||
|     'gnome-calculator.desktop': 'org.gnome.Calculator.desktop', |     'gnome-calculator.desktop': 'org.gnome.Calculator.desktop', | ||||||
|  |     'gnome-chess.desktop': 'org.gnome.Chess.desktop', | ||||||
|     'gnome-clocks.desktop': 'org.gnome.clocks.desktop', |     'gnome-clocks.desktop': 'org.gnome.clocks.desktop', | ||||||
|     'gnome-contacts.desktop': 'org.gnome.Contacts.desktop', |     'gnome-contacts.desktop': 'org.gnome.Contacts.desktop', | ||||||
|     'gnome-documents.desktop': 'org.gnome.Documents.desktop', |     'gnome-documents.desktop': 'org.gnome.Documents.desktop', | ||||||
|     'gnome-font-viewer.desktop': 'org.gnome.font-viewer.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-nibbles.desktop': 'org.gnome.Nibbles.desktop', | ||||||
|     'gnome-mahjongg.desktop': 'org.gnome.Mahjongg.desktop', |     'gnome-mahjongg.desktop': 'org.gnome.Mahjongg.desktop', | ||||||
|  |     'gnome-mines.desktop': 'org.gnome.Mines.desktop', | ||||||
|     'gnome-music.desktop': 'org.gnome.Music.desktop', |     'gnome-music.desktop': 'org.gnome.Music.desktop', | ||||||
|     'gnome-photos.desktop': 'org.gnome.Photos.desktop', |     'gnome-photos.desktop': 'org.gnome.Photos.desktop', | ||||||
|  |     'gnome-robots.desktop': 'org.gnome.Robots.desktop', | ||||||
|     'gnome-screenshot.desktop': 'org.gnome.Screenshot.desktop', |     'gnome-screenshot.desktop': 'org.gnome.Screenshot.desktop', | ||||||
|     'gnome-software.desktop': 'org.gnome.Software.desktop', |     'gnome-software.desktop': 'org.gnome.Software.desktop', | ||||||
|     'gnome-terminal.desktop': 'org.gnome.Terminal.desktop', |     'gnome-terminal.desktop': 'org.gnome.Terminal.desktop', | ||||||
|  |     'gnome-tetravex.desktop': 'org.gnome.Tetravex.desktop', | ||||||
|     'gnome-tweaks.desktop': 'org.gnome.tweaks.desktop', |     'gnome-tweaks.desktop': 'org.gnome.tweaks.desktop', | ||||||
|     'gnome-weather.desktop': 'org.gnome.Weather.desktop', |     'gnome-weather.desktop': 'org.gnome.Weather.desktop', | ||||||
|     'gnomine.desktop': 'gnome-mines.desktop', |     'gnomine.desktop': 'org.gnome.Mines.desktop', | ||||||
|     'gnotravex.desktop': 'gnome-tetravex.desktop', |     'gnotravex.desktop': 'org.gnome.Tetravex.desktop', | ||||||
|     'gnotski.desktop': 'gnome-klotski.desktop', |     'gnotski.desktop': 'org.gnome.Klotski.desktop', | ||||||
|     'gtali.desktop': 'tali.desktop', |     'gtali.desktop': 'org.gnome.Tali.desktop', | ||||||
|     'iagno.desktop': 'org.gnome.Reversi.desktop', |     'iagno.desktop': 'org.gnome.Reversi.desktop', | ||||||
|     'nautilus.desktop': 'org.gnome.Nautilus.desktop', |     'nautilus.desktop': 'org.gnome.Nautilus.desktop', | ||||||
|     'org.gnome.gnome-2048.desktop': 'org.gnome.TwentyFortyEight.desktop', |     'org.gnome.gnome-2048.desktop': 'org.gnome.TwentyFortyEight.desktop', | ||||||
|     'org.gnome.taquin.desktop': 'org.gnome.Taquin.desktop', |     'org.gnome.taquin.desktop': 'org.gnome.Taquin.desktop', | ||||||
|     'org.gnome.Weather.Application.desktop': 'org.gnome.Weather.desktop', |     'org.gnome.Weather.Application.desktop': 'org.gnome.Weather.desktop', | ||||||
|     'polari.desktop': 'org.gnome.Polari.desktop', |     'polari.desktop': 'org.gnome.Polari.desktop', | ||||||
|  |     'tali.desktop': 'org.gnome.Tali.desktop', | ||||||
|     'totem.desktop': 'org.gnome.Totem.desktop', |     'totem.desktop': 'org.gnome.Totem.desktop', | ||||||
|     'evince.desktop': 'org.gnome.Evince.desktop', |     'evince.desktop': 'org.gnome.Evince.desktop', | ||||||
| }; | }; | ||||||
|   | |||||||
| @@ -25,7 +25,7 @@ var BackgroundMenu = class BackgroundMenu extends PopupMenu.PopupMenu { | |||||||
| function addBackgroundMenu(actor, layoutManager) { | function addBackgroundMenu(actor, layoutManager) { | ||||||
|     actor.reactive = true; |     actor.reactive = true; | ||||||
|     actor._backgroundMenu = new BackgroundMenu(layoutManager); |     actor._backgroundMenu = new BackgroundMenu(layoutManager); | ||||||
|     actor._backgroundManager = new PopupMenu.PopupMenuManager({ actor: actor }); |     actor._backgroundManager = new PopupMenu.PopupMenuManager(actor); | ||||||
|     actor._backgroundManager.addMenu(actor._backgroundMenu); |     actor._backgroundManager.addMenu(actor._backgroundMenu); | ||||||
|  |  | ||||||
|     function openMenu(x, y) { |     function openMenu(x, y) { | ||||||
|   | |||||||
| @@ -121,6 +121,7 @@ var BarLevel = class { | |||||||
|         cr.lineTo(x, (height - barLevelHeight) / 2); |         cr.lineTo(x, (height - barLevelHeight) / 2); | ||||||
|         cr.lineTo(x, (height + barLevelHeight) / 2); |         cr.lineTo(x, (height + barLevelHeight) / 2); | ||||||
|         cr.lineTo(barLevelBorderRadius + barLevelBorderWidth, (height + barLevelHeight) / 2); |         cr.lineTo(barLevelBorderRadius + barLevelBorderWidth, (height + barLevelHeight) / 2); | ||||||
|  |         if (this._value > 0) | ||||||
|           Clutter.cairo_set_source_color(cr, barLevelActiveColor); |           Clutter.cairo_set_source_color(cr, barLevelActiveColor); | ||||||
|         cr.fillPreserve(); |         cr.fillPreserve(); | ||||||
|         Clutter.cairo_set_source_color(cr, barLevelActiveBorderColor); |         Clutter.cairo_set_source_color(cr, barLevelActiveBorderColor); | ||||||
| @@ -143,6 +144,7 @@ var BarLevel = class { | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         /* end progress bar arc */ |         /* end progress bar arc */ | ||||||
|  |         if (this._value > 0) { | ||||||
|           if (this._value <= this._overdriveStart) |           if (this._value <= this._overdriveStart) | ||||||
|               Clutter.cairo_set_source_color(cr, barLevelActiveColor); |               Clutter.cairo_set_source_color(cr, barLevelActiveColor); | ||||||
|           else |           else | ||||||
| @@ -154,6 +156,7 @@ var BarLevel = class { | |||||||
|           cr.fillPreserve(); |           cr.fillPreserve(); | ||||||
|           cr.setLineWidth(barLevelBorderWidth); |           cr.setLineWidth(barLevelBorderWidth); | ||||||
|           cr.stroke(); |           cr.stroke(); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         /* draw overdrive separator */ |         /* draw overdrive separator */ | ||||||
|         if (overdriveActive) { |         if (overdriveActive) { | ||||||
|   | |||||||
| @@ -24,7 +24,7 @@ var POPUP_ANIMATION_TIME = 0.15; | |||||||
|  * placed.  The arrow position may be controlled via |  * placed.  The arrow position may be controlled via | ||||||
|  * setArrowOrigin(). The arrow side might be temporarily flipped |  * setArrowOrigin(). The arrow side might be temporarily flipped | ||||||
|  * depending on the box size and source position to keep the box |  * 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({ | var BoxPointer = GObject.registerClass({ | ||||||
| @@ -33,8 +33,6 @@ var BoxPointer = GObject.registerClass({ | |||||||
|     _init(arrowSide, binProperties) { |     _init(arrowSide, binProperties) { | ||||||
|         super._init(); |         super._init(); | ||||||
|  |  | ||||||
|         this.actor = this; |  | ||||||
|  |  | ||||||
|         this.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS); |         this.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS); | ||||||
|  |  | ||||||
|         this._arrowSide = arrowSide; |         this._arrowSide = arrowSide; | ||||||
| @@ -47,10 +45,6 @@ var BoxPointer = GObject.registerClass({ | |||||||
|         this._border.connect('repaint', this._drawBorder.bind(this)); |         this._border.connect('repaint', this._drawBorder.bind(this)); | ||||||
|         this.add_actor(this._border); |         this.add_actor(this._border); | ||||||
|         this.bin.raise(this._border); |         this.bin.raise(this._border); | ||||||
|         this._xOffset = 0; |  | ||||||
|         this._yOffset = 0; |  | ||||||
|         this._xPosition = 0; |  | ||||||
|         this._yPosition = 0; |  | ||||||
|         this._sourceAlignment = 0.5; |         this._sourceAlignment = 0.5; | ||||||
|         this._capturedEventId = 0; |         this._capturedEventId = 0; | ||||||
|         this._muteInput(); |         this._muteInput(); | ||||||
| @@ -118,23 +112,23 @@ var BoxPointer = GObject.registerClass({ | |||||||
|         if (animate & PopupAnimation.SLIDE) { |         if (animate & PopupAnimation.SLIDE) { | ||||||
|             switch (this._arrowSide) { |             switch (this._arrowSide) { | ||||||
|                 case St.Side.TOP: |                 case St.Side.TOP: | ||||||
|                     this.yOffset = -rise; |                     this.translation_y = -rise; | ||||||
|                     break; |                     break; | ||||||
|                 case St.Side.BOTTOM: |                 case St.Side.BOTTOM: | ||||||
|                     this.yOffset = rise; |                     this.translation_y = rise; | ||||||
|                     break; |                     break; | ||||||
|                 case St.Side.LEFT: |                 case St.Side.LEFT: | ||||||
|                     this.xOffset = -rise; |                     this.translation_x = -rise; | ||||||
|                     break; |                     break; | ||||||
|                 case St.Side.RIGHT: |                 case St.Side.RIGHT: | ||||||
|                     this.xOffset = rise; |                     this.translation_x = rise; | ||||||
|                     break; |                     break; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         Tweener.addTween(this, { opacity: 255, |         Tweener.addTween(this, { opacity: 255, | ||||||
|                                  xOffset: 0, |                                  translation_x: 0, | ||||||
|                                  yOffset: 0, |                                  translation_y: 0, | ||||||
|                                  transition: 'linear', |                                  transition: 'linear', | ||||||
|                                  onComplete: () => { |                                  onComplete: () => { | ||||||
|                                      this._unmuteInput(); |                                      this._unmuteInput(); | ||||||
| @@ -148,8 +142,8 @@ var BoxPointer = GObject.registerClass({ | |||||||
|         if (!this.visible) |         if (!this.visible) | ||||||
|             return; |             return; | ||||||
|  |  | ||||||
|         let xOffset = 0; |         let translationX = 0; | ||||||
|         let yOffset = 0; |         let translationY = 0; | ||||||
|         let themeNode = this.get_theme_node(); |         let themeNode = this.get_theme_node(); | ||||||
|         let rise = themeNode.get_length('-arrow-rise'); |         let rise = themeNode.get_length('-arrow-rise'); | ||||||
|         let fade = (animate & PopupAnimation.FADE); |         let fade = (animate & PopupAnimation.FADE); | ||||||
| @@ -158,16 +152,16 @@ var BoxPointer = GObject.registerClass({ | |||||||
|         if (animate & PopupAnimation.SLIDE) { |         if (animate & PopupAnimation.SLIDE) { | ||||||
|             switch (this._arrowSide) { |             switch (this._arrowSide) { | ||||||
|                 case St.Side.TOP: |                 case St.Side.TOP: | ||||||
|                     yOffset = rise; |                     translationY = rise; | ||||||
|                     break; |                     break; | ||||||
|                 case St.Side.BOTTOM: |                 case St.Side.BOTTOM: | ||||||
|                     yOffset = -rise; |                     translationY = -rise; | ||||||
|                     break; |                     break; | ||||||
|                 case St.Side.LEFT: |                 case St.Side.LEFT: | ||||||
|                     xOffset = rise; |                     translationX = rise; | ||||||
|                     break; |                     break; | ||||||
|                 case St.Side.RIGHT: |                 case St.Side.RIGHT: | ||||||
|                     xOffset = -rise; |                     translationX = -rise; | ||||||
|                     break; |                     break; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| @@ -176,15 +170,15 @@ var BoxPointer = GObject.registerClass({ | |||||||
|  |  | ||||||
|         Tweener.removeTweens(this); |         Tweener.removeTweens(this); | ||||||
|         Tweener.addTween(this, { opacity: fade ? 0 : 255, |         Tweener.addTween(this, { opacity: fade ? 0 : 255, | ||||||
|                                  xOffset: xOffset, |                                  translation_x: translationX, | ||||||
|                                  yOffset: yOffset, |                                  translation_y: translationY, | ||||||
|                                  transition: 'linear', |                                  transition: 'linear', | ||||||
|                                  time: animationTime, |                                  time: animationTime, | ||||||
|                                  onComplete: () => { |                                  onComplete: () => { | ||||||
|                                      this.hide(); |                                      this.hide(); | ||||||
|                                      this.opacity = 0; |                                      this.opacity = 0; | ||||||
|                                      this.xOffset = 0; |                                      this.translation_x = 0; | ||||||
|                                      this.yOffset = 0; |                                      this.translation_y = 0; | ||||||
|                                      if (onComplete) |                                      if (onComplete) | ||||||
|                                          onComplete(); |                                          onComplete(); | ||||||
|                                  } |                                  } | ||||||
| @@ -477,11 +471,15 @@ var BoxPointer = GObject.registerClass({ | |||||||
|     _reposition() { |     _reposition() { | ||||||
|         let sourceActor = this._sourceActor; |         let sourceActor = this._sourceActor; | ||||||
|         let alignment = this._arrowAlignment; |         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 |         // Position correctly relative to the sourceActor | ||||||
|         let sourceNode = sourceActor.get_theme_node(); |         let sourceNode = sourceActor.get_theme_node(); | ||||||
|         let sourceContentBox = sourceNode.get_content_box(sourceActor.get_allocation_box()); |         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 sourceCenterX = sourceAllocation.x1 + sourceContentBox.x1 + (sourceContentBox.x2 - sourceContentBox.x1) * this._sourceAlignment; | ||||||
|         let sourceCenterY = sourceAllocation.y1 + sourceContentBox.y1 + (sourceContentBox.y2 - sourceContentBox.y1) * this._sourceAlignment; |         let sourceCenterY = sourceAllocation.y1 + sourceContentBox.y1 + (sourceContentBox.y2 - sourceContentBox.y1) * this._sourceAlignment; | ||||||
|         let [minWidth, minHeight, natWidth, natHeight] = this.get_preferred_size(); |         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 |         // We also want to keep it onscreen, and separated from the | ||||||
|         // edge by the same distance as the main part of the box is |         // edge by the same distance as the main part of the box is | ||||||
|         // separated from its sourceActor |         // separated from its sourceActor | ||||||
|         let monitor = Main.layoutManager.findMonitorForActor(sourceActor); |         let workarea = this._workArea; | ||||||
|         let themeNode = this.get_theme_node(); |         let themeNode = this.get_theme_node(); | ||||||
|         let borderWidth = themeNode.get_length('-arrow-border-width'); |         let borderWidth = themeNode.get_length('-arrow-border-width'); | ||||||
|         let arrowBase = themeNode.get_length('-arrow-base'); |         let arrowBase = themeNode.get_length('-arrow-base'); | ||||||
| @@ -539,8 +537,8 @@ var BoxPointer = GObject.registerClass({ | |||||||
|         case St.Side.BOTTOM: |         case St.Side.BOTTOM: | ||||||
|             resX = sourceCenterX - (halfMargin + (natWidth - margin) * alignment); |             resX = sourceCenterX - (halfMargin + (natWidth - margin) * alignment); | ||||||
|  |  | ||||||
|             resX = Math.max(resX, monitor.x + padding); |             resX = Math.max(resX, workarea.x + padding); | ||||||
|             resX = Math.min(resX, monitor.x + monitor.width - (padding + natWidth)); |             resX = Math.min(resX, workarea.x + workarea.width - (padding + natWidth)); | ||||||
|  |  | ||||||
|             arrowOrigin = sourceCenterX - resX; |             arrowOrigin = sourceCenterX - resX; | ||||||
|             if (arrowOrigin <= (x1 + (borderRadius + halfBase))) { |             if (arrowOrigin <= (x1 + (borderRadius + halfBase))) { | ||||||
| @@ -558,8 +556,8 @@ var BoxPointer = GObject.registerClass({ | |||||||
|         case St.Side.RIGHT: |         case St.Side.RIGHT: | ||||||
|             resY = sourceCenterY - (halfMargin + (natHeight - margin) * alignment); |             resY = sourceCenterY - (halfMargin + (natHeight - margin) * alignment); | ||||||
|  |  | ||||||
|             resY = Math.max(resY, monitor.y + padding); |             resY = Math.max(resY, workarea.y + padding); | ||||||
|             resY = Math.min(resY, monitor.y + monitor.height - (padding + natHeight)); |             resY = Math.min(resY, workarea.y + workarea.height - (padding + natHeight)); | ||||||
|  |  | ||||||
|             arrowOrigin = sourceCenterY - resY; |             arrowOrigin = sourceCenterY - resY; | ||||||
|             if (arrowOrigin <= (y1 + (borderRadius + halfBase))) { |             if (arrowOrigin <= (y1 + (borderRadius + halfBase))) { | ||||||
| @@ -583,9 +581,9 @@ var BoxPointer = GObject.registerClass({ | |||||||
|             parent = parent.get_parent(); |             parent = parent.get_parent(); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         this._xPosition = Math.floor(x); |         // Actually set the position | ||||||
|         this._yPosition = Math.floor(y); |         this.x = Math.floor(x); | ||||||
|         this._shiftActor(); |         this.y = Math.floor(y); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     // @origin: Coordinate specifying middle of the arrow, along |     // @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) { |     _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 [minWidth, minHeight, boxWidth, boxHeight] = this.get_preferred_size(); | ||||||
|         let monitorActor = this.sourceActor; |         let workarea = this._workArea; | ||||||
|         if (!monitorActor) |  | ||||||
|             monitorActor = this; |  | ||||||
|         let monitor = Main.layoutManager.findMonitorForActor(monitorActor); |  | ||||||
|  |  | ||||||
|         switch (arrowSide) { |         switch (arrowSide) { | ||||||
|         case St.Side.TOP: |         case St.Side.TOP: | ||||||
|             if (sourceAllocation.y2 + boxHeight > monitor.y + monitor.height && |             if (sourceAllocation.y2 + boxHeight > workarea.y + workarea.height && | ||||||
|                 boxHeight < sourceAllocation.y1 - monitor.y) |                 boxHeight < sourceAllocation.y1 - workarea.y) | ||||||
|                 return St.Side.BOTTOM; |                 return St.Side.BOTTOM; | ||||||
|             break; |             break; | ||||||
|         case St.Side.BOTTOM: |         case St.Side.BOTTOM: | ||||||
|             if (sourceAllocation.y1 - boxHeight < monitor.y && |             if (sourceAllocation.y1 - boxHeight < workarea.y && | ||||||
|                 boxHeight < monitor.y + monitor.height - sourceAllocation.y2) |                 boxHeight < workarea.y + workarea.height - sourceAllocation.y2) | ||||||
|                 return St.Side.TOP; |                 return St.Side.TOP; | ||||||
|             break; |             break; | ||||||
|         case St.Side.LEFT: |         case St.Side.LEFT: | ||||||
|             if (sourceAllocation.x2 + boxWidth > monitor.x + monitor.width && |             if (sourceAllocation.x2 + boxWidth > workarea.x + workarea.width && | ||||||
|                 boxWidth < sourceAllocation.x1 - monitor.x) |                 boxWidth < sourceAllocation.x1 - workarea.x) | ||||||
|                 return St.Side.RIGHT; |                 return St.Side.RIGHT; | ||||||
|             break; |             break; | ||||||
|         case St.Side.RIGHT: |         case St.Side.RIGHT: | ||||||
|             if (sourceAllocation.x1 - boxWidth < monitor.x && |             if (sourceAllocation.x1 - boxWidth < workarea.x && | ||||||
|                 boxWidth < monitor.x + monitor.width - sourceAllocation.x2) |                 boxWidth < workarea.x + workarea.width - sourceAllocation.x2) | ||||||
|                 return St.Side.LEFT; |                 return St.Side.LEFT; | ||||||
|             break; |             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) { |     updateArrowSide(side) { | ||||||
|         this._arrowSide = side; |         this._arrowSide = side; | ||||||
|         this._border.queue_repaint(); |         this._border.queue_repaint(); | ||||||
|   | |||||||
| @@ -23,20 +23,8 @@ var KeyringDialog = class extends ModalDialog.ModalDialog { | |||||||
|         this._content = new Dialog.MessageDialogContent({ icon }); |         this._content = new Dialog.MessageDialogContent({ icon }); | ||||||
|         this.contentLayout.add(this._content); |         this.contentLayout.add(this._content); | ||||||
|  |  | ||||||
|         // FIXME: Why does this break now? |  | ||||||
|         /* |  | ||||||
|         this.prompt.bind_property('message', this._content, 'title', GObject.BindingFlags.SYNC_CREATE); |         this.prompt.bind_property('message', this._content, 'title', GObject.BindingFlags.SYNC_CREATE); | ||||||
|         this.prompt.bind_property('description', this._content, 'body', GObject.BindingFlags.SYNC_CREATE); |         this.prompt.bind_property('description', this._content, 'body', GObject.BindingFlags.SYNC_CREATE); | ||||||
|         */ |  | ||||||
|         this.prompt.connect('notify::message', () => { |  | ||||||
|             this._content.title = this.prompt.message; |  | ||||||
|         }); |  | ||||||
|         this._content.title = this.prompt.message; |  | ||||||
|  |  | ||||||
|         this.prompt.connect('notify::description', () => { |  | ||||||
|             this._content.body = this.prompt.description; |  | ||||||
|         }); |  | ||||||
|         this._content.body = this.prompt.description; |  | ||||||
|  |  | ||||||
|         this._workSpinner = null; |         this._workSpinner = null; | ||||||
|         this._controlTable = null; |         this._controlTable = null; | ||||||
|   | |||||||
| @@ -401,7 +401,7 @@ var ChatSource = class extends MessageTray.Source { | |||||||
|         if (this._client.is_handling_channel(this._channel)) { |         if (this._client.is_handling_channel(this._channel)) { | ||||||
|             // We are handling the channel, try to pass it to Empathy or Polari |             // We are handling the channel, try to pass it to Empathy or Polari | ||||||
|             // (depending on the channel type) |             // (depending on the channel type) | ||||||
|             // We don't check if either app is availble - mission control will |             // We don't check if either app is available - mission control will | ||||||
|             // fallback to something else if activation fails |             // fallback to something else if activation fails | ||||||
|  |  | ||||||
|             let target; |             let target; | ||||||
|   | |||||||
| @@ -584,22 +584,18 @@ var Dash = class Dash { | |||||||
|         let firstButton = iconChildren[0].child; |         let firstButton = iconChildren[0].child; | ||||||
|         let firstIcon = firstButton._delegate.icon; |         let firstIcon = firstButton._delegate.icon; | ||||||
|  |  | ||||||
|         let minHeight, natHeight; |         // Enforce valid spacings during the size request | ||||||
|         let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; |  | ||||||
|  |  | ||||||
|         // Enforce the current icon size during the size request |  | ||||||
|         firstIcon.icon.ensure_style(); |         firstIcon.icon.ensure_style(); | ||||||
|         let [, currentHeight] = firstIcon.icon.get_size(); |         let [, iconHeight] = firstIcon.icon.get_preferred_height(-1); | ||||||
|         firstIcon.icon.set_height(this.iconSize * scaleFactor); |         let [, buttonHeight] = firstButton.get_preferred_height(-1); | ||||||
|         [minHeight, natHeight] = firstButton.get_preferred_height(-1); |  | ||||||
|         firstIcon.icon.set_height(currentHeight); |  | ||||||
|  |  | ||||||
|         // Subtract icon padding and box spacing from the available height |         // 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; |                        (iconChildren.length - 1) * spacing; | ||||||
|  |  | ||||||
|         let availSize = availHeight / iconChildren.length; |         let availSize = availHeight / iconChildren.length; | ||||||
|  |  | ||||||
|  |         let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; | ||||||
|         let iconSizes = baseIconSizes.map(s => s * scaleFactor); |         let iconSizes = baseIconSizes.map(s => s * scaleFactor); | ||||||
|  |  | ||||||
|         let newIconSize = baseIconSizes[0]; |         let newIconSize = baseIconSizes[0]; | ||||||
| @@ -903,7 +899,7 @@ var Dash = class Dash { | |||||||
|                 favPos++; |                 favPos++; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         // No drag placeholder means we don't wan't to favorite the app |         // No drag placeholder means we don't want to favorite the app | ||||||
|         // and we are dragging it to its original position |         // and we are dragging it to its original position | ||||||
|         if (!this._dragPlaceholder) |         if (!this._dragPlaceholder) | ||||||
|             return true; |             return true; | ||||||
|   | |||||||
| @@ -118,7 +118,7 @@ var WorldClocksSection = class WorldClocksSection { | |||||||
|             if (!clocks[i].location) |             if (!clocks[i].location) | ||||||
|                 continue; |                 continue; | ||||||
|             let l = world.deserialize(clocks[i].location); |             let l = world.deserialize(clocks[i].location); | ||||||
|             if (l) |             if (l && l.get_timezone() != null) | ||||||
|                 this._locations.push({ location: l }); |                 this._locations.push({ location: l }); | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @@ -136,11 +136,12 @@ var WorldClocksSection = class WorldClocksSection { | |||||||
|         layout.attach(header, 0, 0, 2, 1); |         layout.attach(header, 0, 0, 2, 1); | ||||||
|         this.actor.label_actor = header; |         this.actor.label_actor = header; | ||||||
|  |  | ||||||
|  |         let localOffset = GLib.DateTime.new_now_local().get_utc_offset(); | ||||||
|  |  | ||||||
|         for (let i = 0; i < this._locations.length; i++) { |         for (let i = 0; i < this._locations.length; i++) { | ||||||
|             let l = this._locations[i].location; |             let l = this._locations[i].location; | ||||||
|  |  | ||||||
|             let name = l.get_level() == GWeather.LocationLevel.NAMED_TIMEZONE ? l.get_name() |             let name = l.get_city_name() || l.get_name(); | ||||||
|                                                                               : l.get_city_name(); |  | ||||||
|             let label = new St.Label({ style_class: 'world-clocks-city', |             let label = new St.Label({ style_class: 'world-clocks-city', | ||||||
|                                        text: name, |                                        text: name, | ||||||
|                                        x_align: Clutter.ActorAlign.START, |                                        x_align: Clutter.ActorAlign.START, | ||||||
| @@ -149,7 +150,8 @@ var WorldClocksSection = class WorldClocksSection { | |||||||
|  |  | ||||||
|             let time = new St.Label({ style_class: 'world-clocks-time' }); |             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 fmt = (Math.trunc(offset) == offset) ? '%s%.0f' : '%s%.1f'; | ||||||
|             let prefix = (offset >= 0) ? '+' : '-'; |             let prefix = (offset >= 0) ? '+' : '-'; | ||||||
|             let tz = new St.Label({ style_class: 'world-clocks-timezone', |             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() { |     _updateLabels() { | ||||||
|         for (let i = 0; i < this._locations.length; i++) { |         for (let i = 0; i < this._locations.length; i++) { | ||||||
|             let l = this._locations[i]; |             let l = this._locations[i]; | ||||||
|             let tz = GLib.TimeZone.new(l.location.get_timezone().get_tzid()); |             let now = this._getTimeAtLocation(l.location); | ||||||
|             let now = GLib.DateTime.new_now(tz); |  | ||||||
|             l.actor.text = Util.formatTime(now, { timeOnly: true }); |             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._clockDisplay); | ||||||
|         box.add_actor(this._indicator.actor); |         box.add_actor(this._indicator.actor); | ||||||
|  |  | ||||||
|         this.actor.label_actor = this._clockDisplay; |         this.label_actor = this._clockDisplay; | ||||||
|         this.actor.add_actor(box); |         this.add_actor(box); | ||||||
|         this.actor.add_style_class_name ('clock-display'); |         this.add_style_class_name ('clock-display'); | ||||||
|  |  | ||||||
|  |  | ||||||
|         let layout = new FreezableBinLayout(); |         let layout = new FreezableBinLayout(); | ||||||
|         let bin = new St.Widget({ layout_manager: layout }); |         let bin = new St.Widget({ layout_manager: layout }); | ||||||
|   | |||||||
| @@ -175,10 +175,10 @@ var MessageDialogContent = GObject.registerClass({ | |||||||
|             this[`_${prop}`].add_style_class_name(`message-dialog-${prop}`); |             this[`_${prop}`].add_style_class_name(`message-dialog-${prop}`); | ||||||
|         }); |         }); | ||||||
|  |  | ||||||
|         let textProps = { ellipsize_mode: Pango.EllipsizeMode.NONE, |         let textProps = { ellipsize: Pango.EllipsizeMode.NONE, | ||||||
|                           line_wrap: true }; |                           line_wrap: true }; | ||||||
|         Object.assign(this._subtitle.clutter_text, textProps); |         this._subtitle.clutter_text.set(textProps); | ||||||
|         Object.assign(this._body.clutter_text, textProps); |         this._body.clutter_text.set(textProps); | ||||||
|  |  | ||||||
|         if (!params.hasOwnProperty('style_class')) |         if (!params.hasOwnProperty('style_class')) | ||||||
|             params.style_class = 'message-dialog-main-layout'; |             params.style_class = 'message-dialog-main-layout'; | ||||||
|   | |||||||
| @@ -306,6 +306,9 @@ var _Draggable = class _Draggable { | |||||||
|      * for the draggable. |      * for the draggable. | ||||||
|      */ |      */ | ||||||
|     startDrag(stageX, stageY, time, sequence, device) { |     startDrag(stageX, stageY, time, sequence, device) { | ||||||
|  |         if (currentDraggable) | ||||||
|  |             return; | ||||||
|  |  | ||||||
|         if (device == undefined) { |         if (device == undefined) { | ||||||
|             let event = Clutter.get_current_event(); |             let event = Clutter.get_current_event(); | ||||||
|  |  | ||||||
| @@ -447,7 +450,8 @@ var _Draggable = class _Draggable { | |||||||
|         let [stageX, stageY] = event.get_coords(); |         let [stageX, stageY] = event.get_coords(); | ||||||
|  |  | ||||||
|         // See if the user has moved the mouse enough to trigger a drag |         // 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 && |         if (!currentDraggable && | ||||||
|             (Math.abs(stageX - this._dragStartX) > threshold || |             (Math.abs(stageX - this._dragStartX) > threshold || | ||||||
|              Math.abs(stageY - this._dragStartY) > threshold)) { |              Math.abs(stageY - this._dragStartY) > threshold)) { | ||||||
|   | |||||||
| @@ -57,6 +57,60 @@ function _patchLayoutClass(layoutClass, styleProps) { | |||||||
|     }; |     }; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | function _adjustEasingTime(msecs) { | ||||||
|  |     if (!St.Settings.get().enable_animations) | ||||||
|  |         return 1; | ||||||
|  |     return St.get_slow_down_factor() * msecs; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function _easeActor(actor, props, easingParams) { | ||||||
|  |     let { duration, delay, mode, | ||||||
|  |           onStopped, onUpdate, onComplete } = easingParams; | ||||||
|  |  | ||||||
|  |     let animatedProps = Object.keys(props).map(p => p.replace('_', '-', 'g')); | ||||||
|  |  | ||||||
|  |     actor.save_easing_state(); | ||||||
|  |  | ||||||
|  |     if (duration) | ||||||
|  |         actor.set_easing_duration(duration); | ||||||
|  |  | ||||||
|  |     if (delay) | ||||||
|  |         actor.set_easing_delay(delay); | ||||||
|  |  | ||||||
|  |     if (mode) | ||||||
|  |         actor.set_easing_mode(mode); | ||||||
|  |  | ||||||
|  |     actor.set(props); | ||||||
|  |  | ||||||
|  |     if (onUpdate || onComplete || onStopped) { | ||||||
|  |         let transition = actor.get_transition(animatedProps[0]); | ||||||
|  |  | ||||||
|  |         if (transition) { | ||||||
|  |             let updateId = 0; | ||||||
|  |             if (onUpdate) | ||||||
|  |                 updateId = transition.connect('new-frame', onUpdate); | ||||||
|  |  | ||||||
|  |             let id = transition.connect('stopped', isFinished => { | ||||||
|  |                 if (updateId != 0) | ||||||
|  |                     transition.disconnect(updateId); | ||||||
|  |                 transition.disconnect(id); | ||||||
|  |  | ||||||
|  |                 if (onComplete) | ||||||
|  |                     onComplete(); | ||||||
|  |                 if (onStopped) | ||||||
|  |                     onStopped(isFinished); | ||||||
|  |             }); | ||||||
|  |         } else { | ||||||
|  |             if (onComplete) | ||||||
|  |                 onComplete(); | ||||||
|  |             if (onStopped) | ||||||
|  |                 onStopped(true); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     actor.restore_easing_state(); | ||||||
|  | } | ||||||
|  |  | ||||||
| function _loggingFunc() { | function _loggingFunc() { | ||||||
|     let fields = {'MESSAGE': [].join.call(arguments, ', ')}; |     let fields = {'MESSAGE': [].join.call(arguments, ', ')}; | ||||||
|     let domain = "GNOME Shell"; |     let domain = "GNOME Shell"; | ||||||
| @@ -93,9 +147,31 @@ function init() { | |||||||
|                                             column_spacing: 'spacing-columns' }); |                                             column_spacing: 'spacing-columns' }); | ||||||
|     _patchLayoutClass(Clutter.BoxLayout, { spacing: 'spacing' }); |     _patchLayoutClass(Clutter.BoxLayout, { spacing: 'spacing' }); | ||||||
|  |  | ||||||
|  |     let origSetEasingDuration = Clutter.Actor.prototype.set_easing_duration; | ||||||
|  |     Clutter.Actor.prototype.set_easing_duration = function(msecs) { | ||||||
|  |         origSetEasingDuration.call(this, _adjustEasingTime(msecs)); | ||||||
|  |     }; | ||||||
|  |     let origSetEasingDelay = Clutter.Actor.prototype.set_easing_delay; | ||||||
|  |     Clutter.Actor.prototype.set_easing_delay = function(msecs) { | ||||||
|  |         origSetEasingDelay.call(this, _adjustEasingTime(msecs)); | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     Clutter.Actor.prototype.ease = function(props, easingParams) { | ||||||
|  |         _easeActor(this, props, easingParams); | ||||||
|  |     }; | ||||||
|  |  | ||||||
|     Clutter.Actor.prototype.toString = function() { |     Clutter.Actor.prototype.toString = function() { | ||||||
|         return St.describe_actor(this); |         return St.describe_actor(this); | ||||||
|     }; |     }; | ||||||
|  |     // Deprecation warning for former JS classes turned into an actor subclass | ||||||
|  |     Object.defineProperty(Clutter.Actor.prototype, 'actor', { | ||||||
|  |         get() { | ||||||
|  |             let klass = this.constructor.name; | ||||||
|  |             let { stack } = new Error(); | ||||||
|  |             log(`Usage of object.actor is deprecated for ${klass}\n${stack}`); | ||||||
|  |             return this; | ||||||
|  |         } | ||||||
|  |     }); | ||||||
|  |  | ||||||
|     let origToString = Object.prototype.toString; |     let origToString = Object.prototype.toString; | ||||||
|     Object.prototype.toString = function() { |     Object.prototype.toString = function() { | ||||||
|   | |||||||
| @@ -272,7 +272,7 @@ var CandidatePopup = class CandidatePopup { | |||||||
|  |  | ||||||
|     _setDummyCursorGeometry(x, y, w, h) { |     _setDummyCursorGeometry(x, y, w, h) { | ||||||
|         Main.layoutManager.setDummyCursorGeometry(x, y, w, h); |         Main.layoutManager.setDummyCursorGeometry(x, y, w, h); | ||||||
|         if (this._boxPointer.actor.visible) |         if (this._boxPointer.visible) | ||||||
|             this._boxPointer.setPosition(Main.layoutManager.dummyCursor, 0); |             this._boxPointer.setPosition(Main.layoutManager.dummyCursor, 0); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -285,7 +285,7 @@ var CandidatePopup = class CandidatePopup { | |||||||
|         if (isVisible) { |         if (isVisible) { | ||||||
|             this._boxPointer.setPosition(Main.layoutManager.dummyCursor, 0); |             this._boxPointer.setPosition(Main.layoutManager.dummyCursor, 0); | ||||||
|             this._boxPointer.open(BoxPointer.PopupAnimation.NONE); |             this._boxPointer.open(BoxPointer.PopupAnimation.NONE); | ||||||
|             this._boxPointer.actor.raise_top(); |             this._boxPointer.raise_top(); | ||||||
|         } else { |         } else { | ||||||
|             this._boxPointer.close(BoxPointer.PopupAnimation.NONE); |             this._boxPointer.close(BoxPointer.PopupAnimation.NONE); | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -43,8 +43,6 @@ class BaseIcon extends St.Bin { | |||||||
|                       x_fill: true, |                       x_fill: true, | ||||||
|                       y_fill: true }); |                       y_fill: true }); | ||||||
|  |  | ||||||
|         this.actor = this; |  | ||||||
|  |  | ||||||
|         this.connect('destroy', this._onDestroy.bind(this)); |         this.connect('destroy', this._onDestroy.bind(this)); | ||||||
|  |  | ||||||
|         this._box = new St.BoxLayout({ vertical: true }); |         this._box = new St.BoxLayout({ vertical: true }); | ||||||
| @@ -104,6 +102,7 @@ class BaseIcon extends St.Bin { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     vfunc_style_changed() { |     vfunc_style_changed() { | ||||||
|  |         super.vfunc_style_changed(); | ||||||
|         let node = this.get_theme_node(); |         let node = this.get_theme_node(); | ||||||
|  |  | ||||||
|         let size; |         let size; | ||||||
| @@ -187,8 +186,6 @@ var IconGrid = GObject.registerClass({ | |||||||
|         super._init({ style_class: 'icon-grid', |         super._init({ style_class: 'icon-grid', | ||||||
|                       y_align: Clutter.ActorAlign.START }); |                       y_align: Clutter.ActorAlign.START }); | ||||||
|  |  | ||||||
|         this.actor = this; |  | ||||||
|  |  | ||||||
|         params = Params.parse(params, { rowLimit: null, |         params = Params.parse(params, { rowLimit: null, | ||||||
|                                         columnLimit: null, |                                         columnLimit: null, | ||||||
|                                         minRows: 1, |                                         minRows: 1, | ||||||
| @@ -843,7 +840,7 @@ var PaginatedIconGrid = GObject.registerClass({ | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     // Overriden from IconGrid |     // Overridden from IconGrid | ||||||
|     _getChildrenToAnimate() { |     _getChildrenToAnimate() { | ||||||
|         let children = this._getVisibleChildren(); |         let children = this._getVisibleChildren(); | ||||||
|         let firstIndex = this._childrenPerPage * this.currentPage; |         let firstIndex = this._childrenPerPage * this.currentPage; | ||||||
|   | |||||||
| @@ -282,11 +282,11 @@ var Key = class Key { | |||||||
|                                                        y_fill: true, |                                                        y_fill: true, | ||||||
|                                                        x_align: St.Align.START }); |                                                        x_align: St.Align.START }); | ||||||
|         this._boxPointer.hide(); |         this._boxPointer.hide(); | ||||||
|         Main.layoutManager.addChrome(this._boxPointer.actor); |         Main.layoutManager.addChrome(this._boxPointer); | ||||||
|         this._boxPointer.setPosition(this.keyButton, 0.5); |         this._boxPointer.setPosition(this.keyButton, 0.5); | ||||||
|  |  | ||||||
|         // Adds style to existing keyboard style to avoid repetition |         // Adds style to existing keyboard style to avoid repetition | ||||||
|         this._boxPointer.actor.add_style_class_name('keyboard-subkeys'); |         this._boxPointer.add_style_class_name('keyboard-subkeys'); | ||||||
|         this._getExtendedKeys(); |         this._getExtendedKeys(); | ||||||
|         this.keyButton._extended_keys = this._extended_keyboard; |         this.keyButton._extended_keys = this._extended_keyboard; | ||||||
|     } |     } | ||||||
| @@ -1049,7 +1049,7 @@ var Keyboard = class Keyboard { | |||||||
|         this._a11yApplicationsSettings.connect('changed', this._syncEnabled.bind(this)); |         this._a11yApplicationsSettings.connect('changed', this._syncEnabled.bind(this)); | ||||||
|         this._lastDeviceId = null; |         this._lastDeviceId = null; | ||||||
|         this._suggestions = null; |         this._suggestions = null; | ||||||
|         this._emojiKeyVisible = true; |         this._emojiKeyVisible = Meta.is_wayland_compositor(); | ||||||
|  |  | ||||||
|         this._focusTracker = new FocusTracker(); |         this._focusTracker = new FocusTracker(); | ||||||
|         this._focusTracker.connect('position-changed', this._onFocusPositionChanged.bind(this)); |         this._focusTracker.connect('position-changed', this._onFocusPositionChanged.bind(this)); | ||||||
| @@ -1144,6 +1144,7 @@ var Keyboard = class Keyboard { | |||||||
|             this._keyboardController.disconnect(this._keypadVisibleId); |             this._keyboardController.disconnect(this._keypadVisibleId); | ||||||
|         if (this._focusNotifyId) |         if (this._focusNotifyId) | ||||||
|             global.stage.disconnect(this._focusNotifyId); |             global.stage.disconnect(this._focusNotifyId); | ||||||
|  |         this._clearShowIdle(); | ||||||
|         this._keyboard = null; |         this._keyboard = null; | ||||||
|         this.actor.destroy(); |         this.actor.destroy(); | ||||||
|         this.actor = null; |         this.actor = null; | ||||||
| @@ -1162,7 +1163,7 @@ var Keyboard = class Keyboard { | |||||||
|         this._keyboardController = new KeyboardController(); |         this._keyboardController = new KeyboardController(); | ||||||
|  |  | ||||||
|         this._groups = {}; |         this._groups = {}; | ||||||
|         this._current_page = null; |         this._currentPage = null; | ||||||
|  |  | ||||||
|         this._suggestions = new Suggestions(); |         this._suggestions = new Suggestions(); | ||||||
|         this.actor.add(this._suggestions.actor, |         this.actor.add(this._suggestions.actor, | ||||||
| @@ -1202,10 +1203,12 @@ var Keyboard = class Keyboard { | |||||||
|         this._keyboardNotifyId = this._keyboardController.connect('active-group', this._onGroupChanged.bind(this)); |         this._keyboardNotifyId = this._keyboardController.connect('active-group', this._onGroupChanged.bind(this)); | ||||||
|         this._keyboardGroupsChangedId = this._keyboardController.connect('groups-changed', this._onKeyboardGroupsChanged.bind(this)); |         this._keyboardGroupsChangedId = this._keyboardController.connect('groups-changed', this._onKeyboardGroupsChanged.bind(this)); | ||||||
|         this._keyboardStateId = this._keyboardController.connect('panel-state', this._onKeyboardStateChanged.bind(this)); |         this._keyboardStateId = this._keyboardController.connect('panel-state', this._onKeyboardStateChanged.bind(this)); | ||||||
|         this._emojiKeyVisibleId = this._keyboardController.connect('emoji-visible', this._onEmojiKeyVisible.bind(this)); |  | ||||||
|         this._keypadVisibleId = this._keyboardController.connect('keypad-visible', this._onKeypadVisible.bind(this)); |         this._keypadVisibleId = this._keyboardController.connect('keypad-visible', this._onKeypadVisible.bind(this)); | ||||||
|         this._focusNotifyId = global.stage.connect('notify::key-focus', this._onKeyFocusChanged.bind(this)); |         this._focusNotifyId = global.stage.connect('notify::key-focus', this._onKeyFocusChanged.bind(this)); | ||||||
|  |  | ||||||
|  |         if (Meta.is_wayland_compositor()) | ||||||
|  |             this._emojiKeyVisibleId = this._keyboardController.connect('emoji-visible', this._onEmojiKeyVisible.bind(this)); | ||||||
|  |  | ||||||
|         this._relayout(); |         this._relayout(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -1227,6 +1230,7 @@ var Keyboard = class Keyboard { | |||||||
|         if (!this._showIdleId) { |         if (!this._showIdleId) { | ||||||
|           this._showIdleId = GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => { |           this._showIdleId = GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => { | ||||||
|               this.show(Main.layoutManager.focusIndex); |               this.show(Main.layoutManager.focusIndex); | ||||||
|  |               this._showIdleId = 0; | ||||||
|               return GLib.SOURCE_REMOVE; |               return GLib.SOURCE_REMOVE; | ||||||
|           }); |           }); | ||||||
|           GLib.Source.set_name_by_id(this._showIdleId, '[gnome-shell] this.show'); |           GLib.Source.set_name_by_id(this._showIdleId, '[gnome-shell] this.show'); | ||||||
| @@ -1353,7 +1357,7 @@ var Keyboard = class Keyboard { | |||||||
|             } else if (switchToLevel == 1) { |             } else if (switchToLevel == 1) { | ||||||
|                 extraButton.connect('long-press', () => { |                 extraButton.connect('long-press', () => { | ||||||
|                     this._latched = true; |                     this._latched = true; | ||||||
|                     this._setCurrentLevelLatched(this._current_page, this._latched); |                     this._setCurrentLevelLatched(this._currentPage, this._latched); | ||||||
|                 }); |                 }); | ||||||
|             } |             } | ||||||
|  |  | ||||||
| @@ -1380,8 +1384,8 @@ var Keyboard = class Keyboard { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     _updateCurrentPageVisible() { |     _updateCurrentPageVisible() { | ||||||
|         if (this._current_page) |         if (this._currentPage) | ||||||
|             this._current_page.visible = !this._emojiActive && !this._keypadVisible; |             this._currentPage.visible = !this._emojiActive && !this._keypadVisible; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     _setEmojiActive(active) { |     _setEmojiActive(active) { | ||||||
| @@ -1440,7 +1444,7 @@ var Keyboard = class Keyboard { | |||||||
|  |  | ||||||
|     _getGridSlots() { |     _getGridSlots() { | ||||||
|         let numOfHorizSlots = 0, numOfVertSlots; |         let numOfHorizSlots = 0, numOfVertSlots; | ||||||
|         let rows = this._current_page.get_children(); |         let rows = this._currentPage.get_children(); | ||||||
|         numOfVertSlots = rows.length; |         numOfVertSlots = rows.length; | ||||||
|  |  | ||||||
|         for (let i = 0; i < rows.length; ++i) { |         for (let i = 0; i < rows.length; ++i) { | ||||||
| @@ -1470,7 +1474,12 @@ var Keyboard = class Keyboard { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     _onKeyboardGroupsChanged(keyboard) { |     _onKeyboardGroupsChanged(keyboard) { | ||||||
|         this._groups = []; |         let nonGroupActors = [this._emojiSelection.actor, this._keypad.actor]; | ||||||
|  |         this._aspectContainer.get_children().filter(c => !nonGroupActors.includes(c)).forEach(c => { | ||||||
|  |             c.destroy(); | ||||||
|  |         }); | ||||||
|  |  | ||||||
|  |         this._groups = {}; | ||||||
|         this._onGroupChanged(); |         this._onGroupChanged(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -1512,13 +1521,24 @@ var Keyboard = class Keyboard { | |||||||
|     _setActiveLayer(activeLevel) { |     _setActiveLayer(activeLevel) { | ||||||
|         let activeGroupName = this._keyboardController.getCurrentGroup(); |         let activeGroupName = this._keyboardController.getCurrentGroup(); | ||||||
|         let layers = this._groups[activeGroupName]; |         let layers = this._groups[activeGroupName]; | ||||||
|  |         let currentPage = layers[activeLevel]; | ||||||
|  |  | ||||||
|         if (this._current_page != null) { |         if (this._currentPage == currentPage) { | ||||||
|             this._setCurrentLevelLatched(this._current_page, false); |             this._updateCurrentPageVisible(); | ||||||
|             this._current_page.hide(); |             return; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         this._current_page = layers[activeLevel]; |         if (this._currentPage != null) { | ||||||
|  |             this._setCurrentLevelLatched(this._currentPage, false); | ||||||
|  |             this._currentPage.disconnect(this._currentPage._destroyID); | ||||||
|  |             this._currentPage.hide(); | ||||||
|  |             delete this._currentPage._destroyID; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         this._currentPage = currentPage; | ||||||
|  |         this._currentPage._destroyID = this._currentPage.connect('destroy', () => { | ||||||
|  |             this._currentPage = null; | ||||||
|  |         }); | ||||||
|         this._updateCurrentPageVisible(); |         this._updateCurrentPageVisible(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -1606,18 +1626,6 @@ var Keyboard = class Keyboard { | |||||||
|         this.setCursorLocation(null); |         this.setCursorLocation(null); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     _hideSubkeys() { |  | ||||||
|         if (this._subkeysBoxPointer) { |  | ||||||
|             this._subkeysBoxPointer.hide(BoxPointer.PopupAnimation.FULL); |  | ||||||
|             this._subkeysBoxPointer = null; |  | ||||||
|         } |  | ||||||
|         if (this._capturedEventId) { |  | ||||||
|             this.actor.disconnect(this._capturedEventId); |  | ||||||
|             this._capturedEventId = 0; |  | ||||||
|         } |  | ||||||
|         this._capturedPress = false; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     resetSuggestions() { |     resetSuggestions() { | ||||||
|         if (this._suggestions) |         if (this._suggestions) | ||||||
|             this._suggestions.clear(); |             this._suggestions.clear(); | ||||||
|   | |||||||
| @@ -252,7 +252,7 @@ var LayoutManager = GObject.registerClass({ | |||||||
|  |  | ||||||
|         // A dummy actor that tracks the mouse or text cursor, based on the |         // A dummy actor that tracks the mouse or text cursor, based on the | ||||||
|         // position and size set in setDummyCursorGeometry. |         // 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); |         this.uiGroup.add_actor(this.dummyCursor); | ||||||
|  |  | ||||||
|         global.stage.remove_actor(global.top_window_group); |         global.stage.remove_actor(global.top_window_group); | ||||||
|   | |||||||
| @@ -18,9 +18,6 @@ var NO_CHANGE = 0.0; | |||||||
| var POINTER_REST_TIME = 1000; // milliseconds | var POINTER_REST_TIME = 1000; // milliseconds | ||||||
|  |  | ||||||
| // Settings | // Settings | ||||||
| const APPLICATIONS_SCHEMA       = 'org.gnome.desktop.a11y.applications'; |  | ||||||
| const SHOW_KEY                  = 'screen-magnifier-enabled'; |  | ||||||
|  |  | ||||||
| const MAGNIFIER_SCHEMA          = 'org.gnome.desktop.a11y.magnifier'; | const MAGNIFIER_SCHEMA          = 'org.gnome.desktop.a11y.magnifier'; | ||||||
| const SCREEN_POSITION_KEY       = 'screen-position'; | const SCREEN_POSITION_KEY       = 'screen-position'; | ||||||
| const MAG_FACTOR_KEY            = 'mag-factor'; | const MAG_FACTOR_KEY            = 'mag-factor'; | ||||||
| @@ -56,20 +53,19 @@ var MouseSpriteContent = GObject.registerClass({ | |||||||
|  |  | ||||||
|     vfunc_get_preferred_size() { |     vfunc_get_preferred_size() { | ||||||
|         if (!this._texture) |         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) { |     vfunc_paint_content(actor, node) { | ||||||
|         if (!this._texture) |         if (!this._texture) | ||||||
|             return; |             return; | ||||||
|  |  | ||||||
|         let color = new Clutter.Color(); |         let color = Clutter.Color.get_static(Clutter.StaticColor.WHITE); | ||||||
|  |         let [minFilter, magFilter] = actor.get_content_scaling_filters(); | ||||||
|         let textureNode = new Clutter.TextureNode(this._texture, |         let textureNode = new Clutter.TextureNode(this._texture, | ||||||
|                                                   color, |                                                   color, minFilter, magFilter); | ||||||
|                                                   Clutter.ScalingFilter.NEAREST, |  | ||||||
|                                                   Clutter.ScalingFilter.NEAREST); |  | ||||||
|         textureNode.set_name('MouseSpriteContent'); |         textureNode.set_name('MouseSpriteContent'); | ||||||
|         node.add_child(textureNode); |         node.add_child(textureNode); | ||||||
|  |  | ||||||
| @@ -84,8 +80,14 @@ var MouseSpriteContent = GObject.registerClass({ | |||||||
|         if (this._texture == coglTexture) |         if (this._texture == coglTexture) | ||||||
|             return; |             return; | ||||||
|  |  | ||||||
|  |         let oldTexture = this._texture; | ||||||
|         this._texture = coglTexture; |         this._texture = coglTexture; | ||||||
|         this.invalidate(); |         this.invalidate(); | ||||||
|  |  | ||||||
|  |         if (!oldTexture || !coglTexture || | ||||||
|  |             oldTexture.get_width() != coglTexture.get_width() || | ||||||
|  |             oldTexture.get_height() != coglTexture.get_height()) | ||||||
|  |             this.invalidate_size(); | ||||||
|     } |     } | ||||||
| }); | }); | ||||||
|  |  | ||||||
| @@ -100,7 +102,6 @@ var Magnifier = class Magnifier { | |||||||
|  |  | ||||||
|         this._mouseSprite = new Clutter.Actor({ request_mode: Clutter.RequestMode.CONTENT_SIZE }); |         this._mouseSprite = new Clutter.Actor({ request_mode: Clutter.RequestMode.CONTENT_SIZE }); | ||||||
|         this._mouseSprite.content = new MouseSpriteContent(); |         this._mouseSprite.content = new MouseSpriteContent(); | ||||||
|         this._updateSpriteTexture(); |  | ||||||
|  |  | ||||||
|         this._cursorRoot = new Clutter.Actor(); |         this._cursorRoot = new Clutter.Actor(); | ||||||
|         this._cursorRoot.add_actor(this._mouseSprite); |         this._cursorRoot.add_actor(this._mouseSprite); | ||||||
| @@ -113,14 +114,16 @@ var Magnifier = class Magnifier { | |||||||
|  |  | ||||||
|         let aZoomRegion = new ZoomRegion(this, this._cursorRoot); |         let aZoomRegion = new ZoomRegion(this, this._cursorRoot); | ||||||
|         this._zoomRegions.push(aZoomRegion); |         this._zoomRegions.push(aZoomRegion); | ||||||
|         let showAtLaunch = this._settingsInit(aZoomRegion); |         this._settingsInit(aZoomRegion); | ||||||
|         aZoomRegion.scrollContentsTo(this.xMouse, this.yMouse); |         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. |         // Export to dbus. | ||||||
|         magDBusService = new MagnifierDBus.ShellMagnifier(); |         magDBusService = new MagnifierDBus.ShellMagnifier(); | ||||||
|         this.setActive(showAtLaunch); |         this.setActive(St.Settings.get().magnifier_active); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
| @@ -153,9 +156,15 @@ var Magnifier = class Magnifier { | |||||||
|  |  | ||||||
|         if (isActive != activate) { |         if (isActive != activate) { | ||||||
|             if (activate) { |             if (activate) { | ||||||
|  |                 this._updateMouseSprite(); | ||||||
|  |                 this._cursorSpriteChangedId = | ||||||
|  |                     this._cursorTracker.connect('cursor-changed', | ||||||
|  |                                                 this._updateMouseSprite.bind(this)); | ||||||
|                 Meta.disable_unredirect_for_display(global.display); |                 Meta.disable_unredirect_for_display(global.display); | ||||||
|                 this.startTrackingMouse(); |                 this.startTrackingMouse(); | ||||||
|             } else { |             } else { | ||||||
|  |                 this._cursorTracker.disconnect(this._cursorSpriteChangedId); | ||||||
|  |                 this._mouseSprite.content.texture = null; | ||||||
|                 Meta.enable_unredirect_for_display(global.display); |                 Meta.enable_unredirect_for_display(global.display); | ||||||
|                 this.stopTrackingMouse(); |                 this.stopTrackingMouse(); | ||||||
|             } |             } | ||||||
| @@ -493,13 +502,8 @@ var Magnifier = class Magnifier { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     _settingsInit(zoomRegion) { |     _settingsInit(zoomRegion) { | ||||||
|         this._appSettings = new Gio.Settings({ schema_id: APPLICATIONS_SCHEMA }); |  | ||||||
|         this._settings = new Gio.Settings({ schema_id: MAGNIFIER_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._settings.connect('changed::' + SCREEN_POSITION_KEY, | ||||||
|                                this._updateScreenPosition.bind(this)); |                                this._updateScreenPosition.bind(this)); | ||||||
|         this._settings.connect('changed::' + MAG_FACTOR_KEY, |         this._settings.connect('changed::' + MAG_FACTOR_KEY, | ||||||
| @@ -606,8 +610,6 @@ var Magnifier = class Magnifier { | |||||||
|         let showCrosshairs = this._settings.get_boolean(SHOW_CROSS_HAIRS_KEY); |         let showCrosshairs = this._settings.get_boolean(SHOW_CROSS_HAIRS_KEY); | ||||||
|         this.addCrosshairs(); |         this.addCrosshairs(); | ||||||
|         this.setCrosshairsVisible(showCrosshairs); |         this.setCrosshairsVisible(showCrosshairs); | ||||||
|  |  | ||||||
|         return this._appSettings.get_boolean(SHOW_KEY); |  | ||||||
|    } |    } | ||||||
|  |  | ||||||
|     _updateScreenPosition() { |     _updateScreenPosition() { | ||||||
| @@ -754,13 +756,41 @@ var ZoomRegion = class ZoomRegion { | |||||||
|  |  | ||||||
|         this._pointerIdleMonitor = Meta.IdleMonitor.get_for_device(Meta.VIRTUAL_CORE_POINTER_ID); |         this._pointerIdleMonitor = Meta.IdleMonitor.get_for_device(Meta.VIRTUAL_CORE_POINTER_ID); | ||||||
|         this._scrollContentsTimerId = 0; |         this._scrollContentsTimerId = 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|         Main.layoutManager.connect('monitors-changed', |     _connectSignals() { | ||||||
|  |         if (this._signalConnections) | ||||||
|  |             return; | ||||||
|  |  | ||||||
|  |         this._signalConnections = []; | ||||||
|  |         let id = Main.layoutManager.connect('monitors-changed', | ||||||
|                                             this._monitorsChanged.bind(this)); |                                             this._monitorsChanged.bind(this)); | ||||||
|         this._focusCaretTracker.connect('caret-moved', |         this._signalConnections.push([Main.layoutManager, id]); | ||||||
|                                     this._updateCaret.bind(this)); |  | ||||||
|         this._focusCaretTracker.connect('focus-changed', |         id = this._focusCaretTracker.connect('caret-moved', this._updateCaret.bind(this)); | ||||||
|                                     this._updateFocus.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) { |     _updateFocus(caller, event) { | ||||||
| @@ -808,10 +838,13 @@ var ZoomRegion = class ZoomRegion { | |||||||
|             this._createActors(); |             this._createActors(); | ||||||
|             if (this._isMouseOverRegion()) |             if (this._isMouseOverRegion()) | ||||||
|                 this._magnifier.hideSystemCursor(); |                 this._magnifier.hideSystemCursor(); | ||||||
|  |             this._updateScreenPosition(); | ||||||
|             this._updateMagViewGeometry(); |             this._updateMagViewGeometry(); | ||||||
|             this._updateCloneGeometry(); |             this._updateCloneGeometry(); | ||||||
|             this._updateMousePosition(); |             this._updateMousePosition(); | ||||||
|  |             this._connectSignals(); | ||||||
|         } else { |         } else { | ||||||
|  |             this._disconnectSignals(); | ||||||
|             this._destroyActors(); |             this._destroyActors(); | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @@ -1239,7 +1272,7 @@ var ZoomRegion = class ZoomRegion { | |||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * getContrast: |      * getContrast: | ||||||
|      * Retreive the contrast of the magnified view. |      * Retrieve the contrast of the magnified view. | ||||||
|      * @return  Object containing the contrast for the red, green, |      * @return  Object containing the contrast for the red, green, | ||||||
|      *          and blue channels. |      *          and blue channels. | ||||||
|      */ |      */ | ||||||
| @@ -1561,18 +1594,8 @@ var ZoomRegion = class ZoomRegion { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     _monitorsChanged() { |     _monitorsChanged() { | ||||||
|         if (!this.isActive()) |  | ||||||
|             return; |  | ||||||
|  |  | ||||||
|         this._background.set_size(global.screen_width, global.screen_height); |         this._background.set_size(global.screen_width, global.screen_height); | ||||||
|  |         this._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); |  | ||||||
|     } |     } | ||||||
| }; | }; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -211,13 +211,6 @@ function _initializeUI() { | |||||||
|  |  | ||||||
|     _startDate = new Date(); |     _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(); |     ExtensionDownloader.init(); | ||||||
|     ExtensionSystem.init(); |     ExtensionSystem.init(); | ||||||
|  |  | ||||||
| @@ -239,6 +232,13 @@ function _initializeUI() { | |||||||
|             Shell.Global.log_structured('GNOME Shell started at ' + _startDate, |             Shell.Global.log_structured('GNOME Shell started at ' + _startDate, | ||||||
|                                         ['MESSAGE_ID=' + GNOMESHELL_STARTED_MESSAGE_ID]); |                                         ['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); | ||||||
|  |         } | ||||||
|     }); |     }); | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -636,7 +636,7 @@ function _queueBeforeRedraw(workId) { | |||||||
|  * initialization as well, under the assumption that new actors |  * initialization as well, under the assumption that new actors | ||||||
|  * will need it. |  * will need it. | ||||||
|  * |  * | ||||||
|  * Returns: A string work identifer |  * Returns: A string work identifier | ||||||
|  */ |  */ | ||||||
| function initializeDeferredWork(actor, callback, props) { | function initializeDeferredWork(actor, callback, props) { | ||||||
|     // Turn into a string so we can use as an object property |     // Turn into a string so we can use as an object property | ||||||
|   | |||||||
| @@ -584,7 +584,6 @@ class SourceActor extends St.Widget { | |||||||
|         this._source = source; |         this._source = source; | ||||||
|         this._size = size; |         this._size = size; | ||||||
|  |  | ||||||
|         this.actor = this; |  | ||||||
|         this.connect('destroy', () => { |         this.connect('destroy', () => { | ||||||
|             this._source.disconnect(this._iconUpdatedId); |             this._source.disconnect(this._iconUpdatedId); | ||||||
|             this._actorDestroyed = true; |             this._actorDestroyed = true; | ||||||
|   | |||||||
| @@ -224,10 +224,10 @@ var ModalDialog = class { | |||||||
|     // can be dismissed by a close call. |     // can be dismissed by a close call. | ||||||
|     // |     // | ||||||
|     // The main point of this method is to give some indication to the user |     // The main point of this method is to give some indication to the user | ||||||
|     // that the dialog reponse has been acknowledged but will take a few |     // that the dialog response has been acknowledged but will take a few | ||||||
|     // moments before being processed. |     // moments before being processed. | ||||||
|     // e.g., if a user clicked "Log Out" then the dialog should go away |     // e.g., if a user clicked "Log Out" then the dialog should go away | ||||||
|     // imediately, but the lightbox should remain until the logout is |     // immediately, but the lightbox should remain until the logout is | ||||||
|     // complete. |     // complete. | ||||||
|     _fadeOutDialog(timestamp) { |     _fadeOutDialog(timestamp) { | ||||||
|         if (this.state == State.CLOSED || this.state == State.CLOSING) |         if (this.state == State.CLOSED || this.state == State.CLOSING) | ||||||
|   | |||||||
| @@ -95,28 +95,6 @@ var OsdMonitorLabeler = class { | |||||||
|  |  | ||||||
|         this._reset(); |         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) { |         for (let connector in params) { | ||||||
|             let monitor = this._monitorManager.get_monitor_for_connector(connector); |             let monitor = this._monitorManager.get_monitor_for_connector(connector); | ||||||
|             if (monitor == -1) |             if (monitor == -1) | ||||||
|   | |||||||
| @@ -369,17 +369,15 @@ class DashSpacer extends St.Widget { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     vfunc_get_preferred_width(forHeight) { |     vfunc_get_preferred_width(forHeight) { | ||||||
|         let box = this.get_allocation_box(); |         if (this._bindConstraint) | ||||||
|         let minWidth = super.vfunc_get_preferred_width(forHeight)[0]; |             return this._bindConstraint.source.get_preferred_width(forHeight); | ||||||
|         let natWidth = box.x2 - box.x1; |         return super.vfunc_get_preferred_width(forHeight); | ||||||
|         return [minWidth, natWidth]; |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     vfunc_get_preferred_height(forWidth) { |     vfunc_get_preferred_height(forWidth) { | ||||||
|         let box = this.get_allocation_box(); |         if (this._bindConstraint) | ||||||
|         let minHeight = super.vfunc_get_preferred_height(forWidth)[0]; |             return this._bindConstraint.source.get_preferred_height(forWidth); | ||||||
|         let natHeight = box.y2 - box.y1; |         return super.vfunc_get_preferred_height(forWidth); | ||||||
|         return [minHeight, natHeight]; |  | ||||||
|     } |     } | ||||||
| }); | }); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -374,12 +374,12 @@ var PadDiagram = GObject.registerClass({ | |||||||
|         svgData += this._cssString(); |         svgData += this._cssString(); | ||||||
|         svgData += this._wrappingSvgFooter(); |         svgData += this._wrappingSvgFooter(); | ||||||
|  |  | ||||||
|         let handle = new Rsvg.Handle(); |         let istream = new Gio.MemoryInputStream(); | ||||||
|         handle.set_base_uri(GLib.path_get_dirname(this._imagePath)); |         istream.add_bytes(new GLib.Bytes(svgData)); | ||||||
|         handle.write(svgData); |  | ||||||
|         handle.close(); |  | ||||||
|  |  | ||||||
|         return handle; |         return Rsvg.Handle.new_from_stream_sync(istream, | ||||||
|  |                                                 Gio.File.new_for_path(this._imagePath), | ||||||
|  |                                                 0, null); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     _updateDiagramScale() { |     _updateDiagramScale() { | ||||||
|   | |||||||
							
								
								
									
										109
									
								
								js/ui/panel.js
									
									
									
									
									
								
							
							
						
						
									
										109
									
								
								js/ui/panel.js
									
									
									
									
									
								
							| @@ -1,6 +1,6 @@ | |||||||
| // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- | // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- | ||||||
|  |  | ||||||
| const { 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 Cairo = imports.cairo; | ||||||
| const Mainloop = imports.mainloop; | const Mainloop = imports.mainloop; | ||||||
|  |  | ||||||
| @@ -75,6 +75,9 @@ class AppMenu extends PopupMenu.PopupMenu { | |||||||
|  |  | ||||||
|         this._windowsChangedId = 0; |         this._windowsChangedId = 0; | ||||||
|  |  | ||||||
|  |         /* Translators: This is the heading of a list of open windows */ | ||||||
|  |         this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem(_("Open Windows"))); | ||||||
|  |  | ||||||
|         this._windowSection = new PopupMenu.PopupMenuSection(); |         this._windowSection = new PopupMenu.PopupMenuSection(); | ||||||
|         this.addMenuItem(this._windowSection); |         this.addMenuItem(this._windowSection); | ||||||
|  |  | ||||||
| @@ -105,6 +108,8 @@ class AppMenu extends PopupMenu.PopupMenu { | |||||||
|             }); |             }); | ||||||
|         }); |         }); | ||||||
|  |  | ||||||
|  |         this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); | ||||||
|  |  | ||||||
|         this.addAction(_("Quit"), () => { |         this.addAction(_("Quit"), () => { | ||||||
|             this._app.request_quit(); |             this._app.request_quit(); | ||||||
|         }); |         }); | ||||||
| @@ -117,7 +122,7 @@ class AppMenu extends PopupMenu.PopupMenu { | |||||||
|  |  | ||||||
|     _updateDetailsVisibility() { |     _updateDetailsVisibility() { | ||||||
|         let sw = this._appSystem.lookup_app('org.gnome.Software.desktop'); |         let sw = this._appSystem.lookup_app('org.gnome.Software.desktop'); | ||||||
|         this._detailsItem.actor.visible = (sw != null); |         this._detailsItem.visible = (sw != null); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     isEmpty() { |     isEmpty() { | ||||||
| @@ -155,7 +160,7 @@ class AppMenu extends PopupMenu.PopupMenu { | |||||||
|             }); |             }); | ||||||
|         }); |         }); | ||||||
|  |  | ||||||
|         this._newWindowItem.actor.visible = |         this._newWindowItem.visible = | ||||||
|             app && app.can_open_new_window() && !actions.includes('new-window'); |             app && app.can_open_new_window() && !actions.includes('new-window'); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -172,13 +177,6 @@ class AppMenu extends PopupMenu.PopupMenu { | |||||||
|                 Main.activateWindow(window, event.get_time()); |                 Main.activateWindow(window, event.get_time()); | ||||||
|             }); |             }); | ||||||
|         }); |         }); | ||||||
|  |  | ||||||
|         // Add separator between windows of the current desktop and other windows. |  | ||||||
|         let workspaceManager = global.workspace_manager; |  | ||||||
|         let activeWorkspace = workspaceManager.get_active_workspace(); |  | ||||||
|         let pos = windows.findIndex(w => w.get_workspace() != activeWorkspace); |  | ||||||
|         if (pos >= 0) |  | ||||||
|             this._windowSection.addMenuItem(new PopupMenu.PopupSeparatorMenuItem(), pos); |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -196,21 +194,20 @@ var AppMenuButton = GObject.registerClass({ | |||||||
|     _init(panel) { |     _init(panel) { | ||||||
|         super._init(0.0, null, true); |         super._init(0.0, null, true); | ||||||
|  |  | ||||||
|         this.actor.accessible_role = Atk.Role.MENU; |         this.accessible_role = Atk.Role.MENU; | ||||||
|  |  | ||||||
|         this._startingApps = []; |         this._startingApps = []; | ||||||
|  |  | ||||||
|         this._menuManager = panel.menuManager; |         this._menuManager = panel.menuManager; | ||||||
|         this._gtkSettings = Gtk.Settings.get_default(); |  | ||||||
|         this._targetApp = null; |         this._targetApp = null; | ||||||
|         this._busyNotifyId = 0; |         this._busyNotifyId = 0; | ||||||
|  |  | ||||||
|         let bin = new St.Bin({ name: 'appMenu' }); |         let bin = new St.Bin({ name: 'appMenu' }); | ||||||
|         bin.connect('style-changed', this._onStyleChanged.bind(this)); |         bin.connect('style-changed', this._onStyleChanged.bind(this)); | ||||||
|         this.actor.add_actor(bin); |         this.add_actor(bin); | ||||||
|  |  | ||||||
|         this.actor.bind_property("reactive", this.actor, "can-focus", 0); |         this.bind_property("reactive", this, "can-focus", 0); | ||||||
|         this.actor.reactive = false; |         this.reactive = false; | ||||||
|  |  | ||||||
|         this._container = new St.BoxLayout({ style_class: 'panel-status-menu-box' }); |         this._container = new St.BoxLayout({ style_class: 'panel-status-menu-box' }); | ||||||
|         bin.set_child(this._container); |         bin.set_child(this._container); | ||||||
| @@ -266,10 +263,10 @@ var AppMenuButton = GObject.registerClass({ | |||||||
|             return; |             return; | ||||||
|  |  | ||||||
|         this._visible = true; |         this._visible = true; | ||||||
|         this.actor.reactive = true; |         this.reactive = true; | ||||||
|         this.show(); |         this.show(); | ||||||
|         Tweener.removeTweens(this.actor); |         Tweener.removeTweens(this); | ||||||
|         Tweener.addTween(this.actor, |         Tweener.addTween(this, | ||||||
|                          { opacity: 255, |                          { opacity: 255, | ||||||
|                            time: Overview.ANIMATION_TIME, |                            time: Overview.ANIMATION_TIME, | ||||||
|                            transition: 'easeOutQuad' }); |                            transition: 'easeOutQuad' }); | ||||||
| @@ -280,9 +277,9 @@ var AppMenuButton = GObject.registerClass({ | |||||||
|             return; |             return; | ||||||
|  |  | ||||||
|         this._visible = false; |         this._visible = false; | ||||||
|         this.actor.reactive = false; |         this.reactive = false; | ||||||
|         Tweener.removeTweens(this.actor); |         Tweener.removeTweens(this); | ||||||
|         Tweener.addTween(this.actor, |         Tweener.addTween(this, | ||||||
|                          { opacity: 0, |                          { opacity: 0, | ||||||
|                            time: Overview.ANIMATION_TIME, |                            time: Overview.ANIMATION_TIME, | ||||||
|                            transition: 'easeOutQuad', |                            transition: 'easeOutQuad', | ||||||
| @@ -405,7 +402,7 @@ var AppMenuButton = GObject.registerClass({ | |||||||
|             if (this._targetApp) { |             if (this._targetApp) { | ||||||
|                 this._busyNotifyId = this._targetApp.connect('notify::busy', this._sync.bind(this)); |                 this._busyNotifyId = this._targetApp.connect('notify::busy', this._sync.bind(this)); | ||||||
|                 this._label.set_text(this._targetApp.get_name()); |                 this._label.set_text(this._targetApp.get_name()); | ||||||
|                 this.actor.set_accessible_name(this._targetApp.get_name()); |                 this.set_accessible_name(this._targetApp.get_name()); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @@ -423,7 +420,7 @@ var AppMenuButton = GObject.registerClass({ | |||||||
|         else |         else | ||||||
|             this.stopAnimation(); |             this.stopAnimation(); | ||||||
|  |  | ||||||
|         this.actor.reactive = (visible && !isBusy); |         this.reactive = (visible && !isBusy); | ||||||
|  |  | ||||||
|         this._syncIcon(); |         this._syncIcon(); | ||||||
|         this.menu.setApp(this._targetApp); |         this.menu.setApp(this._targetApp); | ||||||
| @@ -462,28 +459,28 @@ var ActivitiesButton = GObject.registerClass( | |||||||
| class ActivitiesButton extends PanelMenu.Button { | class ActivitiesButton extends PanelMenu.Button { | ||||||
|     _init() { |     _init() { | ||||||
|         super._init(0.0, null, true); |         super._init(0.0, null, true); | ||||||
|         this.actor.accessible_role = Atk.Role.TOGGLE_BUTTON; |         this.accessible_role = Atk.Role.TOGGLE_BUTTON; | ||||||
|  |  | ||||||
|         this.actor.name = 'panelActivities'; |         this.name = 'panelActivities'; | ||||||
|  |  | ||||||
|         /* Translators: If there is no suitable word for "Activities" |         /* Translators: If there is no suitable word for "Activities" | ||||||
|            in your language, you can use the word for "Overview". */ |            in your language, you can use the word for "Overview". */ | ||||||
|         this._label = new St.Label({ text: _("Activities"), |         this._label = new St.Label({ text: _("Activities"), | ||||||
|                                      y_align: Clutter.ActorAlign.CENTER }); |                                      y_align: Clutter.ActorAlign.CENTER }); | ||||||
|         this.actor.add_actor(this._label); |         this.add_actor(this._label); | ||||||
|  |  | ||||||
|         this.actor.label_actor = this._label; |         this.label_actor = this._label; | ||||||
|  |  | ||||||
|         this.actor.connect('captured-event', this._onCapturedEvent.bind(this)); |         this.connect('captured-event', this._onCapturedEvent.bind(this)); | ||||||
|         this.actor.connect_after('key-release-event', this._onKeyRelease.bind(this)); |         this.connect_after('key-release-event', this._onKeyRelease.bind(this)); | ||||||
|  |  | ||||||
|         Main.overview.connect('showing', () => { |         Main.overview.connect('showing', () => { | ||||||
|             this.actor.add_style_pseudo_class('overview'); |             this.add_style_pseudo_class('overview'); | ||||||
|             this.actor.add_accessible_state (Atk.StateType.CHECKED); |             this.add_accessible_state (Atk.StateType.CHECKED); | ||||||
|         }); |         }); | ||||||
|         Main.overview.connect('hiding', () => { |         Main.overview.connect('hiding', () => { | ||||||
|             this.actor.remove_style_pseudo_class('overview'); |             this.remove_style_pseudo_class('overview'); | ||||||
|             this.actor.remove_accessible_state (Atk.StateType.CHECKED); |             this.remove_accessible_state (Atk.StateType.CHECKED); | ||||||
|         }); |         }); | ||||||
|  |  | ||||||
|         this._xdndTimeOut = 0; |         this._xdndTimeOut = 0; | ||||||
| @@ -536,7 +533,7 @@ class ActivitiesButton extends PanelMenu.Button { | |||||||
|         let [x, y, mask] = global.get_pointer(); |         let [x, y, mask] = global.get_pointer(); | ||||||
|         let pickedActor = global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, x, y); |         let pickedActor = global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, x, y); | ||||||
|  |  | ||||||
|         if (pickedActor == this.actor && Main.overview.shouldToggleByCornerOrButton()) |         if (pickedActor == this && Main.overview.shouldToggleByCornerOrButton()) | ||||||
|             Main.overview.toggle(); |             Main.overview.toggle(); | ||||||
|  |  | ||||||
|         Mainloop.source_remove(this._xdndTimeOut); |         Mainloop.source_remove(this._xdndTimeOut); | ||||||
| @@ -750,7 +747,7 @@ class AggregateMenu extends PanelMenu.Button { | |||||||
|         this.menu.box.set_layout_manager(menuLayout); |         this.menu.box.set_layout_manager(menuLayout); | ||||||
|  |  | ||||||
|         this._indicators = new St.BoxLayout({ style_class: 'panel-status-indicators-box' }); |         this._indicators = new St.BoxLayout({ style_class: 'panel-status-indicators-box' }); | ||||||
|         this.actor.add_child(this._indicators); |         this.add_child(this._indicators); | ||||||
|  |  | ||||||
|         if (Config.HAVE_NETWORKMANAGER) { |         if (Config.HAVE_NETWORKMANAGER) { | ||||||
|             this._network = new imports.ui.status.network.NMApplet(); |             this._network = new imports.ui.status.network.NMApplet(); | ||||||
| @@ -809,6 +806,7 @@ class AggregateMenu extends PanelMenu.Button { | |||||||
|         menuLayout.addSizeChild(this._location.menu.actor); |         menuLayout.addSizeChild(this._location.menu.actor); | ||||||
|         menuLayout.addSizeChild(this._rfkill.menu.actor); |         menuLayout.addSizeChild(this._rfkill.menu.actor); | ||||||
|         menuLayout.addSizeChild(this._power.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', |         super._init({ name: 'panel', | ||||||
|                       reactive: true }); |                       reactive: true }); | ||||||
|  |  | ||||||
|         // For compatibility with extensions that still use the |  | ||||||
|         // this.actor field |  | ||||||
|         this.actor = this; |  | ||||||
|         this.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS); |         this.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS); | ||||||
|  |  | ||||||
|         this._sessionStyle = null; |         this._sessionStyle = null; | ||||||
| @@ -882,7 +877,7 @@ class Panel extends St.Widget { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     vfunc_allocate(box, flags) { |     vfunc_allocate(box, flags) { | ||||||
|         super.vfunc_allocate(box, flags); |         this.set_allocation(box, flags); | ||||||
|  |  | ||||||
|         let allocWidth = box.x2 - box.x1; |         let allocWidth = box.x2 - box.x1; | ||||||
|         let allocHeight = box.y2 - box.y1; |         let allocHeight = box.y2 - box.y1; | ||||||
| @@ -976,22 +971,11 @@ class Panel extends St.Widget { | |||||||
|         if (isPress && button != 1) |         if (isPress && button != 1) | ||||||
|             return Clutter.EVENT_PROPAGATE; |             return Clutter.EVENT_PROPAGATE; | ||||||
|  |  | ||||||
|         let focusWindow = global.display.focus_window; |  | ||||||
|         if (!focusWindow) |  | ||||||
|             return Clutter.EVENT_PROPAGATE; |  | ||||||
|  |  | ||||||
|         let dragWindow = focusWindow.is_attached_dialog() ? focusWindow.get_transient_for() |  | ||||||
|                                                           : focusWindow; |  | ||||||
|         if (!dragWindow) |  | ||||||
|             return Clutter.EVENT_PROPAGATE; |  | ||||||
|  |  | ||||||
|         let rect = dragWindow.get_frame_rect(); |  | ||||||
|         let [stageX, stageY] = event.get_coords(); |         let [stageX, stageY] = event.get_coords(); | ||||||
|  |  | ||||||
|         let allowDrag = dragWindow.maximized_vertically && |         let dragWindow = this._getDraggableWindowForPosition(stageX); | ||||||
|                         stageX > rect.x && stageX < rect.x + rect.width; |  | ||||||
|  |  | ||||||
|         if (!allowDrag) |         if (!dragWindow) | ||||||
|             return Clutter.EVENT_PROPAGATE; |             return Clutter.EVENT_PROPAGATE; | ||||||
|  |  | ||||||
|         global.display.begin_grab_op(dragWindow, |         global.display.begin_grab_op(dragWindow, | ||||||
| @@ -1021,7 +1005,7 @@ class Panel extends St.Widget { | |||||||
|             return; // menu not supported by current session mode |             return; // menu not supported by current session mode | ||||||
|  |  | ||||||
|         let menu = indicator.menu; |         let menu = indicator.menu; | ||||||
|         if (!indicator.actor.reactive) |         if (!indicator.reactive) | ||||||
|             return; |             return; | ||||||
|  |  | ||||||
|         menu.toggle(); |         menu.toggle(); | ||||||
| @@ -1043,7 +1027,7 @@ class Panel extends St.Widget { | |||||||
|             return; |             return; | ||||||
|  |  | ||||||
|         let menu = indicator.menu; |         let menu = indicator.menu; | ||||||
|         if (!indicator.actor.reactive) |         if (!indicator.reactive) | ||||||
|             return; |             return; | ||||||
|  |  | ||||||
|         menu.close(); |         menu.close(); | ||||||
| @@ -1201,4 +1185,21 @@ class Panel extends St.Widget { | |||||||
|                     Main.messageTray.bannerBlocked = isOpen; |                     Main.messageTray.bannerBlocked = isOpen; | ||||||
|             }); |             }); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     _getDraggableWindowForPosition(stageX) { | ||||||
|  |         let workspaceManager = global.workspace_manager; | ||||||
|  |         let workspace = workspaceManager.get_active_workspace() | ||||||
|  |         let allWindowsByStacking = global.display.sort_windows_by_stacking( | ||||||
|  |             workspace.list_windows() | ||||||
|  |         ).reverse(); | ||||||
|  |  | ||||||
|  |         return allWindowsByStacking.find(metaWindow => { | ||||||
|  |             let rect = metaWindow.get_frame_rect(); | ||||||
|  |             return metaWindow.is_on_primary_monitor() && | ||||||
|  |                    metaWindow.showing_on_its_workspace() && | ||||||
|  |                    metaWindow.get_window_type() != Meta.WindowType.DESKTOP && | ||||||
|  |                    metaWindow.maximized_vertically && | ||||||
|  |                    stageX > rect.x && stageX < rect.x + rect.width | ||||||
|  |         }); | ||||||
|  |     } | ||||||
| }); | }); | ||||||
|   | |||||||
| @@ -14,12 +14,11 @@ class ButtonBox extends St.Widget { | |||||||
|  |  | ||||||
|         super._init(params); |         super._init(params); | ||||||
|  |  | ||||||
|         this.actor = this; |  | ||||||
|         this._delegate = this; |         this._delegate = this; | ||||||
|  |  | ||||||
|         this.container = new St.Bin({ y_fill: true, |         this.container = new St.Bin({ y_fill: true, | ||||||
|                                       x_fill: true, |                                       x_fill: true, | ||||||
|                                       child: this.actor }); |                                       child: this }); | ||||||
|  |  | ||||||
|         this.connect('style-changed', this._onStyleChanged.bind(this)); |         this.connect('style-changed', this._onStyleChanged.bind(this)); | ||||||
|         this.connect('destroy', this._onDestroy.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)); |         this.connect('notify::visible', this._onVisibilityChanged.bind(this)); | ||||||
|  |  | ||||||
|         if (dontCreateMenu) |         if (dontCreateMenu) | ||||||
|             this.menu = new PopupMenu.PopupDummyMenu(this.actor); |             this.menu = new PopupMenu.PopupDummyMenu(this); | ||||||
|         else |         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) { |     setSensitive(sensitive) { | ||||||
| @@ -145,7 +144,7 @@ var Button = GObject.registerClass({ | |||||||
|         if (!this.menu) |         if (!this.menu) | ||||||
|             return; |             return; | ||||||
|  |  | ||||||
|         if (!this.actor.visible) |         if (!this.visible) | ||||||
|             this.menu.close(); |             this.menu.close(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -155,10 +154,10 @@ var Button = GObject.registerClass({ | |||||||
|  |  | ||||||
|         let symbol = event.get_key_symbol(); |         let symbol = event.get_key_symbol(); | ||||||
|         if (symbol == Clutter.KEY_Left || symbol == Clutter.KEY_Right) { |         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) { |             if (group) { | ||||||
|                 let direction = (symbol == Clutter.KEY_Left) ? St.DirectionType.LEFT : St.DirectionType.RIGHT; |                 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; |                 return Clutter.EVENT_STOP; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| @@ -167,9 +166,9 @@ var Button = GObject.registerClass({ | |||||||
|  |  | ||||||
|     _onOpenStateChanged(menu, open) { |     _onOpenStateChanged(menu, open) { | ||||||
|         if (open) |         if (open) | ||||||
|             this.actor.add_style_pseudo_class('active'); |             this.add_style_pseudo_class('active'); | ||||||
|         else |         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 |         // 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 |         // menu is higher then the screen; it's useful if part of the menu is | ||||||
|   | |||||||
| @@ -51,49 +51,64 @@ function arrowIcon(side) { | |||||||
|     return arrow; |     return arrow; | ||||||
| } | } | ||||||
|  |  | ||||||
| var PopupBaseMenuItem = class { | var PopupBaseMenuItem = GObject.registerClass({ | ||||||
|     constructor(params) { |     Properties: { | ||||||
|  |         'active': GObject.ParamSpec.boolean('active', 'active', 'active', | ||||||
|  |                                             GObject.ParamFlags.READWRITE, | ||||||
|  |                                             GObject.TYPE_BOOLEAN, | ||||||
|  |                                             false), | ||||||
|  |         'sensitive': GObject.ParamSpec.boolean('sensitive', 'sensitive', 'sensitive', | ||||||
|  |                                                GObject.ParamFlags.READWRITE, | ||||||
|  |                                                GObject.TYPE_BOOLEAN, | ||||||
|  |                                                true), | ||||||
|  |     }, | ||||||
|  |     Signals: { | ||||||
|  |         'activate': { param_types: [Clutter.Event.$gtype] }, | ||||||
|  |     } | ||||||
|  | }, class PopupBaseMenuItem extends St.BoxLayout { | ||||||
|  |     _init(params) { | ||||||
|         params = Params.parse (params, { reactive: true, |         params = Params.parse (params, { reactive: true, | ||||||
|                                          activate: true, |                                          activate: true, | ||||||
|                                          hover: true, |                                          hover: true, | ||||||
|                                          style_class: null, |                                          style_class: null, | ||||||
|                                          can_focus: true |                                          can_focus: true | ||||||
|                                        }); |                                        }); | ||||||
|  |         super._init({ style_class: 'popup-menu-item', | ||||||
|         this.actor = new St.BoxLayout({ style_class: 'popup-menu-item', |  | ||||||
|                       reactive: params.reactive, |                       reactive: params.reactive, | ||||||
|                       track_hover: params.reactive, |                       track_hover: params.reactive, | ||||||
|                       can_focus: params.can_focus, |                       can_focus: params.can_focus, | ||||||
|                       accessible_role: Atk.Role.MENU_ITEM }); |                       accessible_role: Atk.Role.MENU_ITEM }); | ||||||
|         this.actor._delegate = this; |         this._delegate = this; | ||||||
|  |  | ||||||
|         this._ornament = Ornament.NONE; |         this._ornament = Ornament.NONE; | ||||||
|         this._ornamentLabel = new St.Label({ style_class: 'popup-menu-ornament' }); |         this._ornamentLabel = new St.Label({ style_class: 'popup-menu-ornament' }); | ||||||
|         this.actor.add(this._ornamentLabel); |         this.add(this._ornamentLabel); | ||||||
|  |  | ||||||
|         this._parent = null; |         this._parent = null; | ||||||
|         this.active = false; |         this._active = false; | ||||||
|         this._activatable = params.reactive && params.activate; |         this._activatable = params.reactive && params.activate; | ||||||
|         this._sensitive = true; |         this._sensitive = true; | ||||||
|  |  | ||||||
|         if (!this._activatable) |         if (!this._activatable) | ||||||
|             this.actor.add_style_class_name('popup-inactive-menu-item'); |             this.add_style_class_name('popup-inactive-menu-item'); | ||||||
|  |  | ||||||
|         if (params.style_class) |         if (params.style_class) | ||||||
|             this.actor.add_style_class_name(params.style_class); |             this.add_style_class_name(params.style_class); | ||||||
|  |  | ||||||
|         if (this._activatable) { |         if (this._activatable) { | ||||||
|             this.actor.connect('button-press-event', this._onButtonPressEvent.bind(this)); |             this.connect('button-press-event', this._onButtonPressEvent.bind(this)); | ||||||
|             this.actor.connect('button-release-event', this._onButtonReleaseEvent.bind(this)); |             this.connect('button-release-event', this._onButtonReleaseEvent.bind(this)); | ||||||
|             this.actor.connect('touch-event', this._onTouchEvent.bind(this)); |             this.connect('touch-event', this._onTouchEvent.bind(this)); | ||||||
|             this.actor.connect('key-press-event', this._onKeyPressEvent.bind(this)); |             this.connect('key-press-event', this._onKeyPressEvent.bind(this)); | ||||||
|         } |         } | ||||||
|         if (params.reactive && params.hover) |         if (params.reactive && params.hover) | ||||||
|             this.actor.connect('notify::hover', this._onHoverChanged.bind(this)); |             this.bind_property('hover', this, 'active', GObject.BindingFlags.SYNC_CREATE); | ||||||
|  |     } | ||||||
|  |  | ||||||
|         this.actor.connect('key-focus-in', this._onKeyFocusIn.bind(this)); |     get actor() { | ||||||
|         this.actor.connect('key-focus-out', this._onKeyFocusOut.bind(this)); |         /* This is kept for compatibility with current implementation, and we | ||||||
|         this.actor.connect('destroy', this._onDestroy.bind(this)); |            don't want to warn here yet since PopupMenu depends on this */ | ||||||
|  |         return this; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     _getTopMenu() { |     _getTopMenu() { | ||||||
| @@ -109,24 +124,24 @@ var PopupBaseMenuItem = class { | |||||||
|  |  | ||||||
|     _onButtonPressEvent(actor, event) { |     _onButtonPressEvent(actor, event) { | ||||||
|         // This is the CSS active state |         // This is the CSS active state | ||||||
|         this.actor.add_style_pseudo_class ('active'); |         this.add_style_pseudo_class('active'); | ||||||
|         return Clutter.EVENT_PROPAGATE; |         return Clutter.EVENT_PROPAGATE; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     _onButtonReleaseEvent(actor, event) { |     _onButtonReleaseEvent(actor, event) { | ||||||
|         this.actor.remove_style_pseudo_class ('active'); |         this.remove_style_pseudo_class('active'); | ||||||
|         this.activate(event); |         this.activate(event); | ||||||
|         return Clutter.EVENT_STOP; |         return Clutter.EVENT_STOP; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     _onTouchEvent(actor, event) { |     _onTouchEvent(actor, event) { | ||||||
|         if (event.type() == Clutter.EventType.TOUCH_END) { |         if (event.type() == Clutter.EventType.TOUCH_END) { | ||||||
|             this.actor.remove_style_pseudo_class ('active'); |             this.remove_style_pseudo_class('active'); | ||||||
|             this.activate(event); |             this.activate(event); | ||||||
|             return Clutter.EVENT_STOP; |             return Clutter.EVENT_STOP; | ||||||
|         } else if (event.type() == Clutter.EventType.TOUCH_BEGIN) { |         } else if (event.type() == Clutter.EventType.TOUCH_BEGIN) { | ||||||
|             // This is the CSS active state |             // This is the CSS active state | ||||||
|             this.actor.add_style_pseudo_class ('active'); |             this.add_style_pseudo_class('active'); | ||||||
|         } |         } | ||||||
|         return Clutter.EVENT_PROPAGATE; |         return Clutter.EVENT_PROPAGATE; | ||||||
|     } |     } | ||||||
| @@ -151,54 +166,56 @@ var PopupBaseMenuItem = class { | |||||||
|         return Clutter.EVENT_PROPAGATE; |         return Clutter.EVENT_PROPAGATE; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     _onKeyFocusIn(actor) { |     vfunc_key_focus_in() { | ||||||
|         this.setActive(true); |         super.vfunc_key_focus_in(); | ||||||
|  |         this.active = true; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     _onKeyFocusOut(actor) { |     vfunc_key_focus_out() { | ||||||
|         this.setActive(false); |         super.vfunc_key_focus_out(); | ||||||
|     } |         this.active = false; | ||||||
|  |  | ||||||
|     _onHoverChanged(actor) { |  | ||||||
|         this.setActive(actor.hover); |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     activate(event) { |     activate(event) { | ||||||
|         this.emit('activate', event); |         this.emit('activate', event); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     setActive(active) { |     get active() { | ||||||
|  |         return this._active; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     set active(active) { | ||||||
|         let activeChanged = active != this.active; |         let activeChanged = active != this.active; | ||||||
|         if (activeChanged) { |         if (activeChanged) { | ||||||
|             this.active = active; |             this._active = active; | ||||||
|             if (active) { |             if (active) { | ||||||
|                 this.actor.add_style_class_name('selected'); |                 this.add_style_class_name('selected'); | ||||||
|                 if (this.actor.can_focus) |                 if (this.can_focus) | ||||||
|                     this.actor.grab_key_focus(); |                     this.grab_key_focus(); | ||||||
|             } else { |             } else { | ||||||
|                 this.actor.remove_style_class_name('selected'); |                 this.remove_style_class_name('selected'); | ||||||
|                 // Remove the CSS active state if the user press the button and |                 // Remove the CSS active state if the user press the button and | ||||||
|                 // while holding moves to another menu item, so we don't paint all items. |                 // while holding moves to another menu item, so we don't paint all items. | ||||||
|                 // The correct behaviour would be to set the new item with the CSS |                 // The correct behaviour would be to set the new item with the CSS | ||||||
|                 // active state as well, but button-press-event is not trigered, |                 // active state as well, but button-press-event is not trigered, | ||||||
|                 // so we should track it in our own, which would involve some work |                 // so we should track it in our own, which would involve some work | ||||||
|                 // in the container |                 // in the container | ||||||
|                 this.actor.remove_style_pseudo_class ('active'); |                 this.remove_style_pseudo_class('active'); | ||||||
|             } |             } | ||||||
|             this.emit('active-changed', active); |             this.notify('active'); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     syncSensitive() { |     syncSensitive() { | ||||||
|         let sensitive = this.getSensitive(); |         let sensitive = this.sensitive; | ||||||
|         this.actor.reactive = sensitive; |         this.reactive = sensitive; | ||||||
|         this.actor.can_focus = sensitive; |         this.can_focus = sensitive; | ||||||
|         this.emit('sensitive-changed'); |         this.notify('sensitive'); | ||||||
|         return sensitive; |         return sensitive; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     getSensitive() { |     getSensitive() { | ||||||
|         let parentSensitive = this._parent ? this._parent.getSensitive() : true; |         let parentSensitive = this._parent ? this._parent.sensitive : true; | ||||||
|         return this._activatable && this._sensitive && parentSensitive; |         return this._activatable && this._sensitive && parentSensitive; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -210,12 +227,12 @@ var PopupBaseMenuItem = class { | |||||||
|         this.syncSensitive(); |         this.syncSensitive(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     destroy() { |     get sensitive() { | ||||||
|         this.actor.destroy(); |         return this.getSensitive(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     _onDestroy() { |     set sensitive(sensitive) { | ||||||
|         this.emit('destroy'); |         this.setSensitive(sensitive); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     setOrnament(ornament) { |     setOrnament(ornament) { | ||||||
| @@ -226,36 +243,38 @@ var PopupBaseMenuItem = class { | |||||||
|  |  | ||||||
|         if (ornament == Ornament.DOT) { |         if (ornament == Ornament.DOT) { | ||||||
|             this._ornamentLabel.text = '\u2022'; |             this._ornamentLabel.text = '\u2022'; | ||||||
|             this.actor.add_accessible_state(Atk.StateType.CHECKED); |             this.add_accessible_state(Atk.StateType.CHECKED); | ||||||
|         } else if (ornament == Ornament.CHECK) { |         } else if (ornament == Ornament.CHECK) { | ||||||
|             this._ornamentLabel.text = '\u2713'; |             this._ornamentLabel.text = '\u2713'; | ||||||
|             this.actor.add_accessible_state(Atk.StateType.CHECKED); |             this.add_accessible_state(Atk.StateType.CHECKED); | ||||||
|         } else if (ornament == Ornament.NONE) { |         } else if (ornament == Ornament.NONE) { | ||||||
|             this._ornamentLabel.text = ''; |             this._ornamentLabel.text = ''; | ||||||
|             this.actor.remove_accessible_state(Atk.StateType.CHECKED); |             this.remove_accessible_state(Atk.StateType.CHECKED); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| }; | }); | ||||||
| Signals.addSignalMethods(PopupBaseMenuItem.prototype); |  | ||||||
|  |  | ||||||
| var PopupMenuItem = class extends PopupBaseMenuItem { | var PopupMenuItem = GObject.registerClass( | ||||||
|     constructor(text, params) { | class PopupMenuItem extends PopupBaseMenuItem { | ||||||
|         super(params); |     _init(text, params) { | ||||||
|  |         super._init(params); | ||||||
|  |  | ||||||
|         this.label = new St.Label({ text: text }); |         this.label = new St.Label({ text: text }); | ||||||
|         this.actor.add_child(this.label); |         this.add_child(this.label); | ||||||
|         this.actor.label_actor = this.label |         this.label_actor = this.label | ||||||
|     } |     } | ||||||
| }; | }); | ||||||
|  |  | ||||||
| var PopupSeparatorMenuItem = class extends PopupBaseMenuItem { |  | ||||||
|     constructor(text) { | var PopupSeparatorMenuItem = GObject.registerClass( | ||||||
|         super({ reactive: false, | class PopupSeparatorMenuItem extends PopupBaseMenuItem { | ||||||
|  |     _init(text) { | ||||||
|  |         super._init({ reactive: false, | ||||||
|                       can_focus: false }); |                       can_focus: false }); | ||||||
|  |  | ||||||
|         this.label = new St.Label({ text: text || '' }); |         this.label = new St.Label({ text: text || '' }); | ||||||
|         this.actor.add(this.label); |         this.add(this.label); | ||||||
|         this.actor.label_actor = this.label; |         this.label_actor = this.label; | ||||||
|  |  | ||||||
|         this.label.connect('notify::text', |         this.label.connect('notify::text', | ||||||
|                            this._syncVisibility.bind(this)); |                            this._syncVisibility.bind(this)); | ||||||
| @@ -264,81 +283,78 @@ var PopupSeparatorMenuItem = class extends PopupBaseMenuItem { | |||||||
|         this._separator = new St.Widget({ style_class: 'popup-separator-menu-item', |         this._separator = new St.Widget({ style_class: 'popup-separator-menu-item', | ||||||
|                                           y_expand: true, |                                           y_expand: true, | ||||||
|                                           y_align: Clutter.ActorAlign.CENTER }); |                                           y_align: Clutter.ActorAlign.CENTER }); | ||||||
|         this.actor.add(this._separator, { expand: true }); |         this.add(this._separator, { expand: true }); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     _syncVisibility() { |     _syncVisibility() { | ||||||
|         this.label.visible = this.label.text != ''; |         this.label.visible = this.label.text != ''; | ||||||
|     } |     } | ||||||
| }; | }); | ||||||
|  |  | ||||||
| var Switch = class { | var Switch = GObject.registerClass( | ||||||
|     constructor(state) { | class Switch extends St.Bin { | ||||||
|         this.actor = new St.Bin({ style_class: 'toggle-switch', |     _init(state) { | ||||||
|  |         super._init({ style_class: 'toggle-switch', | ||||||
|                       accessible_role: Atk.Role.CHECK_BOX, |                       accessible_role: Atk.Role.CHECK_BOX, | ||||||
|                       can_focus: true }); |                       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); |         this.setToggleState(state); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     setToggleState(state) { |     setToggleState(state) { | ||||||
|         if (state) |         if (state) | ||||||
|             this.actor.add_style_pseudo_class('checked'); |             this.add_style_pseudo_class('checked'); | ||||||
|         else |         else | ||||||
|             this.actor.remove_style_pseudo_class('checked'); |             this.remove_style_pseudo_class('checked'); | ||||||
|         this.state = state; |         this.state = state; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     toggle() { |     toggle() { | ||||||
|         this.setToggleState(!this.state); |         this.setToggleState(!this.state); | ||||||
|     } |     } | ||||||
| }; | }); | ||||||
|  |  | ||||||
| var PopupSwitchMenuItem = class extends PopupBaseMenuItem { | var PopupSwitchMenuItem = GObject.registerClass({ | ||||||
|     constructor(text, active, params) { |     Signals: { 'toggled': { param_types: [GObject.TYPE_BOOLEAN] }, }, | ||||||
|         super(params); | }, | ||||||
|  | class PopupSwitchMenuItem extends PopupBaseMenuItem { | ||||||
|  |     _init(text, active, params) { | ||||||
|  |         super._init(params); | ||||||
|  |  | ||||||
|         this.label = new St.Label({ text: text }); |         this.label = new St.Label({ text: text }); | ||||||
|         this._switch = new Switch(active); |         this._switch = new Switch(active); | ||||||
|  |  | ||||||
|         this.actor.accessible_role = Atk.Role.CHECK_MENU_ITEM; |         this.accessible_role = Atk.Role.CHECK_MENU_ITEM; | ||||||
|         this.checkAccessibleState(); |         this.checkAccessibleState(); | ||||||
|         this.actor.label_actor = this.label; |         this.label_actor = this.label; | ||||||
|  |  | ||||||
|         this.actor.add_child(this.label); |         this.add_child(this.label); | ||||||
|  |  | ||||||
|         this._statusBin = new St.Bin({ x_align: St.Align.END }); |         this._statusBin = new St.Bin({ x_align: St.Align.END }); | ||||||
|         this.actor.add(this._statusBin, { expand: true, x_align: St.Align.END }); |         this.add(this._statusBin, { expand: true, x_align: St.Align.END }); | ||||||
|  |  | ||||||
|         this._statusLabel = new St.Label({ text: '', |         this._statusLabel = new St.Label({ text: '', | ||||||
|                                            style_class: 'popup-status-menu-item' |                                            style_class: 'popup-status-menu-item' | ||||||
|                                          }); |                                          }); | ||||||
|         this._statusBin.child = this._switch.actor; |         this._statusBin.child = this._switch; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     setStatus(text) { |     setStatus(text) { | ||||||
|         if (text != null) { |         if (text != null) { | ||||||
|             this._statusLabel.text = text; |             this._statusLabel.text = text; | ||||||
|             this._statusBin.child = this._statusLabel; |             this._statusBin.child = this._statusLabel; | ||||||
|             this.actor.reactive = false; |             this.reactive = false; | ||||||
|             this.actor.accessible_role = Atk.Role.MENU_ITEM; |             this.accessible_role = Atk.Role.MENU_ITEM; | ||||||
|         } else { |         } else { | ||||||
|             this._statusBin.child = this._switch.actor; |             this._statusBin.child = this._switch; | ||||||
|             this.actor.reactive = true; |             this.reactive = true; | ||||||
|             this.actor.accessible_role = Atk.Role.CHECK_MENU_ITEM; |             this.accessible_role = Atk.Role.CHECK_MENU_ITEM; | ||||||
|         } |         } | ||||||
|         this.checkAccessibleState(); |         this.checkAccessibleState(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     activate(event) { |     activate(event) { | ||||||
|         if (this._switch.actor.mapped) { |         if (this._switch.mapped) | ||||||
|             this.toggle(); |             this.toggle(); | ||||||
|         } |  | ||||||
|  |  | ||||||
|         // we allow pressing space to toggle the switch |         // we allow pressing space to toggle the switch | ||||||
|         // without closing the menu |         // without closing the menu | ||||||
| @@ -365,29 +381,30 @@ var PopupSwitchMenuItem = class extends PopupBaseMenuItem { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     checkAccessibleState() { |     checkAccessibleState() { | ||||||
|         switch (this.actor.accessible_role) { |         switch (this.accessible_role) { | ||||||
|         case Atk.Role.CHECK_MENU_ITEM: |         case Atk.Role.CHECK_MENU_ITEM: | ||||||
|             if (this._switch.state) |             if (this._switch.state) | ||||||
|                 this.actor.add_accessible_state (Atk.StateType.CHECKED); |                 this.add_accessible_state(Atk.StateType.CHECKED); | ||||||
|             else |             else | ||||||
|                 this.actor.remove_accessible_state (Atk.StateType.CHECKED); |                 this.remove_accessible_state(Atk.StateType.CHECKED); | ||||||
|             break; |             break; | ||||||
|         default: |         default: | ||||||
|             this.actor.remove_accessible_state (Atk.StateType.CHECKED); |             this.remove_accessible_state(Atk.StateType.CHECKED); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| }; | }); | ||||||
|  |  | ||||||
| var PopupImageMenuItem = class extends PopupBaseMenuItem { | var PopupImageMenuItem = GObject.registerClass( | ||||||
|     constructor(text, icon, params) { | class PopupImageMenuItem extends PopupBaseMenuItem { | ||||||
|         super(params); |     _init(text, icon, params) { | ||||||
|  |         super._init(params); | ||||||
|  |  | ||||||
|         this._icon = new St.Icon({ style_class: 'popup-menu-icon', |         this._icon = new St.Icon({ style_class: 'popup-menu-icon', | ||||||
|                                    x_align: Clutter.ActorAlign.END }); |                                    x_align: Clutter.ActorAlign.END }); | ||||||
|         this.actor.add_child(this._icon); |         this.add_child(this._icon); | ||||||
|         this.label = new St.Label({ text: text }); |         this.label = new St.Label({ text: text }); | ||||||
|         this.actor.add_child(this.label); |         this.add_child(this.label); | ||||||
|         this.actor.label_actor = this.label; |         this.label_actor = this.label; | ||||||
|  |  | ||||||
|         this.setIcon(icon); |         this.setIcon(icon); | ||||||
|     } |     } | ||||||
| @@ -399,12 +416,12 @@ var PopupImageMenuItem = class extends PopupBaseMenuItem { | |||||||
|         else |         else | ||||||
|             this._icon.icon_name = icon; |             this._icon.icon_name = icon; | ||||||
|     } |     } | ||||||
| }; | }); | ||||||
|  |  | ||||||
| var PopupMenuBase = class { | var PopupMenuBase = class { | ||||||
|     constructor(sourceActor, styleClass) { |     constructor(sourceActor, styleClass) { | ||||||
|         if (new.target === PopupMenuBase) |         if (this.constructor === PopupMenuBase) | ||||||
|             throw new TypeError('Cannot instantiate abstract class ' + new.target.name); |             throw new TypeError(`Cannot instantiate abstract class ${this.constructor.name}`); | ||||||
|  |  | ||||||
|         this.sourceActor = sourceActor; |         this.sourceActor = sourceActor; | ||||||
|         this._parent = null; |         this._parent = null; | ||||||
| @@ -443,13 +460,21 @@ var PopupMenuBase = class { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     getSensitive() { |     getSensitive() { | ||||||
|         let parentSensitive = this._parent ? this._parent.getSensitive() : true; |         let parentSensitive = this._parent ? this._parent.sensitive : true; | ||||||
|         return this._sensitive && parentSensitive; |         return this._sensitive && parentSensitive; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     setSensitive(sensitive) { |     setSensitive(sensitive) { | ||||||
|         this._sensitive = sensitive; |         this._sensitive = sensitive; | ||||||
|         this.emit('sensitive-changed'); |         this.emit('notify::sensitive'); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     get sensitive() { | ||||||
|  |         return this.getSensitive(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     set sensitive(sensitive) { | ||||||
|  |         this.setSensitive(sensitive); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     _sessionUpdated() { |     _sessionUpdated() { | ||||||
| @@ -485,7 +510,7 @@ var PopupMenuBase = class { | |||||||
|             app.activate(); |             app.activate(); | ||||||
|         }); |         }); | ||||||
|  |  | ||||||
|         menuItem.actor.visible = Main.sessionMode.allowSettings; |         menuItem.visible = Main.sessionMode.allowSettings; | ||||||
|         this._settingsActions[desktopFile] = menuItem; |         this._settingsActions[desktopFile] = menuItem; | ||||||
|  |  | ||||||
|         return menuItem; |         return menuItem; | ||||||
| @@ -494,7 +519,7 @@ var PopupMenuBase = class { | |||||||
|     _setSettingsVisibility(visible) { |     _setSettingsVisibility(visible) { | ||||||
|         for (let id in this._settingsActions) { |         for (let id in this._settingsActions) { | ||||||
|             let item = this._settingsActions[id]; |             let item = this._settingsActions[id]; | ||||||
|             item.actor.visible = visible; |             item.visible = visible; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -517,16 +542,17 @@ var PopupMenuBase = class { | |||||||
|  |  | ||||||
|     _subMenuActiveChanged(submenu, submenuItem) { |     _subMenuActiveChanged(submenu, submenuItem) { | ||||||
|         if (this._activeMenuItem && this._activeMenuItem != submenuItem) |         if (this._activeMenuItem && this._activeMenuItem != submenuItem) | ||||||
|             this._activeMenuItem.setActive(false); |             this._activeMenuItem.active = false; | ||||||
|         this._activeMenuItem = submenuItem; |         this._activeMenuItem = submenuItem; | ||||||
|         this.emit('active-changed', submenuItem); |         this.emit('active-changed', submenuItem); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     _connectItemSignals(menuItem) { |     _connectItemSignals(menuItem) { | ||||||
|         menuItem._activeChangeId = menuItem.connect('active-changed', (menuItem, active) => { |         menuItem._activeChangeId = menuItem.connect('notify::active', (menuItem) => { | ||||||
|  |             let active = menuItem.active; | ||||||
|             if (active && this._activeMenuItem != menuItem) { |             if (active && this._activeMenuItem != menuItem) { | ||||||
|                 if (this._activeMenuItem) |                 if (this._activeMenuItem) | ||||||
|                     this._activeMenuItem.setActive(false); |                     this._activeMenuItem.active = false; | ||||||
|                 this._activeMenuItem = menuItem; |                 this._activeMenuItem = menuItem; | ||||||
|                 this.emit('active-changed', menuItem); |                 this.emit('active-changed', menuItem); | ||||||
|             } else if (!active && this._activeMenuItem == menuItem) { |             } else if (!active && this._activeMenuItem == menuItem) { | ||||||
| @@ -534,8 +560,8 @@ var PopupMenuBase = class { | |||||||
|                 this.emit('active-changed', null); |                 this.emit('active-changed', null); | ||||||
|             } |             } | ||||||
|         }); |         }); | ||||||
|         menuItem._sensitiveChangeId = menuItem.connect('sensitive-changed', () => { |         menuItem._sensitiveChangeId = menuItem.connect('notify::sensitive', () => { | ||||||
|             let sensitive = menuItem.getSensitive(); |             let sensitive = menuItem.sensitive; | ||||||
|             if (!sensitive && this._activeMenuItem == menuItem) { |             if (!sensitive && this._activeMenuItem == menuItem) { | ||||||
|                 if (!this.actor.navigate_focus(menuItem.actor, |                 if (!this.actor.navigate_focus(menuItem.actor, | ||||||
|                                                St.DirectionType.TAB_FORWARD, |                                                St.DirectionType.TAB_FORWARD, | ||||||
| @@ -551,7 +577,7 @@ var PopupMenuBase = class { | |||||||
|             this.itemActivated(BoxPointer.PopupAnimation.FULL); |             this.itemActivated(BoxPointer.PopupAnimation.FULL); | ||||||
|         }); |         }); | ||||||
|  |  | ||||||
|         menuItem._parentSensitiveChangeId = this.connect('sensitive-changed', () => { |         menuItem._parentSensitiveChangeId = this.connect('notify::sensitive', () => { | ||||||
|             menuItem.syncSensitive(); |             menuItem.syncSensitive(); | ||||||
|         }); |         }); | ||||||
|  |  | ||||||
| @@ -603,7 +629,7 @@ var PopupMenuBase = class { | |||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         menuItem.actor.show(); |         menuItem.show(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     moveMenuItem(menuItem, position) { |     moveMenuItem(menuItem, position) { | ||||||
| @@ -650,8 +676,8 @@ var PopupMenuBase = class { | |||||||
|             let parentClosingId = this.connect('menu-closed', () => { |             let parentClosingId = this.connect('menu-closed', () => { | ||||||
|                 menuItem.emit('menu-closed'); |                 menuItem.emit('menu-closed'); | ||||||
|             }); |             }); | ||||||
|             let subMenuSensitiveChangedId = this.connect('sensitive-changed', () => { |             let subMenuSensitiveChangedId = this.connect('notify::sensitive', () => { | ||||||
|                 menuItem.emit('sensitive-changed'); |                 menuItem.emit('notify::sensitive'); | ||||||
|             }); |             }); | ||||||
|  |  | ||||||
|             menuItem.connect('destroy', () => { |             menuItem.connect('destroy', () => { | ||||||
| @@ -857,9 +883,9 @@ var PopupMenu = class extends PopupMenuBase { | |||||||
|  |  | ||||||
|     close(animate) { |     close(animate) { | ||||||
|         if (this._activeMenuItem) |         if (this._activeMenuItem) | ||||||
|             this._activeMenuItem.setActive(false); |             this._activeMenuItem.active = false; | ||||||
|  |  | ||||||
|         if (this._boxPointer.actor.visible) { |         if (this._boxPointer.visible) { | ||||||
|             this._boxPointer.close(animate, () => { |             this._boxPointer.close(animate, () => { | ||||||
|                 this.emit('menu-closed'); |                 this.emit('menu-closed'); | ||||||
|             }); |             }); | ||||||
| @@ -890,6 +916,10 @@ var PopupDummyMenu = class { | |||||||
|         return true; |         return true; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     get sensitive() { | ||||||
|  |         return this.getSensitive(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     open() { this.emit('open-state-changed', true); } |     open() { this.emit('open-state-changed', true); } | ||||||
|     close() { this.emit('open-state-changed', false); } |     close() { this.emit('open-state-changed', false); } | ||||||
|     toggle() {} |     toggle() {} | ||||||
| @@ -929,7 +959,11 @@ var PopupSubMenu = class extends PopupMenuBase { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     getSensitive() { |     getSensitive() { | ||||||
|         return this._sensitive && this.sourceActor._delegate.getSensitive(); |         return this._sensitive && this.sourceActor.sensitive; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     get sensitive() { | ||||||
|  |         return this.getSensitive(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     open(animate) { |     open(animate) { | ||||||
| @@ -996,7 +1030,7 @@ var PopupSubMenu = class extends PopupMenuBase { | |||||||
|         this.emit('open-state-changed', false); |         this.emit('open-state-changed', false); | ||||||
|  |  | ||||||
|         if (this._activeMenuItem) |         if (this._activeMenuItem) | ||||||
|             this._activeMenuItem.setActive(false); |             this._activeMenuItem.active = false; | ||||||
|  |  | ||||||
|         if (animate && this._needsScrollbar()) |         if (animate && this._needsScrollbar()) | ||||||
|             animate = false; |             animate = false; | ||||||
| @@ -1028,7 +1062,7 @@ var PopupSubMenu = class extends PopupMenuBase { | |||||||
|  |  | ||||||
|         if (this.isOpen && event.get_key_symbol() == Clutter.KEY_Left) { |         if (this.isOpen && event.get_key_symbol() == Clutter.KEY_Left) { | ||||||
|             this.close(BoxPointer.PopupAnimation.FULL); |             this.close(BoxPointer.PopupAnimation.FULL); | ||||||
|             this.sourceActor._delegate.setActive(true); |             this.sourceActor._delegate.active = true; | ||||||
|             return Clutter.EVENT_STOP; |             return Clutter.EVENT_STOP; | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @@ -1059,25 +1093,26 @@ var PopupMenuSection = class extends PopupMenuBase { | |||||||
|     close() { this.emit('open-state-changed', false); } |     close() { this.emit('open-state-changed', false); } | ||||||
| }; | }; | ||||||
|  |  | ||||||
| var PopupSubMenuMenuItem = class extends PopupBaseMenuItem { | var PopupSubMenuMenuItem = GObject.registerClass( | ||||||
|     constructor(text, wantIcon) { | class PopupSubMenuMenuItem extends PopupBaseMenuItem { | ||||||
|         super(); |     _init(text, wantIcon) { | ||||||
|  |         super._init(); | ||||||
|  |  | ||||||
|         this.actor.add_style_class_name('popup-submenu-menu-item'); |         this.add_style_class_name('popup-submenu-menu-item'); | ||||||
|  |  | ||||||
|         if (wantIcon) { |         if (wantIcon) { | ||||||
|             this.icon = new St.Icon({ style_class: 'popup-menu-icon' }); |             this.icon = new St.Icon({ style_class: 'popup-menu-icon' }); | ||||||
|             this.actor.add_child(this.icon); |             this.add_child(this.icon); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         this.label = new St.Label({ text: text, |         this.label = new St.Label({ text: text, | ||||||
|                                     y_expand: true, |                                     y_expand: true, | ||||||
|                                     y_align: Clutter.ActorAlign.CENTER }); |                                     y_align: Clutter.ActorAlign.CENTER }); | ||||||
|         this.actor.add_child(this.label); |         this.add_child(this.label); | ||||||
|         this.actor.label_actor = this.label; |         this.label_actor = this.label; | ||||||
|  |  | ||||||
|         let expander = new St.Bin({ style_class: 'popup-menu-item-expander' }); |         let expander = new St.Bin({ style_class: 'popup-menu-item-expander' }); | ||||||
|         this.actor.add(expander, { expand: true }); |         this.add(expander, { expand: true }); | ||||||
|  |  | ||||||
|         this._triangle = arrowIcon(St.Side.RIGHT); |         this._triangle = arrowIcon(St.Side.RIGHT); | ||||||
|         this._triangle.pivot_point = new Clutter.Point({ x: 0.5, y: 0.6 }); |         this._triangle.pivot_point = new Clutter.Point({ x: 0.5, y: 0.6 }); | ||||||
| @@ -1086,11 +1121,12 @@ var PopupSubMenuMenuItem = class extends PopupBaseMenuItem { | |||||||
|                                             y_align: Clutter.ActorAlign.CENTER }); |                                             y_align: Clutter.ActorAlign.CENTER }); | ||||||
|         this._triangleBin.add_child(this._triangle); |         this._triangleBin.add_child(this._triangle); | ||||||
|  |  | ||||||
|         this.actor.add_child(this._triangleBin); |         this.add_child(this._triangleBin); | ||||||
|         this.actor.add_accessible_state (Atk.StateType.EXPANDABLE); |         this.add_accessible_state(Atk.StateType.EXPANDABLE); | ||||||
|  |  | ||||||
|         this.menu = new PopupSubMenu(this.actor, this._triangle); |         this.menu = new PopupSubMenu(this, this._triangle); | ||||||
|         this.menu.connect('open-state-changed', this._subMenuOpenStateChanged.bind(this)); |         this.menu.connect('open-state-changed', this._subMenuOpenStateChanged.bind(this)); | ||||||
|  |         this.connect('destroy', () => { this.menu.destroy(); }); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     _setParent(parent) { |     _setParent(parent) { | ||||||
| @@ -1107,24 +1143,18 @@ var PopupSubMenuMenuItem = class extends PopupBaseMenuItem { | |||||||
|  |  | ||||||
|     _subMenuOpenStateChanged(menu, open) { |     _subMenuOpenStateChanged(menu, open) { | ||||||
|         if (open) { |         if (open) { | ||||||
|             this.actor.add_style_pseudo_class('open'); |             this.add_style_pseudo_class('open'); | ||||||
|             this._getTopMenu()._setOpenedSubMenu(this.menu); |             this._getTopMenu()._setOpenedSubMenu(this.menu); | ||||||
|             this.actor.add_accessible_state (Atk.StateType.EXPANDED); |             this.add_accessible_state(Atk.StateType.EXPANDED); | ||||||
|             this.actor.add_style_pseudo_class('checked'); |             this.add_style_pseudo_class('checked'); | ||||||
|         } else { |         } else { | ||||||
|             this.actor.remove_style_pseudo_class('open'); |             this.remove_style_pseudo_class('open'); | ||||||
|             this._getTopMenu()._setOpenedSubMenu(null); |             this._getTopMenu()._setOpenedSubMenu(null); | ||||||
|             this.actor.remove_accessible_state (Atk.StateType.EXPANDED); |             this.remove_accessible_state (Atk.StateType.EXPANDED); | ||||||
|             this.actor.remove_style_pseudo_class('checked'); |             this.remove_style_pseudo_class('checked'); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     destroy() { |  | ||||||
|         this.menu.destroy(); |  | ||||||
|  |  | ||||||
|         super.destroy(); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     setSubmenuShown(open) { |     setSubmenuShown(open) { | ||||||
|         if (open) |         if (open) | ||||||
|             this.menu.open(BoxPointer.PopupAnimation.FULL); |             this.menu.open(BoxPointer.PopupAnimation.FULL); | ||||||
| @@ -1162,7 +1192,7 @@ var PopupSubMenuMenuItem = class extends PopupBaseMenuItem { | |||||||
|     _onButtonReleaseEvent(actor) { |     _onButtonReleaseEvent(actor) { | ||||||
|         // Since we override the parent, we need to manage what the parent does |         // Since we override the parent, we need to manage what the parent does | ||||||
|         // with the active style class |         // with the active style class | ||||||
|         this.actor.remove_style_pseudo_class ('active'); |         this.remove_style_pseudo_class('active'); | ||||||
|         this._setOpenState(!this._getOpenState()); |         this._setOpenState(!this._getOpenState()); | ||||||
|         return Clutter.EVENT_PROPAGATE; |         return Clutter.EVENT_PROPAGATE; | ||||||
|     } |     } | ||||||
| @@ -1171,12 +1201,12 @@ var PopupSubMenuMenuItem = class extends PopupBaseMenuItem { | |||||||
|         if (event.type() == Clutter.EventType.TOUCH_END) { |         if (event.type() == Clutter.EventType.TOUCH_END) { | ||||||
|             // Since we override the parent, we need to manage what the parent does |             // Since we override the parent, we need to manage what the parent does | ||||||
|             // with the active style class |             // with the active style class | ||||||
|             this.actor.remove_style_pseudo_class ('active'); |             this.remove_style_pseudo_class('active'); | ||||||
|             this._setOpenState(!this._getOpenState()); |             this._setOpenState(!this._getOpenState()); | ||||||
|         } |         } | ||||||
|         return Clutter.EVENT_PROPAGATE; |         return Clutter.EVENT_PROPAGATE; | ||||||
|     } |     } | ||||||
| }; | }); | ||||||
|  |  | ||||||
| /* Basic implementation of a menu manager. | /* Basic implementation of a menu manager. | ||||||
|  * Call addMenu to add menus |  * Call addMenu to add menus | ||||||
| @@ -1186,7 +1216,7 @@ var PopupMenuManager = class { | |||||||
|         grabParams = Params.parse(grabParams, |         grabParams = Params.parse(grabParams, | ||||||
|                                   { actionMode: Shell.ActionMode.POPUP }); |                                   { actionMode: Shell.ActionMode.POPUP }); | ||||||
|         this._owner = owner; |         this._owner = owner; | ||||||
|         this._grabHelper = new GrabHelper.GrabHelper(owner.actor, grabParams); |         this._grabHelper = new GrabHelper.GrabHelper(owner, grabParams); | ||||||
|         this._menus = []; |         this._menus = []; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -810,16 +810,8 @@ var ScreenShield = class { | |||||||
|  |  | ||||||
|         this._maybeCancelDialog(); |         this._maybeCancelDialog(); | ||||||
|  |  | ||||||
|         if (this._longLightbox.actor.visible || |         if (this._longLightbox.actor.visible) { | ||||||
|             this._isActive) { |             // We're in the process of showing. | ||||||
|             // 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 |  | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- | // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- | ||||||
|  |  | ||||||
| const { Clutter, Gio, GLib, Gtk, Meta, Shell, St } = imports.gi; | const { Clutter, Gio, GLib, Meta, Shell, St } = imports.gi; | ||||||
| const Signals = imports.signals; | const Signals = imports.signals; | ||||||
|  |  | ||||||
| const GrabHelper = imports.ui.grabHelper; | const GrabHelper = imports.ui.grabHelper; | ||||||
| @@ -227,8 +227,6 @@ var SelectArea = class { | |||||||
|         this._lastY = 0; |         this._lastY = 0; | ||||||
|         this._result = null; |         this._result = null; | ||||||
|  |  | ||||||
|         this._initRubberbandColors(); |  | ||||||
|  |  | ||||||
|         this._group = new St.Widget({ visible: false, |         this._group = new St.Widget({ visible: false, | ||||||
|                                       reactive: true, |                                       reactive: true, | ||||||
|                                       x: 0, |                                       x: 0, | ||||||
| @@ -248,10 +246,10 @@ var SelectArea = class { | |||||||
|                                                       coordinate: Clutter.BindCoordinate.ALL }); |                                                       coordinate: Clutter.BindCoordinate.ALL }); | ||||||
|         this._group.add_constraint(constraint); |         this._group.add_constraint(constraint); | ||||||
|  |  | ||||||
|         this._rubberband = new Clutter.Rectangle({ color: this._background, |         this._rubberband = new St.Widget({ | ||||||
|                                                    has_border: true, |             style_class: 'select-area-rubberband', | ||||||
|                                                    border_width: 1, |             visible: false | ||||||
|                                                    border_color: this._border }); |         }); | ||||||
|         this._group.add_actor(this._rubberband); |         this._group.add_actor(this._rubberband); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -265,25 +263,6 @@ var SelectArea = class { | |||||||
|         this._group.visible = true; |         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() { |     _getGeometry() { | ||||||
|         return { x: Math.min(this._startX, this._lastX), |         return { x: Math.min(this._startX, this._lastX), | ||||||
|                  y: Math.min(this._startY, this._lastY), |                  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_position(geometry.x, geometry.y); | ||||||
|         this._rubberband.set_size(geometry.width, geometry.height); |         this._rubberband.set_size(geometry.width, geometry.height); | ||||||
|  |         this._rubberband.show(); | ||||||
|  |  | ||||||
|         return Clutter.EVENT_PROPAGATE; |         return Clutter.EVENT_PROPAGATE; | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -37,16 +37,13 @@ const { loadInterfaceXML } = imports.misc.fileUtils; | |||||||
|  * 'yield Scripting.sleep(500);' |  * 'yield Scripting.sleep(500);' | ||||||
|  */ |  */ | ||||||
| function sleep(milliseconds) { | function sleep(milliseconds) { | ||||||
|     let cb; |     return new Promise(resolve => { | ||||||
|  |  | ||||||
|         let id = Mainloop.timeout_add(milliseconds, () => { |         let id = Mainloop.timeout_add(milliseconds, () => { | ||||||
|         if (cb) |             resolve(); | ||||||
|             cb(); |  | ||||||
|             return GLib.SOURCE_REMOVE; |             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();' |  * 'yield Scripting.waitLeisure();' | ||||||
|  */ |  */ | ||||||
| function waitLeisure() { | function waitLeisure() { | ||||||
|     let cb; |     return new Promise(resolve => { | ||||||
|  |         global.run_at_leisure(resolve); | ||||||
|     global.run_at_leisure(() => { |  | ||||||
|        if (cb) |  | ||||||
|            cb(); |  | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     return callback => { cb = callback; }; |  | ||||||
| } | } | ||||||
|  |  | ||||||
| const PerfHelperIface = loadInterfaceXML('org.gnome.Shell.PerfHelper'); | const PerfHelperIface = loadInterfaceXML('org.gnome.Shell.PerfHelper'); | ||||||
| @@ -82,25 +74,16 @@ function _getPerfHelper() { | |||||||
| } | } | ||||||
|  |  | ||||||
| function _callRemote(obj, method, ...args) { | function _callRemote(obj, method, ...args) { | ||||||
|     let cb; |     return new Promise((resolve, reject) => { | ||||||
|     let errcb; |  | ||||||
|  |  | ||||||
|         args.push((result, excp) => { |         args.push((result, excp) => { | ||||||
|          if (excp) { |             if (excp) | ||||||
|              if (errcb) |                 reject(excp); | ||||||
|                  errcb(excp); |             else | ||||||
|          } else { |                 resolve(); | ||||||
|              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(); |     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) { | function _collect(scriptModule, outputFile) { | ||||||
|     let eventHandlers = {}; |     let eventHandlers = {}; | ||||||
|  |  | ||||||
| @@ -348,23 +310,23 @@ function _collect(scriptModule, outputFile) { | |||||||
|  * After running the script and collecting statistics from the |  * After running the script and collecting statistics from the | ||||||
|  * event log, GNOME Shell will exit. |  * event log, GNOME Shell will exit. | ||||||
|  **/ |  **/ | ||||||
| function runPerfScript(scriptModule, outputFile) { | async function runPerfScript(scriptModule, outputFile) { | ||||||
|     Shell.PerfLog.get_default().set_enabled(true); |     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 { |     try { | ||||||
|         _collect(scriptModule, outputFile); |         _collect(scriptModule, outputFile); | ||||||
|     } catch (err) { |     } catch (err) { | ||||||
|                   log("Script failed: " + err + "\n" + err.stack); |         log(`Script failed: ${err}\n${err.stack}`); | ||||||
|         Meta.exit(Meta.ExitCode.ERROR); |         Meta.exit(Meta.ExitCode.ERROR); | ||||||
|     } |     } | ||||||
|     Meta.exit(Meta.ExitCode.SUCCESS); |     Meta.exit(Meta.ExitCode.SUCCESS); | ||||||
|           }, |  | ||||||
|          err => { |  | ||||||
|              log("Script failed: " + err + "\n" + err.stack); |  | ||||||
|              Meta.exit(Meta.ExitCode.ERROR); |  | ||||||
|          }); |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -79,14 +79,17 @@ var GnomeShell = class { | |||||||
|         for (let param in params) |         for (let param in params) | ||||||
|             params[param] = params[param].deep_unpack(); |             params[param] = params[param].deep_unpack(); | ||||||
|  |  | ||||||
|         let { monitor: monitorIndex, |         let { connector, | ||||||
|               label, |               label, | ||||||
|               level, |               level, | ||||||
|               max_level: maxLevel, |               max_level: maxLevel, | ||||||
|               icon: serializedIcon } = params; |               icon: serializedIcon } = params; | ||||||
|  |  | ||||||
|         if (monitorIndex === undefined) |         let monitorIndex = -1; | ||||||
|             monitorIndex = -1; |         if (connector) { | ||||||
|  |             let monitorManager = Meta.MonitorManager.get(); | ||||||
|  |             monitorIndex = monitorManager.get_monitor_for_connector(connector); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         let icon = null; |         let icon = null; | ||||||
|         if (serializedIcon) |         if (serializedIcon) | ||||||
| @@ -203,16 +206,10 @@ var GnomeShell = class { | |||||||
|         this._grabbers.delete(name); |         this._grabbers.delete(name); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     ShowMonitorLabelsAsync(params, invocation) { |  | ||||||
|         let sender = invocation.get_sender(); |  | ||||||
|         let [dict] = params; |  | ||||||
|         Main.osdMonitorLabeler.show(sender, dict); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     ShowMonitorLabels2Async(params, invocation) { |     ShowMonitorLabels2Async(params, invocation) { | ||||||
|         let sender = invocation.get_sender(); |         let sender = invocation.get_sender(); | ||||||
|         let [dict] = params; |         let [dict] = params; | ||||||
|         Main.osdMonitorLabeler.show2(sender, dict); |         Main.osdMonitorLabeler.show(sender, dict); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     HideMonitorLabelsAsync(params, invocation) { |     HideMonitorLabelsAsync(params, invocation) { | ||||||
|   | |||||||
| @@ -148,7 +148,7 @@ function addContextMenu(entry, params) { | |||||||
|  |  | ||||||
|     entry.menu = new EntryMenu(entry); |     entry.menu = new EntryMenu(entry); | ||||||
|     entry.menu.isPassword = params.isPassword; |     entry.menu.isPassword = params.isPassword; | ||||||
|     entry._menuManager = new PopupMenu.PopupMenuManager({ actor: entry }, |     entry._menuManager = new PopupMenu.PopupMenuManager(entry, | ||||||
|                                                         { actionMode: params.actionMode }); |                                                         { actionMode: params.actionMode }); | ||||||
|     entry._menuManager.addMenu(entry.menu); |     entry._menuManager.addMenu(entry.menu); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -39,7 +39,7 @@ class ATIndicator extends PanelMenu.Button { | |||||||
|                                            icon_name: 'preferences-desktop-accessibility-symbolic' })); |                                            icon_name: 'preferences-desktop-accessibility-symbolic' })); | ||||||
|         this._hbox.add_child(PopupMenu.arrowIcon(St.Side.BOTTOM)); |         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 = new Gio.Settings({ schema_id: A11Y_SCHEMA }); | ||||||
|         this._a11ySettings.connect('changed::' + KEY_ALWAYS_SHOW, this._queueSyncMenuVisibility.bind(this)); |         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 alwaysShow = this._a11ySettings.get_boolean(KEY_ALWAYS_SHOW); | ||||||
|         let items = this.menu._getMenuItems(); |         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; |         return GLib.SOURCE_REMOVE; | ||||||
|     } |     } | ||||||
| @@ -112,38 +112,22 @@ class ATIndicator extends PanelMenu.Button { | |||||||
|  |  | ||||||
|     _buildItem(string, schema, key) { |     _buildItem(string, schema, key) { | ||||||
|         let settings = new Gio.Settings({ schema_id: schema }); |         let settings = new Gio.Settings({ schema_id: schema }); | ||||||
|  |         let widget = this._buildItemExtended(string, | ||||||
|  |             settings.get_boolean(key), | ||||||
|  |             settings.is_writable(key), | ||||||
|  |             enabled => settings.set_boolean(key, enabled)); | ||||||
|  |  | ||||||
|         settings.connect('changed::' + key, () => { |         settings.connect('changed::' + key, () => { | ||||||
|             widget.setToggleState(settings.get_boolean(key)); |             widget.setToggleState(settings.get_boolean(key)); | ||||||
|  |  | ||||||
|             this._queueSyncMenuVisibility(); |             this._queueSyncMenuVisibility(); | ||||||
|         }); |         }); | ||||||
|  |  | ||||||
|         let widget = this._buildItemExtended(string, |  | ||||||
|             settings.get_boolean(key), |  | ||||||
|             settings.is_writable(key), |  | ||||||
|             enabled => settings.set_boolean(key, enabled)); |  | ||||||
|         return widget; |         return widget; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     _buildHCItem() { |     _buildHCItem() { | ||||||
|         let interfaceSettings = new Gio.Settings({ schema_id: DESKTOP_INTERFACE_SCHEMA }); |         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 gtkTheme = interfaceSettings.get_string(KEY_GTK_THEME); | ||||||
|         let iconTheme = interfaceSettings.get_string(KEY_ICON_THEME); |         let iconTheme = interfaceSettings.get_string(KEY_ICON_THEME); | ||||||
|         let hasHC = (gtkTheme == HIGH_CONTRAST_THEME); |         let hasHC = (gtkTheme == HIGH_CONTRAST_THEME); | ||||||
| @@ -164,19 +148,30 @@ class ATIndicator extends PanelMenu.Button { | |||||||
|                     interfaceSettings.reset(KEY_ICON_THEME); |                     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; |         return highContrast; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     _buildFontItem() { |     _buildFontItem() { | ||||||
|         let settings = new Gio.Settings({ schema_id: DESKTOP_INTERFACE_SCHEMA }); |         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 factor = settings.get_double(KEY_TEXT_SCALING_FACTOR); | ||||||
|         let initial_setting = (factor > 1.0); |         let initial_setting = (factor > 1.0); | ||||||
|         let widget = this._buildItemExtended(_("Large Text"), |         let widget = this._buildItemExtended(_("Large Text"), | ||||||
| @@ -189,6 +184,15 @@ class ATIndicator extends PanelMenu.Button { | |||||||
|                 else |                 else | ||||||
|                     settings.reset(KEY_TEXT_SCALING_FACTOR); |                     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; |         return widget; | ||||||
|     } |     } | ||||||
| }); | }); | ||||||
|   | |||||||
| @@ -118,9 +118,9 @@ var Indicator = class extends PanelMenu.SystemIndicator { | |||||||
|         // Remember if there were setup devices and show the menu |         // Remember if there were setup devices and show the menu | ||||||
|         // if we've seen setup devices and we're not hard blocked |         // if we've seen setup devices and we're not hard blocked | ||||||
|         if (nDevices > 0) |         if (nDevices > 0) | ||||||
|             this._item.actor.visible = !this._proxy.BluetoothHardwareAirplaneMode; |             this._item.visible = !this._proxy.BluetoothHardwareAirplaneMode; | ||||||
|         else |         else | ||||||
|             this._item.actor.visible = this._proxy.BluetoothHasAirplaneMode && !this._proxy.BluetoothAirplaneMode; |             this._item.visible = this._proxy.BluetoothHasAirplaneMode && !this._proxy.BluetoothAirplaneMode; | ||||||
|  |  | ||||||
|         if (nConnectedDevices > 0) |         if (nConnectedDevices > 0) | ||||||
|             /* Translators: this is the number of connected bluetooth devices */ |             /* Translators: this is the number of connected bluetooth devices */ | ||||||
|   | |||||||
| @@ -37,12 +37,12 @@ var Indicator = class extends PanelMenu.SystemIndicator { | |||||||
|  |  | ||||||
|         let icon = new St.Icon({ icon_name: 'display-brightness-symbolic', |         let icon = new St.Icon({ icon_name: 'display-brightness-symbolic', | ||||||
|                                  style_class: 'popup-menu-icon' }); |                                  style_class: 'popup-menu-icon' }); | ||||||
|         this._item.actor.add(icon); |         this._item.add(icon); | ||||||
|         this._item.actor.add(this._slider.actor, { expand: true }); |         this._item.add(this._slider.actor, { expand: true }); | ||||||
|         this._item.actor.connect('button-press-event', (actor, event) => { |         this._item.connect('button-press-event', (actor, event) => { | ||||||
|             return this._slider.startDragging(event); |             return this._slider.startDragging(event); | ||||||
|         }); |         }); | ||||||
|         this._item.actor.connect('key-press-event', (actor, event) => { |         this._item.connect('key-press-event', (actor, event) => { | ||||||
|             return this._slider.onKeyPressEvent(actor, event); |             return this._slider.onKeyPressEvent(actor, event); | ||||||
|         }); |         }); | ||||||
|  |  | ||||||
| @@ -55,7 +55,7 @@ var Indicator = class extends PanelMenu.SystemIndicator { | |||||||
|  |  | ||||||
|     _sync() { |     _sync() { | ||||||
|         let visible = this._proxy.Brightness >= 0; |         let visible = this._proxy.Brightness >= 0; | ||||||
|         this._item.actor.visible = visible; |         this._item.visible = visible; | ||||||
|         if (visible) |         if (visible) | ||||||
|             this._slider.setValue(this._proxy.Brightness / 100.0); |             this._slider.setValue(this._proxy.Brightness / 100.0); | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -15,17 +15,18 @@ const Util = imports.misc.util; | |||||||
| const INPUT_SOURCE_TYPE_XKB = 'xkb'; | const INPUT_SOURCE_TYPE_XKB = 'xkb'; | ||||||
| const INPUT_SOURCE_TYPE_IBUS = 'ibus'; | const INPUT_SOURCE_TYPE_IBUS = 'ibus'; | ||||||
|  |  | ||||||
| var LayoutMenuItem = class extends PopupMenu.PopupBaseMenuItem { | var LayoutMenuItem = GObject.registerClass( | ||||||
|     constructor(displayName, shortName) { | class LayoutMenuItem extends PopupMenu.PopupBaseMenuItem { | ||||||
|         super(); |     _init(displayName, shortName) { | ||||||
|  |         super._init(); | ||||||
|  |  | ||||||
|         this.label = new St.Label({ text: displayName }); |         this.label = new St.Label({ text: displayName }); | ||||||
|         this.indicator = new St.Label({ text: shortName }); |         this.indicator = new St.Label({ text: shortName }); | ||||||
|         this.actor.add(this.label, { expand: true }); |         this.add(this.label, { expand: true }); | ||||||
|         this.actor.add(this.indicator); |         this.add(this.indicator); | ||||||
|         this.actor.label_actor = this.label; |         this.label_actor = this.label; | ||||||
|     } |     } | ||||||
| }; | }); | ||||||
|  |  | ||||||
| var InputSource = class { | var InputSource = class { | ||||||
|     constructor(type, id, displayName, shortName, index) { |     constructor(type, id, displayName, shortName, index) { | ||||||
| @@ -125,8 +126,8 @@ class InputSourceSwitcher extends SwitcherPopup.SwitcherList { | |||||||
|  |  | ||||||
| var InputSourceSettings = class { | var InputSourceSettings = class { | ||||||
|     constructor() { |     constructor() { | ||||||
|         if (new.target === InputSourceSettings) |         if (this.constructor === InputSourceSettings) | ||||||
|             throw new TypeError('Cannot instantiate abstract class ' + new.target.name); |             throw new TypeError(`Cannot instantiate abstract class ${this.constructor.name}`); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     _emitInputSourcesChanged() { |     _emitInputSourcesChanged() { | ||||||
| @@ -822,7 +823,7 @@ class InputSourceIndicator extends PanelMenu.Button { | |||||||
|         this._hbox.add_child(this._container); |         this._hbox.add_child(this._container); | ||||||
|         this._hbox.add_child(PopupMenu.arrowIcon(St.Side.BOTTOM)); |         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._propSeparator = new PopupMenu.PopupSeparatorMenuItem(); | ||||||
|         this.menu.addMenuItem(this._propSeparator); |         this.menu.addMenuItem(this._propSeparator); | ||||||
| @@ -857,7 +858,7 @@ class InputSourceIndicator extends PanelMenu.Button { | |||||||
|         // but at least for now it is used as "allow popping up windows |         // but at least for now it is used as "allow popping up windows | ||||||
|         // from shell menus"; we can always add a separate sessionMode |         // from shell menus"; we can always add a separate sessionMode | ||||||
|         // option if need arises. |         // option if need arises. | ||||||
|         this._showLayoutItem.actor.visible = Main.sessionMode.allowSettings; |         this._showLayoutItem.visible = Main.sessionMode.allowSettings; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     _sourcesChanged() { |     _sourcesChanged() { | ||||||
| @@ -908,11 +909,11 @@ class InputSourceIndicator extends PanelMenu.Button { | |||||||
|             // We also hide if we have only one visible source unless |             // We also hide if we have only one visible source unless | ||||||
|             // it's an IBus source with properties. |             // it's an IBus source with properties. | ||||||
|             this.menu.close(); |             this.menu.close(); | ||||||
|             this.actor.hide(); |             this.hide(); | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         this.actor.show(); |         this.show(); | ||||||
|  |  | ||||||
|         this._buildPropSection(newSource.properties); |         this._buildPropSection(newSource.properties); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -101,12 +101,12 @@ var Indicator = class extends PanelMenu.SystemIndicator { | |||||||
|     _syncIndicator() { |     _syncIndicator() { | ||||||
|         if (this._managerProxy == null) { |         if (this._managerProxy == null) { | ||||||
|             this._indicator.visible = false; |             this._indicator.visible = false; | ||||||
|             this._item.actor.visible = false; |             this._item.visible = false; | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         this._indicator.visible = this._managerProxy.InUse; |         this._indicator.visible = this._managerProxy.InUse; | ||||||
|         this._item.actor.visible = this._indicator.visible; |         this._item.visible = this._indicator.visible; | ||||||
|         this._updateMenuLabels(); |         this._updateMenuLabels(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -167,10 +167,10 @@ var NMConnectionItem = class { | |||||||
| }; | }; | ||||||
| Signals.addSignalMethods(NMConnectionItem.prototype); | Signals.addSignalMethods(NMConnectionItem.prototype); | ||||||
|  |  | ||||||
| var NMConnectionSection = class { | var NMConnectionSection = class NMConnectionSection { | ||||||
|     constructor(client) { |     constructor(client) { | ||||||
|         if (new.target === NMConnectionSection) |         if (this.constructor === NMConnectionSection) | ||||||
|             throw new TypeError('Cannot instantiate abstract type ' + new.target.name); |             throw new TypeError(`Cannot instantiate abstract type ${this.constructor.name}`); | ||||||
|  |  | ||||||
|         this._client = client; |         this._client = client; | ||||||
|  |  | ||||||
| @@ -235,14 +235,14 @@ var NMConnectionSection = class { | |||||||
|         if (!this._connectionValid(connection)) |         if (!this._connectionValid(connection)) | ||||||
|             return; |             return; | ||||||
|  |  | ||||||
|         // This function is called everytime connection is added or updated |         // This function is called every time the connection is added or updated. | ||||||
|         // In the usual case, we already added this connection and UUID |         // In the usual case, we already added this connection and UUID | ||||||
|         // didn't change. So we need to check if we already have an item, |         // didn't change. So we need to check if we already have an item, | ||||||
|         // and update it for properties in the connection that changed |         // and update it for properties in the connection that changed | ||||||
|         // (the only one we care about is the name) |         // (the only one we care about is the name) | ||||||
|         // But it's also possible we didn't know about this connection |         // But it's also possible we didn't know about this connection | ||||||
|         // (eg, during coldplug, or because it was updated and suddenly |         // (eg, during coldplug, or because it was updated and suddenly | ||||||
|         // it's valid for this device), in which case we add a new item |         // it's valid for this device), in which case we add a new item. | ||||||
|  |  | ||||||
|         let item = this._connectionItems.get(connection.get_uuid()); |         let item = this._connectionItems.get(connection.get_uuid()); | ||||||
|         if (item) |         if (item) | ||||||
| @@ -297,12 +297,13 @@ var NMConnectionSection = class { | |||||||
| }; | }; | ||||||
| Signals.addSignalMethods(NMConnectionSection.prototype); | Signals.addSignalMethods(NMConnectionSection.prototype); | ||||||
|  |  | ||||||
| var NMConnectionDevice = class extends NMConnectionSection { | var NMConnectionDevice = class NMConnectionDevice extends NMConnectionSection { | ||||||
|     constructor(client, device) { |     constructor(client, device) { | ||||||
|         if (new.target === NMConnectionDevice) |  | ||||||
|             throw new TypeError('Cannot instantiate abstract type ' + new.target.name); |  | ||||||
|  |  | ||||||
|         super(client); |         super(client); | ||||||
|  |  | ||||||
|  |         if (this.constructor === NMConnectionDevice) | ||||||
|  |             throw new TypeError(`Cannot instantiate abstract type ${this.constructor.name}`); | ||||||
|  |  | ||||||
|         this._device = device; |         this._device = device; | ||||||
|         this._description = ''; |         this._description = ''; | ||||||
|  |  | ||||||
| @@ -388,8 +389,8 @@ var NMConnectionDevice = class extends NMConnectionSection { | |||||||
|  |  | ||||||
|     _sync() { |     _sync() { | ||||||
|         let nItems = this._connectionItems.size; |         let nItems = this._connectionItems.size; | ||||||
|         this._autoConnectItem.actor.visible = (nItems == 0); |         this._autoConnectItem.visible = (nItems == 0); | ||||||
|         this._deactivateItem.actor.visible = this._device.state > NM.DeviceState.DISCONNECTED; |         this._deactivateItem.visible = this._device.state > NM.DeviceState.DISCONNECTED; | ||||||
|  |  | ||||||
|         if (this._activeConnection == null) { |         if (this._activeConnection == null) { | ||||||
|             let activeConnection = this._device.active_connection; |             let activeConnection = this._device.active_connection; | ||||||
| @@ -476,7 +477,7 @@ var NMDeviceWired = class extends NMConnectionDevice { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     _sync() { |     _sync() { | ||||||
|         this.item.actor.visible = this._hasCarrier(); |         this.item.visible = this._hasCarrier(); | ||||||
|         super._sync(); |         super._sync(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -1075,7 +1076,7 @@ var NMWirelessDialog = class extends ModalDialog.ModalDialog { | |||||||
|  |  | ||||||
|             let newPos = Util.insertSorted(this._networks, network, this._networkSortFunction); |             let newPos = Util.insertSorted(this._networks, network, this._networkSortFunction); | ||||||
|             this._createNetworkItem(network); |             this._createNetworkItem(network); | ||||||
|             this._itemBox.insert_child_at_index(network.item.actor, newPos); |             this._itemBox.insert_child_at_index(network.item, newPos); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         this._syncView(); |         this._syncView(); | ||||||
| @@ -1093,7 +1094,7 @@ var NMWirelessDialog = class extends ModalDialog.ModalDialog { | |||||||
|         network.accessPoints.splice(res.ap, 1); |         network.accessPoints.splice(res.ap, 1); | ||||||
|  |  | ||||||
|         if (network.accessPoints.length == 0) { |         if (network.accessPoints.length == 0) { | ||||||
|             network.item.actor.destroy(); |             network.item.destroy(); | ||||||
|             this._networks.splice(res.network, 1); |             this._networks.splice(res.network, 1); | ||||||
|         } else { |         } else { | ||||||
|             network.item.updateBestAP(network.accessPoints[0]); |             network.item.updateBestAP(network.accessPoints[0]); | ||||||
| @@ -1109,7 +1110,7 @@ var NMWirelessDialog = class extends ModalDialog.ModalDialog { | |||||||
|  |  | ||||||
|         this._itemBox.remove_all_children(); |         this._itemBox.remove_all_children(); | ||||||
|         this._networks.forEach(network => { |         this._networks.forEach(network => { | ||||||
|             this._itemBox.add_child(network.item.actor); |             this._itemBox.add_child(network.item); | ||||||
|         }); |         }); | ||||||
|  |  | ||||||
|         adjustment.value = scrollValue; |         adjustment.value = scrollValue; | ||||||
| @@ -1117,25 +1118,25 @@ var NMWirelessDialog = class extends ModalDialog.ModalDialog { | |||||||
|  |  | ||||||
|     _selectNetwork(network) { |     _selectNetwork(network) { | ||||||
|         if (this._selectedNetwork) |         if (this._selectedNetwork) | ||||||
|             this._selectedNetwork.item.actor.remove_style_pseudo_class('selected'); |             this._selectedNetwork.item.remove_style_pseudo_class('selected'); | ||||||
|  |  | ||||||
|         this._selectedNetwork = network; |         this._selectedNetwork = network; | ||||||
|         this._updateSensitivity(); |         this._updateSensitivity(); | ||||||
|  |  | ||||||
|         if (this._selectedNetwork) |         if (this._selectedNetwork) | ||||||
|             this._selectedNetwork.item.actor.add_style_pseudo_class('selected'); |             this._selectedNetwork.item.add_style_pseudo_class('selected'); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     _createNetworkItem(network) { |     _createNetworkItem(network) { | ||||||
|         network.item = new NMWirelessDialogItem(network); |         network.item = new NMWirelessDialogItem(network); | ||||||
|         network.item.setActive(network == this._selectedNetwork); |         network.item.setActive(network == this._selectedNetwork); | ||||||
|         network.item.connect('selected', () => { |         network.item.connect('selected', () => { | ||||||
|             Util.ensureActorVisibleInScrollView(this._scrollView, network.item.actor); |             Util.ensureActorVisibleInScrollView(this._scrollView, network.item); | ||||||
|             this._selectNetwork(network); |             this._selectNetwork(network); | ||||||
|         }); |         }); | ||||||
|         network.item.actor.connect('destroy', () => { |         network.item.connect('destroy', () => { | ||||||
|             let keyFocus = global.stage.key_focus; |             let keyFocus = global.stage.key_focus; | ||||||
|             if (keyFocus && keyFocus.contains(network.item.actor)) |             if (keyFocus && keyFocus.contains(network.item)) | ||||||
|                 this._itemBox.grab_key_focus(); |                 this._itemBox.grab_key_focus(); | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
| @@ -1261,7 +1262,7 @@ var NMDeviceWireless = class { | |||||||
|  |  | ||||||
|     _sync() { |     _sync() { | ||||||
|         this._toggleItem.label.text = this._client.wireless_enabled ? _("Turn Off") : _("Turn On"); |         this._toggleItem.label.text = this._client.wireless_enabled ? _("Turn Off") : _("Turn On"); | ||||||
|         this._toggleItem.actor.visible = this._client.wireless_hardware_enabled; |         this._toggleItem.visible = this._client.wireless_hardware_enabled; | ||||||
|  |  | ||||||
|         this.item.icon.icon_name = this._getMenuIcon(); |         this.item.icon.icon_name = this._getMenuIcon(); | ||||||
|         this.item.label.text = this._getStatus(); |         this.item.label.text = this._getStatus(); | ||||||
| @@ -1451,7 +1452,7 @@ var NMVpnSection = class extends NMConnectionSection { | |||||||
|  |  | ||||||
|     _sync() { |     _sync() { | ||||||
|         let nItems = this._connectionItems.size; |         let nItems = this._connectionItems.size; | ||||||
|         this.item.actor.visible = (nItems > 0); |         this.item.visible = (nItems > 0); | ||||||
|  |  | ||||||
|         super._sync(); |         super._sync(); | ||||||
|     } |     } | ||||||
| @@ -1534,7 +1535,7 @@ var DeviceCategory = class extends PopupMenu.PopupMenuSection { | |||||||
|  |  | ||||||
|         this._summaryItem.menu.addSettingsAction(_('Network Settings'), |         this._summaryItem.menu.addSettingsAction(_('Network Settings'), | ||||||
|                                                  'gnome-network-panel.desktop'); |                                                  'gnome-network-panel.desktop'); | ||||||
|         this._summaryItem.actor.hide(); |         this._summaryItem.hide(); | ||||||
|  |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -1543,7 +1544,7 @@ var DeviceCategory = class extends PopupMenu.PopupMenuSection { | |||||||
|             (prev, child) => prev + (child.visible ? 1 : 0), 0); |             (prev, child) => prev + (child.visible ? 1 : 0), 0); | ||||||
|         this._summaryItem.label.text = this._getSummaryLabel(nDevices); |         this._summaryItem.label.text = this._getSummaryLabel(nDevices); | ||||||
|         let shouldSummarize = nDevices > MAX_DEVICE_ITEMS; |         let shouldSummarize = nDevices > MAX_DEVICE_ITEMS; | ||||||
|         this._summaryItem.actor.visible = shouldSummarize; |         this._summaryItem.visible = shouldSummarize; | ||||||
|         this.section.actor.visible = !shouldSummarize; |         this.section.actor.visible = !shouldSummarize; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -1673,7 +1674,11 @@ var NMApplet = class extends PanelMenu.SystemIndicator { | |||||||
|     _readDevices() { |     _readDevices() { | ||||||
|         let devices = this._client.get_devices() || [ ]; |         let devices = this._client.get_devices() || [ ]; | ||||||
|         for (let i = 0; i < devices.length; ++i) { |         for (let i = 0; i < devices.length; ++i) { | ||||||
|  |             try { | ||||||
|                 this._deviceAdded(this._client, devices[i], true); |                 this._deviceAdded(this._client, devices[i], true); | ||||||
|  |             } catch (e) { | ||||||
|  |                 log(`Failed to add device ${devices[i]}: ${e}`); | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|         this._syncDeviceNames(); |         this._syncDeviceNames(); | ||||||
|     } |     } | ||||||
| @@ -1726,6 +1731,17 @@ var NMApplet = class extends PanelMenu.SystemIndicator { | |||||||
|             this._addDeviceWrapper(wrapper); |             this._addDeviceWrapper(wrapper); | ||||||
|  |  | ||||||
|             this._nmDevices.push(device); |             this._nmDevices.push(device); | ||||||
|  |             this._deviceChanged(device, skipSyncDeviceNames); | ||||||
|  |  | ||||||
|  |             device.connect('notify::interface', () => { | ||||||
|  |                 this._deviceChanged(device, false); | ||||||
|  |             }); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     _deviceChanged(device, skipSyncDeviceNames) { | ||||||
|  |         let wrapper = device._delegate; | ||||||
|  |  | ||||||
|         if (!skipSyncDeviceNames) |         if (!skipSyncDeviceNames) | ||||||
|             this._syncDeviceNames(); |             this._syncDeviceNames(); | ||||||
|  |  | ||||||
| @@ -1735,7 +1751,6 @@ var NMApplet = class extends PanelMenu.SystemIndicator { | |||||||
|             }); |             }); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     } |  | ||||||
|  |  | ||||||
|     _addDeviceWrapper(wrapper) { |     _addDeviceWrapper(wrapper) { | ||||||
|         wrapper._activationFailedId = wrapper.connect('activation-failed', |         wrapper._activationFailedId = wrapper.connect('activation-failed', | ||||||
|   | |||||||
| @@ -61,6 +61,6 @@ var Indicator = class extends PanelMenu.SystemIndicator { | |||||||
|                                          : _("Night Light On"); |                                          : _("Night Light On"); | ||||||
|         this._disableItem.label.text = disabled ? _("Resume") |         this._disableItem.label.text = disabled ? _("Resume") | ||||||
|                                                 : _("Disable Until Tomorrow"); |                                                 : _("Disable Until Tomorrow"); | ||||||
|         this._item.actor.visible = this._indicator.visible = visible; |         this._item.visible = this._indicator.visible = visible; | ||||||
|     } |     } | ||||||
| }; | }; | ||||||
|   | |||||||
| @@ -96,11 +96,11 @@ var Indicator = class extends PanelMenu.SystemIndicator { | |||||||
|         // Do we have batteries or a UPS? |         // Do we have batteries or a UPS? | ||||||
|         let visible = this._proxy.IsPresent; |         let visible = this._proxy.IsPresent; | ||||||
|         if (visible) { |         if (visible) { | ||||||
|             this._item.actor.show(); |             this._item.show(); | ||||||
|             this._percentageLabel.visible = this._desktopSettings.get_boolean(SHOW_BATTERY_PERCENTAGE); |             this._percentageLabel.visible = this._desktopSettings.get_boolean(SHOW_BATTERY_PERCENTAGE); | ||||||
|         } else { |         } else { | ||||||
|             // If there's no battery, then we use the power icon. |             // If there's no battery, then we use the power icon. | ||||||
|             this._item.actor.hide(); |             this._item.hide(); | ||||||
|             this._indicator.icon_name = 'system-shutdown-symbolic'; |             this._indicator.icon_name = 'system-shutdown-symbolic'; | ||||||
|             this._percentageLabel.hide(); |             this._percentageLabel.hide(); | ||||||
|             return; |             return; | ||||||
|   | |||||||
| @@ -53,10 +53,10 @@ var RemoteAccessApplet = class extends PanelMenu.SystemIndicator { | |||||||
|     _sync() { |     _sync() { | ||||||
|         if (this._handles.size == 0) { |         if (this._handles.size == 0) { | ||||||
|             this._indicator.visible = false; |             this._indicator.visible = false; | ||||||
|             this._item.actor.visible = false; |             this._item.visible = false; | ||||||
|         } else { |         } else { | ||||||
|             this._indicator.visible = true; |             this._indicator.visible = true; | ||||||
|             this._item.actor.visible = true; |             this._item.visible = true; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -97,7 +97,7 @@ var Indicator = class extends PanelMenu.SystemIndicator { | |||||||
|         let showAirplaneMode = this._manager.shouldShowAirplaneMode; |         let showAirplaneMode = this._manager.shouldShowAirplaneMode; | ||||||
|  |  | ||||||
|         this._indicator.visible = (airplaneMode && showAirplaneMode); |         this._indicator.visible = (airplaneMode && showAirplaneMode); | ||||||
|         this._item.actor.visible = (airplaneMode && showAirplaneMode); |         this._item.visible = (airplaneMode && showAirplaneMode); | ||||||
|         this._offItem.setSensitive(!hwAirplaneMode); |         this._offItem.setSensitive(!hwAirplaneMode); | ||||||
|  |  | ||||||
|         if (hwAirplaneMode) |         if (hwAirplaneMode) | ||||||
|   | |||||||
| @@ -116,9 +116,9 @@ var Indicator = class extends PanelMenu.SystemIndicator { | |||||||
|  |  | ||||||
|         this._createSubMenu(); |         this._createSubMenu(); | ||||||
|  |  | ||||||
|         this._loginScreenItem.actor.connect('notify::visible', |         this._loginScreenItem.connect('notify::visible', | ||||||
|                                       () => { this._updateMultiUser(); }); |                                       () => { this._updateMultiUser(); }); | ||||||
|         this._logoutItem.actor.connect('notify::visible', |         this._logoutItem.connect('notify::visible', | ||||||
|                                  () => { this._updateMultiUser(); }); |                                  () => { this._updateMultiUser(); }); | ||||||
|         // Whether shutdown is available or not depends on both lockdown |         // Whether shutdown is available or not depends on both lockdown | ||||||
|         // settings (disable-log-out) and Polkit policy - the latter doesn't |         // settings (disable-log-out) and Polkit policy - the latter doesn't | ||||||
| @@ -142,7 +142,7 @@ var Indicator = class extends PanelMenu.SystemIndicator { | |||||||
|                        this._lockScreenAction.visible || |                        this._lockScreenAction.visible || | ||||||
|                        this._altSwitcher.actor.visible); |                        this._altSwitcher.actor.visible); | ||||||
|  |  | ||||||
|         this._actionsItem.actor.visible = visible; |         this.buttonGroup.visible = visible; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     _sessionUpdated() { |     _sessionUpdated() { | ||||||
| @@ -150,10 +150,10 @@ var Indicator = class extends PanelMenu.SystemIndicator { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     _updateMultiUser() { |     _updateMultiUser() { | ||||||
|         let hasSwitchUser = this._loginScreenItem.actor.visible; |         let hasSwitchUser = this._loginScreenItem.visible; | ||||||
|         let hasLogout = this._logoutItem.actor.visible; |         let hasLogout = this._logoutItem.visible; | ||||||
|  |  | ||||||
|         this._switchUserSubMenu.actor.visible = hasSwitchUser || hasLogout; |         this._switchUserSubMenu.visible = hasSwitchUser || hasLogout; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     _updateSwitchUserSubMenu() { |     _updateSwitchUserSubMenu() { | ||||||
| @@ -208,7 +208,7 @@ var Indicator = class extends PanelMenu.SystemIndicator { | |||||||
|         this._switchUserSubMenu.menu.addMenuItem(item); |         this._switchUserSubMenu.menu.addMenuItem(item); | ||||||
|         this._loginScreenItem = item; |         this._loginScreenItem = item; | ||||||
|         this._systemActions.bind_property('can-switch-user', |         this._systemActions.bind_property('can-switch-user', | ||||||
|                                           this._loginScreenItem.actor, |                                           this._loginScreenItem, | ||||||
|                                           'visible', |                                           'visible', | ||||||
|                                           bindFlags); |                                           bindFlags); | ||||||
|  |  | ||||||
| @@ -220,7 +220,7 @@ var Indicator = class extends PanelMenu.SystemIndicator { | |||||||
|         this._switchUserSubMenu.menu.addMenuItem(item); |         this._switchUserSubMenu.menu.addMenuItem(item); | ||||||
|         this._logoutItem = item; |         this._logoutItem = item; | ||||||
|         this._systemActions.bind_property('can-logout', |         this._systemActions.bind_property('can-logout', | ||||||
|                                           this._logoutItem.actor, |                                           this._logoutItem, | ||||||
|                                           'visible', |                                           'visible', | ||||||
|                                           bindFlags); |                                           bindFlags); | ||||||
|  |  | ||||||
| @@ -236,6 +236,7 @@ var Indicator = class extends PanelMenu.SystemIndicator { | |||||||
|  |  | ||||||
|         item = new PopupMenu.PopupBaseMenuItem({ reactive: false, |         item = new PopupMenu.PopupBaseMenuItem({ reactive: false, | ||||||
|                                                  can_focus: false }); |                                                  can_focus: false }); | ||||||
|  |         this.buttonGroup = item; | ||||||
|  |  | ||||||
|         let app = this._settingsApp = Shell.AppSystem.get_default().lookup_app( |         let app = this._settingsApp = Shell.AppSystem.get_default().lookup_app( | ||||||
|             'gnome-control-center.desktop' |             'gnome-control-center.desktop' | ||||||
| @@ -250,14 +251,14 @@ var Indicator = class extends PanelMenu.SystemIndicator { | |||||||
|             log('Missing required core component Settings, expect trouble…'); |             log('Missing required core component Settings, expect trouble…'); | ||||||
|             this._settingsAction = new St.Widget(); |             this._settingsAction = new St.Widget(); | ||||||
|         } |         } | ||||||
|         item.actor.add(this._settingsAction, { expand: true, x_fill: false }); |         item.add(this._settingsAction, { expand: true, x_fill: false }); | ||||||
|  |  | ||||||
|         this._orientationLockAction = this._createActionButton('', _("Orientation Lock")); |         this._orientationLockAction = this._createActionButton('', _("Orientation Lock")); | ||||||
|         this._orientationLockAction.connect('clicked', () => { |         this._orientationLockAction.connect('clicked', () => { | ||||||
|             this.menu.itemActivated(BoxPointer.PopupAnimation.NONE), |             this.menu.itemActivated(BoxPointer.PopupAnimation.NONE), | ||||||
|             this._systemActions.activateLockOrientation(); |             this._systemActions.activateLockOrientation(); | ||||||
|         }); |         }); | ||||||
|         item.actor.add(this._orientationLockAction, { expand: true, x_fill: false }); |         item.add(this._orientationLockAction, { expand: true, x_fill: false }); | ||||||
|         this._systemActions.bind_property('can-lock-orientation', |         this._systemActions.bind_property('can-lock-orientation', | ||||||
|                                           this._orientationLockAction, |                                           this._orientationLockAction, | ||||||
|                                           'visible', |                                           'visible', | ||||||
| @@ -272,7 +273,7 @@ var Indicator = class extends PanelMenu.SystemIndicator { | |||||||
|             this.menu.itemActivated(BoxPointer.PopupAnimation.NONE); |             this.menu.itemActivated(BoxPointer.PopupAnimation.NONE); | ||||||
|             this._systemActions.activateLockScreen(); |             this._systemActions.activateLockScreen(); | ||||||
|         }); |         }); | ||||||
|         item.actor.add(this._lockScreenAction, { expand: true, x_fill: false }); |         item.add(this._lockScreenAction, { expand: true, x_fill: false }); | ||||||
|         this._systemActions.bind_property('can-lock-screen', |         this._systemActions.bind_property('can-lock-screen', | ||||||
|                                           this._lockScreenAction, |                                           this._lockScreenAction, | ||||||
|                                           'visible', |                                           'visible', | ||||||
| @@ -299,9 +300,8 @@ var Indicator = class extends PanelMenu.SystemIndicator { | |||||||
|                                           bindFlags); |                                           bindFlags); | ||||||
|  |  | ||||||
|         this._altSwitcher = new AltSwitcher(this._powerOffAction, this._suspendAction); |         this._altSwitcher = new AltSwitcher(this._powerOffAction, this._suspendAction); | ||||||
|         item.actor.add(this._altSwitcher.actor, { expand: true, x_fill: false }); |         item.add(this._altSwitcher.actor, { expand: true, x_fill: false }); | ||||||
|  |  | ||||||
|         this._actionsItem = item; |  | ||||||
|         this.menu.addMenuItem(item); |         this.menu.addMenuItem(item); | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -41,12 +41,12 @@ var StreamSlider = class { | |||||||
|         this._slider.connect('drag-end', this._notifyVolumeChange.bind(this)); |         this._slider.connect('drag-end', this._notifyVolumeChange.bind(this)); | ||||||
|  |  | ||||||
|         this._icon = new St.Icon({ style_class: 'popup-menu-icon' }); |         this._icon = new St.Icon({ style_class: 'popup-menu-icon' }); | ||||||
|         this.item.actor.add(this._icon); |         this.item.add(this._icon); | ||||||
|         this.item.actor.add(this._slider.actor, { expand: true }); |         this.item.add(this._slider.actor, { expand: true }); | ||||||
|         this.item.actor.connect('button-press-event', (actor, event) => { |         this.item.connect('button-press-event', (actor, event) => { | ||||||
|             return this._slider.startDragging(event); |             return this._slider.startDragging(event); | ||||||
|         }); |         }); | ||||||
|         this.item.actor.connect('key-press-event', (actor, event) => { |         this.item.connect('key-press-event', (actor, event) => { | ||||||
|             return this._slider.onKeyPressEvent(actor, event); |             return this._slider.onKeyPressEvent(actor, event); | ||||||
|         }); |         }); | ||||||
|  |  | ||||||
| @@ -93,7 +93,7 @@ var StreamSlider = class { | |||||||
|  |  | ||||||
|     _updateVisibility() { |     _updateVisibility() { | ||||||
|         let visible = this._shouldBeVisible(); |         let visible = this._shouldBeVisible(); | ||||||
|         this.item.actor.visible = visible; |         this.item.visible = visible; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     scroll(event) { |     scroll(event) { | ||||||
|   | |||||||
| @@ -30,12 +30,10 @@ function primaryModifier(mask) { | |||||||
|     return primary; |     return primary; | ||||||
| } | } | ||||||
|  |  | ||||||
| var SwitcherPopup = GObject.registerClass( | var SwitcherPopup = GObject.registerClass({ | ||||||
| class SwitcherPopup extends St.Widget { |     GTypeFlags: GObject.TypeFlags.ABSTRACT | ||||||
|  | }, class SwitcherPopup extends St.Widget { | ||||||
|     _init(items) { |     _init(items) { | ||||||
|         if (new.target === SwitcherPopup) |  | ||||||
|             throw new TypeError('Cannot instantiate abstract class ' + new.target.name); |  | ||||||
|  |  | ||||||
|         super._init({ style_class: 'switcher-popup', |         super._init({ style_class: 'switcher-popup', | ||||||
|                       reactive: true, |                       reactive: true, | ||||||
|                       visible: false }); |                       visible: false }); | ||||||
|   | |||||||
| @@ -152,7 +152,7 @@ function registerSpecialPropertySplitter(name, splitFunction, parameters) { | |||||||
| // Tweener to a Clutter.TimeLine. Now, Clutter.Timeline itself isn't a | // Tweener to a Clutter.TimeLine. Now, Clutter.Timeline itself isn't a | ||||||
| // whole lot more sophisticated than a simple timeout at a fixed frame | // whole lot more sophisticated than a simple timeout at a fixed frame | ||||||
| // rate, but at least it knows how to drop frames. (See | // rate, but at least it knows how to drop frames. (See | ||||||
| // HippoAnimationManager for a more sophisticated view of continous | // HippoAnimationManager for a more sophisticated view of continuous | ||||||
| // time updates; even better is to pay attention to the vertical | // time updates; even better is to pay attention to the vertical | ||||||
| // vblank and sync to that when possible.) | // vblank and sync to that when possible.) | ||||||
| // | // | ||||||
|   | |||||||
| @@ -11,7 +11,6 @@ const WorkspaceSwitcherPopup = imports.ui.workspaceSwitcherPopup; | |||||||
| const InhibitShortcutsDialog = imports.ui.inhibitShortcutsDialog; | const InhibitShortcutsDialog = imports.ui.inhibitShortcutsDialog; | ||||||
| const Main = imports.ui.main; | const Main = imports.ui.main; | ||||||
| const ModalDialog = imports.ui.modalDialog; | const ModalDialog = imports.ui.modalDialog; | ||||||
| const Tweener = imports.ui.tweener; |  | ||||||
| const WindowMenu = imports.ui.windowMenu; | const WindowMenu = imports.ui.windowMenu; | ||||||
| const PadOsd = imports.ui.padOsd; | const PadOsd = imports.ui.padOsd; | ||||||
| const EdgeDragAction = imports.ui.edgeDragAction; | const EdgeDragAction = imports.ui.edgeDragAction; | ||||||
| @@ -21,15 +20,15 @@ const SwitchMonitor = imports.ui.switchMonitor; | |||||||
| const { loadInterfaceXML } = imports.misc.fileUtils; | const { loadInterfaceXML } = imports.misc.fileUtils; | ||||||
|  |  | ||||||
| var SHELL_KEYBINDINGS_SCHEMA = 'org.gnome.shell.keybindings'; | var SHELL_KEYBINDINGS_SCHEMA = 'org.gnome.shell.keybindings'; | ||||||
| var MINIMIZE_WINDOW_ANIMATION_TIME = 0.2; | var MINIMIZE_WINDOW_ANIMATION_TIME = 200; // ms | ||||||
| var SHOW_WINDOW_ANIMATION_TIME = 0.15; | var SHOW_WINDOW_ANIMATION_TIME = 150; // ms | ||||||
| var DIALOG_SHOW_WINDOW_ANIMATION_TIME = 0.1; | var DIALOG_SHOW_WINDOW_ANIMATION_TIME = 100; // ms | ||||||
| var DESTROY_WINDOW_ANIMATION_TIME = 0.15; | var DESTROY_WINDOW_ANIMATION_TIME = 150; // ms | ||||||
| var DIALOG_DESTROY_WINDOW_ANIMATION_TIME = 0.1; | var DIALOG_DESTROY_WINDOW_ANIMATION_TIME = 100; // ms | ||||||
| var WINDOW_ANIMATION_TIME = 0.25; | var WINDOW_ANIMATION_TIME = 250; // ms | ||||||
| var DIM_BRIGHTNESS = -0.3; | var DIM_BRIGHTNESS = -0.3; | ||||||
| var DIM_TIME = 0.500; | var DIM_TIME = 500; // ms | ||||||
| var UNDIM_TIME = 0.250; | var UNDIM_TIME = 250; // ms | ||||||
| var MOTION_THRESHOLD = 100; | var MOTION_THRESHOLD = 100; | ||||||
|  |  | ||||||
| var ONE_SECOND = 1000; // in ms | var ONE_SECOND = 1000; // in ms | ||||||
| @@ -59,7 +58,7 @@ var DisplayChangeDialog = class extends ModalDialog.ModalDialog { | |||||||
|                                { x_fill: true, |                                { x_fill: true, | ||||||
|                                  y_fill: true }); |                                  y_fill: true }); | ||||||
|  |  | ||||||
|         /* Translators: this and the following message should be limited in lenght, |         /* Translators: this and the following message should be limited in length, | ||||||
|            to avoid ellipsizing the labels. |            to avoid ellipsizing the labels. | ||||||
|         */ |         */ | ||||||
|         this._cancelButton = this.addButton({ label: _("Revert Settings"), |         this._cancelButton = this.addButton({ label: _("Revert Settings"), | ||||||
| @@ -115,16 +114,39 @@ var DisplayChangeDialog = class extends ModalDialog.ModalDialog { | |||||||
|  |  | ||||||
| var WindowDimmer = class { | var WindowDimmer = class { | ||||||
|     constructor(actor) { |     constructor(actor) { | ||||||
|         this._brightnessEffect = new Clutter.BrightnessContrastEffect(); |         this._brightnessEffect = new Clutter.BrightnessContrastEffect({ | ||||||
|  |             name: 'dim', | ||||||
|  |             enabled: false | ||||||
|  |         }); | ||||||
|         actor.add_effect(this._brightnessEffect); |         actor.add_effect(this._brightnessEffect); | ||||||
|         this.actor = actor; |         this.actor = actor; | ||||||
|         this._enabled = true; |         this._enabled = true; | ||||||
|         this._dimFactor = 0.0; |         this._dimmed = false; | ||||||
|         this._syncEnabled(); |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     _syncEnabled() { |     _syncEnabled() { | ||||||
|         this._brightnessEffect.enabled = (this._enabled && this._dimFactor > 0); |         this._brightnessEffect.enabled = | ||||||
|  |             (this._enabled && (this._dimmed || this._transition != null)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     get _transition() { | ||||||
|  |         return this.actor.get_transition('dim'); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     _ensureTransition() { | ||||||
|  |         if (this._transition) | ||||||
|  |             return; | ||||||
|  |  | ||||||
|  |         let params = { | ||||||
|  |             propertyName: '@effects.dim.brightness', | ||||||
|  |             progressMode: Clutter.AnimationMode.LINEAR, | ||||||
|  |             duration: (this._dimmed ? DIM_TIME : UNDIM_TIME), | ||||||
|  |             removeOnComplete: true | ||||||
|  |         }; | ||||||
|  |         this.actor.add_transition('dim', | ||||||
|  |             new Clutter.PropertyTransition(params)); | ||||||
|  |  | ||||||
|  |         this._transition.connect('completed', this._syncEnabled.bind(this)); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     setEnabled(enabled) { |     setEnabled(enabled) { | ||||||
| @@ -132,14 +154,20 @@ var WindowDimmer = class { | |||||||
|         this._syncEnabled(); |         this._syncEnabled(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     set dimFactor(factor) { |     setDimmed(dimmed, animate) { | ||||||
|         this._dimFactor = factor; |         this._dimmed = dimmed; | ||||||
|         this._brightnessEffect.set_brightness(factor * DIM_BRIGHTNESS); |  | ||||||
|         this._syncEnabled(); |         let val = 127 * (1 + dimmed * DIM_BRIGHTNESS); | ||||||
|  |         let color = Clutter.Color.new(val, val, val, 255); | ||||||
|  |  | ||||||
|  |         if (animate) { | ||||||
|  |             this._ensureTransition(); | ||||||
|  |             this._transition.set_to(color); | ||||||
|  |         } else { | ||||||
|  |             this._effect.brightness = color; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|     get dimFactor() { |         this._syncEnabled(); | ||||||
|         return this._dimFactor; |  | ||||||
|     } |     } | ||||||
| }; | }; | ||||||
|  |  | ||||||
| @@ -412,14 +440,15 @@ var TilePreview = class { | |||||||
|  |  | ||||||
|         this._showing = true; |         this._showing = true; | ||||||
|         this.actor.show(); |         this.actor.show(); | ||||||
|         Tweener.addTween(this.actor, |         this.actor.ease({ | ||||||
|                          { x: tileRect.x, |             x: tileRect.x, | ||||||
|             y: tileRect.y, |             y: tileRect.y, | ||||||
|             width: tileRect.width, |             width: tileRect.width, | ||||||
|             height: tileRect.height, |             height: tileRect.height, | ||||||
|                            opacity: 255, |             opacity: 255 | ||||||
|                            time: WINDOW_ANIMATION_TIME, |         }, { | ||||||
|                            transition: 'easeOutQuad' |             duration: WINDOW_ANIMATION_TIME, | ||||||
|  |             mode: Clutter.AnimationMode.EASE_OUT_QUAD | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -428,11 +457,12 @@ var TilePreview = class { | |||||||
|             return; |             return; | ||||||
|  |  | ||||||
|         this._showing = false; |         this._showing = false; | ||||||
|         Tweener.addTween(this.actor, |         this.actor.ease({ | ||||||
|                          { opacity: 0, |             opacity: 0 | ||||||
|                            time: WINDOW_ANIMATION_TIME, |         }, { | ||||||
|                            transition: 'easeOutQuad', |             duration: WINDOW_ANIMATION_TIME, | ||||||
|                            onComplete: this._reset.bind(this) |             mode: Clutter.AnimationMode.EASE_OUT_QUAD, | ||||||
|  |             onComplete: () => this._reset() | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -456,13 +486,28 @@ var TilePreview = class { | |||||||
| }; | }; | ||||||
|  |  | ||||||
| var TouchpadWorkspaceSwitchAction = class { | var TouchpadWorkspaceSwitchAction = class { | ||||||
|     constructor(actor) { |     constructor(actor, allowedModes) { | ||||||
|  |         this._allowedModes = allowedModes; | ||||||
|         this._dx = 0; |         this._dx = 0; | ||||||
|         this._dy = 0; |         this._dy = 0; | ||||||
|  |         this._enabled = true; | ||||||
|         actor.connect('captured-event', this._handleEvent.bind(this)); |         actor.connect('captured-event', this._handleEvent.bind(this)); | ||||||
| 	this._touchpadSettings = new Gio.Settings({schema_id: 'org.gnome.desktop.peripherals.touchpad'}); | 	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() { |     _checkActivated() { | ||||||
|         let dir; |         let dir; | ||||||
|  |  | ||||||
| @@ -482,15 +527,16 @@ var TouchpadWorkspaceSwitchAction = class { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     _handleEvent(actor, event) { |     _handleEvent(actor, event) { | ||||||
|         let allowedModes = Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW; |  | ||||||
|  |  | ||||||
|         if (event.type() != Clutter.EventType.TOUCHPAD_SWIPE) |         if (event.type() != Clutter.EventType.TOUCHPAD_SWIPE) | ||||||
|             return Clutter.EVENT_PROPAGATE; |             return Clutter.EVENT_PROPAGATE; | ||||||
|  |  | ||||||
|         if (event.get_touchpad_gesture_finger_count() != 4) |         if (event.get_touchpad_gesture_finger_count() != 4) | ||||||
|             return Clutter.EVENT_PROPAGATE; |             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; |             return Clutter.EVENT_PROPAGATE; | ||||||
|  |  | ||||||
|         if (event.get_gesture_phase() == Clutter.TouchpadGesturePhase.UPDATE) { |         if (event.get_gesture_phase() == Clutter.TouchpadGesturePhase.UPDATE) { | ||||||
| @@ -523,10 +569,11 @@ var WorkspaceSwitchAction = GObject.registerClass({ | |||||||
|                'motion':    { param_types: [GObject.TYPE_DOUBLE, GObject.TYPE_DOUBLE] }, |                'motion':    { param_types: [GObject.TYPE_DOUBLE, GObject.TYPE_DOUBLE] }, | ||||||
|                'cancel':    { param_types: [] }}, |                'cancel':    { param_types: [] }}, | ||||||
| }, class WorkspaceSwitchAction extends Clutter.SwipeAction { | }, class WorkspaceSwitchAction extends Clutter.SwipeAction { | ||||||
|     _init() { |     _init(allowedModes) { | ||||||
|         super._init(); |         super._init(); | ||||||
|         this.set_n_touch_points(4); |         this.set_n_touch_points(4); | ||||||
|         this._swept = false; |         this._swept = false; | ||||||
|  |         this._allowedModes = allowedModes; | ||||||
|  |  | ||||||
|         global.display.connect('grab-op-begin', () => { |         global.display.connect('grab-op-begin', () => { | ||||||
|             this.cancel(); |             this.cancel(); | ||||||
| @@ -534,14 +581,12 @@ var WorkspaceSwitchAction = GObject.registerClass({ | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     vfunc_gesture_prepare(actor) { |     vfunc_gesture_prepare(actor) { | ||||||
|         let allowedModes = Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW; |  | ||||||
|  |  | ||||||
|         this._swept = false; |         this._swept = false; | ||||||
|  |  | ||||||
|         if (!super.vfunc_gesture_prepare(actor)) |         if (!super.vfunc_gesture_prepare(actor)) | ||||||
|             return false; |             return false; | ||||||
|  |  | ||||||
|         return (allowedModes & Main.actionMode); |         return (this._allowedModes & Main.actionMode); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     vfunc_gesture_progress(actor) { |     vfunc_gesture_progress(actor) { | ||||||
| @@ -1043,14 +1088,15 @@ var WindowManager = class { | |||||||
|         global.workspace_manager.override_workspace_layout(Meta.DisplayCorner.TOPLEFT, |         global.workspace_manager.override_workspace_layout(Meta.DisplayCorner.TOPLEFT, | ||||||
|                                                            false, -1, 1); |                                                            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('motion', this._switchWorkspaceMotion.bind(this)); | ||||||
|         gesture.connect('activated', this._actionSwitchWorkspace.bind(this)); |         gesture.connect('activated', this._actionSwitchWorkspace.bind(this)); | ||||||
|         gesture.connect('cancel', this._switchWorkspaceCancel.bind(this)); |         gesture.connect('cancel', this._switchWorkspaceCancel.bind(this)); | ||||||
|         global.stage.add_action(gesture); |         global.stage.add_action(gesture); | ||||||
|  |  | ||||||
|         // This is not a normal Clutter.GestureAction, doesn't need add_action() |         // 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('motion', this._switchWorkspaceMotion.bind(this)); | ||||||
|         gesture.connect('activated', this._actionSwitchWorkspace.bind(this)); |         gesture.connect('activated', this._actionSwitchWorkspace.bind(this)); | ||||||
|         gesture.connect('cancel', this._switchWorkspaceCancel.bind(this)); |         gesture.connect('cancel', this._switchWorkspaceCancel.bind(this)); | ||||||
| @@ -1119,14 +1165,15 @@ var WindowManager = class { | |||||||
|             return; |             return; | ||||||
|         let switchData = this._switchData; |         let switchData = this._switchData; | ||||||
|         this._switchData = null; |         this._switchData = null; | ||||||
|         Tweener.addTween(switchData.container, |         switchData.container.ease({ | ||||||
|                          { x: 0, |             x: 0, | ||||||
|                            y: 0, |             y: 0 | ||||||
|  |         }, { | ||||||
|             time: WINDOW_ANIMATION_TIME, |             time: WINDOW_ANIMATION_TIME, | ||||||
|                            transition: 'easeOutQuad', |             mode: Clutter.AnimationMode.EASE_OUT_QUAD, | ||||||
|                            onComplete: this._finishWorkspaceSwitch, |             onComplete: () => { | ||||||
|                            onCompleteScope: this, |                 this._finishWorkspaceSwitch(switchData); | ||||||
|                            onCompleteParams: [switchData], |             } | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -1202,6 +1249,10 @@ var WindowManager = class { | |||||||
|             // Same for OR windows |             // Same for OR windows | ||||||
|             if (window.is_override_redirect()) |             if (window.is_override_redirect()) | ||||||
|                 return; |                 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 |             // Windows on workspaces below pos don't need moving | ||||||
|             let index = window.get_workspace().index(); |             let index = window.get_workspace().index(); | ||||||
|             if (index < pos) |             if (index < pos) | ||||||
| @@ -1293,16 +1344,17 @@ var WindowManager = class { | |||||||
|         this._minimizing.push(actor); |         this._minimizing.push(actor); | ||||||
|  |  | ||||||
|         if (actor.meta_window.is_monitor_sized()) { |         if (actor.meta_window.is_monitor_sized()) { | ||||||
|             Tweener.addTween(actor, |             actor.ease({ | ||||||
|                          { opacity: 0, |                 opacity: 0 | ||||||
|                            time: MINIMIZE_WINDOW_ANIMATION_TIME, |             }, { | ||||||
|                            transition: 'easeOutQuad', |                 duration: MINIMIZE_WINDOW_ANIMATION_TIME, | ||||||
|                            onComplete: this._minimizeWindowDone, |                 mode: Clutter.AnimationMode.EASE_OUT_QUAD, | ||||||
|                            onCompleteScope: this, |                 onStopped: isFinished => { | ||||||
|                            onCompleteParams: [shellwm, actor], |                     if (isFinished) | ||||||
|                            onOverwrite: this._minimizeWindowOverwritten, |                         this._minimizeWindowDone(shellwm, actor); | ||||||
|                            onOverwriteScope: this, |                     else | ||||||
|                            onOverwriteParams: [shellwm, actor] |                         this._minimizeWindowOverwritten(shellwm, actor); | ||||||
|  |                 }, | ||||||
|             }); |             }); | ||||||
|         } else { |         } else { | ||||||
|             let xDest, yDest, xScale, yScale; |             let xDest, yDest, xScale, yScale; | ||||||
| @@ -1326,26 +1378,27 @@ var WindowManager = class { | |||||||
|                 yScale = 0; |                 yScale = 0; | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             Tweener.addTween(actor, |             actor.ease({ | ||||||
|                              { scale_x: xScale, |                 scale_x: xScale, | ||||||
|                 scale_y: yScale, |                 scale_y: yScale, | ||||||
|                 x: xDest, |                 x: xDest, | ||||||
|                                y: yDest, |                 y: yDest | ||||||
|                                time: MINIMIZE_WINDOW_ANIMATION_TIME, |             }, { | ||||||
|                                transition: 'easeInExpo', |                 duration: MINIMIZE_WINDOW_ANIMATION_TIME, | ||||||
|                                onComplete: this._minimizeWindowDone, |                 mode: Clutter.AnimationMode.EASE_IN_EXPO, | ||||||
|                                onCompleteScope: this, |                 onStopped: isFinished => { | ||||||
|                                onCompleteParams: [shellwm, actor], |                     if (isFinished) | ||||||
|                                onOverwrite: this._minimizeWindowOverwritten, |                         this._minimizeWindowDone(shellwm, actor); | ||||||
|                                onOverwriteScope: this, |                     else | ||||||
|                                onOverwriteParams: [shellwm, actor] |                         this._minimizeWindowOverwritten(shellwm, actor); | ||||||
|  |                 } | ||||||
|             }); |             }); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     _minimizeWindowDone(shellwm, actor) { |     _minimizeWindowDone(shellwm, actor) { | ||||||
|         if (this._removeEffect(this._minimizing, actor)) { |         if (this._removeEffect(this._minimizing, actor)) { | ||||||
|             Tweener.removeTweens(actor); |             actor.remove_all_transitions(); | ||||||
|             actor.set_scale(1.0, 1.0); |             actor.set_scale(1.0, 1.0); | ||||||
|             actor.set_opacity(255); |             actor.set_opacity(255); | ||||||
|             actor.set_pivot_point(0, 0); |             actor.set_pivot_point(0, 0); | ||||||
| @@ -1374,16 +1427,17 @@ var WindowManager = class { | |||||||
|         if (actor.meta_window.is_monitor_sized()) { |         if (actor.meta_window.is_monitor_sized()) { | ||||||
|             actor.opacity = 0; |             actor.opacity = 0; | ||||||
|             actor.set_scale(1.0, 1.0); |             actor.set_scale(1.0, 1.0); | ||||||
|             Tweener.addTween(actor, |             actor.ease({ | ||||||
|                          { opacity: 255, |                 opacity: 255 | ||||||
|                            time: MINIMIZE_WINDOW_ANIMATION_TIME, |             }, { | ||||||
|                            transition: 'easeOutQuad', |                 duration: MINIMIZE_WINDOW_ANIMATION_TIME, | ||||||
|                            onComplete: this._unminimizeWindowDone, |                 mode: Clutter.AnimationMode.EASE_OUT_QUAD, | ||||||
|                            onCompleteScope: this, |                 onStopped: isFinished => { | ||||||
|                            onCompleteParams: [shellwm, actor], |                     if (isFinished) | ||||||
|                            onOverwrite: this._unminimizeWindowOverwritten, |                         this._unminimizeWindowDone(shellwm, actor); | ||||||
|                            onOverwriteScope: this, |                     else | ||||||
|                            onOverwriteParams: [shellwm, actor] |                         this._unminimizeWindowOverwritten(shellwm, actor); | ||||||
|  |                 } | ||||||
|             }); |             }); | ||||||
|         } else { |         } else { | ||||||
|             let [success, geom] = actor.meta_window.get_icon_geometry(); |             let [success, geom] = actor.meta_window.get_icon_geometry(); | ||||||
| @@ -1408,26 +1462,27 @@ var WindowManager = class { | |||||||
|             let [xDest, yDest] = [rect.x, rect.y]; |             let [xDest, yDest] = [rect.x, rect.y]; | ||||||
|  |  | ||||||
|             actor.show(); |             actor.show(); | ||||||
|             Tweener.addTween(actor, |             actor.ease({ | ||||||
|                              { scale_x: 1.0, |                 scale_x: 1, | ||||||
|                                scale_y: 1.0, |                 scale_y: 1, | ||||||
|                 x: xDest, |                 x: xDest, | ||||||
|                                y: yDest, |                 y: yDest | ||||||
|                                time: MINIMIZE_WINDOW_ANIMATION_TIME, |             }, { | ||||||
|                                transition: 'easeInExpo', |                 duration: MINIMIZE_WINDOW_ANIMATION_TIME, | ||||||
|                                onComplete: this._unminimizeWindowDone, |                 mode: Clutter.AnimationMode.EASE_IN_EXPO, | ||||||
|                                onCompleteScope: this, |                 onStopped: isFinished => { | ||||||
|                                onCompleteParams: [shellwm, actor], |                     if (isFinished) | ||||||
|                                onOverwrite: this._unminimizeWindowOverwritten, |                         this._unminimizeWindowDone(shellwm, actor); | ||||||
|                                onOverwriteScope: this, |                     else | ||||||
|                                onOverwriteParams: [shellwm, actor] |                         this._unminimizeWindowOverwritten(shellwm, actor); | ||||||
|  |                 } | ||||||
|             }); |             }); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     _unminimizeWindowDone(shellwm, actor) { |     _unminimizeWindowDone(shellwm, actor) { | ||||||
|         if (this._removeEffect(this._unminimizing, actor)) { |         if (this._removeEffect(this._unminimizing, actor)) { | ||||||
|             Tweener.removeTweens(actor); |             actor.remove_all_transitions(); | ||||||
|             actor.set_scale(1.0, 1.0); |             actor.set_scale(1.0, 1.0); | ||||||
|             actor.set_opacity(255); |             actor.set_opacity(255); | ||||||
|             actor.set_pivot_point(0, 0); |             actor.set_pivot_point(0, 0); | ||||||
| @@ -1468,8 +1523,13 @@ var WindowManager = class { | |||||||
|         if (this._clearAnimationInfo(actor)) |         if (this._clearAnimationInfo(actor)) | ||||||
|             this._shellwm.completed_size_change(actor); |             this._shellwm.completed_size_change(actor); | ||||||
|  |  | ||||||
|  |         let destroyId = actor.connect('destroy', () => { | ||||||
|  |             this._clearAnimationInfo(actor); | ||||||
|  |         }); | ||||||
|  |  | ||||||
|         actor.__animationInfo = { clone: actorClone, |         actor.__animationInfo = { clone: actorClone, | ||||||
|                                   oldRect: oldFrameRect }; |                                   oldRect: oldFrameRect, | ||||||
|  |                                   destroyId: destroyId }; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     _sizeChangedWindow(shellwm, actor) { |     _sizeChangedWindow(shellwm, actor) { | ||||||
| @@ -1488,14 +1548,15 @@ var WindowManager = class { | |||||||
|         this._resizing.push(actor); |         this._resizing.push(actor); | ||||||
|  |  | ||||||
|         // Now scale and fade out the clone |         // Now scale and fade out the clone | ||||||
|         Tweener.addTween(actorClone, |         actorClone.ease({ | ||||||
|                          { x: targetRect.x, |             x: targetRect.x, | ||||||
|             y: targetRect.y, |             y: targetRect.y, | ||||||
|             scale_x: scaleX, |             scale_x: scaleX, | ||||||
|             scale_y: scaleY, |             scale_y: scaleY, | ||||||
|                            opacity: 0, |             opacity: 0 | ||||||
|                            time: WINDOW_ANIMATION_TIME, |         }, { | ||||||
|                            transition: 'easeOutQuad' |             duration: WINDOW_ANIMATION_TIME, | ||||||
|  |             mode: Clutter.AnimationMode.EASE_OUT_QUAD | ||||||
|         }); |         }); | ||||||
|  |  | ||||||
|         actor.translation_x = -targetRect.x + sourceRect.x; |         actor.translation_x = -targetRect.x + sourceRect.x; | ||||||
| @@ -1506,19 +1567,20 @@ var WindowManager = class { | |||||||
|         actor.scale_y = 1 / scaleY; |         actor.scale_y = 1 / scaleY; | ||||||
|  |  | ||||||
|         // Scale it to its actual new size |         // Scale it to its actual new size | ||||||
|         Tweener.addTween(actor, |         actor.ease({ | ||||||
|                          { scale_x: 1.0, |             scale_x: 1, | ||||||
|                            scale_y: 1.0, |             scale_y: 1, | ||||||
|             translation_x: 0, |             translation_x: 0, | ||||||
|                            translation_y: 0, |             translation_y: 0 | ||||||
|                            time: WINDOW_ANIMATION_TIME, |         }, { | ||||||
|                            transition: 'easeOutQuad', |             duration: WINDOW_ANIMATION_TIME, | ||||||
|                            onComplete: this._sizeChangeWindowDone, |             mode: Clutter.AnimationMode.EASE_OUT_QUAD, | ||||||
|                            onCompleteScope: this, |             onStopped: isFinished => { | ||||||
|                            onCompleteParams: [shellwm, actor], |                 if (isFinished) | ||||||
|                            onOverwrite: this._sizeChangeWindowOverwritten, |                     this._sizeChangeWindowDone(shellwm, actor); | ||||||
|                            onOverwriteScope: this, |                 else | ||||||
|                            onOverwriteParams: [shellwm, actor] |                     this._sizeChangeWindowOverwritten(shellwm, actor); | ||||||
|  |             } | ||||||
|         }); |         }); | ||||||
|  |  | ||||||
|         // Now unfreeze actor updates, to get it to the new size. |         // Now unfreeze actor updates, to get it to the new size. | ||||||
| @@ -1530,6 +1592,7 @@ var WindowManager = class { | |||||||
|     _clearAnimationInfo(actor) { |     _clearAnimationInfo(actor) { | ||||||
|         if (actor.__animationInfo) { |         if (actor.__animationInfo) { | ||||||
|             actor.__animationInfo.clone.destroy(); |             actor.__animationInfo.clone.destroy(); | ||||||
|  |             actor.disconnect(actor.__animationInfo.destroyId); | ||||||
|             delete actor.__animationInfo; |             delete actor.__animationInfo; | ||||||
|             return true; |             return true; | ||||||
|         } |         } | ||||||
| @@ -1538,7 +1601,7 @@ var WindowManager = class { | |||||||
|  |  | ||||||
|     _sizeChangeWindowDone(shellwm, actor) { |     _sizeChangeWindowDone(shellwm, actor) { | ||||||
|         if (this._removeEffect(this._resizing, actor)) { |         if (this._removeEffect(this._resizing, actor)) { | ||||||
|             Tweener.removeTweens(actor); |             actor.remove_all_transitions(); | ||||||
|             actor.scale_x = 1.0; |             actor.scale_x = 1.0; | ||||||
|             actor.scale_y = 1.0; |             actor.scale_y = 1.0; | ||||||
|             actor.translation_x = 0; |             actor.translation_x = 0; | ||||||
| @@ -1588,14 +1651,7 @@ var WindowManager = class { | |||||||
|         let dimmer = getWindowDimmer(actor); |         let dimmer = getWindowDimmer(actor); | ||||||
|         if (!dimmer) |         if (!dimmer) | ||||||
|             return; |             return; | ||||||
|         if (this._shouldAnimate()) |         dimmer.setDimmed(true, this._shouldAnimate()); | ||||||
|             Tweener.addTween(dimmer, |  | ||||||
|                              { dimFactor: 1.0, |  | ||||||
|                                time: DIM_TIME, |  | ||||||
|                                transition: 'linear' |  | ||||||
|                              }); |  | ||||||
|         else |  | ||||||
|             dimmer.dimFactor = 1.0; |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     _undimWindow(window) { |     _undimWindow(window) { | ||||||
| @@ -1605,13 +1661,7 @@ var WindowManager = class { | |||||||
|         let dimmer = getWindowDimmer(actor); |         let dimmer = getWindowDimmer(actor); | ||||||
|         if (!dimmer) |         if (!dimmer) | ||||||
|             return; |             return; | ||||||
|         if (this._shouldAnimate()) |         dimmer.setDimmed(false, this._shouldAnimate()); | ||||||
|             Tweener.addTween(dimmer, |  | ||||||
|                              { dimFactor: 0.0, |  | ||||||
|                                time: UNDIM_TIME, |  | ||||||
|                                transition: 'linear' }); |  | ||||||
|         else |  | ||||||
|             dimmer.dimFactor = 0.0; |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     _mapWindow(shellwm, actor) { |     _mapWindow(shellwm, actor) { | ||||||
| @@ -1656,18 +1706,19 @@ var WindowManager = class { | |||||||
|             actor.show(); |             actor.show(); | ||||||
|             this._mapping.push(actor); |             this._mapping.push(actor); | ||||||
|  |  | ||||||
|             Tweener.addTween(actor, |             actor.ease({ | ||||||
|                              { opacity: 255, |                 opacity: 255, | ||||||
|                 scale_x: 1, |                 scale_x: 1, | ||||||
|                                scale_y: 1, |                 scale_y: 1 | ||||||
|                                time: SHOW_WINDOW_ANIMATION_TIME, |             }, { | ||||||
|                                transition: 'easeOutExpo', |                 duration: SHOW_WINDOW_ANIMATION_TIME, | ||||||
|                                onComplete: this._mapWindowDone, |                 mode: Clutter.AnimationMode.EASE_OUT_EXPO, | ||||||
|                                onCompleteScope: this, |                 onStopped: isFinished => { | ||||||
|                                onCompleteParams: [shellwm, actor], |                     if (isFinished) | ||||||
|                                onOverwrite: this._mapWindowOverwrite, |                         this._mapWindowDone(shellwm, actor); | ||||||
|                                onOverwriteScope: this, |                     else | ||||||
|                                onOverwriteParams: [shellwm, actor] |                         this._mapWindowOverwrite(shellwm, actor); | ||||||
|  |                 } | ||||||
|             }); |             }); | ||||||
|             break; |             break; | ||||||
|         case Meta.WindowType.MODAL_DIALOG: |         case Meta.WindowType.MODAL_DIALOG: | ||||||
| @@ -1678,18 +1729,19 @@ var WindowManager = class { | |||||||
|             actor.show(); |             actor.show(); | ||||||
|             this._mapping.push(actor); |             this._mapping.push(actor); | ||||||
|  |  | ||||||
|             Tweener.addTween(actor, |             actor.ease({ | ||||||
|                              { opacity: 255, |                 opacity: 255, | ||||||
|                 scale_x: 1, |                 scale_x: 1, | ||||||
|                                scale_y: 1, |                 scale_y: 1 | ||||||
|                                time: DIALOG_SHOW_WINDOW_ANIMATION_TIME, |             }, { | ||||||
|                                transition: 'easeOutQuad', |                 duration: DIALOG_SHOW_WINDOW_ANIMATION_TIME, | ||||||
|                                onComplete: this._mapWindowDone, |                 mode: Clutter.AnimationMode.EASE_OUT_QUAD, | ||||||
|                                onCompleteScope: this, |                 onStopped: isFinished => { | ||||||
|                                onCompleteParams: [shellwm, actor], |                     if (isFinished) | ||||||
|                                onOverwrite: this._mapWindowOverwrite, |                         this._mapWindowDone(shellwm, actor); | ||||||
|                                onOverwriteScope: this, |                     else | ||||||
|                                onOverwriteParams: [shellwm, actor] |                         this._mapWindowOverwrite(shellwm, actor); | ||||||
|  |                 } | ||||||
|             }); |             }); | ||||||
|             break; |             break; | ||||||
|         default: |         default: | ||||||
| @@ -1700,7 +1752,7 @@ var WindowManager = class { | |||||||
|  |  | ||||||
|     _mapWindowDone(shellwm, actor) { |     _mapWindowDone(shellwm, actor) { | ||||||
|         if (this._removeEffect(this._mapping, actor)) { |         if (this._removeEffect(this._mapping, actor)) { | ||||||
|             Tweener.removeTweens(actor); |             actor.remove_all_transitions(); | ||||||
|             actor.opacity = 255; |             actor.opacity = 255; | ||||||
|             actor.set_pivot_point(0, 0); |             actor.set_pivot_point(0, 0); | ||||||
|             actor.scale_y = 1; |             actor.scale_y = 1; | ||||||
| @@ -1744,18 +1796,16 @@ var WindowManager = class { | |||||||
|             actor.set_pivot_point(0.5, 0.5); |             actor.set_pivot_point(0.5, 0.5); | ||||||
|             this._destroying.push(actor); |             this._destroying.push(actor); | ||||||
|  |  | ||||||
|             Tweener.addTween(actor, |             actor.ease({ | ||||||
|                              { opacity: 0, |                 opacity: 0, | ||||||
|                 scale_x: 0.8, |                 scale_x: 0.8, | ||||||
|                                scale_y: 0.8, |                 scale_y: 0.8 | ||||||
|                                time: DESTROY_WINDOW_ANIMATION_TIME, |             }, { | ||||||
|                                transition: 'easeOutQuad', |                 duration: DESTROY_WINDOW_ANIMATION_TIME, | ||||||
|                                onComplete: this._destroyWindowDone, |                 mode: Clutter.AnimationMode.EASE_OUT_QUAD, | ||||||
|                                onCompleteScope: this, |                 onStopped: () => { | ||||||
|                                onCompleteParams: [shellwm, actor], |                     this._destroyWindowDone(shellwm, actor); | ||||||
|                                onOverwrite: this._destroyWindowDone, |                 } | ||||||
|                                onOverwriteScope: this, |  | ||||||
|                                onOverwriteParams: [shellwm, actor] |  | ||||||
|             }); |             }); | ||||||
|             break; |             break; | ||||||
|         case Meta.WindowType.MODAL_DIALOG: |         case Meta.WindowType.MODAL_DIALOG: | ||||||
| @@ -1766,21 +1816,19 @@ var WindowManager = class { | |||||||
|             if (window.is_attached_dialog()) { |             if (window.is_attached_dialog()) { | ||||||
|                 let parent = window.get_transient_for(); |                 let parent = window.get_transient_for(); | ||||||
|                 actor._parentDestroyId = parent.connect('unmanaged', () => { |                 actor._parentDestroyId = parent.connect('unmanaged', () => { | ||||||
|                     Tweener.removeTweens(actor); |                     actor.remove_all_transitions(); | ||||||
|                     this._destroyWindowDone(shellwm, actor); |                     this._destroyWindowDone(shellwm, actor); | ||||||
|                 }); |                 }); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             Tweener.addTween(actor, |             actor.ease({ | ||||||
|                              { scale_y: 0, |                 scale_y: 0 | ||||||
|                                time: DIALOG_DESTROY_WINDOW_ANIMATION_TIME, |             }, { | ||||||
|                                transition: 'easeOutQuad', |                 duration: DIALOG_DESTROY_WINDOW_ANIMATION_TIME, | ||||||
|                                onComplete: this._destroyWindowDone, |                 mode: Clutter.AnimationMode.EASE_OUT_QUAD, | ||||||
|                                onCompleteScope: this, |                 onStopped: () => { | ||||||
|                                onCompleteParams: [shellwm, actor], |                     this._destroyWindowDone(shellwm, actor); | ||||||
|                                onOverwrite: this._destroyWindowDone, |                 } | ||||||
|                                onOverwriteScope: this, |  | ||||||
|                                onOverwriteParams: [shellwm, actor] |  | ||||||
|             }); |             }); | ||||||
|             break; |             break; | ||||||
|         default: |         default: | ||||||
| @@ -1844,17 +1892,25 @@ var WindowManager = class { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     _getPositionForDirection(direction) { |     _getPositionForDirection(direction, fromWs, toWs) { | ||||||
|         let xDest = 0, yDest = 0; |         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 || |         if (direction == Meta.MotionDirection.UP || | ||||||
|             direction == Meta.MotionDirection.UP_LEFT || |             direction == Meta.MotionDirection.UP_LEFT || | ||||||
|             direction == Meta.MotionDirection.UP_RIGHT) |             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 || |         else if (direction == Meta.MotionDirection.DOWN || | ||||||
|             direction == Meta.MotionDirection.DOWN_LEFT || |             direction == Meta.MotionDirection.DOWN_LEFT || | ||||||
|             direction == Meta.MotionDirection.DOWN_RIGHT) |             direction == Meta.MotionDirection.DOWN_RIGHT) | ||||||
|             yDest = global.screen_height - Main.panel.height; |             yDest = global.screen_height - (newWsIsFullscreen ? 0 : shiftHeight); | ||||||
|  |  | ||||||
|         if (direction == Meta.MotionDirection.LEFT || |         if (direction == Meta.MotionDirection.LEFT || | ||||||
|             direction == Meta.MotionDirection.UP_LEFT || |             direction == Meta.MotionDirection.UP_LEFT || | ||||||
| @@ -1912,7 +1968,7 @@ var WindowManager = class { | |||||||
|             switchData.container.add_actor(info.actor); |             switchData.container.add_actor(info.actor); | ||||||
|             info.actor.raise_top(); |             info.actor.raise_top(); | ||||||
|  |  | ||||||
|             let [x, y] = this._getPositionForDirection(dir); |             let [x, y] = this._getPositionForDirection(dir, curWs, ws); | ||||||
|             info.actor.set_position(x, y); |             info.actor.set_position(x, y); | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @@ -1998,7 +2054,11 @@ var WindowManager = class { | |||||||
|  |  | ||||||
|         this._switchData.inProgress = true; |         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 |         /* @direction is the direction that the "camera" moves, so the | ||||||
|          * screen contents have to move one screen's worth in the |          * screen contents have to move one screen's worth in the | ||||||
| @@ -2007,14 +2067,15 @@ var WindowManager = class { | |||||||
|         xDest = -xDest; |         xDest = -xDest; | ||||||
|         yDest = -yDest; |         yDest = -yDest; | ||||||
|  |  | ||||||
|         Tweener.addTween(this._switchData.container, |         this._switchData.container.ease({ | ||||||
|                          { x: xDest, |             x: xDest, | ||||||
|                            y: yDest, |             y: yDest | ||||||
|  |         }, { | ||||||
|             time: WINDOW_ANIMATION_TIME, |             time: WINDOW_ANIMATION_TIME, | ||||||
|                            transition: 'easeOutQuad', |             mode: Clutter.AnimationMode.EASE_OUT_QUAD, | ||||||
|                            onComplete: this._switchWorkspaceDone, |             onComplete: () => { | ||||||
|                            onCompleteScope: this, |                 this._switchWorkspaceDone(shellwm); | ||||||
|                            onCompleteParams: [shellwm] |             } | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -173,7 +173,7 @@ var WindowMenu = class extends PopupMenu.PopupMenu { | |||||||
|  |  | ||||||
| var WindowMenuManager = class { | var WindowMenuManager = class { | ||||||
|     constructor() { |     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 = new St.Widget({ reactive: true, visible: false }); | ||||||
|         this._sourceActor.connect('button-press-event', () => { |         this._sourceActor.connect('button-press-event', () => { | ||||||
|   | |||||||
| @@ -786,8 +786,8 @@ var WindowPositionFlags = { | |||||||
|  |  | ||||||
| var LayoutStrategy = class { | var LayoutStrategy = class { | ||||||
|     constructor(monitor, rowSpacing, columnSpacing) { |     constructor(monitor, rowSpacing, columnSpacing) { | ||||||
|         if (new.target === LayoutStrategy) |         if (this.constructor === LayoutStrategy) | ||||||
|             throw new TypeError('Cannot instantiate abstract type ' + new.target.name); |             throw new TypeError(`Cannot instantiate abstract type ${this.constructor.name}`); | ||||||
|  |  | ||||||
|         this._monitor = monitor; |         this._monitor = monitor; | ||||||
|         this._rowSpacing = rowSpacing; |         this._rowSpacing = rowSpacing; | ||||||
| @@ -813,7 +813,7 @@ var LayoutStrategy = class { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     // Computes and returns an individual scaling factor for @window, |     // Computes and returns an individual scaling factor for @window, | ||||||
|     // to be applied in addition to the overal layout scale. |     // to be applied in addition to the overall layout scale. | ||||||
|     _computeWindowScale(window) { |     _computeWindowScale(window) { | ||||||
|         // Since we align windows next to each other, the height of the |         // Since we align windows next to each other, the height of the | ||||||
|         // thumbnails is much more important to preserve than the width of |         // thumbnails is much more important to preserve than the width of | ||||||
| @@ -1266,7 +1266,7 @@ var Workspace = class { | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         // We will reposition windows anyway when enter again overview or when ending the windows |         // We will reposition windows anyway when enter again overview or when ending the windows | ||||||
|         // animations whith fade animation. |         // animations with fade animation. | ||||||
|         // In this way we avoid unwanted animations of windows repositioning while |         // In this way we avoid unwanted animations of windows repositioning while | ||||||
|         // animating overview. |         // animating overview. | ||||||
|         if (this.leavingOverview || this._animatingWindowsFade) |         if (this.leavingOverview || this._animatingWindowsFade) | ||||||
| @@ -1886,10 +1886,10 @@ var Workspace = class { | |||||||
|             // Win win -- better scale and better space |             // Win win -- better scale and better space | ||||||
|             return true; |             return true; | ||||||
|         } else if (newLayout.scale > oldLayout.scale && newLayout.space <= oldLayout.space) { |         } else if (newLayout.scale > oldLayout.scale && newLayout.space <= oldLayout.space) { | ||||||
|             // Keep new layout only if scale gain outweights aspect space loss |             // Keep new layout only if scale gain outweighs aspect space loss | ||||||
|             return scalePower > spacePower; |             return scalePower > spacePower; | ||||||
|         } else if (newLayout.scale <= oldLayout.scale && newLayout.space > oldLayout.space) { |         } else if (newLayout.scale <= oldLayout.scale && newLayout.space > oldLayout.space) { | ||||||
|             // Keep new layout only if aspect space gain outweights scale loss |             // Keep new layout only if aspect space gain outweighs scale loss | ||||||
|             return spacePower > scalePower; |             return spacePower > scalePower; | ||||||
|         } else { |         } else { | ||||||
|             // Lose -- worse scale and space |             // Lose -- worse scale and space | ||||||
|   | |||||||
| @@ -85,8 +85,6 @@ class WorkspaceSwitcherPopup extends St.Widget { | |||||||
|                       height: global.screen_height, |                       height: global.screen_height, | ||||||
|                       style_class: 'workspace-switcher-group' }); |                       style_class: 'workspace-switcher-group' }); | ||||||
|  |  | ||||||
|         this.actor = this; |  | ||||||
|  |  | ||||||
|         Main.uiGroup.add_actor(this); |         Main.uiGroup.add_actor(this); | ||||||
|  |  | ||||||
|         this._timeoutId = 0; |         this._timeoutId = 0; | ||||||
| @@ -142,7 +140,7 @@ class WorkspaceSwitcherPopup extends St.Widget { | |||||||
|                                             time: ANIMATION_TIME, |                                             time: ANIMATION_TIME, | ||||||
|                                             transition: 'easeOutQuad' |                                             transition: 'easeOutQuad' | ||||||
|                                            }); |                                            }); | ||||||
|         this.actor.show(); |         this.show(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     display(direction, activeWorkspaceIndex) { |     display(direction, activeWorkspaceIndex) { | ||||||
|   | |||||||
| @@ -601,8 +601,7 @@ class ThumbnailsBox extends St.Widget { | |||||||
|                       style_class: 'workspace-thumbnails', |                       style_class: 'workspace-thumbnails', | ||||||
|                       request_mode: Clutter.RequestMode.WIDTH_FOR_HEIGHT }); |                       request_mode: Clutter.RequestMode.WIDTH_FOR_HEIGHT }); | ||||||
|  |  | ||||||
|         this.actor = this; |         this._delegate = this; | ||||||
|         this.actor._delegate = this; |  | ||||||
|  |  | ||||||
|         let indicator = new St.Bin({ style_class: 'workspace-thumbnail-indicator' }); |         let indicator = new St.Bin({ style_class: 'workspace-thumbnail-indicator' }); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,10 +1,11 @@ | |||||||
| // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- | // -*- 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 Signals = imports.signals; | ||||||
|  |  | ||||||
| const Main = imports.ui.main; | const Main = imports.ui.main; | ||||||
| const Tweener = imports.ui.tweener; | const Tweener = imports.ui.tweener; | ||||||
|  | const WindowManager = imports.ui.windowManager; | ||||||
| const Workspace = imports.ui.workspace; | const Workspace = imports.ui.workspace; | ||||||
|  |  | ||||||
| var WORKSPACE_SWITCH_TIME = 0.25; | var WORKSPACE_SWITCH_TIME = 0.25; | ||||||
| @@ -82,7 +83,8 @@ var WorkspacesView = class extends WorkspacesViewBase { | |||||||
|  |  | ||||||
|         this._animating = false; // tweening |         this._animating = false; // tweening | ||||||
|         this._scrolling = false; // swipe-scrolling |         this._scrolling = false; // swipe-scrolling | ||||||
|         this._animatingScroll = false; // programatically updating the adjustment |         this._gestureActive = false; // touch(pad) gestures | ||||||
|  |         this._animatingScroll = false; // programmatically updating the adjustment | ||||||
|  |  | ||||||
|         let activeWorkspaceIndex = workspaceManager.get_active_workspace_index(); |         let activeWorkspaceIndex = workspaceManager.get_active_workspace_index(); | ||||||
|         this.scrollAdjustment = new St.Adjustment({ value: activeWorkspaceIndex, |         this.scrollAdjustment = new St.Adjustment({ value: activeWorkspaceIndex, | ||||||
| @@ -211,7 +213,7 @@ var WorkspacesView = class extends WorkspacesViewBase { | |||||||
|  |  | ||||||
|         for (let w = 0; w < this._workspaces.length; w++) { |         for (let w = 0; w < this._workspaces.length; w++) { | ||||||
|             let workspace = this._workspaces[w]; |             let workspace = this._workspaces[w]; | ||||||
|             if (this._animating || this._scrolling) { |             if (this._animating || this._scrolling || this._gestureActive) { | ||||||
|                 workspace.actor.show(); |                 workspace.actor.show(); | ||||||
|             } else { |             } else { | ||||||
|                 if (this._inDrag) |                 if (this._inDrag) | ||||||
| @@ -223,7 +225,7 @@ var WorkspacesView = class extends WorkspacesViewBase { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     _updateScrollAdjustment(index) { |     _updateScrollAdjustment(index) { | ||||||
|         if (this._scrolling) |         if (this._scrolling || this._gestureActive) | ||||||
|             return; |             return; | ||||||
|  |  | ||||||
|         this._animatingScroll = true; |         this._animatingScroll = true; | ||||||
| @@ -300,6 +302,18 @@ var WorkspacesView = class extends WorkspacesViewBase { | |||||||
|         this._updateVisibility(); |         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 |     // sync the workspaces' positions to the value of the scroll adjustment | ||||||
|     // and change the active workspace if appropriate |     // and change the active workspace if appropriate | ||||||
|     _onScroll(adj) { |     _onScroll(adj) { | ||||||
| @@ -310,7 +324,7 @@ var WorkspacesView = class extends WorkspacesViewBase { | |||||||
|         let active = workspaceManager.get_active_workspace_index(); |         let active = workspaceManager.get_active_workspace_index(); | ||||||
|         let current = Math.round(adj.value); |         let current = Math.round(adj.value); | ||||||
|  |  | ||||||
|         if (active != current) { |         if (active != current && !this._gestureActive) { | ||||||
|             if (!this._workspaces[current]) { |             if (!this._workspaces[current]) { | ||||||
|                 // The current workspace was destroyed. This could happen |                 // The current workspace was destroyed. This could happen | ||||||
|                 // when you are on the last empty workspace, and consolidate |                 // when you are on the last empty workspace, and consolidate | ||||||
| @@ -391,6 +405,12 @@ var ExtraWorkspaceView = class extends WorkspacesViewBase { | |||||||
|  |  | ||||||
|     endSwipeScroll() { |     endSwipeScroll() { | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     startTouchGesture() { | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     endTouchGesture() { | ||||||
|  |     } | ||||||
| }; | }; | ||||||
|  |  | ||||||
| var DelegateFocusNavigator = GObject.registerClass( | var DelegateFocusNavigator = GObject.registerClass( | ||||||
| @@ -430,27 +450,41 @@ var WorkspacesDisplay = class { | |||||||
|                     return false; |                     return false; | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             for (let i = 0; i < this._workspacesViews.length; i++) |             this._startSwipeScroll(); | ||||||
|                 this._workspacesViews[i].startSwipeScroll(); |  | ||||||
|             return true; |             return true; | ||||||
|         }); |         }); | ||||||
|         panAction.connect('gesture-cancel', () => { |         panAction.connect('gesture-cancel', () => { | ||||||
|             clickAction.release(); |             clickAction.release(); | ||||||
|             for (let i = 0; i < this._workspacesViews.length; i++) |             this._endSwipeScroll(); | ||||||
|                 this._workspacesViews[i].endSwipeScroll(); |  | ||||||
|         }); |         }); | ||||||
|         panAction.connect('gesture-end', () => { |         panAction.connect('gesture-end', () => { | ||||||
|             clickAction.release(); |             clickAction.release(); | ||||||
|             for (let i = 0; i < this._workspacesViews.length; i++) |             this._endSwipeScroll(); | ||||||
|                 this._workspacesViews[i].endSwipeScroll(); |  | ||||||
|         }); |         }); | ||||||
|         Main.overview.addAction(panAction); |         Main.overview.addAction(panAction); | ||||||
|         this.actor.bind_property('mapped', panAction, 'enabled', GObject.BindingFlags.SYNC_CREATE); |         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._primaryIndex = Main.layoutManager.primaryIndex; | ||||||
|  |  | ||||||
|         this._workspacesViews = []; |         this._workspacesViews = []; | ||||||
|         this._primaryScrollAdjustment = null; |         this._primaryScrollAdjustment = null; | ||||||
|  |         switchGesture.enabled = this.actor.mapped; | ||||||
|  |  | ||||||
|         this._settings = new Gio.Settings({ schema_id: MUTTER_SCHEMA }); |         this._settings = new Gio.Settings({ schema_id: MUTTER_SCHEMA }); | ||||||
|         this._settings.connect('changed::workspaces-only-on-primary', |         this._settings.connect('changed::workspaces-only-on-primary', | ||||||
| @@ -474,6 +508,47 @@ var WorkspacesDisplay = class { | |||||||
|         return false; |         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) { |     navigateFocus(from, direction) { | ||||||
|         return this._getPrimaryView().actor.navigate_focus(from, direction, false); |         return this._getPrimaryView().actor.navigate_focus(from, direction, false); | ||||||
|     } |     } | ||||||
|   | |||||||
							
								
								
									
										46
									
								
								meson.build
									
									
									
									
									
								
							
							
						
						
									
										46
									
								
								meson.build
									
									
									
									
									
								
							| @@ -1,5 +1,5 @@ | |||||||
| project('gnome-shell', 'c', | project('gnome-shell', 'c', | ||||||
|   version: '3.32.0', |   version: '3.33.1', | ||||||
|   meson_version: '>= 0.47.0', |   meson_version: '>= 0.47.0', | ||||||
|   license: 'GPLv2+' |   license: 'GPLv2+' | ||||||
| ) | ) | ||||||
| @@ -23,7 +23,7 @@ gi_req = '>= 1.49.1' | |||||||
| gjs_req = '>= 1.54.0' | gjs_req = '>= 1.54.0' | ||||||
| gtk_req = '>= 3.15.0' | gtk_req = '>= 3.15.0' | ||||||
| json_glib_req = '>= 0.13.2' | json_glib_req = '>= 0.13.2' | ||||||
| mutter_req = '>= 3.32.0' | mutter_req = '>= 3.33.1' | ||||||
| polkit_req = '>= 0.100' | polkit_req = '>= 0.100' | ||||||
| schemas_req = '>= 3.27.90' | schemas_req = '>= 3.27.90' | ||||||
| startup_req = '>= 0.11' | startup_req = '>= 0.11' | ||||||
| @@ -167,6 +167,48 @@ cdata.set('HAVE_FDWALK', | |||||||
|           cc.has_function('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( | config_h = configure_file( | ||||||
|   input: 'config.h.meson', |   input: 'config.h.meson', | ||||||
|   output: 'config.h', |   output: 'config.h', | ||||||
|   | |||||||
							
								
								
									
										128
									
								
								po/de.po
									
									
									
									
									
								
							
							
						
						
									
										128
									
								
								po/de.po
									
									
									
									
									
								
							| @@ -16,14 +16,14 @@ | |||||||
| # Benjamin Steinwender <b@stbe.at>, 2013-2014. | # Benjamin Steinwender <b@stbe.at>, 2013-2014. | ||||||
| # Bernd Homuth <dev@hmt.im>, 2014-2015, 2016, 2019. | # Bernd Homuth <dev@hmt.im>, 2014-2015, 2016, 2019. | ||||||
| # Franco Della-Monica <franco.della.monica@gmail.com>, 2016. | # Franco Della-Monica <franco.della.monica@gmail.com>, 2016. | ||||||
| # Tim Sabsch <tim@sabsch.com>, 2018. | # Tim Sabsch <tim@sabsch.com>, 2018-2019. | ||||||
| # | # | ||||||
| msgid "" | msgid "" | ||||||
| msgstr "" | msgstr "" | ||||||
| "Project-Id-Version: gnome-shell master\n" | "Project-Id-Version: gnome-shell master\n" | ||||||
| "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" | "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" | ||||||
| "POT-Creation-Date: 2019-03-02 19:56+0000\n" | "POT-Creation-Date: 2019-05-08 10:16+0000\n" | ||||||
| "PO-Revision-Date: 2019-03-02 21:13+0100\n" | "PO-Revision-Date: 2019-05-12 12:36+0200\n" | ||||||
| "Last-Translator: Tim Sabsch <tim@sabsch.com>\n" | "Last-Translator: Tim Sabsch <tim@sabsch.com>\n" | ||||||
| "Language-Team: Deutsch <gnome-de@gnome.org>\n" | "Language-Team: Deutsch <gnome-de@gnome.org>\n" | ||||||
| "Language: de\n" | "Language: de\n" | ||||||
| @@ -390,11 +390,6 @@ msgstr "" | |||||||
| msgid "Network Login" | msgid "Network Login" | ||||||
| msgstr "Netzwerkanmeldung" | msgstr "Netzwerkanmeldung" | ||||||
|  |  | ||||||
| #. Translators: Do NOT translate or transliterate this text (this is an icon file name)! |  | ||||||
| #: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 |  | ||||||
| msgid "network-workgroup" |  | ||||||
| msgstr "network-workgroup" |  | ||||||
|  |  | ||||||
| #: js/extensionPrefs/main.js:116 | #: js/extensionPrefs/main.js:116 | ||||||
| msgid "Something’s gone wrong" | msgid "Something’s gone wrong" | ||||||
| msgstr "Etwas ist schiefgelaufen" | msgstr "Etwas ist schiefgelaufen" | ||||||
| @@ -542,7 +537,7 @@ msgstr "abmelden;verlassen" | |||||||
| #: js/misc/systemActions.js:109 | #: js/misc/systemActions.js:109 | ||||||
| msgctxt "search-result" | msgctxt "search-result" | ||||||
| msgid "Suspend" | msgid "Suspend" | ||||||
| msgstr "In Bereitschaft versetzen" | msgstr "Bereitschaft" | ||||||
|  |  | ||||||
| #. Translators: A list of keywords that match the suspend action, separated by semicolons | #. Translators: A list of keywords that match the suspend action, separated by semicolons | ||||||
| #: js/misc/systemActions.js:112 | #: js/misc/systemActions.js:112 | ||||||
| @@ -762,12 +757,12 @@ msgstr "Zu Favoriten hinzufügen" | |||||||
| msgid "Show Details" | msgid "Show Details" | ||||||
| msgstr "Details anzeigen" | msgstr "Details anzeigen" | ||||||
|  |  | ||||||
| #: js/ui/appFavorites.js:141 | #: js/ui/appFavorites.js:149 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s has been added to your favorites." | msgid "%s has been added to your favorites." | ||||||
| msgstr "%s wurde zu Ihren Favoriten hinzugefügt" | msgstr "%s wurde zu Ihren Favoriten hinzugefügt" | ||||||
|  |  | ||||||
| #: js/ui/appFavorites.js:175 | #: js/ui/appFavorites.js:183 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s has been removed from your favorites." | msgid "%s has been removed from your favorites." | ||||||
| msgstr "%s wurde aus Ihren Favoriten entfernt" | msgstr "%s wurde aus Ihren Favoriten entfernt" | ||||||
| @@ -1053,7 +1048,7 @@ msgstr "Passwort der mobilen Breitbandverbindung" | |||||||
| msgid "A password is required to connect to “%s”." | msgid "A password is required to connect to “%s”." | ||||||
| msgstr "Es wird ein Passwort benötigt, um sich mit »%s« zu verbinden." | msgstr "Es wird ein Passwort benötigt, um sich mit »%s« zu verbinden." | ||||||
|  |  | ||||||
| #: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1665 | #: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1664 | ||||||
| msgid "Network Manager" | msgid "Network Manager" | ||||||
| msgstr "Netzwerk-Verwaltung" | msgstr "Netzwerk-Verwaltung" | ||||||
|  |  | ||||||
| @@ -1125,23 +1120,23 @@ msgstr "Weltuhren hinzufügen …" | |||||||
| msgid "World Clocks" | msgid "World Clocks" | ||||||
| msgstr "Weltuhren" | msgstr "Weltuhren" | ||||||
|  |  | ||||||
| #: js/ui/dateMenu.js:222 | #: js/ui/dateMenu.js:228 | ||||||
| msgid "Weather" | msgid "Weather" | ||||||
| msgstr "Wetter" | msgstr "Wetter" | ||||||
|  |  | ||||||
| #: js/ui/dateMenu.js:305 | #: js/ui/dateMenu.js:311 | ||||||
| msgid "Select a location…" | msgid "Select a location…" | ||||||
| msgstr "Ort auswählen …" | msgstr "Ort auswählen …" | ||||||
|  |  | ||||||
| #: js/ui/dateMenu.js:313 | #: js/ui/dateMenu.js:319 | ||||||
| msgid "Loading…" | msgid "Loading…" | ||||||
| msgstr "Wird geladen …" | msgstr "Wird geladen …" | ||||||
|  |  | ||||||
| #: js/ui/dateMenu.js:323 | #: js/ui/dateMenu.js:329 | ||||||
| msgid "Go online for weather information" | msgid "Go online for weather information" | ||||||
| msgstr "Gehen Sie Online, um Wetterinformationen beziehen zu können" | msgstr "Gehen Sie Online, um Wetterinformationen beziehen zu können" | ||||||
|  |  | ||||||
| #: js/ui/dateMenu.js:325 | #: js/ui/dateMenu.js:331 | ||||||
| msgid "Weather information is currently unavailable" | msgid "Weather information is currently unavailable" | ||||||
| msgstr "Wetterinformationen sind momentan nicht verfügbar" | msgstr "Wetterinformationen sind momentan nicht verfügbar" | ||||||
|  |  | ||||||
| @@ -1304,26 +1299,26 @@ msgid "Download and install “%s” from extensions.gnome.org?" | |||||||
| msgstr "»%s« von extensions.gnome.org herunterladen und installieren?" | msgstr "»%s« von extensions.gnome.org herunterladen und installieren?" | ||||||
|  |  | ||||||
| #. Translators: %s is an application name like "Settings" | #. Translators: %s is an application name like "Settings" | ||||||
| #: js/ui/inhibitShortcutsDialog.js:50 | #: js/ui/inhibitShortcutsDialog.js:78 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s wants to inhibit shortcuts" | msgid "%s wants to inhibit shortcuts" | ||||||
| msgstr "%s möchte Tastenkombinationen sperren" | msgstr "%s möchte Tastenkombinationen sperren" | ||||||
|  |  | ||||||
| #: js/ui/inhibitShortcutsDialog.js:51 | #: js/ui/inhibitShortcutsDialog.js:79 | ||||||
| msgid "Application wants to inhibit shortcuts" | msgid "Application wants to inhibit shortcuts" | ||||||
| msgstr "Die Anwendung möchte Tastenkombinationen sperren" | msgstr "Die Anwendung möchte Tastenkombinationen sperren" | ||||||
|  |  | ||||||
| #. Translators: %s is a keyboard shortcut like "Super+x" | #. Translators: %s is a keyboard shortcut like "Super+x" | ||||||
| #: js/ui/inhibitShortcutsDialog.js:60 | #: js/ui/inhibitShortcutsDialog.js:88 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "You can restore shortcuts by pressing %s." | msgid "You can restore shortcuts by pressing %s." | ||||||
| msgstr "Sie können Tastenkombinationen durch Drücken von %s wiederherstellen." | msgstr "Sie können Tastenkombinationen durch Drücken von %s wiederherstellen." | ||||||
|  |  | ||||||
| #: js/ui/inhibitShortcutsDialog.js:65 | #: js/ui/inhibitShortcutsDialog.js:93 | ||||||
| msgid "Deny" | msgid "Deny" | ||||||
| msgstr "Ablehnen" | msgstr "Ablehnen" | ||||||
|  |  | ||||||
| #: js/ui/inhibitShortcutsDialog.js:71 | #: js/ui/inhibitShortcutsDialog.js:100 | ||||||
| msgid "Allow" | msgid "Allow" | ||||||
| msgstr "Zulassen" | msgstr "Zulassen" | ||||||
|  |  | ||||||
| @@ -1376,13 +1371,13 @@ msgid "Leave On" | |||||||
| msgstr "Eingeschaltet lassen" | msgstr "Eingeschaltet lassen" | ||||||
|  |  | ||||||
| #: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133 | #: 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" | msgid "Turn On" | ||||||
| msgstr "Einschalten" | msgstr "Einschalten" | ||||||
|  |  | ||||||
| #: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133 | #: 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: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/nightLight.js:39 js/ui/status/rfkill.js:79 | ||||||
| #: js/ui/status/rfkill.js:106 | #: js/ui/status/rfkill.js:106 | ||||||
| msgid "Turn Off" | msgid "Turn Off" | ||||||
| @@ -1392,7 +1387,7 @@ msgstr "Ausschalten" | |||||||
| msgid "Leave Off" | msgid "Leave Off" | ||||||
| msgstr "Ausgeschaltet lassen" | msgstr "Ausgeschaltet lassen" | ||||||
|  |  | ||||||
| #: js/ui/keyboard.js:203 | #: js/ui/keyboard.js:200 | ||||||
| msgid "Region & Language Settings" | msgid "Region & Language Settings" | ||||||
| msgstr "Regions- und Spracheinstellungen" | msgstr "Regions- und Spracheinstellungen" | ||||||
|  |  | ||||||
| @@ -1444,7 +1439,7 @@ msgstr "Quelle zeigen" | |||||||
| msgid "Web Page" | msgid "Web Page" | ||||||
| msgstr "Webseite" | msgstr "Webseite" | ||||||
|  |  | ||||||
| #: js/ui/messageTray.js:1474 | #: js/ui/messageTray.js:1480 | ||||||
| msgid "System Information" | msgid "System Information" | ||||||
| msgstr "Systeminformationen" | msgstr "Systeminformationen" | ||||||
|  |  | ||||||
| @@ -1528,11 +1523,11 @@ msgstr "Beenden" | |||||||
|  |  | ||||||
| #. Translators: If there is no suitable word for "Activities" | #. Translators: If there is no suitable word for "Activities" | ||||||
| #. in your language, you can use the word for "Overview". | #. in your language, you can use the word for "Overview". | ||||||
| #: js/ui/panel.js:471 | #: js/ui/panel.js:470 | ||||||
| msgid "Activities" | msgid "Activities" | ||||||
| msgstr "Aktivitäten" | msgstr "Aktivitäten" | ||||||
|  |  | ||||||
| #: js/ui/panel.js:746 | #: js/ui/panel.js:745 | ||||||
| msgctxt "System menu in the top bar" | msgctxt "System menu in the top bar" | ||||||
| msgid "System" | msgid "System" | ||||||
| msgstr "System" | msgstr "System" | ||||||
| @@ -1541,15 +1536,6 @@ msgstr "System" | |||||||
| msgid "Top Bar" | msgid "Top Bar" | ||||||
| msgstr "Oberes Panel" | msgstr "Oberes Panel" | ||||||
|  |  | ||||||
| #. Translators: this MUST be either "toggle-switch-us" |  | ||||||
| #. (for toggle switches containing the English words |  | ||||||
| #. "ON" and "OFF") or "toggle-switch-intl" (for toggle |  | ||||||
| #. switches containing "◯" and "|"). Other values will |  | ||||||
| #. simply result in invisible toggle switches. |  | ||||||
| #: js/ui/popupMenu.js:285 |  | ||||||
| msgid "toggle-switch-us" |  | ||||||
| msgstr "toggle-switch-intl" |  | ||||||
|  |  | ||||||
| #: js/ui/runDialog.js:64 | #: js/ui/runDialog.js:64 | ||||||
| msgid "Enter a Command" | msgid "Enter a Command" | ||||||
| msgstr "Bitte geben Sie einen Befehl ein" | msgstr "Bitte geben Sie einen Befehl ein" | ||||||
| @@ -1589,7 +1575,7 @@ msgid_plural "%d new notifications" | |||||||
| msgstr[0] "%d neue Benachrichtigung" | msgstr[0] "%d neue Benachrichtigung" | ||||||
| msgstr[1] "%d neue Benachrichtigungen" | msgstr[1] "%d neue Benachrichtigungen" | ||||||
|  |  | ||||||
| #: js/ui/screenShield.js:449 js/ui/status/system.js:270 | #: js/ui/screenShield.js:449 js/ui/status/system.js:271 | ||||||
| msgid "Lock" | msgid "Lock" | ||||||
| msgstr "Sperren" | msgstr "Sperren" | ||||||
|  |  | ||||||
| @@ -1604,11 +1590,11 @@ msgstr "GNOME muss den Bildschirm sperren" | |||||||
| #. | #. | ||||||
| #. XXX: another option is to kick the user into the gdm login | #. XXX: another option is to kick the user into the gdm login | ||||||
| #. screen, where we're not affected by grabs | #. 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" | msgid "Unable to lock" | ||||||
| msgstr "Sperrung fehlgeschlagen" | msgstr "Sperrung fehlgeschlagen" | ||||||
|  |  | ||||||
| #: js/ui/screenShield.js:835 js/ui/screenShield.js:1308 | #: js/ui/screenShield.js:827 js/ui/screenShield.js:1300 | ||||||
| msgid "Lock was blocked by an application" | msgid "Lock was blocked by an application" | ||||||
| msgstr "Sperrung wurde von einer Anwendung blockiert" | msgstr "Sperrung wurde von einer Anwendung blockiert" | ||||||
|  |  | ||||||
| @@ -1772,7 +1758,7 @@ msgid "<unknown>" | |||||||
| msgstr "<Unbekannt>" | msgstr "<Unbekannt>" | ||||||
|  |  | ||||||
| #. Translators: %s is a network identifier | #. 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 | #, javascript-format | ||||||
| msgid "%s Off" | msgid "%s Off" | ||||||
| msgstr "%s ausgeschaltet" | msgstr "%s ausgeschaltet" | ||||||
| @@ -1798,7 +1784,7 @@ msgid "%s Disconnecting" | |||||||
| msgstr "%s wird getrennt" | msgstr "%s wird getrennt" | ||||||
|  |  | ||||||
| #. Translators: %s is a network identifier | #. 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 | #, javascript-format | ||||||
| msgid "%s Connecting" | msgid "%s Connecting" | ||||||
| msgstr "%s wird verbunden" | msgstr "%s wird verbunden" | ||||||
| @@ -1838,7 +1824,7 @@ msgid "Mobile Broadband Settings" | |||||||
| msgstr "Einstellungen der mobilen Breitbandverbindung" | msgstr "Einstellungen der mobilen Breitbandverbindung" | ||||||
|  |  | ||||||
| #. Translators: %s is a network identifier | #. 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 | #, javascript-format | ||||||
| msgid "%s Hardware Disabled" | msgid "%s Hardware Disabled" | ||||||
| msgstr "%s-Hardware ausgeschaltet" | msgstr "%s-Hardware ausgeschaltet" | ||||||
| @@ -1910,72 +1896,72 @@ msgid "Wi-Fi Settings" | |||||||
| msgstr "Drahtlosnetzwerk-Einstellungen" | msgstr "Drahtlosnetzwerk-Einstellungen" | ||||||
|  |  | ||||||
| #. Translators: %s is a network identifier | #. Translators: %s is a network identifier | ||||||
| #: js/ui/status/network.js:1281 | #: js/ui/status/network.js:1280 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s Hotspot Active" | msgid "%s Hotspot Active" | ||||||
| msgstr "Hotspot %s eingeschaltet" | msgstr "Hotspot %s eingeschaltet" | ||||||
|  |  | ||||||
| #. Translators: %s is a network identifier | #. Translators: %s is a network identifier | ||||||
| #: js/ui/status/network.js:1296 | #: js/ui/status/network.js:1295 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s Not Connected" | msgid "%s Not Connected" | ||||||
| msgstr "%s nicht verbunden" | msgstr "%s nicht verbunden" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1393 | #: js/ui/status/network.js:1392 | ||||||
| msgid "connecting…" | msgid "connecting…" | ||||||
| msgstr "Verbindungsaufbau …" | msgstr "Verbindungsaufbau …" | ||||||
|  |  | ||||||
| #. Translators: this is for network connections that require some kind of key or password | #. 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" | msgid "authentication required" | ||||||
| msgstr "Anmeldung erforderlich" | msgstr "Anmeldung erforderlich" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1398 | #: js/ui/status/network.js:1397 | ||||||
| msgid "connection failed" | msgid "connection failed" | ||||||
| msgstr "Verbindung gescheitert" | msgstr "Verbindung gescheitert" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1448 | #: js/ui/status/network.js:1447 | ||||||
| msgid "VPN Settings" | msgid "VPN Settings" | ||||||
| msgstr "VPN-Einstellungen" | msgstr "VPN-Einstellungen" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1465 | #: js/ui/status/network.js:1464 | ||||||
| msgid "VPN" | msgid "VPN" | ||||||
| msgstr "VPN" | msgstr "VPN" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1475 | #: js/ui/status/network.js:1474 | ||||||
| msgid "VPN Off" | msgid "VPN Off" | ||||||
| msgstr "VPN ausgeschaltet" | msgstr "VPN ausgeschaltet" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1536 js/ui/status/rfkill.js:82 | #: js/ui/status/network.js:1535 js/ui/status/rfkill.js:82 | ||||||
| msgid "Network Settings" | msgid "Network Settings" | ||||||
| msgstr "Netzwerkeinstellungen" | msgstr "Netzwerkeinstellungen" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1565 | #: js/ui/status/network.js:1564 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s Wired Connection" | msgid "%s Wired Connection" | ||||||
| msgid_plural "%s Wired Connections" | msgid_plural "%s Wired Connections" | ||||||
| msgstr[0] "%s Kabelverbindung" | msgstr[0] "%s Kabelverbindung" | ||||||
| msgstr[1] "%s Kabelverbindungen" | msgstr[1] "%s Kabelverbindungen" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1569 | #: js/ui/status/network.js:1568 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s Wi-Fi Connection" | msgid "%s Wi-Fi Connection" | ||||||
| msgid_plural "%s Wi-Fi Connections" | msgid_plural "%s Wi-Fi Connections" | ||||||
| msgstr[0] "%s Funknetzwerkverbindung" | msgstr[0] "%s Funknetzwerkverbindung" | ||||||
| msgstr[1] "%s Funknetzwerkverbindungen" | msgstr[1] "%s Funknetzwerkverbindungen" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1573 | #: js/ui/status/network.js:1572 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s Modem Connection" | msgid "%s Modem Connection" | ||||||
| msgid_plural "%s Modem Connections" | msgid_plural "%s Modem Connections" | ||||||
| msgstr[0] "%s Modem-Verbindung" | msgstr[0] "%s Modem-Verbindung" | ||||||
| msgstr[1] "%s Modem-Verbindungen" | msgstr[1] "%s Modem-Verbindungen" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1702 | #: js/ui/status/network.js:1705 | ||||||
| msgid "Connection failed" | msgid "Connection failed" | ||||||
| msgstr "Verbindung gescheitert" | msgstr "Verbindung gescheitert" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1703 | #: js/ui/status/network.js:1706 | ||||||
| msgid "Activation of network connection failed" | msgid "Activation of network connection failed" | ||||||
| msgstr "Aktivierung der Netzwerkverbindung ist gescheitert" | msgstr "Aktivierung der Netzwerkverbindung ist gescheitert" | ||||||
|  |  | ||||||
| @@ -2057,15 +2043,15 @@ msgstr "Abmelden" | |||||||
| msgid "Account Settings" | msgid "Account Settings" | ||||||
| msgstr "Kontoeinstellungen" | msgstr "Kontoeinstellungen" | ||||||
|  |  | ||||||
| #: js/ui/status/system.js:255 | #: js/ui/status/system.js:256 | ||||||
| msgid "Orientation Lock" | msgid "Orientation Lock" | ||||||
| msgstr "Hoch-/Querformats-Fixierung" | msgstr "Hoch-/Querformats-Fixierung" | ||||||
|  |  | ||||||
| #: js/ui/status/system.js:281 | #: js/ui/status/system.js:282 | ||||||
| msgid "Suspend" | msgid "Suspend" | ||||||
| msgstr "In Bereitschaft versetzen" | msgstr "Bereitschaft" | ||||||
|  |  | ||||||
| #: js/ui/status/system.js:291 | #: js/ui/status/system.js:292 | ||||||
| msgid "Power Off" | msgid "Power Off" | ||||||
| msgstr "Ausschalten" | msgstr "Ausschalten" | ||||||
|  |  | ||||||
| @@ -2183,7 +2169,7 @@ msgstr[1] "" | |||||||
|  |  | ||||||
| #. Translators: This represents the size of a window. The first number is | #. Translators: This represents the size of a window. The first number is | ||||||
| #. * the width of the window and the second is the height. | #. * the width of the window and the second is the height. | ||||||
| #: js/ui/windowManager.js:662 | #: js/ui/windowManager.js:677 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%d × %d" | msgid "%d × %d" | ||||||
| msgstr "%d × %d" | msgstr "%d × %d" | ||||||
| @@ -2256,11 +2242,6 @@ msgstr "Auf den Bildschirm nach rechts verschieben" | |||||||
| msgid "Evolution Calendar" | msgid "Evolution Calendar" | ||||||
| msgstr "Evolution-Kalender" | 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 | #: src/main.c:408 | ||||||
| msgid "Print version" | msgid "Print version" | ||||||
| msgstr "Version ausgeben" | msgstr "Version ausgeben" | ||||||
| @@ -2279,12 +2260,12 @@ msgstr "" | |||||||
| msgid "List possible modes" | msgid "List possible modes" | ||||||
| msgstr "Die möglichen Modi auflisten" | msgstr "Die möglichen Modi auflisten" | ||||||
|  |  | ||||||
| #: src/shell-app.c:260 | #: src/shell-app.c:264 | ||||||
| msgctxt "program" | msgctxt "program" | ||||||
| msgid "Unknown" | msgid "Unknown" | ||||||
| msgstr "Unbekannt" | msgstr "Unbekannt" | ||||||
|  |  | ||||||
| #: src/shell-app.c:511 | #: src/shell-app.c:515 | ||||||
| #, c-format | #, c-format | ||||||
| msgid "Failed to launch “%s”" | msgid "Failed to launch “%s”" | ||||||
| msgstr "»%s« konnte nicht gestartet werden" | msgstr "»%s« konnte nicht gestartet werden" | ||||||
| @@ -2323,6 +2304,15 @@ msgstr[1] "%u Eingänge" | |||||||
| msgid "System Sounds" | msgid "System Sounds" | ||||||
| msgstr "Systemklänge" | msgstr "Systemklänge" | ||||||
|  |  | ||||||
|  | #~ msgid "network-workgroup" | ||||||
|  | #~ msgstr "network-workgroup" | ||||||
|  |  | ||||||
|  | #~ msgid "toggle-switch-us" | ||||||
|  | #~ msgstr "toggle-switch-intl" | ||||||
|  |  | ||||||
|  | #~ msgid "evolution" | ||||||
|  | #~ msgstr "evolution" | ||||||
|  |  | ||||||
| #~ msgid "There was an error loading the preferences dialog for %s:" | #~ msgid "There was an error loading the preferences dialog for %s:" | ||||||
| #~ msgstr "" | #~ msgstr "" | ||||||
| #~ "Beim Laden des Einstellungsdialogs für %s ist ein Fehler aufgetreten:" | #~ "Beim Laden des Einstellungsdialogs für %s ist ein Fehler aufgetreten:" | ||||||
|   | |||||||
							
								
								
									
										1043
									
								
								po/en_GB.po
									
									
									
									
									
								
							
							
						
						
									
										1043
									
								
								po/en_GB.po
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										222
									
								
								po/eo.po
									
									
									
									
									
								
							
							
						
						
									
										222
									
								
								po/eo.po
									
									
									
									
									
								
							| @@ -6,22 +6,22 @@ | |||||||
| # Daniel PUENTES <blatberk@openmailbox.org>, 2015. | # Daniel PUENTES <blatberk@openmailbox.org>, 2015. | ||||||
| # Nicolas MAIA < >, 2015. | # Nicolas MAIA < >, 2015. | ||||||
| # Kristjan SCHMIDT <kristjan.schmidt@googlemail.com>, 2011, 2012, 2015, 2016, 2018. | # 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 "" | msgid "" | ||||||
| msgstr "" | msgstr "" | ||||||
| "Project-Id-Version: gnome-shell master\n" | "Project-Id-Version: gnome-shell master\n" | ||||||
| "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" | "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" | ||||||
| "POT-Creation-Date: 2019-02-21 18:43+0000\n" | "POT-Creation-Date: 2019-05-08 17:45+0000\n" | ||||||
| "PO-Revision-Date: 2019-02-22 13:19+0100\n" | "PO-Revision-Date: 2019-05-09 20:12+0200\n" | ||||||
| "Last-Translator: Carmen Bianca BAKKER <carmen@carmenbianca.eu>\n" | "Last-Translator: Carmen Bianca BAKKER <carmen@carmenbianca.eu>\n" | ||||||
| "Language-Team: Esperanto <gnome-eo-list@gnome.org>\n" | "Language-Team: Esperanto <gnome-eo-list@gnome.org>\n" | ||||||
| "Language: eo\n" | "Language: eo\n" | ||||||
| "MIME-Version: 1.0\n" | "MIME-Version: 1.0\n" | ||||||
| "Content-Type: text/plain; charset=UTF-8\n" | "Content-Type: text/plain; charset=UTF-8\n" | ||||||
| "Content-Transfer-Encoding: 8bit\n" | "Content-Transfer-Encoding: 8bit\n" | ||||||
| "Plural-Forms: nplurals=2; plural=(n != 1);\n" | "Plural-Forms: nplurals=2; plural=(n != 1)\n" | ||||||
| "X-Generator: Poedit 2.2.1\n" | "X-Generator: Gtranslator 3.32.0\n" | ||||||
| "X-DamnedLies-Scope: partial\n" | "X-DamnedLies-Scope: partial\n" | ||||||
| "X-Project-Style: gnome\n" | "X-Project-Style: gnome\n" | ||||||
|  |  | ||||||
| @@ -185,8 +185,8 @@ msgstr "Klavkombino por malfermi la “Montri aplikaĵojn”-vidon" | |||||||
| msgid "" | msgid "" | ||||||
| "Keybinding to open the “Show Applications” view of the Activities Overview." | "Keybinding to open the “Show Applications” view of the Activities Overview." | ||||||
| msgstr "" | msgstr "" | ||||||
| "Klavkombino por malfermi la “Montri aplikaĵojn” vidon de la aktivecoj " | "Klavkombino por malfermi la “Montri aplikaĵojn” vidon de la Aktivecoj-" | ||||||
| "superrigardo." | "Superrigardo." | ||||||
|  |  | ||||||
| #: data/org.gnome.shell.gschema.xml.in:124 | #: data/org.gnome.shell.gschema.xml.in:124 | ||||||
| msgid "Keybinding to open the overview" | msgid "Keybinding to open the overview" | ||||||
| @@ -194,7 +194,7 @@ msgstr "Klavkombino por malfermi la superrigardon" | |||||||
|  |  | ||||||
| #: data/org.gnome.shell.gschema.xml.in:125 | #: data/org.gnome.shell.gschema.xml.in:125 | ||||||
| msgid "Keybinding to open the Activities Overview." | 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 | #: data/org.gnome.shell.gschema.xml.in:131 | ||||||
| msgid "Keybinding to toggle the visibility of the notification list" | 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" | msgid "Network Login" | ||||||
| msgstr "Reta saluto" | 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 | #: js/extensionPrefs/main.js:116 | ||||||
| msgid "Something’s gone wrong" | msgid "Something’s gone wrong" | ||||||
| msgstr "Io fiaskis" | msgstr "Io fiaskis" | ||||||
| @@ -388,7 +383,7 @@ msgstr "Foliumi en Programaro" | |||||||
| #: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55 | #: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55 | ||||||
| #: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136 | #: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136 | ||||||
| #: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188 | #: js/ui/endSessionDialog.js:430 js/ui/extensionDownloader.js:188 | ||||||
| #: js/ui/shellMountOperation.js:325 js/ui/status/network.js:888 | #: js/ui/shellMountOperation.js:325 js/ui/status/network.js:889 | ||||||
| msgid "Cancel" | msgid "Cancel" | ||||||
| msgstr "Nuligi" | msgstr "Nuligi" | ||||||
|  |  | ||||||
| @@ -419,7 +414,7 @@ msgstr "Ĉu ne en listo?" | |||||||
|  |  | ||||||
| #. Translators: this message is shown below the username entry field | #. Translators: this message is shown below the username entry field | ||||||
| #. to clue the user in on how to login to the local network realm | #. 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 | #, javascript-format | ||||||
| msgid "(e.g., user or %s)" | msgid "(e.g., user or %s)" | ||||||
| msgstr "(ekzemple, uzanto aŭ %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 | #. TTLS and PEAP are actually much more complicated, but this complication | ||||||
| #. is not visible here since we only care about phase2 authentication | #. is not visible here since we only care about phase2 authentication | ||||||
| #. (and don't even care of which one) | #. (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 | #: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281 | ||||||
| msgid "Username: " | msgid "Username: " | ||||||
| msgstr "Uzantonomo: " | msgstr "Uzantonomo: " | ||||||
|  |  | ||||||
| #: js/gdm/loginDialog.js:1223 | #: js/gdm/loginDialog.js:1227 | ||||||
| msgid "Login Window" | msgid "Login Window" | ||||||
| msgstr "Salutfenestro" | msgstr "Salutfenestro" | ||||||
|  |  | ||||||
| @@ -686,32 +681,37 @@ msgstr "Oftaj" | |||||||
| msgid "All" | msgid "All" | ||||||
| msgstr "Ĉiuj" | msgstr "Ĉiuj" | ||||||
|  |  | ||||||
| #: js/ui/appDisplay.js:1737 js/ui/panel.js:83 | #. Translators: This is the heading of a list of open windows | ||||||
|  | #: js/ui/appDisplay.js:1713 js/ui/panel.js:79 | ||||||
|  | msgid "Open Windows" | ||||||
|  | msgstr "Malfermaj fenestroj" | ||||||
|  |  | ||||||
|  | #: js/ui/appDisplay.js:1732 js/ui/panel.js:86 | ||||||
| msgid "New Window" | msgid "New Window" | ||||||
| msgstr "Nova fenestro" | msgstr "Nova fenestro" | ||||||
|  |  | ||||||
| #: js/ui/appDisplay.js:1751 | #: js/ui/appDisplay.js:1746 | ||||||
| msgid "Launch using Dedicated Graphics Card" | msgid "Launch using Dedicated Graphics Card" | ||||||
| msgstr "Lanĉi uzante dediĉitan vidkarton" | 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" | msgid "Remove from Favorites" | ||||||
| msgstr "Forigi el preferataj" | msgstr "Forigi el preferataj" | ||||||
|  |  | ||||||
| #: js/ui/appDisplay.js:1784 | #: js/ui/appDisplay.js:1779 | ||||||
| msgid "Add to Favorites" | msgid "Add to Favorites" | ||||||
| msgstr "Aldoni al preferataj" | 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" | msgid "Show Details" | ||||||
| msgstr "Montri detalojn" | msgstr "Montri detalojn" | ||||||
|  |  | ||||||
| #: js/ui/appFavorites.js:141 | #: js/ui/appFavorites.js:149 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s has been added to your favorites." | msgid "%s has been added to your favorites." | ||||||
| msgstr "%s estas aldonita de via preferataj aplikaĵoj." | msgstr "%s estas aldonita de via preferataj aplikaĵoj." | ||||||
|  |  | ||||||
| #: js/ui/appFavorites.js:175 | #: js/ui/appFavorites.js:183 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s has been removed from your favorites." | msgid "%s has been removed from your favorites." | ||||||
| msgstr "%s estas forigita de via preferataj aplikaĵoj." | msgstr "%s estas forigita de via preferataj aplikaĵoj." | ||||||
| @@ -919,7 +919,7 @@ msgstr "" | |||||||
| "Alternative vi povas konekti per premi la “WPS”-butonon de via enkursigilo." | "Alternative vi povas konekti per premi la “WPS”-butonon de via enkursigilo." | ||||||
|  |  | ||||||
| #: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219 | #: js/ui/components/networkAgent.js:112 js/ui/status/network.js:219 | ||||||
| #: js/ui/status/network.js:309 js/ui/status/network.js:891 | #: js/ui/status/network.js:310 js/ui/status/network.js:892 | ||||||
| msgid "Connect" | msgid "Connect" | ||||||
| msgstr "Konekti" | msgstr "Konekti" | ||||||
|  |  | ||||||
| @@ -949,7 +949,7 @@ msgstr "Servo: " | |||||||
|  |  | ||||||
| #: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685 | #: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:685 | ||||||
| msgid "Authentication required by wireless network" | msgid "Authentication required by wireless network" | ||||||
| msgstr "Aŭtentigo estas bezonata de sendrata reto" | msgstr "Sendrata reto bezonas aŭtentigon" | ||||||
|  |  | ||||||
| #: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686 | #: js/ui/components/networkAgent.js:313 js/ui/components/networkAgent.js:686 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| @@ -977,7 +977,7 @@ msgstr "PIN-kodo bezonata" | |||||||
|  |  | ||||||
| #: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700 | #: js/ui/components/networkAgent.js:332 js/ui/components/networkAgent.js:700 | ||||||
| msgid "PIN code is needed for the mobile broadband device" | msgid "PIN code is needed for the mobile broadband device" | ||||||
| msgstr "PIN-kodo estas bezonata por la portebla larĝkapacita aparato" | msgstr "PIN-kodo necesas por la portebla larĝkapacita aparato" | ||||||
|  |  | ||||||
| #: js/ui/components/networkAgent.js:333 | #: js/ui/components/networkAgent.js:333 | ||||||
| msgid "PIN: " | msgid "PIN: " | ||||||
| @@ -991,7 +991,7 @@ msgstr "Portebla larĝkapacita retopasvorto" | |||||||
| #: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707 | #: js/ui/components/networkAgent.js:694 js/ui/components/networkAgent.js:707 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "A password is required to connect to “%s”." | msgid "A password is required to connect to “%s”." | ||||||
| msgstr "Pasvorto estas bezonata por konekti al “%s”." | msgstr "Pasvorto necesas por konekti al “%s”." | ||||||
|  |  | ||||||
| #: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1665 | #: js/ui/components/networkAgent.js:674 js/ui/status/network.js:1665 | ||||||
| msgid "Network Manager" | msgid "Network Manager" | ||||||
| @@ -1065,23 +1065,23 @@ msgstr "Aldoni mondajn horloĝojn…" | |||||||
| msgid "World Clocks" | msgid "World Clocks" | ||||||
| msgstr "Mondaj horloĝoj" | msgstr "Mondaj horloĝoj" | ||||||
|  |  | ||||||
| #: js/ui/dateMenu.js:222 | #: js/ui/dateMenu.js:228 | ||||||
| msgid "Weather" | msgid "Weather" | ||||||
| msgstr "Vetero" | msgstr "Vetero" | ||||||
|  |  | ||||||
| #: js/ui/dateMenu.js:305 | #: js/ui/dateMenu.js:311 | ||||||
| msgid "Select a location…" | msgid "Select a location…" | ||||||
| msgstr "Elekti lokon…" | msgstr "Elekti lokon…" | ||||||
|  |  | ||||||
| #: js/ui/dateMenu.js:313 | #: js/ui/dateMenu.js:319 | ||||||
| msgid "Loading…" | msgid "Loading…" | ||||||
| msgstr "Ŝargante…" | msgstr "Ŝargante…" | ||||||
|  |  | ||||||
| #: js/ui/dateMenu.js:323 | #: js/ui/dateMenu.js:329 | ||||||
| msgid "Go online for weather information" | msgid "Go online for weather information" | ||||||
| msgstr "Enretigi por veterinformoj" | msgstr "Enretigi por veterinformoj" | ||||||
|  |  | ||||||
| #: js/ui/dateMenu.js:325 | #: js/ui/dateMenu.js:331 | ||||||
| msgid "Weather information is currently unavailable" | msgid "Weather information is currently unavailable" | ||||||
| msgstr "Veterinformoj ĉimomente nehaveblas" | msgstr "Veterinformoj ĉimomente nehaveblas" | ||||||
|  |  | ||||||
| @@ -1240,26 +1240,26 @@ msgid "Download and install “%s” from extensions.gnome.org?" | |||||||
| msgstr "Ĉu elŝuti kaj instali “%s” de extensions.gnome.org?" | msgstr "Ĉu elŝuti kaj instali “%s” de extensions.gnome.org?" | ||||||
|  |  | ||||||
| #. Translators: %s is an application name like "Settings" | #. Translators: %s is an application name like "Settings" | ||||||
| #: js/ui/inhibitShortcutsDialog.js:50 | #: js/ui/inhibitShortcutsDialog.js:78 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s wants to inhibit shortcuts" | msgid "%s wants to inhibit shortcuts" | ||||||
| msgstr "%s volas malebligi klavkombinojn" | msgstr "%s volas malebligi klavkombinojn" | ||||||
|  |  | ||||||
| #: js/ui/inhibitShortcutsDialog.js:51 | #: js/ui/inhibitShortcutsDialog.js:79 | ||||||
| msgid "Application wants to inhibit shortcuts" | msgid "Application wants to inhibit shortcuts" | ||||||
| msgstr "Aplikaĵo volas malebligi klavkombinojn" | msgstr "Aplikaĵo volas malebligi klavkombinojn" | ||||||
|  |  | ||||||
| #. Translators: %s is a keyboard shortcut like "Super+x" | #. Translators: %s is a keyboard shortcut like "Super+x" | ||||||
| #: js/ui/inhibitShortcutsDialog.js:60 | #: js/ui/inhibitShortcutsDialog.js:88 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "You can restore shortcuts by pressing %s." | msgid "You can restore shortcuts by pressing %s." | ||||||
| msgstr "Vi povas restaŭri klavkombinojn per premi %s." | msgstr "Vi povas restaŭri klavkombinojn per premi %s." | ||||||
|  |  | ||||||
| #: js/ui/inhibitShortcutsDialog.js:65 | #: js/ui/inhibitShortcutsDialog.js:93 | ||||||
| msgid "Deny" | msgid "Deny" | ||||||
| msgstr "Rifuzi" | msgstr "Rifuzi" | ||||||
|  |  | ||||||
| #: js/ui/inhibitShortcutsDialog.js:71 | #: js/ui/inhibitShortcutsDialog.js:100 | ||||||
| msgid "Allow" | msgid "Allow" | ||||||
| msgstr "Akcepti" | msgstr "Akcepti" | ||||||
|  |  | ||||||
| @@ -1315,7 +1315,7 @@ msgid "Turn On" | |||||||
| msgstr "Ŝalti" | msgstr "Ŝalti" | ||||||
|  |  | ||||||
| #: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133 | #: 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:128 js/ui/status/network.js:311 | ||||||
| #: js/ui/status/network.js:1264 js/ui/status/network.js:1376 | #: js/ui/status/network.js:1264 js/ui/status/network.js:1376 | ||||||
| #: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 | #: js/ui/status/nightLight.js:39 js/ui/status/rfkill.js:79 | ||||||
| #: js/ui/status/rfkill.js:106 | #: js/ui/status/rfkill.js:106 | ||||||
| @@ -1326,59 +1326,59 @@ msgstr "Malŝalti" | |||||||
| msgid "Leave Off" | msgid "Leave Off" | ||||||
| msgstr "Lasi malŝaltita" | msgstr "Lasi malŝaltita" | ||||||
|  |  | ||||||
| #: js/ui/keyboard.js:203 | #: js/ui/keyboard.js:200 | ||||||
| msgid "Region & Language Settings" | msgid "Region & Language Settings" | ||||||
| msgstr "Regiono & lingvo agordoj" | msgstr "Regiono & lingvo agordoj" | ||||||
|  |  | ||||||
| #: js/ui/lookingGlass.js:614 | #: js/ui/lookingGlass.js:615 | ||||||
| msgid "No extensions installed" | msgid "No extensions installed" | ||||||
| msgstr "Neniu kromprogramo instalita" | msgstr "Neniu kromprogramo instalita" | ||||||
|  |  | ||||||
| #. Translators: argument is an extension UUID. | #. Translators: argument is an extension UUID. | ||||||
| #: js/ui/lookingGlass.js:668 | #: js/ui/lookingGlass.js:669 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s has not emitted any errors." | msgid "%s has not emitted any errors." | ||||||
| msgstr "%s ne eligintaj ajnaj eraroj." | msgstr "%s ne eligintaj ajnaj eraroj." | ||||||
|  |  | ||||||
| #: js/ui/lookingGlass.js:674 | #: js/ui/lookingGlass.js:675 | ||||||
| msgid "Hide Errors" | msgid "Hide Errors" | ||||||
| msgstr "Kaŝi erarojn" | 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" | msgid "Show Errors" | ||||||
| msgstr "Montri erarojn" | msgstr "Montri erarojn" | ||||||
|  |  | ||||||
| #: js/ui/lookingGlass.js:687 | #: js/ui/lookingGlass.js:688 | ||||||
| msgid "Enabled" | msgid "Enabled" | ||||||
| msgstr "Enŝaltita" | msgstr "Enŝaltita" | ||||||
|  |  | ||||||
| #. translators: | #. translators: | ||||||
| #. * The device has been disabled | #. * 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" | msgid "Disabled" | ||||||
| msgstr "Elŝaltita" | msgstr "Elŝaltita" | ||||||
|  |  | ||||||
| #: js/ui/lookingGlass.js:692 | #: js/ui/lookingGlass.js:693 | ||||||
| msgid "Error" | msgid "Error" | ||||||
| msgstr "Eraro" | msgstr "Eraro" | ||||||
|  |  | ||||||
| #: js/ui/lookingGlass.js:694 | #: js/ui/lookingGlass.js:695 | ||||||
| msgid "Out of date" | msgid "Out of date" | ||||||
| msgstr "Neaktuala" | msgstr "Neaktuala" | ||||||
|  |  | ||||||
| #: js/ui/lookingGlass.js:696 | #: js/ui/lookingGlass.js:697 | ||||||
| msgid "Downloading" | msgid "Downloading" | ||||||
| msgstr "Elŝutante" | msgstr "Elŝutante" | ||||||
|  |  | ||||||
| #: js/ui/lookingGlass.js:720 | #: js/ui/lookingGlass.js:721 | ||||||
| msgid "View Source" | msgid "View Source" | ||||||
| msgstr "Montri fonton" | msgstr "Montri fonton" | ||||||
|  |  | ||||||
| #: js/ui/lookingGlass.js:729 | #: js/ui/lookingGlass.js:730 | ||||||
| msgid "Web Page" | msgid "Web Page" | ||||||
| msgstr "Retpaĝo" | msgstr "Retpaĝo" | ||||||
|  |  | ||||||
| #: js/ui/messageTray.js:1474 | #: js/ui/messageTray.js:1479 | ||||||
| msgid "System Information" | msgid "System Information" | ||||||
| msgstr "Sisteminformoj" | msgstr "Sisteminformoj" | ||||||
|  |  | ||||||
| @@ -1404,13 +1404,14 @@ msgstr "Malfari" | |||||||
| msgid "Overview" | msgid "Overview" | ||||||
| msgstr "Superrigardo" | msgstr "Superrigardo" | ||||||
|  |  | ||||||
|  | # Imperativo | ||||||
| #. Translators: this is the text displayed | #. Translators: this is the text displayed | ||||||
| #. in the search entry when no search is | #. in the search entry when no search is | ||||||
| #. active; it should not exceed ~30 | #. active; it should not exceed ~30 | ||||||
| #. characters. | #. characters. | ||||||
| #: js/ui/overview.js:226 | #: js/ui/overview.js:226 | ||||||
| msgid "Type to search…" | msgid "Type to search…" | ||||||
| msgstr "Tajpi por serĉi…" | msgstr "Tajpu por serĉi…" | ||||||
|  |  | ||||||
| #: js/ui/padOsd.js:92 | #: js/ui/padOsd.js:92 | ||||||
| msgid "New shortcut…" | msgid "New shortcut…" | ||||||
| @@ -1456,17 +1457,17 @@ msgstr "Premu Esk-klavon por ĉesi" | |||||||
| msgid "Press any key to exit" | msgid "Press any key to exit" | ||||||
| msgstr "Premu iun ajn klavon por ĉesi" | msgstr "Premu iun ajn klavon por ĉesi" | ||||||
|  |  | ||||||
| #: js/ui/panel.js:108 | #: js/ui/panel.js:113 | ||||||
| msgid "Quit" | msgid "Quit" | ||||||
| msgstr "Ĉesi" | msgstr "Ĉesi" | ||||||
|  |  | ||||||
| #. Translators: If there is no suitable word for "Activities" | #. Translators: If there is no suitable word for "Activities" | ||||||
| #. in your language, you can use the word for "Overview". | #. in your language, you can use the word for "Overview". | ||||||
| #: js/ui/panel.js:466 | #: js/ui/panel.js:468 | ||||||
| msgid "Activities" | msgid "Activities" | ||||||
| msgstr "Aktivecoj" | msgstr "Aktivecoj" | ||||||
|  |  | ||||||
| #: js/ui/panel.js:741 | #: js/ui/panel.js:743 | ||||||
| msgctxt "System menu in the top bar" | msgctxt "System menu in the top bar" | ||||||
| msgid "System" | msgid "System" | ||||||
| msgstr "Sistemo" | msgstr "Sistemo" | ||||||
| @@ -1475,15 +1476,6 @@ msgstr "Sistemo" | |||||||
| msgid "Top Bar" | msgid "Top Bar" | ||||||
| msgstr "Supra breto" | 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 | #: js/ui/runDialog.js:64 | ||||||
| msgid "Enter a Command" | msgid "Enter a Command" | ||||||
| msgstr "Enigu komandon" | msgstr "Enigu komandon" | ||||||
| @@ -1520,7 +1512,7 @@ msgid_plural "%d new notifications" | |||||||
| msgstr[0] "%d nova sciigo" | msgstr[0] "%d nova sciigo" | ||||||
| msgstr[1] "%d novaj sciigoj" | 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" | msgid "Lock" | ||||||
| msgstr "Ŝlosi" | msgstr "Ŝlosi" | ||||||
|  |  | ||||||
| @@ -1535,11 +1527,11 @@ msgstr "GNOME bezonas ŝlosi la ekranon" | |||||||
| #. | #. | ||||||
| #. XXX: another option is to kick the user into the gdm login | #. XXX: another option is to kick the user into the gdm login | ||||||
| #. screen, where we're not affected by grabs | #. 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" | msgid "Unable to lock" | ||||||
| msgstr "Ne eblas ŝlosi" | 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" | msgid "Lock was blocked by an application" | ||||||
| msgstr "Ŝloso estis blokita de aplikaĵo" | msgstr "Ŝloso estis blokita de aplikaĵo" | ||||||
|  |  | ||||||
| @@ -1618,11 +1610,11 @@ msgstr "Saltaj klavoj" | |||||||
| msgid "Mouse Keys" | msgid "Mouse Keys" | ||||||
| msgstr "Musklavoj" | msgstr "Musklavoj" | ||||||
|  |  | ||||||
| #: js/ui/status/accessibility.js:151 | #: js/ui/status/accessibility.js:135 | ||||||
| msgid "High Contrast" | msgid "High Contrast" | ||||||
| msgstr "Alta kontrasto" | msgstr "Alta kontrasto" | ||||||
|  |  | ||||||
| #: js/ui/status/accessibility.js:182 | #: js/ui/status/accessibility.js:177 | ||||||
| msgid "Large Text" | msgid "Large Text" | ||||||
| msgstr "Granda teksto" | msgstr "Granda teksto" | ||||||
|  |  | ||||||
| @@ -1630,7 +1622,7 @@ msgstr "Granda teksto" | |||||||
| msgid "Bluetooth" | msgid "Bluetooth" | ||||||
| msgstr "Bludento" | msgstr "Bludento" | ||||||
|  |  | ||||||
| #: js/ui/status/bluetooth.js:47 js/ui/status/network.js:585 | #: js/ui/status/bluetooth.js:47 js/ui/status/network.js:586 | ||||||
| msgid "Bluetooth Settings" | msgid "Bluetooth Settings" | ||||||
| msgstr "Bludento-agordoj" | msgstr "Bludento-agordoj" | ||||||
|  |  | ||||||
| @@ -1701,13 +1693,13 @@ msgid "<unknown>" | |||||||
| msgstr "<nekonata>" | msgstr "<nekonata>" | ||||||
|  |  | ||||||
| #. Translators: %s is a network identifier | #. Translators: %s is a network identifier | ||||||
| #: js/ui/status/network.js:416 js/ui/status/network.js:1293 | #: js/ui/status/network.js:417 js/ui/status/network.js:1293 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s Off" | msgid "%s Off" | ||||||
| msgstr "%s malŝaltita" | msgstr "%s malŝaltita" | ||||||
|  |  | ||||||
| #. Translators: %s is a network identifier | #. Translators: %s is a network identifier | ||||||
| #: js/ui/status/network.js:419 | #: js/ui/status/network.js:420 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s Connected" | msgid "%s Connected" | ||||||
| msgstr "%s konektita" | msgstr "%s konektita" | ||||||
| @@ -1715,119 +1707,119 @@ msgstr "%s konektita" | |||||||
| #. Translators: this is for network devices that are physically present but are not | #. Translators: this is for network devices that are physically present but are not | ||||||
| #. under NetworkManager's control (and thus cannot be used in the menu); | #. under NetworkManager's control (and thus cannot be used in the menu); | ||||||
| #. %s is a network identifier | #. %s is a network identifier | ||||||
| #: js/ui/status/network.js:424 | #: js/ui/status/network.js:425 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s Unmanaged" | msgid "%s Unmanaged" | ||||||
| msgstr "%s nemastrumita" | msgstr "%s nemastrumita" | ||||||
|  |  | ||||||
| #. Translators: %s is a network identifier | #. Translators: %s is a network identifier | ||||||
| #: js/ui/status/network.js:427 | #: js/ui/status/network.js:428 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s Disconnecting" | msgid "%s Disconnecting" | ||||||
| msgstr "%s malkonektante" | msgstr "%s malkonektante" | ||||||
|  |  | ||||||
| #. Translators: %s is a network identifier | #. Translators: %s is a network identifier | ||||||
| #: js/ui/status/network.js:434 js/ui/status/network.js:1285 | #: js/ui/status/network.js:435 js/ui/status/network.js:1285 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s Connecting" | msgid "%s Connecting" | ||||||
| msgstr "%s konektante" | msgstr "%s konektante" | ||||||
|  |  | ||||||
| #. Translators: this is for network connections that require some kind of key or password; %s is a network identifier | #. Translators: this is for network connections that require some kind of key or password; %s is a network identifier | ||||||
| #: js/ui/status/network.js:437 | #: js/ui/status/network.js:438 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s Requires Authentication" | msgid "%s Requires Authentication" | ||||||
| msgstr "%s postulas aŭtentigon" | msgstr "%s postulas aŭtentigon" | ||||||
|  |  | ||||||
| #. Translators: this is for devices that require some kind of firmware or kernel | #. Translators: this is for devices that require some kind of firmware or kernel | ||||||
| #. module, which is missing; %s is a network identifier | #. module, which is missing; %s is a network identifier | ||||||
| #: js/ui/status/network.js:445 | #: js/ui/status/network.js:446 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "Firmware Missing For %s" | msgid "Firmware Missing For %s" | ||||||
| msgstr "Mikroprogramo mankas por %s" | msgstr "Mikroprogramo mankas por %s" | ||||||
|  |  | ||||||
| #. Translators: this is for a network device that cannot be activated (for example it | #. Translators: this is for a network device that cannot be activated (for example it | ||||||
| #. is disabled by rfkill, or it has no coverage; %s is a network identifier | #. is disabled by rfkill, or it has no coverage; %s is a network identifier | ||||||
| #: js/ui/status/network.js:449 | #: js/ui/status/network.js:450 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s Unavailable" | msgid "%s Unavailable" | ||||||
| msgstr "%s nedisponebla" | msgstr "%s nedisponebla" | ||||||
|  |  | ||||||
| #. Translators: %s is a network identifier | #. Translators: %s is a network identifier | ||||||
| #: js/ui/status/network.js:452 | #: js/ui/status/network.js:453 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s Connection Failed" | msgid "%s Connection Failed" | ||||||
| msgstr "%s konekto malsukcesis" | msgstr "%s konekto malsukcesis" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:464 | #: js/ui/status/network.js:465 | ||||||
| msgid "Wired Settings" | msgid "Wired Settings" | ||||||
| msgstr "Drataj agordoj" | msgstr "Drataj agordoj" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:506 | #: js/ui/status/network.js:507 | ||||||
| msgid "Mobile Broadband Settings" | msgid "Mobile Broadband Settings" | ||||||
| msgstr "Porteblaj larĝkapacitaj agordoj" | msgstr "Porteblaj larĝkapacitaj agordoj" | ||||||
|  |  | ||||||
| #. Translators: %s is a network identifier | #. Translators: %s is a network identifier | ||||||
| #: js/ui/status/network.js:553 js/ui/status/network.js:1290 | #: js/ui/status/network.js:554 js/ui/status/network.js:1290 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s Hardware Disabled" | msgid "%s Hardware Disabled" | ||||||
| msgstr "%s aparataro malŝaltita" | msgstr "%s aparataro malŝaltita" | ||||||
|  |  | ||||||
| #. Translators: this is for a network device that cannot be activated | #. Translators: this is for a network device that cannot be activated | ||||||
| #. because it's disabled by rfkill (airplane mode); %s is a network identifier | #. because it's disabled by rfkill (airplane mode); %s is a network identifier | ||||||
| #: js/ui/status/network.js:557 | #: js/ui/status/network.js:558 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s Disabled" | msgid "%s Disabled" | ||||||
| msgstr "%s malŝaltita" | msgstr "%s malŝaltita" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:597 | #: js/ui/status/network.js:598 | ||||||
| msgid "Connect to Internet" | msgid "Connect to Internet" | ||||||
| msgstr "Konekti al interreto" | msgstr "Konekti al interreto" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:786 | #: js/ui/status/network.js:787 | ||||||
| msgid "Airplane Mode is On" | msgid "Airplane Mode is On" | ||||||
| msgstr "Aviadila reĝimo ŝaltita" | msgstr "Aviadila reĝimo ŝaltita" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:787 | #: js/ui/status/network.js:788 | ||||||
| msgid "Wi-Fi is disabled when airplane mode is on." | msgid "Wi-Fi is disabled when airplane mode is on." | ||||||
| msgstr "Vifio malebliĝas se aviadila reĝimo estas ŝaltita." | msgstr "Vifio malebliĝas se aviadila reĝimo estas ŝaltita." | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:788 | #: js/ui/status/network.js:789 | ||||||
| msgid "Turn Off Airplane Mode" | msgid "Turn Off Airplane Mode" | ||||||
| msgstr "Malŝalti aviadilan reĝimon" | msgstr "Malŝalti aviadilan reĝimon" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:797 | #: js/ui/status/network.js:798 | ||||||
| msgid "Wi-Fi is Off" | msgid "Wi-Fi is Off" | ||||||
| msgstr "Vifio malŝaltita" | msgstr "Vifio malŝaltita" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:798 | #: js/ui/status/network.js:799 | ||||||
| msgid "Wi-Fi needs to be turned on in order to connect to a network." | msgid "Wi-Fi needs to be turned on in order to connect to a network." | ||||||
| msgstr "Necesas ŝalti vifion por konekti al reto." | msgstr "Necesas ŝalti vifion por konekti al reto." | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:799 | #: js/ui/status/network.js:800 | ||||||
| msgid "Turn On Wi-Fi" | msgid "Turn On Wi-Fi" | ||||||
| msgstr "Ŝalti vifion" | msgstr "Ŝalti vifion" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:824 | #: js/ui/status/network.js:825 | ||||||
| msgid "Wi-Fi Networks" | msgid "Wi-Fi Networks" | ||||||
| msgstr "Vifiaj retoj" | msgstr "Vifiaj retoj" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:826 | #: js/ui/status/network.js:827 | ||||||
| msgid "Select a network" | msgid "Select a network" | ||||||
| msgstr "Elekti reton" | msgstr "Elekti reton" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:855 | #: js/ui/status/network.js:856 | ||||||
| msgid "No Networks" | msgid "No Networks" | ||||||
| msgstr "Neniu reto" | msgstr "Neniu reto" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:876 js/ui/status/rfkill.js:104 | #: js/ui/status/network.js:877 js/ui/status/rfkill.js:104 | ||||||
| msgid "Use hardware switch to turn off" | msgid "Use hardware switch to turn off" | ||||||
| msgstr "Uzi aparataran ŝaltilon por malŝalti" | msgstr "Uzi aparataran ŝaltilon por malŝalti" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1152 | #: js/ui/status/network.js:1153 | ||||||
| msgid "Select Network" | msgid "Select Network" | ||||||
| msgstr "Elekti reton" | msgstr "Elekti reton" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1158 | #: js/ui/status/network.js:1159 | ||||||
| msgid "Wi-Fi Settings" | msgid "Wi-Fi Settings" | ||||||
| msgstr "Vifio-agordoj" | msgstr "Vifio-agordoj" | ||||||
|  |  | ||||||
| @@ -1893,11 +1885,11 @@ msgid_plural "%s Modem Connections" | |||||||
| msgstr[0] "%s modema konekto" | msgstr[0] "%s modema konekto" | ||||||
| msgstr[1] "%s modemaj konektoj" | msgstr[1] "%s modemaj konektoj" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1702 | #: js/ui/status/network.js:1706 | ||||||
| msgid "Connection failed" | msgid "Connection failed" | ||||||
| msgstr "Konekto malsukcesis" | msgstr "Konekto malsukcesis" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1703 | #: js/ui/status/network.js:1707 | ||||||
| msgid "Activation of network connection failed" | msgid "Activation of network connection failed" | ||||||
| msgstr "Aktivigo de reto-konekto malsukcesis" | msgstr "Aktivigo de reto-konekto malsukcesis" | ||||||
|  |  | ||||||
| @@ -1979,15 +1971,15 @@ msgstr "Adiaŭi" | |||||||
| msgid "Account Settings" | msgid "Account Settings" | ||||||
| msgstr "Kontoagordoj" | msgstr "Kontoagordoj" | ||||||
|  |  | ||||||
| #: js/ui/status/system.js:255 | #: js/ui/status/system.js:256 | ||||||
| msgid "Orientation Lock" | msgid "Orientation Lock" | ||||||
| msgstr "Orientiĝa ŝloso" | msgstr "Orientiĝa ŝloso" | ||||||
|  |  | ||||||
| #: js/ui/status/system.js:281 | #: js/ui/status/system.js:282 | ||||||
| msgid "Suspend" | msgid "Suspend" | ||||||
| msgstr "Dormeti" | msgstr "Dormeti" | ||||||
|  |  | ||||||
| #: js/ui/status/system.js:291 | #: js/ui/status/system.js:292 | ||||||
| msgid "Power Off" | msgid "Power Off" | ||||||
| msgstr "Malŝalti" | msgstr "Malŝalti" | ||||||
|  |  | ||||||
| @@ -2102,7 +2094,7 @@ msgstr[1] "Agordaj ŝanĝoj malfaritos post %d sekundoj" | |||||||
|  |  | ||||||
| #. Translators: This represents the size of a window. The first number is | #. Translators: This represents the size of a window. The first number is | ||||||
| #. * the width of the window and the second is the height. | #. * the width of the window and the second is the height. | ||||||
| #: js/ui/windowManager.js:662 | #: js/ui/windowManager.js:677 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%d × %d" | msgid "%d × %d" | ||||||
| msgstr "%d × %d" | msgstr "%d × %d" | ||||||
| @@ -2175,11 +2167,6 @@ msgstr "Movi al dekstra ekrano" | |||||||
| msgid "Evolution Calendar" | msgid "Evolution Calendar" | ||||||
| msgstr "Evolucio-kalendaro" | 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 | #: src/main.c:408 | ||||||
| msgid "Print version" | msgid "Print version" | ||||||
| msgstr "Presi version" | msgstr "Presi version" | ||||||
| @@ -2196,12 +2183,12 @@ msgstr "Uzi specifan reĝimon, ekz. “gdm” por la salut-ekrano" | |||||||
| msgid "List possible modes" | msgid "List possible modes" | ||||||
| msgstr "Listigi eblajn reĝimojn" | msgstr "Listigi eblajn reĝimojn" | ||||||
|  |  | ||||||
| #: src/shell-app.c:260 | #: src/shell-app.c:264 | ||||||
| msgctxt "program" | msgctxt "program" | ||||||
| msgid "Unknown" | msgid "Unknown" | ||||||
| msgstr "Nekonata" | msgstr "Nekonata" | ||||||
|  |  | ||||||
| #: src/shell-app.c:511 | #: src/shell-app.c:515 | ||||||
| #, c-format | #, c-format | ||||||
| msgid "Failed to launch “%s”" | msgid "Failed to launch “%s”" | ||||||
| msgstr "Malsukcesis lanĉi “%s”" | msgstr "Malsukcesis lanĉi “%s”" | ||||||
| @@ -2220,7 +2207,7 @@ msgstr "La uzanto malakceptis la aŭtentigan dialogon" | |||||||
|  |  | ||||||
| #. translators: | #. translators: | ||||||
| #. * The number of sound outputs on a particular device | #. * 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 | #, c-format | ||||||
| msgid "%u Output" | msgid "%u Output" | ||||||
| msgid_plural "%u Outputs" | msgid_plural "%u Outputs" | ||||||
| @@ -2229,17 +2216,26 @@ msgstr[1] "%u eligoj" | |||||||
|  |  | ||||||
| #. translators: | #. translators: | ||||||
| #. * The number of sound inputs on a particular device | #. * 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 | #, c-format | ||||||
| msgid "%u Input" | msgid "%u Input" | ||||||
| msgid_plural "%u Inputs" | msgid_plural "%u Inputs" | ||||||
| msgstr[0] "%u enigo" | msgstr[0] "%u enigo" | ||||||
| msgstr[1] "%u enigoj" | msgstr[1] "%u enigoj" | ||||||
|  |  | ||||||
| #: subprojects/gvc/gvc-mixer-control.c:2738 | #: subprojects/gvc/gvc-mixer-control.c:2736 | ||||||
| msgid "System Sounds" | msgid "System Sounds" | ||||||
| msgstr "Sistemsonoj" | 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:" | #~ msgid "There was an error loading the preferences dialog for %s:" | ||||||
| #~ msgstr "Eraro okazis dum ŝarĝado de la agorda dialogo de %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. | # Alain Lojewski <allomervan@gmail.com>, 2014-2018. | ||||||
| # Erwan Georget <egeorget@opmbx.org>, 2016. | # Erwan Georget <egeorget@opmbx.org>, 2016. | ||||||
| # Claude Paroz <claude@2xlibre.net>, 2010-2011, 2016. | # Claude Paroz <claude@2xlibre.net>, 2010-2011, 2016. | ||||||
| # Charles Monzat <charles.monzat@numericable.fr>, 2016-2018. |  | ||||||
| # Julien Humbert <julroy67@gmail.com>, 2019. | # Julien Humbert <julroy67@gmail.com>, 2019. | ||||||
|  | # Charles Monzat <charles.monzat@free.fr>, 2016-2019. | ||||||
| # | # | ||||||
| msgid "" | msgid "" | ||||||
| msgstr "" | msgstr "" | ||||||
| "Project-Id-Version: gnome-shell master fr\n" | "Project-Id-Version: gnome-shell master fr\n" | ||||||
| "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" | "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" | ||||||
| "POT-Creation-Date: 2019-02-28 03:16+0000\n" | "POT-Creation-Date: 2019-03-13 20:47+0000\n" | ||||||
| "PO-Revision-Date: 2019-02-28 08:29+0100\n" | "PO-Revision-Date: 2019-03-17 19:15+0100\n" | ||||||
| "Last-Translator: Julien Humbert <julroy67@gmail.com>\n" | "Last-Translator: Charles Monzat <charles.monzat@free.fr>\n" | ||||||
| "Language-Team: français <gnomefr@traduc.org>\n" | "Language-Team: GNOME French Team <gnomefr@traduc.org>\n" | ||||||
| "Language: fr\n" | "Language: fr\n" | ||||||
| "MIME-Version: 1.0\n" | "MIME-Version: 1.0\n" | ||||||
| "Content-Type: text/plain; charset=UTF-8\n" | "Content-Type: text/plain; charset=UTF-8\n" | ||||||
| "Content-Transfer-Encoding: 8bit\n" | "Content-Transfer-Encoding: 8bit\n" | ||||||
| "Plural-Forms: nplurals=2; plural=(n > 1);\n" | "Plural-Forms: nplurals=2; plural=(n > 1)\n" | ||||||
| "X-Generator: Poedit 2.2.1\n" | "X-Generator: Gtranslator 3.32.0\n" | ||||||
|  |  | ||||||
| #: data/50-gnome-shell-system.xml:6 | #: data/50-gnome-shell-system.xml:6 | ||||||
| msgid "System" | msgid "System" | ||||||
| @@ -482,7 +482,7 @@ msgstr "Absent de la liste ?" | |||||||
|  |  | ||||||
| #. Translators: this message is shown below the username entry field | #. Translators: this message is shown below the username entry field | ||||||
| #. to clue the user in on how to login to the local network realm | #. 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 | #, javascript-format | ||||||
| msgid "(e.g., user or %s)" | msgid "(e.g., user or %s)" | ||||||
| msgstr "(par ex. utilisateur ou %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 | #. TTLS and PEAP are actually much more complicated, but this complication | ||||||
| #. is not visible here since we only care about phase2 authentication | #. is not visible here since we only care about phase2 authentication | ||||||
| #. (and don't even care of which one) | #. (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 | #: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281 | ||||||
| msgid "Username: " | msgid "Username: " | ||||||
| msgstr "Nom d’utilisateur : " | msgstr "Nom d’utilisateur : " | ||||||
|  |  | ||||||
| #: js/gdm/loginDialog.js:1223 | #: js/gdm/loginDialog.js:1227 | ||||||
| msgid "Login Window" | msgid "Login Window" | ||||||
| msgstr "Fenêtre de connexion" | 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”." | msgid "A password is required to connect to “%s”." | ||||||
| msgstr "Un mot de passe est requis pour se connecter à « %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" | msgid "Network Manager" | ||||||
| msgstr "Gestionnaire de réseau" | 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 ?" | msgstr "Télécharger et installer « %s » à partir de extensions.gnome.org ?" | ||||||
|  |  | ||||||
| #. Translators: %s is an application name like "Settings" | #. Translators: %s is an application name like "Settings" | ||||||
| #: js/ui/inhibitShortcutsDialog.js:50 | #: js/ui/inhibitShortcutsDialog.js:78 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s wants to inhibit shortcuts" | msgid "%s wants to inhibit shortcuts" | ||||||
| msgstr "%s veut neutraliser les raccourcis" | msgstr "%s veut neutraliser les raccourcis" | ||||||
|  |  | ||||||
| #: js/ui/inhibitShortcutsDialog.js:51 | #: js/ui/inhibitShortcutsDialog.js:79 | ||||||
| msgid "Application wants to inhibit shortcuts" | msgid "Application wants to inhibit shortcuts" | ||||||
| msgstr "L’application veut neutraliser les raccourcis" | msgstr "L’application veut neutraliser les raccourcis" | ||||||
|  |  | ||||||
| #. Translators: %s is a keyboard shortcut like "Super+x" | #. Translators: %s is a keyboard shortcut like "Super+x" | ||||||
| #: js/ui/inhibitShortcutsDialog.js:60 | #: js/ui/inhibitShortcutsDialog.js:88 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "You can restore shortcuts by pressing %s." | msgid "You can restore shortcuts by pressing %s." | ||||||
| msgstr "Pour restaurer les raccourcis, appuyez sur %s." | msgstr "Pour restaurer les raccourcis, appuyez sur %s." | ||||||
|  |  | ||||||
| #: js/ui/inhibitShortcutsDialog.js:65 | #: js/ui/inhibitShortcutsDialog.js:93 | ||||||
| msgid "Deny" | msgid "Deny" | ||||||
| msgstr "Refuser" | msgstr "Refuser" | ||||||
|  |  | ||||||
| #: js/ui/inhibitShortcutsDialog.js:71 | #: js/ui/inhibitShortcutsDialog.js:100 | ||||||
| msgid "Allow" | msgid "Allow" | ||||||
| msgstr "Autoriser" | msgstr "Autoriser" | ||||||
|  |  | ||||||
| @@ -1407,13 +1407,13 @@ msgid "Leave On" | |||||||
| msgstr "Laisser activé" | msgstr "Laisser activé" | ||||||
|  |  | ||||||
| #: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133 | #: 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" | msgid "Turn On" | ||||||
| msgstr "Activer" | msgstr "Activer" | ||||||
|  |  | ||||||
| #: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133 | #: 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: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/nightLight.js:39 js/ui/status/rfkill.js:79 | ||||||
| #: js/ui/status/rfkill.js:106 | #: js/ui/status/rfkill.js:106 | ||||||
| msgid "Turn Off" | msgid "Turn Off" | ||||||
| @@ -1423,59 +1423,59 @@ msgstr "Éteindre" | |||||||
| msgid "Leave Off" | msgid "Leave Off" | ||||||
| msgstr "Laisser éteint" | msgstr "Laisser éteint" | ||||||
|  |  | ||||||
| #: js/ui/keyboard.js:203 | #: js/ui/keyboard.js:200 | ||||||
| msgid "Region & Language Settings" | msgid "Region & Language Settings" | ||||||
| msgstr "Paramètres de langue et région" | msgstr "Paramètres de langue et région" | ||||||
|  |  | ||||||
| #: js/ui/lookingGlass.js:614 | #: js/ui/lookingGlass.js:615 | ||||||
| msgid "No extensions installed" | msgid "No extensions installed" | ||||||
| msgstr "Aucune extension installée" | msgstr "Aucune extension installée" | ||||||
|  |  | ||||||
| #. Translators: argument is an extension UUID. | #. Translators: argument is an extension UUID. | ||||||
| #: js/ui/lookingGlass.js:668 | #: js/ui/lookingGlass.js:669 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s has not emitted any errors." | msgid "%s has not emitted any errors." | ||||||
| msgstr "%s n’a émis aucune erreur." | msgstr "%s n’a émis aucune erreur." | ||||||
|  |  | ||||||
| #: js/ui/lookingGlass.js:674 | #: js/ui/lookingGlass.js:675 | ||||||
| msgid "Hide Errors" | msgid "Hide Errors" | ||||||
| msgstr "Masquer les erreurs" | 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" | msgid "Show Errors" | ||||||
| msgstr "Afficher les erreurs" | msgstr "Afficher les erreurs" | ||||||
|  |  | ||||||
| #: js/ui/lookingGlass.js:687 | #: js/ui/lookingGlass.js:688 | ||||||
| msgid "Enabled" | msgid "Enabled" | ||||||
| msgstr "Activé" | msgstr "Activé" | ||||||
|  |  | ||||||
| #. translators: | #. translators: | ||||||
| #. * The device has been disabled | #. * 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" | msgid "Disabled" | ||||||
| msgstr "Désactivé" | msgstr "Désactivé" | ||||||
|  |  | ||||||
| #: js/ui/lookingGlass.js:692 | #: js/ui/lookingGlass.js:693 | ||||||
| msgid "Error" | msgid "Error" | ||||||
| msgstr "Erreur" | msgstr "Erreur" | ||||||
|  |  | ||||||
| #: js/ui/lookingGlass.js:694 | #: js/ui/lookingGlass.js:695 | ||||||
| msgid "Out of date" | msgid "Out of date" | ||||||
| msgstr "Périmé" | msgstr "Périmé" | ||||||
|  |  | ||||||
| #: js/ui/lookingGlass.js:696 | #: js/ui/lookingGlass.js:697 | ||||||
| msgid "Downloading" | msgid "Downloading" | ||||||
| msgstr "Téléchargement" | msgstr "Téléchargement" | ||||||
|  |  | ||||||
| #: js/ui/lookingGlass.js:720 | #: js/ui/lookingGlass.js:721 | ||||||
| msgid "View Source" | msgid "View Source" | ||||||
| msgstr "Afficher la source" | msgstr "Afficher la source" | ||||||
|  |  | ||||||
| #: js/ui/lookingGlass.js:729 | #: js/ui/lookingGlass.js:730 | ||||||
| msgid "Web Page" | msgid "Web Page" | ||||||
| msgstr "Page Web" | msgstr "Page Web" | ||||||
|  |  | ||||||
| #: js/ui/messageTray.js:1474 | #: js/ui/messageTray.js:1480 | ||||||
| msgid "System Information" | msgid "System Information" | ||||||
| msgstr "Informations du système" | msgstr "Informations du système" | ||||||
|  |  | ||||||
| @@ -1559,16 +1559,16 @@ msgstr "Quitter" | |||||||
|  |  | ||||||
| #. Translators: If there is no suitable word for "Activities" | #. Translators: If there is no suitable word for "Activities" | ||||||
| #. in your language, you can use the word for "Overview". | #. in your language, you can use the word for "Overview". | ||||||
| #: js/ui/panel.js:466 | #: js/ui/panel.js:471 | ||||||
| msgid "Activities" | msgid "Activities" | ||||||
| msgstr "Activités" | msgstr "Activités" | ||||||
|  |  | ||||||
| #: js/ui/panel.js:741 | #: js/ui/panel.js:746 | ||||||
| msgctxt "System menu in the top bar" | msgctxt "System menu in the top bar" | ||||||
| msgid "System" | msgid "System" | ||||||
| msgstr "Système" | msgstr "Système" | ||||||
|  |  | ||||||
| #: js/ui/panel.js:861 | #: js/ui/panel.js:866 | ||||||
| msgid "Top Bar" | msgid "Top Bar" | ||||||
| msgstr "Barre supérieure" | msgstr "Barre supérieure" | ||||||
|  |  | ||||||
| @@ -1800,7 +1800,7 @@ msgid "<unknown>" | |||||||
| msgstr "<inconnu>" | msgstr "<inconnu>" | ||||||
|  |  | ||||||
| #. Translators: %s is a network identifier | #. 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 | #, javascript-format | ||||||
| msgid "%s Off" | msgid "%s Off" | ||||||
| msgstr "%s éteint" | msgstr "%s éteint" | ||||||
| @@ -1826,7 +1826,7 @@ msgid "%s Disconnecting" | |||||||
| msgstr "Déconnexion de %s en cours" | msgstr "Déconnexion de %s en cours" | ||||||
|  |  | ||||||
| #. Translators: %s is a network identifier | #. 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 | #, javascript-format | ||||||
| msgid "%s Connecting" | msgid "%s Connecting" | ||||||
| msgstr "Connexion de %s en cours" | msgstr "Connexion de %s en cours" | ||||||
| @@ -1866,7 +1866,7 @@ msgid "Mobile Broadband Settings" | |||||||
| msgstr "Paramètres connexion mobile" | msgstr "Paramètres connexion mobile" | ||||||
|  |  | ||||||
| #. Translators: %s is a network identifier | #. 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 | #, javascript-format | ||||||
| msgid "%s Hardware Disabled" | msgid "%s Hardware Disabled" | ||||||
| msgstr "Équipement %s désactivé" | msgstr "Équipement %s désactivé" | ||||||
| @@ -1931,72 +1931,72 @@ msgid "Wi-Fi Settings" | |||||||
| msgstr "Paramètres Wi-Fi" | msgstr "Paramètres Wi-Fi" | ||||||
|  |  | ||||||
| #. Translators: %s is a network identifier | #. Translators: %s is a network identifier | ||||||
| #: js/ui/status/network.js:1281 | #: js/ui/status/network.js:1280 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s Hotspot Active" | msgid "%s Hotspot Active" | ||||||
| msgstr "Point d’accès %s actif" | msgstr "Point d’accès %s actif" | ||||||
|  |  | ||||||
| #. Translators: %s is a network identifier | #. Translators: %s is a network identifier | ||||||
| #: js/ui/status/network.js:1296 | #: js/ui/status/network.js:1295 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s Not Connected" | msgid "%s Not Connected" | ||||||
| msgstr "%s non connecté" | msgstr "%s non connecté" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1393 | #: js/ui/status/network.js:1392 | ||||||
| msgid "connecting…" | msgid "connecting…" | ||||||
| msgstr "connexion…" | msgstr "connexion…" | ||||||
|  |  | ||||||
| #. Translators: this is for network connections that require some kind of key or password | #. 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" | msgid "authentication required" | ||||||
| msgstr "authentification nécessaire" | msgstr "authentification nécessaire" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1398 | #: js/ui/status/network.js:1397 | ||||||
| msgid "connection failed" | msgid "connection failed" | ||||||
| msgstr "échec de connexion" | msgstr "échec de connexion" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1448 | #: js/ui/status/network.js:1447 | ||||||
| msgid "VPN Settings" | msgid "VPN Settings" | ||||||
| msgstr "Paramètres VPN" | msgstr "Paramètres VPN" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1465 | #: js/ui/status/network.js:1464 | ||||||
| msgid "VPN" | msgid "VPN" | ||||||
| msgstr "VPN" | msgstr "VPN" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1475 | #: js/ui/status/network.js:1474 | ||||||
| msgid "VPN Off" | msgid "VPN Off" | ||||||
| msgstr "VPN désactivé" | 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" | msgid "Network Settings" | ||||||
| msgstr "Paramètres du réseau" | msgstr "Paramètres du réseau" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1565 | #: js/ui/status/network.js:1564 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s Wired Connection" | msgid "%s Wired Connection" | ||||||
| msgid_plural "%s Wired Connections" | msgid_plural "%s Wired Connections" | ||||||
| msgstr[0] "%s connexion filaire." | msgstr[0] "%s connexion filaire." | ||||||
| msgstr[1] "%s connexions filaires." | msgstr[1] "%s connexions filaires." | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1569 | #: js/ui/status/network.js:1568 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s Wi-Fi Connection" | msgid "%s Wi-Fi Connection" | ||||||
| msgid_plural "%s Wi-Fi Connections" | msgid_plural "%s Wi-Fi Connections" | ||||||
| msgstr[0] "%s connexion Wi-Fi." | msgstr[0] "%s connexion Wi-Fi." | ||||||
| msgstr[1] "%s connexions Wi-Fi." | msgstr[1] "%s connexions Wi-Fi." | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1573 | #: js/ui/status/network.js:1572 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s Modem Connection" | msgid "%s Modem Connection" | ||||||
| msgid_plural "%s Modem Connections" | msgid_plural "%s Modem Connections" | ||||||
| msgstr[0] "%s connexion à un modem." | msgstr[0] "%s connexion à un modem." | ||||||
| msgstr[1] "%s connexions à des modems." | msgstr[1] "%s connexions à des modems." | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1702 | #: js/ui/status/network.js:1701 | ||||||
| msgid "Connection failed" | msgid "Connection failed" | ||||||
| msgstr "Échec de connexion" | msgstr "Échec de connexion" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1703 | #: js/ui/status/network.js:1702 | ||||||
| msgid "Activation of network connection failed" | msgid "Activation of network connection failed" | ||||||
| msgstr "L’activation de la connexion réseau a échoué" | 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 | #: js/ui/status/power.js:117 js/ui/status/power.js:119 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%d %%" | msgid "%d %%" | ||||||
| msgstr "%d %%" | msgstr "%d %%" | ||||||
|  |  | ||||||
| #: js/ui/status/remoteAccess.js:42 | #: js/ui/status/remoteAccess.js:42 | ||||||
| msgid "Screen is Being Shared" | msgid "Screen is Being Shared" | ||||||
| @@ -2298,12 +2298,12 @@ msgstr "" | |||||||
| msgid "List possible modes" | msgid "List possible modes" | ||||||
| msgstr "Lister les modes possibles" | msgstr "Lister les modes possibles" | ||||||
|  |  | ||||||
| #: src/shell-app.c:260 | #: src/shell-app.c:264 | ||||||
| msgctxt "program" | msgctxt "program" | ||||||
| msgid "Unknown" | msgid "Unknown" | ||||||
| msgstr "Inconnu" | msgstr "Inconnu" | ||||||
|  |  | ||||||
| #: src/shell-app.c:511 | #: src/shell-app.c:515 | ||||||
| #, c-format | #, c-format | ||||||
| msgid "Failed to launch “%s”" | msgid "Failed to launch “%s”" | ||||||
| msgstr "Impossible de lancer « %s »" | msgstr "Impossible de lancer « %s »" | ||||||
| @@ -2322,7 +2322,7 @@ msgstr "La fenêtre d’authentification a été écartée par l’utilisateur" | |||||||
|  |  | ||||||
| #. translators: | #. translators: | ||||||
| #. * The number of sound outputs on a particular device | #. * 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 | #, c-format | ||||||
| msgid "%u Output" | msgid "%u Output" | ||||||
| msgid_plural "%u Outputs" | msgid_plural "%u Outputs" | ||||||
| @@ -2331,14 +2331,14 @@ msgstr[1] "%u sorties" | |||||||
|  |  | ||||||
| #. translators: | #. translators: | ||||||
| #. * The number of sound inputs on a particular device | #. * 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 | #, c-format | ||||||
| msgid "%u Input" | msgid "%u Input" | ||||||
| msgid_plural "%u Inputs" | msgid_plural "%u Inputs" | ||||||
| msgstr[0] "%u entrée" | msgstr[0] "%u entrée" | ||||||
| msgstr[1] "%u entrées" | msgstr[1] "%u entrées" | ||||||
|  |  | ||||||
| #: subprojects/gvc/gvc-mixer-control.c:2738 | #: subprojects/gvc/gvc-mixer-control.c:2736 | ||||||
| msgid "System Sounds" | msgid "System Sounds" | ||||||
| msgstr "Sons système" | msgstr "Sons système" | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										178
									
								
								po/id.po
									
									
									
									
									
								
							
							
						
						
									
										178
									
								
								po/id.po
									
									
									
									
									
								
							| @@ -4,12 +4,13 @@ | |||||||
| # Andika Triwidada <andika@gmail.com>, 2010-2014, 2017. | # Andika Triwidada <andika@gmail.com>, 2010-2014, 2017. | ||||||
| # Dirgita <dirgitadevina@yahoo.co.id>, 2011, 2012, 2014. | # Dirgita <dirgitadevina@yahoo.co.id>, 2011, 2012, 2014. | ||||||
| # Wibiharto <wibinem@yahoo.com>, 2011. | # Wibiharto <wibinem@yahoo.com>, 2011. | ||||||
|  | # Kukuh Syafaat <kukuhsyafaat@gnome.org>, 2017, 2018, 2019. | ||||||
| msgid "" | msgid "" | ||||||
| msgstr "" | msgstr "" | ||||||
| "Project-Id-Version: gnome-shell master\n" | "Project-Id-Version: gnome-shell master\n" | ||||||
| "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" | "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" | ||||||
| "POT-Creation-Date: 2019-02-21 18:43+0000\n" | "POT-Creation-Date: 2019-04-17 19:29+0000\n" | ||||||
| "PO-Revision-Date: 2019-02-14 22:18+0700\n" | "PO-Revision-Date: 2019-04-25 14:54+0700\n" | ||||||
| "Last-Translator: Kukuh Syafaat <kukuhsyafaat@gnome.org>\n" | "Last-Translator: Kukuh Syafaat <kukuhsyafaat@gnome.org>\n" | ||||||
| "Language-Team: Indonesian <gnome-l10n-id@googlegroups.com>\n" | "Language-Team: Indonesian <gnome-l10n-id@googlegroups.com>\n" | ||||||
| "Language: id\n" | "Language: id\n" | ||||||
| @@ -376,11 +377,6 @@ msgstr "" | |||||||
| msgid "Network Login" | msgid "Network Login" | ||||||
| msgstr "Log Masuk Jaringan" | 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 | #: js/extensionPrefs/main.js:116 | ||||||
| msgid "Something’s gone wrong" | msgid "Something’s gone wrong" | ||||||
| msgstr "Ada yang tidak beres" | msgstr "Ada yang tidak beres" | ||||||
| @@ -461,7 +457,7 @@ msgstr "Tak masuk daftar?" | |||||||
|  |  | ||||||
| #. Translators: this message is shown below the username entry field | #. Translators: this message is shown below the username entry field | ||||||
| #. to clue the user in on how to login to the local network realm | #. 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 | #, javascript-format | ||||||
| msgid "(e.g., user or %s)" | msgid "(e.g., user or %s)" | ||||||
| msgstr "(cth., pengguna dari %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 | #. TTLS and PEAP are actually much more complicated, but this complication | ||||||
| #. is not visible here since we only care about phase2 authentication | #. is not visible here since we only care about phase2 authentication | ||||||
| #. (and don't even care of which one) | #. (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 | #: js/ui/components/networkAgent.js:263 js/ui/components/networkAgent.js:281 | ||||||
| msgid "Username: " | msgid "Username: " | ||||||
| msgstr "Nama pengguna: " | msgstr "Nama pengguna: " | ||||||
|  |  | ||||||
| #: js/gdm/loginDialog.js:1223 | #: js/gdm/loginDialog.js:1227 | ||||||
| msgid "Login Window" | msgid "Login Window" | ||||||
| msgstr "Jendela Log Masuk" | msgstr "Jendela Log Masuk" | ||||||
|  |  | ||||||
| @@ -728,32 +724,37 @@ msgstr "Sering" | |||||||
| msgid "All" | msgid "All" | ||||||
| msgstr "Semua" | 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" | msgid "New Window" | ||||||
| msgstr "Jendela Baru" | msgstr "Jendela Baru" | ||||||
|  |  | ||||||
| #: js/ui/appDisplay.js:1751 | #: js/ui/appDisplay.js:1746 | ||||||
| msgid "Launch using Dedicated Graphics Card" | msgid "Launch using Dedicated Graphics Card" | ||||||
| msgstr "Luncurkan menggunakan Kartu Grafis Terdedikasi" | 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" | msgid "Remove from Favorites" | ||||||
| msgstr "Hapus dari Favorit" | msgstr "Hapus dari Favorit" | ||||||
|  |  | ||||||
| #: js/ui/appDisplay.js:1784 | #: js/ui/appDisplay.js:1779 | ||||||
| msgid "Add to Favorites" | msgid "Add to Favorites" | ||||||
| msgstr "Tambah ke Favorit" | 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" | msgid "Show Details" | ||||||
| msgstr "Tampilkan Rincian" | msgstr "Tampilkan Rincian" | ||||||
|  |  | ||||||
| #: js/ui/appFavorites.js:141 | #: js/ui/appFavorites.js:149 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s has been added to your favorites." | msgid "%s has been added to your favorites." | ||||||
| msgstr "%s telah ditambahkan ke favorit Anda." | msgstr "%s telah ditambahkan ke favorit Anda." | ||||||
|  |  | ||||||
| #: js/ui/appFavorites.js:175 | #: js/ui/appFavorites.js:183 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s has been removed from your favorites." | msgid "%s has been removed from your favorites." | ||||||
| msgstr "%s telah dihapus dari favorit Anda." | 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”." | msgid "A password is required to connect to “%s”." | ||||||
| msgstr "Perlu suatu sandi untuk menyambung ke \"%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" | msgid "Network Manager" | ||||||
| msgstr "Manajer Jaringan" | msgstr "Manajer Jaringan" | ||||||
|  |  | ||||||
| @@ -1109,23 +1110,23 @@ msgstr "Tambah jam dunia…" | |||||||
| msgid "World Clocks" | msgid "World Clocks" | ||||||
| msgstr "Jam Dunia" | msgstr "Jam Dunia" | ||||||
|  |  | ||||||
| #: js/ui/dateMenu.js:222 | #: js/ui/dateMenu.js:228 | ||||||
| msgid "Weather" | msgid "Weather" | ||||||
| msgstr "Cuaca" | msgstr "Cuaca" | ||||||
|  |  | ||||||
| #: js/ui/dateMenu.js:305 | #: js/ui/dateMenu.js:311 | ||||||
| msgid "Select a location…" | msgid "Select a location…" | ||||||
| msgstr "Pilih lokasi…" | msgstr "Pilih lokasi…" | ||||||
|  |  | ||||||
| #: js/ui/dateMenu.js:313 | #: js/ui/dateMenu.js:319 | ||||||
| msgid "Loading…" | msgid "Loading…" | ||||||
| msgstr "Memuat…" | msgstr "Memuat…" | ||||||
|  |  | ||||||
| #: js/ui/dateMenu.js:323 | #: js/ui/dateMenu.js:329 | ||||||
| msgid "Go online for weather information" | msgid "Go online for weather information" | ||||||
| msgstr "Pergi daring untuk informasi cuaca" | msgstr "Pergi daring untuk informasi cuaca" | ||||||
|  |  | ||||||
| #: js/ui/dateMenu.js:325 | #: js/ui/dateMenu.js:331 | ||||||
| msgid "Weather information is currently unavailable" | msgid "Weather information is currently unavailable" | ||||||
| msgstr "Informasi cuaca saat ini tidak tersedia" | 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?" | msgstr "Unduh dan pasang \"%s\" dari extensions.gnome.org?" | ||||||
|  |  | ||||||
| #. Translators: %s is an application name like "Settings" | #. Translators: %s is an application name like "Settings" | ||||||
| #: js/ui/inhibitShortcutsDialog.js:50 | #: js/ui/inhibitShortcutsDialog.js:78 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s wants to inhibit shortcuts" | msgid "%s wants to inhibit shortcuts" | ||||||
| msgstr "%s ingin mencegah pintasan" | msgstr "%s ingin mencegah pintasan" | ||||||
|  |  | ||||||
| #: js/ui/inhibitShortcutsDialog.js:51 | #: js/ui/inhibitShortcutsDialog.js:79 | ||||||
| msgid "Application wants to inhibit shortcuts" | msgid "Application wants to inhibit shortcuts" | ||||||
| msgstr "Aplikasi ingin mencegah pintasan" | msgstr "Aplikasi ingin mencegah pintasan" | ||||||
|  |  | ||||||
| #. Translators: %s is a keyboard shortcut like "Super+x" | #. Translators: %s is a keyboard shortcut like "Super+x" | ||||||
| #: js/ui/inhibitShortcutsDialog.js:60 | #: js/ui/inhibitShortcutsDialog.js:88 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "You can restore shortcuts by pressing %s." | msgid "You can restore shortcuts by pressing %s." | ||||||
| msgstr "Anda dapat memulihkan pintasan dengan menekan %s." | msgstr "Anda dapat memulihkan pintasan dengan menekan %s." | ||||||
|  |  | ||||||
| #: js/ui/inhibitShortcutsDialog.js:65 | #: js/ui/inhibitShortcutsDialog.js:93 | ||||||
| msgid "Deny" | msgid "Deny" | ||||||
| msgstr "Tolak" | msgstr "Tolak" | ||||||
|  |  | ||||||
| #: js/ui/inhibitShortcutsDialog.js:71 | #: js/ui/inhibitShortcutsDialog.js:100 | ||||||
| msgid "Allow" | msgid "Allow" | ||||||
| msgstr "Izinkan" | msgstr "Izinkan" | ||||||
|  |  | ||||||
| @@ -1358,13 +1359,13 @@ msgid "Leave On" | |||||||
| msgstr "Biarkan Menyala" | msgstr "Biarkan Menyala" | ||||||
|  |  | ||||||
| #: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133 | #: 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" | msgid "Turn On" | ||||||
| msgstr "Nyalakan" | msgstr "Nyalakan" | ||||||
|  |  | ||||||
| #: js/ui/kbdA11yDialog.js:65 js/ui/status/bluetooth.js:133 | #: 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: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/nightLight.js:39 js/ui/status/rfkill.js:79 | ||||||
| #: js/ui/status/rfkill.js:106 | #: js/ui/status/rfkill.js:106 | ||||||
| msgid "Turn Off" | msgid "Turn Off" | ||||||
| @@ -1374,59 +1375,59 @@ msgstr "Matikan" | |||||||
| msgid "Leave Off" | msgid "Leave Off" | ||||||
| msgstr "Biarkan Mati" | msgstr "Biarkan Mati" | ||||||
|  |  | ||||||
| #: js/ui/keyboard.js:203 | #: js/ui/keyboard.js:200 | ||||||
| msgid "Region & Language Settings" | msgid "Region & Language Settings" | ||||||
| msgstr "Pengaturan Wilayah & Bahasa" | msgstr "Pengaturan Wilayah & Bahasa" | ||||||
|  |  | ||||||
| #: js/ui/lookingGlass.js:614 | #: js/ui/lookingGlass.js:615 | ||||||
| msgid "No extensions installed" | msgid "No extensions installed" | ||||||
| msgstr "Tak ada ekstensi terpasang" | msgstr "Tak ada ekstensi terpasang" | ||||||
|  |  | ||||||
| #. Translators: argument is an extension UUID. | #. Translators: argument is an extension UUID. | ||||||
| #: js/ui/lookingGlass.js:668 | #: js/ui/lookingGlass.js:669 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s has not emitted any errors." | msgid "%s has not emitted any errors." | ||||||
| msgstr "%s tidak menampilkan galat apa pun." | msgstr "%s tidak menampilkan galat apa pun." | ||||||
|  |  | ||||||
| #: js/ui/lookingGlass.js:674 | #: js/ui/lookingGlass.js:675 | ||||||
| msgid "Hide Errors" | msgid "Hide Errors" | ||||||
| msgstr "Sembunyikan Galat" | 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" | msgid "Show Errors" | ||||||
| msgstr "Tampilkan Galat" | msgstr "Tampilkan Galat" | ||||||
|  |  | ||||||
| #: js/ui/lookingGlass.js:687 | #: js/ui/lookingGlass.js:688 | ||||||
| msgid "Enabled" | msgid "Enabled" | ||||||
| msgstr "Diaktifkan" | msgstr "Diaktifkan" | ||||||
|  |  | ||||||
| #. translators: | #. translators: | ||||||
| #. * The device has been disabled | #. * 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" | msgid "Disabled" | ||||||
| msgstr "Dinonaktifkan" | msgstr "Dinonaktifkan" | ||||||
|  |  | ||||||
| #: js/ui/lookingGlass.js:692 | #: js/ui/lookingGlass.js:693 | ||||||
| msgid "Error" | msgid "Error" | ||||||
| msgstr "Galat" | msgstr "Galat" | ||||||
|  |  | ||||||
| #: js/ui/lookingGlass.js:694 | #: js/ui/lookingGlass.js:695 | ||||||
| msgid "Out of date" | msgid "Out of date" | ||||||
| msgstr "Kadaluarsa" | msgstr "Kadaluarsa" | ||||||
|  |  | ||||||
| #: js/ui/lookingGlass.js:696 | #: js/ui/lookingGlass.js:697 | ||||||
| msgid "Downloading" | msgid "Downloading" | ||||||
| msgstr "Mengunduh" | msgstr "Mengunduh" | ||||||
|  |  | ||||||
| #: js/ui/lookingGlass.js:720 | #: js/ui/lookingGlass.js:721 | ||||||
| msgid "View Source" | msgid "View Source" | ||||||
| msgstr "Tilik Sumber" | msgstr "Tilik Sumber" | ||||||
|  |  | ||||||
| #: js/ui/lookingGlass.js:729 | #: js/ui/lookingGlass.js:730 | ||||||
| msgid "Web Page" | msgid "Web Page" | ||||||
| msgstr "Halaman Web" | msgstr "Halaman Web" | ||||||
|  |  | ||||||
| #: js/ui/messageTray.js:1474 | #: js/ui/messageTray.js:1480 | ||||||
| msgid "System Information" | msgid "System Information" | ||||||
| msgstr "Informasi Sistem" | msgstr "Informasi Sistem" | ||||||
|  |  | ||||||
| @@ -1504,35 +1505,25 @@ msgstr "Tekan Esc untuk keluar" | |||||||
| msgid "Press any key to exit" | msgid "Press any key to exit" | ||||||
| msgstr "Tekan tombol apa saja untuk keluar" | msgstr "Tekan tombol apa saja untuk keluar" | ||||||
|  |  | ||||||
| #: js/ui/panel.js:108 | #: js/ui/panel.js:113 | ||||||
| msgid "Quit" | msgid "Quit" | ||||||
| msgstr "Keluar" | msgstr "Keluar" | ||||||
|  |  | ||||||
| #. Translators: If there is no suitable word for "Activities" | #. Translators: If there is no suitable word for "Activities" | ||||||
| #. in your language, you can use the word for "Overview". | #. in your language, you can use the word for "Overview". | ||||||
| #: js/ui/panel.js:466 | #: js/ui/panel.js:468 | ||||||
| msgid "Activities" | msgid "Activities" | ||||||
| msgstr "Aktivitas" | msgstr "Aktivitas" | ||||||
|  |  | ||||||
| #: js/ui/panel.js:741 | #: js/ui/panel.js:743 | ||||||
| msgctxt "System menu in the top bar" | msgctxt "System menu in the top bar" | ||||||
| msgid "System" | msgid "System" | ||||||
| msgstr "Sistem" | msgstr "Sistem" | ||||||
|  |  | ||||||
| #: js/ui/panel.js:861 | #: js/ui/panel.js:864 | ||||||
| msgid "Top Bar" | msgid "Top Bar" | ||||||
| msgstr "Bar Atas" | 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 | #: js/ui/runDialog.js:64 | ||||||
| msgid "Enter a Command" | msgid "Enter a Command" | ||||||
| msgstr "Ketikkan Perintah" | msgstr "Ketikkan Perintah" | ||||||
| @@ -1569,7 +1560,7 @@ msgid_plural "%d new notifications" | |||||||
| msgstr[0] "%d pemberitahuan baru" | msgstr[0] "%d pemberitahuan baru" | ||||||
| msgstr[1] "%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" | msgid "Lock" | ||||||
| msgstr "Kunci" | msgstr "Kunci" | ||||||
|  |  | ||||||
| @@ -1584,11 +1575,11 @@ msgstr "GNOME perlu mengunci layar" | |||||||
| #. | #. | ||||||
| #. XXX: another option is to kick the user into the gdm login | #. XXX: another option is to kick the user into the gdm login | ||||||
| #. screen, where we're not affected by grabs | #. 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" | msgid "Unable to lock" | ||||||
| msgstr "Tak bisa mengunci" | 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" | msgid "Lock was blocked by an application" | ||||||
| msgstr "Kunci diblokir oleh suatu aplikasi" | msgstr "Kunci diblokir oleh suatu aplikasi" | ||||||
|  |  | ||||||
| @@ -1750,7 +1741,7 @@ msgid "<unknown>" | |||||||
| msgstr "<tak dikenal>" | msgstr "<tak dikenal>" | ||||||
|  |  | ||||||
| #. Translators: %s is a network identifier | #. 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 | #, javascript-format | ||||||
| msgid "%s Off" | msgid "%s Off" | ||||||
| msgstr "%s Mati" | msgstr "%s Mati" | ||||||
| @@ -1776,7 +1767,7 @@ msgid "%s Disconnecting" | |||||||
| msgstr "%s Memutus" | msgstr "%s Memutus" | ||||||
|  |  | ||||||
| #. Translators: %s is a network identifier | #. 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 | #, javascript-format | ||||||
| msgid "%s Connecting" | msgid "%s Connecting" | ||||||
| msgstr "%s Menyambung" | msgstr "%s Menyambung" | ||||||
| @@ -1816,7 +1807,7 @@ msgid "Mobile Broadband Settings" | |||||||
| msgstr "Pengaturan Data Seluler" | msgstr "Pengaturan Data Seluler" | ||||||
|  |  | ||||||
| #. Translators: %s is a network identifier | #. 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 | #, javascript-format | ||||||
| msgid "%s Hardware Disabled" | msgid "%s Hardware Disabled" | ||||||
| msgstr "%s Perangkat Keras Dinonaktifkan" | msgstr "%s Perangkat Keras Dinonaktifkan" | ||||||
| @@ -1881,72 +1872,72 @@ msgid "Wi-Fi Settings" | |||||||
| msgstr "Pengaturan Wi-Fi" | msgstr "Pengaturan Wi-Fi" | ||||||
|  |  | ||||||
| #. Translators: %s is a network identifier | #. Translators: %s is a network identifier | ||||||
| #: js/ui/status/network.js:1281 | #: js/ui/status/network.js:1280 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s Hotspot Active" | msgid "%s Hotspot Active" | ||||||
| msgstr "%s Hotspot Aktif" | msgstr "%s Hotspot Aktif" | ||||||
|  |  | ||||||
| #. Translators: %s is a network identifier | #. Translators: %s is a network identifier | ||||||
| #: js/ui/status/network.js:1296 | #: js/ui/status/network.js:1295 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s Not Connected" | msgid "%s Not Connected" | ||||||
| msgstr "%s Tak Tersambung" | msgstr "%s Tak Tersambung" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1393 | #: js/ui/status/network.js:1392 | ||||||
| msgid "connecting…" | msgid "connecting…" | ||||||
| msgstr "menyambung…" | msgstr "menyambung…" | ||||||
|  |  | ||||||
| #. Translators: this is for network connections that require some kind of key or password | #. 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" | msgid "authentication required" | ||||||
| msgstr "diperlukan otentikasi" | msgstr "diperlukan otentikasi" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1398 | #: js/ui/status/network.js:1397 | ||||||
| msgid "connection failed" | msgid "connection failed" | ||||||
| msgstr "koneksi gagal" | msgstr "koneksi gagal" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1448 | #: js/ui/status/network.js:1447 | ||||||
| msgid "VPN Settings" | msgid "VPN Settings" | ||||||
| msgstr "Pengaturan VPN" | msgstr "Pengaturan VPN" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1465 | #: js/ui/status/network.js:1464 | ||||||
| msgid "VPN" | msgid "VPN" | ||||||
| msgstr "VPN" | msgstr "VPN" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1475 | #: js/ui/status/network.js:1474 | ||||||
| msgid "VPN Off" | msgid "VPN Off" | ||||||
| msgstr "VPN Mati" | 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" | msgid "Network Settings" | ||||||
| msgstr "Pengaturan Jaringan" | msgstr "Pengaturan Jaringan" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1565 | #: js/ui/status/network.js:1564 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s Wired Connection" | msgid "%s Wired Connection" | ||||||
| msgid_plural "%s Wired Connections" | msgid_plural "%s Wired Connections" | ||||||
| msgstr[0] "%s Koneksi Kabel" | msgstr[0] "%s Koneksi Kabel" | ||||||
| msgstr[1] "%s Koneksi Kabel" | msgstr[1] "%s Koneksi Kabel" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1569 | #: js/ui/status/network.js:1568 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s Wi-Fi Connection" | msgid "%s Wi-Fi Connection" | ||||||
| msgid_plural "%s Wi-Fi Connections" | msgid_plural "%s Wi-Fi Connections" | ||||||
| msgstr[0] "%s Koneksi Wi-Fi" | msgstr[0] "%s Koneksi Wi-Fi" | ||||||
| msgstr[1] "%s Koneksi Wi-Fi" | msgstr[1] "%s Koneksi Wi-Fi" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1573 | #: js/ui/status/network.js:1572 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%s Modem Connection" | msgid "%s Modem Connection" | ||||||
| msgid_plural "%s Modem Connections" | msgid_plural "%s Modem Connections" | ||||||
| msgstr[0] "%s Koneksi Modem" | msgstr[0] "%s Koneksi Modem" | ||||||
| msgstr[1] "%s Koneksi Modem" | msgstr[1] "%s Koneksi Modem" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1702 | #: js/ui/status/network.js:1705 | ||||||
| msgid "Connection failed" | msgid "Connection failed" | ||||||
| msgstr "Koneksi gagal" | msgstr "Koneksi gagal" | ||||||
|  |  | ||||||
| #: js/ui/status/network.js:1703 | #: js/ui/status/network.js:1706 | ||||||
| msgid "Activation of network connection failed" | msgid "Activation of network connection failed" | ||||||
| msgstr "Aktivasi koneksi jaringan gagal" | msgstr "Aktivasi koneksi jaringan gagal" | ||||||
|  |  | ||||||
| @@ -2028,15 +2019,15 @@ msgstr "Keluar" | |||||||
| msgid "Account Settings" | msgid "Account Settings" | ||||||
| msgstr "Pengaturan Akun" | msgstr "Pengaturan Akun" | ||||||
|  |  | ||||||
| #: js/ui/status/system.js:255 | #: js/ui/status/system.js:256 | ||||||
| msgid "Orientation Lock" | msgid "Orientation Lock" | ||||||
| msgstr "Kunci Orientasi" | msgstr "Kunci Orientasi" | ||||||
|  |  | ||||||
| #: js/ui/status/system.js:281 | #: js/ui/status/system.js:282 | ||||||
| msgid "Suspend" | msgid "Suspend" | ||||||
| msgstr "Suspensi" | msgstr "Suspensi" | ||||||
|  |  | ||||||
| #: js/ui/status/system.js:291 | #: js/ui/status/system.js:292 | ||||||
| msgid "Power Off" | msgid "Power Off" | ||||||
| msgstr "Matikan" | 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 | #. Translators: This represents the size of a window. The first number is | ||||||
| #. * the width of the window and the second is the height. | #. * the width of the window and the second is the height. | ||||||
| #: js/ui/windowManager.js:662 | #: js/ui/windowManager.js:677 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%d × %d" | msgid "%d × %d" | ||||||
| msgstr "%d × %d" | msgstr "%d × %d" | ||||||
| @@ -2225,11 +2216,6 @@ msgstr "Pindahkan ke Monitor Kanan" | |||||||
| msgid "Evolution Calendar" | msgid "Evolution Calendar" | ||||||
| msgstr "Evolution Kalender" | 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 | #: src/main.c:408 | ||||||
| msgid "Print version" | msgid "Print version" | ||||||
| msgstr "Versi Cetak" | msgstr "Versi Cetak" | ||||||
| @@ -2246,12 +2232,12 @@ msgstr "Menggunakan mode tertentu, mis. \"gdm\" untuk layar masuk" | |||||||
| msgid "List possible modes" | msgid "List possible modes" | ||||||
| msgstr "Menampilkan mode yang mungkin" | msgstr "Menampilkan mode yang mungkin" | ||||||
|  |  | ||||||
| #: src/shell-app.c:260 | #: src/shell-app.c:264 | ||||||
| msgctxt "program" | msgctxt "program" | ||||||
| msgid "Unknown" | msgid "Unknown" | ||||||
| msgstr "Tak dikenal" | msgstr "Tak dikenal" | ||||||
|  |  | ||||||
| #: src/shell-app.c:511 | #: src/shell-app.c:515 | ||||||
| #, c-format | #, c-format | ||||||
| msgid "Failed to launch “%s”" | msgid "Failed to launch “%s”" | ||||||
| msgstr "Gagal meluncurkan \"%s\"" | msgstr "Gagal meluncurkan \"%s\"" | ||||||
| @@ -2270,7 +2256,7 @@ msgstr "Dialog autentikasi ditolak oleh pengguna" | |||||||
|  |  | ||||||
| #. translators: | #. translators: | ||||||
| #. * The number of sound outputs on a particular device | #. * 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 | #, c-format | ||||||
| msgid "%u Output" | msgid "%u Output" | ||||||
| msgid_plural "%u Outputs" | msgid_plural "%u Outputs" | ||||||
| @@ -2279,17 +2265,27 @@ msgstr[1] "%u Keluaran" | |||||||
|  |  | ||||||
| #. translators: | #. translators: | ||||||
| #. * The number of sound inputs on a particular device | #. * 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 | #, c-format | ||||||
| msgid "%u Input" | msgid "%u Input" | ||||||
| msgid_plural "%u Inputs" | msgid_plural "%u Inputs" | ||||||
| msgstr[0] "%u Masukan" | msgstr[0] "%u Masukan" | ||||||
| msgstr[1] "%u Masukan" | msgstr[1] "%u Masukan" | ||||||
|  |  | ||||||
| #: subprojects/gvc/gvc-mixer-control.c:2738 | #: subprojects/gvc/gvc-mixer-control.c:2736 | ||||||
| msgid "System Sounds" | msgid "System Sounds" | ||||||
| msgstr "Suara Sistem" | 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:" | #~ msgid "There was an error loading the preferences dialog for %s:" | ||||||
| #~ msgstr "Ada galat saat memuat dialog preferensi bagi %s:" | #~ msgstr "Ada galat saat memuat dialog preferensi bagi %s:" | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										132
									
								
								po/tg.po
									
									
									
									
									
								
							
							
						
						
									
										132
									
								
								po/tg.po
									
									
									
									
									
								
							| @@ -8,7 +8,7 @@ msgstr "" | |||||||
| "Project-Id-Version: Tajik Gnome\n" | "Project-Id-Version: Tajik Gnome\n" | ||||||
| "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" | "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" | ||||||
| "POT-Creation-Date: 2019-03-02 10:57+0000\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" | "Last-Translator: Victor Ibragimov <victor.ibragimov@gmail.com>\n" | ||||||
| "Language-Team: \n" | "Language-Team: \n" | ||||||
| "Language: tg\n" | "Language: tg\n" | ||||||
| @@ -32,7 +32,7 @@ msgstr "Марказонидани огоҳии фаъол" | |||||||
|  |  | ||||||
| #: data/50-gnome-shell-system.xml:15 | #: data/50-gnome-shell-system.xml:15 | ||||||
| msgid "Show the overview" | msgid "Show the overview" | ||||||
| msgstr "Намоиш додани хулоса" | msgstr "Намоиш додани ҷамъбаст" | ||||||
|  |  | ||||||
| #: data/50-gnome-shell-system.xml:18 | #: data/50-gnome-shell-system.xml:18 | ||||||
| msgid "Show all applications" | msgid "Show all applications" | ||||||
| @@ -82,7 +82,7 @@ msgstr "Ғайрифаъол кардани васеъшавиҳои корба | |||||||
|  |  | ||||||
| #: data/org.gnome.shell.gschema.xml.in:27 | #: data/org.gnome.shell.gschema.xml.in:27 | ||||||
| msgid "Disable all extensions the user has enabled without affecting the “enabled-extension” setting." | msgid "Disable all extensions the user has enabled without affecting the “enabled-extension” setting." | ||||||
| msgstr "" | msgstr "Ҳамаи васеъшавиҳое, ки корбар фаъол кард, бе расонидани таъсир ба танзими “васеъшавиии-фаъол” ғайрифаъол карда мешаванд." | ||||||
|  |  | ||||||
| #: data/org.gnome.shell.gschema.xml.in:34 | #: data/org.gnome.shell.gschema.xml.in:34 | ||||||
| msgid "Disables the validation of extension version compatibility" | msgid "Disables the validation of extension version compatibility" | ||||||
| @@ -188,11 +188,11 @@ msgstr "Тугмабандӣ барои иваз кардани намоёнии | |||||||
|  |  | ||||||
| #: data/org.gnome.shell.gschema.xml.in:138 | #: data/org.gnome.shell.gschema.xml.in:138 | ||||||
| msgid "Keybinding to focus the active notification" | msgid "Keybinding to focus the active notification" | ||||||
| msgstr "Тугмабандӣ барои гузоштани фокус ба огоҳии фаъол" | msgstr "Тугмабандӣ барои марказонидани огоҳии фаъол" | ||||||
|  |  | ||||||
| #: data/org.gnome.shell.gschema.xml.in:139 | #: data/org.gnome.shell.gschema.xml.in:139 | ||||||
| msgid "Keybinding to focus the active notification." | msgid "Keybinding to focus the active notification." | ||||||
| msgstr "Тугмабандӣ барои гузоштани фокус ба огоҳии фаъол." | msgstr "Тугмабандӣ барои марказонидани огоҳии фаъол." | ||||||
|  |  | ||||||
| #: data/org.gnome.shell.gschema.xml.in:145 | #: data/org.gnome.shell.gschema.xml.in:145 | ||||||
| msgid "Keybinding that pauses and resumes all running tweens, for debugging purposes" | 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 | #: data/org.gnome.shell.gschema.xml.in:190 | ||||||
| msgid "Which keyboard to use" | msgid "Which keyboard to use" | ||||||
| msgstr "Клавиатураро интихоб кунед" | msgstr "Клавиатураро интихоб намоед" | ||||||
|  |  | ||||||
| #: data/org.gnome.shell.gschema.xml.in:191 | #: data/org.gnome.shell.gschema.xml.in:191 | ||||||
| msgid "The type of keyboard to use." | msgid "The type of keyboard to use." | ||||||
| msgstr "Намуди клавиатура барои истифода." | msgstr "Навъи клавиатурае, ки истифода мешавад." | ||||||
|  |  | ||||||
| #: data/org.gnome.shell.gschema.xml.in:202 | #: data/org.gnome.shell.gschema.xml.in:202 | ||||||
| #: data/org.gnome.shell.gschema.xml.in:229 | #: 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)! | #. Translators: Do NOT translate or transliterate this text (this is an icon file name)! | ||||||
| #: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 | #: data/org.gnome.Shell.PortalHelper.desktop.in.in:9 | ||||||
| msgid "network-workgroup" | msgid "network-workgroup" | ||||||
| msgstr "" | msgstr "network-workgroup" | ||||||
|  |  | ||||||
| #: js/extensionPrefs/main.js:116 | #: js/extensionPrefs/main.js:116 | ||||||
| msgid "Something’s gone wrong" | msgid "Something’s gone wrong" | ||||||
| msgstr "" | msgstr "Чизе нодуруст ба миён омад" | ||||||
|  |  | ||||||
| #: js/extensionPrefs/main.js:123 | #: 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." | 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 | #: js/extensionPrefs/main.js:130 | ||||||
| #| msgid "Show Details" | #| msgid "Show Details" | ||||||
| @@ -330,7 +330,7 @@ msgstr "Намоиш додани хатоҳо" | |||||||
|  |  | ||||||
| #: js/extensionPrefs/main.js:185 | #: js/extensionPrefs/main.js:185 | ||||||
| msgid "Homepage" | msgid "Homepage" | ||||||
| msgstr "" | msgstr "Саҳифаи асосӣ" | ||||||
|  |  | ||||||
| #: js/extensionPrefs/main.js:186 | #: js/extensionPrefs/main.js:186 | ||||||
| #| msgid "UUIDs of extensions to enable" | #| msgid "UUIDs of extensions to enable" | ||||||
| @@ -340,15 +340,15 @@ msgstr "Рамзҳои UUID барои пасвандҳои фаъолшаван | |||||||
| #: js/extensionPrefs/main.js:449 | #: js/extensionPrefs/main.js:449 | ||||||
| #| msgid "No extensions installed" | #| msgid "No extensions installed" | ||||||
| msgid "No Extensions Installed" | msgid "No Extensions Installed" | ||||||
| msgstr "Ягон пасванд насб нашудааст" | msgstr "Ягон васеъшавӣ насб нашудааст" | ||||||
|  |  | ||||||
| #: js/extensionPrefs/main.js:459 | #: js/extensionPrefs/main.js:459 | ||||||
| msgid "Extensions can be installed through Software or <a href=\"https://extensions.gnome.org\">extensions.gnome.org</a>." | 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 | #: js/extensionPrefs/main.js:474 | ||||||
| msgid "Browse in Software" | msgid "Browse in Software" | ||||||
| msgstr "" | msgstr "Намоиш дар низоми нармафзор" | ||||||
|  |  | ||||||
| #: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55 | #: js/gdm/authPrompt.js:140 js/ui/audioDeviceSelection.js:55 | ||||||
| #: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136 | #: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:136 | ||||||
| @@ -430,7 +430,7 @@ msgstr "" | |||||||
| #: js/misc/systemActions.js:95 | #: js/misc/systemActions.js:95 | ||||||
| msgctxt "search-result" | msgctxt "search-result" | ||||||
| msgid "Lock Screen" | msgid "Lock Screen" | ||||||
| msgstr "" | msgstr "Қулф кардани экран" | ||||||
|  |  | ||||||
| #. Translators: A list of keywords that match the lock screen action, separated by semicolons | #. Translators: A list of keywords that match the lock screen action, separated by semicolons | ||||||
| #: js/misc/systemActions.js:98 | #: js/misc/systemActions.js:98 | ||||||
| @@ -454,13 +454,13 @@ msgstr "" | |||||||
| #| msgid "Suspend" | #| msgid "Suspend" | ||||||
| msgctxt "search-result" | msgctxt "search-result" | ||||||
| msgid "Suspend" | msgid "Suspend" | ||||||
| msgstr "Таваққуф кардан" | msgstr "Таваққуф кардани низом" | ||||||
|  |  | ||||||
| #. Translators: A list of keywords that match the suspend action, separated by semicolons | #. Translators: A list of keywords that match the suspend action, separated by semicolons | ||||||
| #: js/misc/systemActions.js:112 | #: js/misc/systemActions.js:112 | ||||||
| #| msgid "Suspend" | #| msgid "Suspend" | ||||||
| msgid "suspend;sleep" | msgid "suspend;sleep" | ||||||
| msgstr "Таваққуф" | msgstr "таваққуф;хоб" | ||||||
|  |  | ||||||
| #. Translators: The name of the switch user action in search | #. Translators: The name of the switch user action in search | ||||||
| #: js/misc/systemActions.js:116 | #: js/misc/systemActions.js:116 | ||||||
| @@ -473,14 +473,14 @@ msgstr "Иваз кардани корбар" | |||||||
| #: js/misc/systemActions.js:119 | #: js/misc/systemActions.js:119 | ||||||
| #| msgid "Switch User" | #| msgid "Switch User" | ||||||
| msgid "switch user" | msgid "switch user" | ||||||
| msgstr "Таъвизи корбар" | msgstr "ивази корбар" | ||||||
|  |  | ||||||
| #. Translators: The name of the lock orientation action in search | #. Translators: The name of the lock orientation action in search | ||||||
| #: js/misc/systemActions.js:123 | #: js/misc/systemActions.js:123 | ||||||
| #| msgid "Orientation Lock" | #| msgid "Orientation Lock" | ||||||
| msgctxt "search-result" | msgctxt "search-result" | ||||||
| msgid "Lock Orientation" | msgid "Lock Orientation" | ||||||
| msgstr "Қулфи самт" | msgstr "Қулфи самти экран" | ||||||
|  |  | ||||||
| #. Translators: A list of keywords that match the lock orientation action, separated by semicolons | #. Translators: A list of keywords that match the lock orientation action, separated by semicolons | ||||||
| #: js/misc/systemActions.js:126 | #: js/misc/systemActions.js:126 | ||||||
| @@ -504,7 +504,7 @@ msgstr "Иҷрокунии “%s” қатъ шудааст:" | |||||||
|  |  | ||||||
| #: js/misc/util.js:175 | #: js/misc/util.js:175 | ||||||
| msgid "Just now" | msgid "Just now" | ||||||
| msgstr "" | msgstr "Ҳоли ҳозир" | ||||||
|  |  | ||||||
| #: js/misc/util.js:177 | #: js/misc/util.js:177 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| @@ -533,29 +533,29 @@ msgstr "Дирӯз" | |||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%d day ago" | msgid "%d day ago" | ||||||
| msgid_plural "%d days ago" | msgid_plural "%d days ago" | ||||||
| msgstr[0] "" | msgstr[0] "%d рӯз пеш" | ||||||
| msgstr[1] "" | msgstr[1] "%d рӯз пеш" | ||||||
|  |  | ||||||
| #: js/misc/util.js:188 | #: js/misc/util.js:188 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%d week ago" | msgid "%d week ago" | ||||||
| msgid_plural "%d weeks ago" | msgid_plural "%d weeks ago" | ||||||
| msgstr[0] "" | msgstr[0] "%d ҳафта пеш" | ||||||
| msgstr[1] "" | msgstr[1] "%d ҳафта пеш" | ||||||
|  |  | ||||||
| #: js/misc/util.js:191 | #: js/misc/util.js:191 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%d month ago" | msgid "%d month ago" | ||||||
| msgid_plural "%d months ago" | msgid_plural "%d months ago" | ||||||
| msgstr[0] "" | msgstr[0] "%d моҳ пеш" | ||||||
| msgstr[1] "" | msgstr[1] "%d моҳ пеш" | ||||||
|  |  | ||||||
| #: js/misc/util.js:193 | #: js/misc/util.js:193 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%d year ago" | msgid "%d year ago" | ||||||
| msgid_plural "%d years ago" | msgid_plural "%d years ago" | ||||||
| msgstr[0] "" | msgstr[0] "%d сол пеш" | ||||||
| msgstr[1] "" | msgstr[1] "%d сол пеш" | ||||||
|  |  | ||||||
| #. Translators: Time in 24h format | #. Translators: Time in 24h format | ||||||
| #: js/misc/util.js:223 | #: js/misc/util.js:223 | ||||||
| @@ -635,22 +635,22 @@ msgstr "%B %d %Y, %l∶%M %p" | |||||||
| #: js/portalHelper/main.js:40 | #: js/portalHelper/main.js:40 | ||||||
| #| msgid "Hotspot Active" | #| msgid "Hotspot Active" | ||||||
| msgid "Hotspot Login" | msgid "Hotspot Login" | ||||||
| msgstr "Hotspot фаъол аст" | msgstr "Воридшавӣ ба нуқтаи пайваст" | ||||||
|  |  | ||||||
| #: js/portalHelper/main.js:86 | #: 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." | 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 | #. No support for non-modal system dialogs, so ignore the option | ||||||
| #. let modal = options['modal'] || true; | #. let modal = options['modal'] || true; | ||||||
| #: js/ui/accessDialog.js:37 js/ui/status/location.js:360 | #: js/ui/accessDialog.js:37 js/ui/status/location.js:360 | ||||||
| msgid "Deny Access" | msgid "Deny Access" | ||||||
| msgstr "" | msgstr "Манъ кардани дастрасӣ" | ||||||
|  |  | ||||||
| #: js/ui/accessDialog.js:38 js/ui/status/location.js:363 | #: js/ui/accessDialog.js:38 js/ui/status/location.js:363 | ||||||
| #| msgid "Always grant access" | #| msgid "Always grant access" | ||||||
| msgid "Grant Access" | msgid "Grant Access" | ||||||
| msgstr "Ҳамеша иҷозат додан" | msgstr "Иҷозат додани дастрасӣ" | ||||||
|  |  | ||||||
| #: js/ui/appDisplay.js:660 | #: js/ui/appDisplay.js:660 | ||||||
| msgid "Frequently used applications will appear here" | msgid "Frequently used applications will appear here" | ||||||
| @@ -697,7 +697,7 @@ msgstr "%s аз баргузидаҳои шумо тоза шудааст." | |||||||
| #: js/ui/audioDeviceSelection.js:42 | #: js/ui/audioDeviceSelection.js:42 | ||||||
| #| msgid "Send Files to Device…" | #| msgid "Send Files to Device…" | ||||||
| msgid "Select Audio Device" | msgid "Select Audio Device" | ||||||
| msgstr "Фиристодани файлҳо ба дастгоҳ..." | msgstr "Интихоби дастгоҳи аудиоӣ" | ||||||
|  |  | ||||||
| #: js/ui/audioDeviceSelection.js:53 | #: js/ui/audioDeviceSelection.js:53 | ||||||
| msgid "Sound Settings" | msgid "Sound Settings" | ||||||
| @@ -705,11 +705,11 @@ msgstr "Танзимоти садо" | |||||||
|  |  | ||||||
| #: js/ui/audioDeviceSelection.js:62 | #: js/ui/audioDeviceSelection.js:62 | ||||||
| msgid "Headphones" | msgid "Headphones" | ||||||
| msgstr "" | msgstr "Гӯшмонакҳо" | ||||||
|  |  | ||||||
| #: js/ui/audioDeviceSelection.js:64 | #: js/ui/audioDeviceSelection.js:64 | ||||||
| msgid "Headset" | msgid "Headset" | ||||||
| msgstr "" | msgstr "Гӯшмонак бо микрофон" | ||||||
|  |  | ||||||
| #: js/ui/audioDeviceSelection.js:66 js/ui/status/volume.js:247 | #: js/ui/audioDeviceSelection.js:66 js/ui/status/volume.js:247 | ||||||
| msgid "Microphone" | msgid "Microphone" | ||||||
| @@ -717,7 +717,7 @@ msgstr "Микрофон" | |||||||
|  |  | ||||||
| #: js/ui/backgroundMenu.js:13 | #: js/ui/backgroundMenu.js:13 | ||||||
| msgid "Change Background…" | msgid "Change Background…" | ||||||
| msgstr "Тағйир додани пазсамина..." | msgstr "Тағйир додани пазсамина…" | ||||||
|  |  | ||||||
| #: js/ui/backgroundMenu.js:15 js/ui/status/nightLight.js:43 | #: js/ui/backgroundMenu.js:15 js/ui/status/nightLight.js:43 | ||||||
| msgid "Display Settings" | msgid "Display Settings" | ||||||
| @@ -800,7 +800,7 @@ msgstr "%OB" | |||||||
| #. | #. | ||||||
| #: js/ui/calendar.js:342 | #: js/ui/calendar.js:342 | ||||||
| msgid "%OB %Y" | msgid "%OB %Y" | ||||||
| msgstr "" | msgstr "%OB %Y" | ||||||
|  |  | ||||||
| #: js/ui/calendar.js:399 | #: js/ui/calendar.js:399 | ||||||
| msgid "Previous month" | msgid "Previous month" | ||||||
| @@ -854,14 +854,14 @@ msgstr "Ягон рӯйдод нест" | |||||||
|  |  | ||||||
| #: js/ui/calendar.js:1075 | #: js/ui/calendar.js:1075 | ||||||
| msgid "Clear" | msgid "Clear" | ||||||
| msgstr "" | msgstr "Пок кардан" | ||||||
|  |  | ||||||
| #. Translators: %s is an application name | #. Translators: %s is an application name | ||||||
| #: js/ui/closeDialog.js:42 | #: js/ui/closeDialog.js:42 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| #| msgid "“%s” is ready" | #| msgid "“%s” is ready" | ||||||
| msgid "“%s” is not responding." | msgid "“%s” is not responding." | ||||||
| msgstr "“%s” омода аст" | msgstr "“%s” ҷавоб намедиҳад." | ||||||
|  |  | ||||||
| #: js/ui/closeDialog.js:43 | #: 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." | 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 | #: js/ui/closeDialog.js:59 | ||||||
| msgid "Force Quit" | msgid "Force Quit" | ||||||
| msgstr "" | msgstr "Маҷбуран пӯшида шавад" | ||||||
|  |  | ||||||
| #: js/ui/closeDialog.js:62 | #: js/ui/closeDialog.js:62 | ||||||
| msgid "Wait" | msgid "Wait" | ||||||
| msgstr "" | msgstr "Интизор шавед" | ||||||
|  |  | ||||||
| #: js/ui/components/automountManager.js:86 | #: js/ui/components/automountManager.js:86 | ||||||
| msgid "External drive connected" | msgid "External drive connected" | ||||||
| @@ -919,7 +919,7 @@ msgstr "Калид:" | |||||||
|  |  | ||||||
| #: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271 | #: js/ui/components/networkAgent.js:249 js/ui/components/networkAgent.js:271 | ||||||
| msgid "Private key password: " | msgid "Private key password: " | ||||||
| msgstr "Пароли калиди шахсӣ:" | msgstr "Ниҳонвожаи калиди шахсӣ: " | ||||||
|  |  | ||||||
| #: js/ui/components/networkAgent.js:269 | #: js/ui/components/networkAgent.js:269 | ||||||
| msgid "Identity: " | msgid "Identity: " | ||||||
| @@ -1051,12 +1051,12 @@ msgstr "Обу ҳаво" | |||||||
| #: js/ui/dateMenu.js:305 | #: js/ui/dateMenu.js:305 | ||||||
| #| msgid "Select a network" | #| msgid "Select a network" | ||||||
| msgid "Select a location…" | msgid "Select a location…" | ||||||
| msgstr "Интихоб кардани шабака" | msgstr "Интихоби ҷойгиршавӣ…" | ||||||
|  |  | ||||||
| #: js/ui/dateMenu.js:313 | #: js/ui/dateMenu.js:313 | ||||||
| #| msgid "Searching…" | #| msgid "Searching…" | ||||||
| msgid "Loading…" | msgid "Loading…" | ||||||
| msgstr "Ҷустуҷӯ рафта истодааст..." | msgstr "Бор шуда истодааст…" | ||||||
|  |  | ||||||
| #: js/ui/dateMenu.js:323 | #: js/ui/dateMenu.js:323 | ||||||
| msgid "Go online for weather information" | msgid "Go online for weather information" | ||||||
| @@ -1274,7 +1274,7 @@ msgstr "" | |||||||
|  |  | ||||||
| #: js/ui/kbdA11yDialog.js:57 | #: js/ui/kbdA11yDialog.js:57 | ||||||
| msgid "Leave On" | msgid "Leave On" | ||||||
| msgstr "" | msgstr "Ҳамеша фаъол" | ||||||
|  |  | ||||||
| #: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133 | #: js/ui/kbdA11yDialog.js:57 js/ui/status/bluetooth.js:133 | ||||||
| #: js/ui/status/network.js:1264 | #: 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/nightLight.js:39 js/ui/status/rfkill.js:79 | ||||||
| #: js/ui/status/rfkill.js:106 | #: js/ui/status/rfkill.js:106 | ||||||
| msgid "Turn Off" | msgid "Turn Off" | ||||||
| msgstr "Хомӯш кардан" | msgstr "Ғайрифаъол кардан" | ||||||
|  |  | ||||||
| #: js/ui/kbdA11yDialog.js:65 | #: js/ui/kbdA11yDialog.js:65 | ||||||
| msgid "Leave Off" | msgid "Leave Off" | ||||||
| msgstr "" | msgstr "Ҳамеша ғайрифаъол" | ||||||
|  |  | ||||||
| #: js/ui/keyboard.js:203 | #: js/ui/keyboard.js:203 | ||||||
| msgid "Region & Language Settings" | msgid "Region & Language Settings" | ||||||
| @@ -1327,7 +1327,7 @@ msgstr "Ғайрифаъол" | |||||||
|  |  | ||||||
| #: js/ui/lookingGlass.js:693 | #: js/ui/lookingGlass.js:693 | ||||||
| msgid "Error" | msgid "Error" | ||||||
| msgstr "Хатогӣ" | msgstr "Хато" | ||||||
|  |  | ||||||
| #: js/ui/lookingGlass.js:695 | #: js/ui/lookingGlass.js:695 | ||||||
| msgid "Out of date" | msgid "Out of date" | ||||||
| @@ -1372,7 +1372,7 @@ msgstr "Ботил сохтан" | |||||||
| #. activities. See also note for "Activities" string. | #. activities. See also note for "Activities" string. | ||||||
| #: js/ui/overview.js:100 | #: js/ui/overview.js:100 | ||||||
| msgid "Overview" | msgid "Overview" | ||||||
| msgstr "Хулоса" | msgstr "Ҷамъбаст" | ||||||
|  |  | ||||||
| #. Translators: this is the text displayed | #. Translators: this is the text displayed | ||||||
| #. in the search entry when no search is | #. in the search entry when no search is | ||||||
| @@ -1380,20 +1380,20 @@ msgstr "Хулоса" | |||||||
| #. characters. | #. characters. | ||||||
| #: js/ui/overview.js:226 | #: js/ui/overview.js:226 | ||||||
| msgid "Type to search…" | msgid "Type to search…" | ||||||
| msgstr "Ҷустуҷӯ кардан..." | msgstr "Барои ҷустуҷӯ чизеро чоп намоед…" | ||||||
|  |  | ||||||
| #: js/ui/padOsd.js:92 | #: js/ui/padOsd.js:92 | ||||||
| msgid "New shortcut…" | msgid "New shortcut…" | ||||||
| msgstr "" | msgstr "Миёнбури нав…" | ||||||
|  |  | ||||||
| #: js/ui/padOsd.js:141 | #: js/ui/padOsd.js:141 | ||||||
| #| msgid "Applications" | #| msgid "Applications" | ||||||
| msgid "Application defined" | msgid "Application defined" | ||||||
| msgstr "Барномаҳо" | msgstr "Барномаи муайяншуда" | ||||||
|  |  | ||||||
| #: js/ui/padOsd.js:142 | #: js/ui/padOsd.js:142 | ||||||
| msgid "Show on-screen help" | msgid "Show on-screen help" | ||||||
| msgstr "" | msgstr "Намоиш додани кумаки экранӣ" | ||||||
|  |  | ||||||
| #: js/ui/padOsd.js:143 | #: js/ui/padOsd.js:143 | ||||||
| #| msgid "Switch User" | #| msgid "Switch User" | ||||||
| @@ -1406,7 +1406,7 @@ msgstr "" | |||||||
|  |  | ||||||
| #: js/ui/padOsd.js:209 | #: js/ui/padOsd.js:209 | ||||||
| msgid "Done" | msgid "Done" | ||||||
| msgstr "" | msgstr "Тайёр" | ||||||
|  |  | ||||||
| #: js/ui/padOsd.js:721 | #: js/ui/padOsd.js:721 | ||||||
| msgid "Edit…" | msgid "Edit…" | ||||||
| @@ -1414,19 +1414,19 @@ msgstr "Таҳрир кардан…" | |||||||
|  |  | ||||||
| #: js/ui/padOsd.js:763 js/ui/padOsd.js:868 | #: js/ui/padOsd.js:763 js/ui/padOsd.js:868 | ||||||
| msgid "None" | msgid "None" | ||||||
| msgstr "" | msgstr "Ҳеҷ" | ||||||
|  |  | ||||||
| #: js/ui/padOsd.js:822 | #: js/ui/padOsd.js:822 | ||||||
| msgid "Press a button to configure" | msgid "Press a button to configure" | ||||||
| msgstr "" | msgstr "Барои идома тугмаеро пахш намоед" | ||||||
|  |  | ||||||
| #: js/ui/padOsd.js:823 | #: js/ui/padOsd.js:823 | ||||||
| msgid "Press Esc to exit" | msgid "Press Esc to exit" | ||||||
| msgstr "" | msgstr "Барои баромад тугмаи Esc-ро пахш намоед" | ||||||
|  |  | ||||||
| #: js/ui/padOsd.js:826 | #: js/ui/padOsd.js:826 | ||||||
| msgid "Press any key to exit" | msgid "Press any key to exit" | ||||||
| msgstr "" | msgstr "Барои баромад тугмаи дилхоҳро пахш намоед" | ||||||
|  |  | ||||||
| #: js/ui/panel.js:108 | #: js/ui/panel.js:108 | ||||||
| msgid "Quit" | msgid "Quit" | ||||||
| @@ -1446,7 +1446,7 @@ msgstr "Низом" | |||||||
|  |  | ||||||
| #: js/ui/panel.js:861 | #: js/ui/panel.js:861 | ||||||
| msgid "Top Bar" | msgid "Top Bar" | ||||||
| msgstr "Панели боло" | msgstr "Лавҳаии болоӣ" | ||||||
|  |  | ||||||
| #. Translators: this MUST be either "toggle-switch-us" | #. Translators: this MUST be either "toggle-switch-us" | ||||||
| #. (for toggle switches containing the English words | #. (for toggle switches containing the English words | ||||||
| @@ -1519,7 +1519,7 @@ msgstr "Қулф аз тарави барнома баста шудааст" | |||||||
|  |  | ||||||
| #: js/ui/search.js:635 | #: js/ui/search.js:635 | ||||||
| msgid "Searching…" | msgid "Searching…" | ||||||
| msgstr "Ҷустуҷӯ рафта истодааст..." | msgstr "Дар ҳоли ҷустуҷӯ…" | ||||||
|  |  | ||||||
| #: js/ui/search.js:637 | #: js/ui/search.js:637 | ||||||
| msgid "No results." | msgid "No results." | ||||||
| @@ -1836,7 +1836,7 @@ msgstr "%s пайваст нашудааст" | |||||||
| #: js/ui/status/network.js:1393 | #: js/ui/status/network.js:1393 | ||||||
| #| msgid "Connecting" | #| msgid "Connecting" | ||||||
| msgid "connecting…" | msgid "connecting…" | ||||||
| msgstr "Пайвастшавӣ" | msgstr "пайваст шуда истодааст…" | ||||||
|  |  | ||||||
| #. Translators: this is for network connections that require some kind of key or password | #. 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:1396 | ||||||
| @@ -1894,7 +1894,7 @@ msgstr "Пайваст қатъ шудааст" | |||||||
|  |  | ||||||
| #: js/ui/status/network.js:1703 | #: js/ui/status/network.js:1703 | ||||||
| msgid "Activation of network connection failed" | msgid "Activation of network connection failed" | ||||||
| msgstr "Фаъолсозии пайвасти шабака қатъ шудааст." | msgstr "Фаъолсозии пайвасти шабака қатъ шуд" | ||||||
|  |  | ||||||
| #: js/ui/status/nightLight.js:60 | #: js/ui/status/nightLight.js:60 | ||||||
| #| msgid "Networking is disabled" | #| msgid "Networking is disabled" | ||||||
| @@ -1929,7 +1929,7 @@ msgstr "" | |||||||
| #. to estimate battery life | #. to estimate battery life | ||||||
| #: js/ui/status/power.js:70 js/ui/status/power.js:76 | #: js/ui/status/power.js:70 js/ui/status/power.js:76 | ||||||
| msgid "Estimating…" | msgid "Estimating…" | ||||||
| msgstr "Ҳисоб шуда истодааст..." | msgstr "Ҳисоб шуда истодааст…" | ||||||
|  |  | ||||||
| #. Translators: this is <hours>:<minutes> Remaining (<percentage>) | #. Translators: this is <hours>:<minutes> Remaining (<percentage>) | ||||||
| #: js/ui/status/power.js:84 | #: 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 | #: js/ui/status/power.js:117 js/ui/status/power.js:119 | ||||||
| #, javascript-format | #, javascript-format | ||||||
| msgid "%d %%" | msgid "%d %%" | ||||||
| msgstr "" | msgstr "%d %%" | ||||||
|  |  | ||||||
| #: js/ui/status/remoteAccess.js:42 | #: js/ui/status/remoteAccess.js:42 | ||||||
| msgid "Screen is Being Shared" | msgid "Screen is Being Shared" | ||||||
| @@ -1978,11 +1978,11 @@ msgstr "Баромад аз мизи корӣ" | |||||||
| #: js/ui/status/system.js:227 | #: js/ui/status/system.js:227 | ||||||
| #| msgid "Sound Settings" | #| msgid "Sound Settings" | ||||||
| msgid "Account Settings" | msgid "Account Settings" | ||||||
| msgstr "Танзимоти садо" | msgstr "Танзимоти ҳисоб" | ||||||
|  |  | ||||||
| #: js/ui/status/system.js:255 | #: js/ui/status/system.js:255 | ||||||
| msgid "Orientation Lock" | msgid "Orientation Lock" | ||||||
| msgstr "Қулфи самт" | msgstr "Қулфи самти экран" | ||||||
|  |  | ||||||
| #: js/ui/status/system.js:281 | #: js/ui/status/system.js:281 | ||||||
| msgid "Suspend" | msgid "Suspend" | ||||||
|   | |||||||
							
								
								
									
										1083
									
								
								po/zh_CN.po
									
									
									
									
									
								
							
							
						
						
									
										1083
									
								
								po/zh_CN.po
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										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, ...) | print_debug (const gchar *format, ...) | ||||||
| { | { | ||||||
|   gchar *s; |   gchar *s; | ||||||
|   | |||||||
| @@ -266,7 +266,7 @@ main (int    argc, | |||||||
|  |  | ||||||
| /* ---------------------------------------------------------------------------------------------------- */ | /* ---------------------------------------------------------------------------------------------------- */ | ||||||
|  |  | ||||||
| static void | static void __attribute__((format(printf, 1, 0))) | ||||||
| print_debug (const gchar *format, ...) | print_debug (const gchar *format, ...) | ||||||
| { | { | ||||||
|   gchar *s; |   gchar *s; | ||||||
|   | |||||||
| @@ -1069,9 +1069,9 @@ _shell_app_add_window (ShellApp        *app, | |||||||
|  |  | ||||||
|   app->running_state->window_sort_stale = TRUE; |   app->running_state->window_sort_stale = TRUE; | ||||||
|   app->running_state->windows = g_slist_prepend (app->running_state->windows, g_object_ref (window)); |   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_object (window, "unmanaged", G_CALLBACK(shell_app_on_unmanaged), app, 0); | ||||||
|   g_signal_connect (window, "notify::user-time", G_CALLBACK(shell_app_on_user_time_changed), app); |   g_signal_connect_object (window, "notify::user-time", G_CALLBACK(shell_app_on_user_time_changed), app, 0); | ||||||
|   g_signal_connect (window, "notify::skip-taskbar", G_CALLBACK(shell_app_on_skip_taskbar_changed), app); |   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_update_app_actions (app, window); | ||||||
|   shell_app_ensure_busy_watch (app); |   shell_app_ensure_busy_watch (app); | ||||||
| @@ -1183,13 +1183,26 @@ _shell_app_handle_startup_sequence (ShellApp            *app, | |||||||
| gboolean | gboolean | ||||||
| shell_app_request_quit (ShellApp   *app) | shell_app_request_quit (ShellApp   *app) | ||||||
| { | { | ||||||
|  |   GActionGroup *group = NULL; | ||||||
|   GSList *iter; |   GSList *iter; | ||||||
|  |  | ||||||
|   if (shell_app_get_state (app) != SHELL_APP_STATE_RUNNING) |   if (shell_app_get_state (app) != SHELL_APP_STATE_RUNNING) | ||||||
|     return FALSE; |     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) |   for (iter = app->running_state->windows; iter; iter = iter->next) | ||||||
|     { |     { | ||||||
|       MetaWindow *win = iter->data; |       MetaWindow *win = iter->data; | ||||||
|   | |||||||
| @@ -863,6 +863,7 @@ _shell_global_set_plugin (ShellGlobal *global, | |||||||
|     } |     } | ||||||
|  |  | ||||||
|   st_entry_set_cursor_func (entry_cursor_func, 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_signal_connect (global->stage, "notify::width", | ||||||
|                     G_CALLBACK (global_stage_notify_width), global); |                     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); |   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 | static void | ||||||
|   | |||||||
| @@ -186,9 +186,7 @@ shell_invert_lightness_effect_init (ShellInvertLightnessEffect *self) | |||||||
|       cogl_pipeline_add_layer_snippet (klass->base_pipeline, 0, snippet); |       cogl_pipeline_add_layer_snippet (klass->base_pipeline, 0, snippet); | ||||||
|       cogl_object_unref (snippet); |       cogl_object_unref (snippet); | ||||||
|  |  | ||||||
|       cogl_pipeline_set_layer_null_texture (klass->base_pipeline, |       cogl_pipeline_set_layer_null_texture (klass->base_pipeline, 0); | ||||||
|                                             0, /* layer number */ |  | ||||||
|                                             COGL_TEXTURE_TYPE_2D); |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   self->pipeline = cogl_pipeline_copy (klass->base_pipeline); |   self->pipeline = cogl_pipeline_copy (klass->base_pipeline); | ||||||
|   | |||||||
| @@ -117,7 +117,7 @@ remove_mnemonics (const GValue *value) | |||||||
|   label = g_value_get_string (value); |   label = g_value_get_string (value); | ||||||
|   g_return_val_if_fail (label != NULL, NULL); |   g_return_val_if_fail (label != NULL, NULL); | ||||||
|  |  | ||||||
|   /* Stripped label will have the original label lenght at most */ |   /* Stripped label will have the original label length at most */ | ||||||
|   stripped_label = temp = g_new (gchar, strlen(label) + 1); |   stripped_label = temp = g_new (gchar, strlen(label) + 1); | ||||||
|   g_assert (stripped_label != NULL); |   g_assert (stripped_label != NULL); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -17,15 +17,13 @@ | |||||||
| #include <meta/meta-cursor-tracker.h> | #include <meta/meta-cursor-tracker.h> | ||||||
| #include <meta/display.h> | #include <meta/display.h> | ||||||
| #include <meta/compositor-mutter.h> | #include <meta/compositor-mutter.h> | ||||||
|  | #include <st/st.h> | ||||||
|  |  | ||||||
| #include "shell-global.h" | #include "shell-global.h" | ||||||
| #include "shell-recorder-src.h" | #include "shell-recorder-src.h" | ||||||
| #include "shell-recorder.h" | #include "shell-recorder.h" | ||||||
| #include "shell-util.h" | #include "shell-util.h" | ||||||
|  |  | ||||||
| #define A11Y_APPS_SCHEMA "org.gnome.desktop.a11y.applications" |  | ||||||
| #define MAGNIFIER_ACTIVE_KEY "screen-magnifier-enabled" |  | ||||||
|  |  | ||||||
| typedef enum { | typedef enum { | ||||||
|   RECORDER_STATE_CLOSED, |   RECORDER_STATE_CLOSED, | ||||||
|   RECORDER_STATE_RECORDING |   RECORDER_STATE_RECORDING | ||||||
| @@ -58,7 +56,6 @@ struct _ShellRecorder { | |||||||
|   int pointer_x; |   int pointer_x; | ||||||
|   int pointer_y; |   int pointer_y; | ||||||
|  |  | ||||||
|   GSettings *a11y_settings; |  | ||||||
|   gboolean draw_cursor; |   gboolean draw_cursor; | ||||||
|   MetaCursorTracker *cursor_tracker; |   MetaCursorTracker *cursor_tracker; | ||||||
|   cairo_surface_t *cursor_image; |   cairo_surface_t *cursor_image; | ||||||
| @@ -213,8 +210,6 @@ shell_recorder_init (ShellRecorder *recorder) | |||||||
|  |  | ||||||
|   recorder->memory_target = get_memory_target(); |   recorder->memory_target = get_memory_target(); | ||||||
|  |  | ||||||
|   recorder->a11y_settings = g_settings_new (A11Y_APPS_SCHEMA); |  | ||||||
|  |  | ||||||
|   recorder->state = RECORDER_STATE_CLOSED; |   recorder->state = RECORDER_STATE_CLOSED; | ||||||
|   recorder->framerate = DEFAULT_FRAMES_PER_SECOND; |   recorder->framerate = DEFAULT_FRAMES_PER_SECOND; | ||||||
|   recorder->draw_cursor = TRUE; |   recorder->draw_cursor = TRUE; | ||||||
| @@ -239,8 +234,6 @@ shell_recorder_finalize (GObject  *object) | |||||||
|  |  | ||||||
|   recorder_remove_redraw_timeout (recorder); |   recorder_remove_redraw_timeout (recorder); | ||||||
|  |  | ||||||
|   g_clear_object (&recorder->a11y_settings); |  | ||||||
|  |  | ||||||
|   G_OBJECT_CLASS (shell_recorder_parent_class)->finalize (object); |   G_OBJECT_CLASS (shell_recorder_parent_class)->finalize (object); | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -465,9 +458,16 @@ recorder_record_frame (ShellRecorder *recorder, | |||||||
|  |  | ||||||
|   GST_BUFFER_PTS(buffer) = now; |   GST_BUFFER_PTS(buffer) = now; | ||||||
|  |  | ||||||
|   if (recorder->draw_cursor && |   if (recorder->draw_cursor) | ||||||
|       !g_settings_get_boolean (recorder->a11y_settings, MAGNIFIER_ACTIVE_KEY)) |     { | ||||||
|  |       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); |         recorder_draw_cursor (recorder, buffer); | ||||||
|  |     } | ||||||
|  |  | ||||||
|   shell_recorder_src_add_buffer (SHELL_RECORDER_SRC (recorder->current_pipeline->src), buffer); |   shell_recorder_src_add_buffer (SHELL_RECORDER_SRC (recorder->current_pipeline->src), buffer); | ||||||
|   gst_buffer_unref (buffer); |   gst_buffer_unref (buffer); | ||||||
|   | |||||||
| @@ -7,14 +7,12 @@ | |||||||
| #include <meta/meta-plugin.h> | #include <meta/meta-plugin.h> | ||||||
| #include <meta/meta-shaped-texture.h> | #include <meta/meta-shaped-texture.h> | ||||||
| #include <meta/meta-cursor-tracker.h> | #include <meta/meta-cursor-tracker.h> | ||||||
|  | #include <st/st.h> | ||||||
|  |  | ||||||
| #include "shell-global.h" | #include "shell-global.h" | ||||||
| #include "shell-screenshot.h" | #include "shell-screenshot.h" | ||||||
| #include "shell-util.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; | typedef struct _ShellScreenshotPrivate  ShellScreenshotPrivate; | ||||||
|  |  | ||||||
| struct _ShellScreenshot | struct _ShellScreenshot | ||||||
| @@ -202,6 +200,9 @@ write_screenshot_thread (GTask        *result, | |||||||
|                                             cairo_image_surface_get_height (priv->image)); |                                             cairo_image_surface_get_height (priv->image)); | ||||||
|       creation_time = g_date_time_format (priv->datetime, "%c"); |       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, |       if (gdk_pixbuf_save_to_stream (pixbuf, stream, "png", NULL, NULL, | ||||||
|                                      "tEXt::Software", "gnome-screenshot", |                                      "tEXt::Software", "gnome-screenshot", | ||||||
|                                      "tEXt::Creation Time", creation_time, |                                      "tEXt::Creation Time", creation_time, | ||||||
| @@ -268,9 +269,12 @@ should_draw_cursor_image (ShellScreenshotMode mode) | |||||||
| { | { | ||||||
|   if (mode == SHELL_SCREENSHOT_WINDOW || !meta_is_wayland_compositor ()) |   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; |         return TRUE; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -430,7 +430,7 @@ ClutterContent * | |||||||
| shell_util_get_content_for_window_actor (MetaWindowActor *window_actor, | shell_util_get_content_for_window_actor (MetaWindowActor *window_actor, | ||||||
|                                          MetaRectangle   *window_rect) |                                          MetaRectangle   *window_rect) | ||||||
| { | { | ||||||
|   ClutterActor *texture; |   MetaShapedTexture *texture; | ||||||
|   ClutterContent *content; |   ClutterContent *content; | ||||||
|   cairo_surface_t *surface; |   cairo_surface_t *surface; | ||||||
|   cairo_rectangle_int_t clip; |   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.width = ceilf (window_rect->width * resource_scale); | ||||||
|   clip.height = ceilf (window_rect->height * resource_scale); |   clip.height = ceilf (window_rect->height * resource_scale); | ||||||
|  |  | ||||||
|   surface = meta_shaped_texture_get_image (META_SHAPED_TEXTURE (texture), |   surface = meta_shaped_texture_get_image (texture, &clip); | ||||||
|                                            &clip); |  | ||||||
|  |  | ||||||
|   content = clutter_canvas_new (); |   content = clutter_canvas_new (); | ||||||
|   clutter_canvas_set_size (CLUTTER_CANVAS (content), |   clutter_canvas_set_size (CLUTTER_CANVAS (content), | ||||||
|   | |||||||
| @@ -125,7 +125,7 @@ st_cflags = [ | |||||||
| libst = shared_library('st-1.0', | libst = shared_library('st-1.0', | ||||||
|   sources: st_gir_sources + st_non_gir_sources, |   sources: st_gir_sources + st_non_gir_sources, | ||||||
|   c_args: st_cflags, |   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, |   build_rpath: mutter_typelibdir, | ||||||
|   install_rpath: mutter_typelibdir, |   install_rpath: mutter_typelibdir, | ||||||
|   install_dir: pkglibdir, |   install_dir: pkglibdir, | ||||||
| @@ -152,7 +152,7 @@ libst_gir = gnome.generate_gir(libst, | |||||||
|   sources: st_gir_sources, |   sources: st_gir_sources, | ||||||
|   nsversion: '1.0', |   nsversion: '1.0', | ||||||
|   namespace: 'St', |   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], |   dependencies: [mutter_dep], | ||||||
|   include_directories: include_directories('..'), |   include_directories: include_directories('..'), | ||||||
|   extra_args: ['-DST_COMPILATION', '--quiet'], |   extra_args: ['-DST_COMPILATION', '--quiet'], | ||||||
|   | |||||||
| @@ -19,251 +19,49 @@ | |||||||
|  |  | ||||||
| /** | /** | ||||||
|  * SECTION:st-clipboard |  * 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 |  * #StCliboard is a very simple object representation of the clipboard | ||||||
|  * available to applications. Text is always assumed to be UTF-8 and non-text |  * available to applications. Text is always assumed to be UTF-8 and non-text | ||||||
|  * items are not handled. |  * items are not handled. | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
|  | #include "config.h" | ||||||
|  |  | ||||||
| #include "st-clipboard.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 | #include <meta/display.h> | ||||||
| { | #include <meta/meta-selection-source-memory.h> | ||||||
|   Window clipboard_window; | #include <meta/meta-selection.h> | ||||||
|   gchar *clipboard_text; |  | ||||||
|  |  | ||||||
|   Atom  *supported_targets; | G_DEFINE_TYPE (StClipboard, st_clipboard, G_TYPE_OBJECT) | ||||||
|   gint   n_targets; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| G_DEFINE_TYPE_WITH_PRIVATE (StClipboard, st_clipboard, G_TYPE_OBJECT) | typedef struct _TransferData TransferData; | ||||||
|  | struct _TransferData | ||||||
| typedef struct _EventFilterData EventFilterData; |  | ||||||
| struct _EventFilterData |  | ||||||
| { | { | ||||||
|   StClipboard            *clipboard; |   StClipboard            *clipboard; | ||||||
|   StClipboardCallbackFunc callback; |   StClipboardCallbackFunc callback; | ||||||
|   gpointer                user_data; |   gpointer                user_data; | ||||||
|  |   GOutputStream          *stream; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| static Atom __atom_primary = None; | const char *supported_mimetypes[] = { | ||||||
| static Atom __atom_clip = None; |   "text/plain;charset=utf-8", | ||||||
| static Atom __utf8_string = None; |   "UTF8_STRING", | ||||||
| static Atom __atom_targets = None; |   "text/plain", | ||||||
|  |   "STRING", | ||||||
| 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; |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  | static MetaSelection *meta_selection = NULL; | ||||||
|  |  | ||||||
| static void | static void | ||||||
| st_clipboard_class_init (StClipboardClass *klass) | 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 | static void | ||||||
| st_clipboard_init (StClipboard *self) | 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; |   return default_clipboard; | ||||||
| } | } | ||||||
|  |  | ||||||
| static Atom | static gboolean | ||||||
| atom_for_clipboard_type (StClipboardType type) | 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, |                        StClipboardCallbackFunc callback, | ||||||
|                        gpointer                user_data) |                        gpointer                user_data) | ||||||
| { | { | ||||||
|   EventFilterData *data; |   MetaSelectionType selection_type; | ||||||
|   GdkDisplay *gdk_display; |   TransferData *data; | ||||||
|   Display *dpy; |   const char *mimetype = NULL; | ||||||
|  |  | ||||||
|   g_return_if_fail (ST_IS_CLIPBOARD (clipboard)); |   g_return_if_fail (ST_IS_CLIPBOARD (clipboard)); | ||||||
|  |   g_return_if_fail (meta_selection != NULL); | ||||||
|   g_return_if_fail (callback != 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->clipboard = clipboard; | ||||||
|   data->callback = callback; |   data->callback = callback; | ||||||
|   data->user_data = user_data; |   data->user_data = user_data; | ||||||
|  |   data->stream = g_memory_output_stream_new_resizable (); | ||||||
|  |  | ||||||
|   gdk_window_add_filter (NULL, /* all windows */ |   meta_selection_transfer_async (meta_selection, | ||||||
|                          st_clipboard_x11_event_filter, |                                  selection_type, | ||||||
|  |                                  mimetype, -1, | ||||||
|  |                                  data->stream, NULL, | ||||||
|  |                                  (GAsyncReadyCallback) transfer_cb, | ||||||
|                                  data); |                                  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 */ |  | ||||||
|     } |  | ||||||
| } | } | ||||||
|  |  | ||||||
| /** | /** | ||||||
| @@ -356,31 +199,26 @@ st_clipboard_set_text (StClipboard     *clipboard, | |||||||
|                        StClipboardType  type, |                        StClipboardType  type, | ||||||
|                        const gchar     *text) |                        const gchar     *text) | ||||||
| { | { | ||||||
|   StClipboardPrivate *priv; |   MetaSelectionType selection_type; | ||||||
|   GdkDisplay *gdk_display; |   MetaSelectionSource *source; | ||||||
|   Display *dpy; |   GBytes *bytes; | ||||||
|  |  | ||||||
|   g_return_if_fail (ST_IS_CLIPBOARD (clipboard)); |   g_return_if_fail (ST_IS_CLIPBOARD (clipboard)); | ||||||
|  |   g_return_if_fail (meta_selection != NULL); | ||||||
|   g_return_if_fail (text != NULL); |   g_return_if_fail (text != NULL); | ||||||
|  |  | ||||||
|   priv = clipboard->priv; |   if (!convert_type (type, &selection_type)) | ||||||
|  |     return; | ||||||
|  |  | ||||||
|   /* make a copy of the text */ |   bytes = g_bytes_new_take (g_strdup (text), strlen (text)); | ||||||
|   g_free (priv->clipboard_text); |   source = meta_selection_source_memory_new ("text/plain;charset=utf-8", bytes); | ||||||
|   priv->clipboard_text = g_strdup (text); |   g_bytes_unref (bytes); | ||||||
|  |  | ||||||
|   /* tell X we own the clipboard selection */ |   meta_selection_set_owner (meta_selection, selection_type, source); | ||||||
|   gdk_display = gdk_display_get_default (); | } | ||||||
|   dpy = GDK_DISPLAY_XDISPLAY (gdk_display); |  | ||||||
|  |  | ||||||
|   gdk_x11_display_error_trap_push (gdk_display); | void | ||||||
|  | st_clipboard_set_selection (MetaSelection *selection) | ||||||
|   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 = selection; | ||||||
|     } |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -25,6 +25,7 @@ | |||||||
| #define _ST_CLIPBOARD_H | #define _ST_CLIPBOARD_H | ||||||
|  |  | ||||||
| #include <glib-object.h> | #include <glib-object.h> | ||||||
|  | #include <meta/meta-selection.h> | ||||||
|  |  | ||||||
| G_BEGIN_DECLS | G_BEGIN_DECLS | ||||||
|  |  | ||||||
| @@ -32,7 +33,6 @@ G_BEGIN_DECLS | |||||||
| G_DECLARE_FINAL_TYPE (StClipboard, st_clipboard, ST, CLIPBOARD, GObject) | G_DECLARE_FINAL_TYPE (StClipboard, st_clipboard, ST, CLIPBOARD, GObject) | ||||||
|  |  | ||||||
| typedef struct _StClipboard StClipboard; | typedef struct _StClipboard StClipboard; | ||||||
| typedef struct _StClipboardPrivate StClipboardPrivate; |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * StClipboard: |  * StClipboard: | ||||||
| @@ -44,7 +44,6 @@ struct _StClipboard | |||||||
| { | { | ||||||
|   /*< private >*/ |   /*< private >*/ | ||||||
|   GObject parent; |   GObject parent; | ||||||
|   StClipboardPrivate *priv; |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
| typedef enum { | typedef enum { | ||||||
| @@ -74,6 +73,8 @@ void st_clipboard_set_text (StClipboard             *clipboard, | |||||||
|                             StClipboardType          type, |                             StClipboardType          type, | ||||||
|                             const gchar             *text); |                             const gchar             *text); | ||||||
|  |  | ||||||
|  | void st_clipboard_set_selection (MetaSelection *selection); | ||||||
|  |  | ||||||
| G_END_DECLS | G_END_DECLS | ||||||
|  |  | ||||||
| #endif /* _ST_CLIPBOARD_H */ | #endif /* _ST_CLIPBOARD_H */ | ||||||
|   | |||||||
| @@ -204,9 +204,7 @@ _st_create_texture_pipeline (CoglTexture *src_texture) | |||||||
|         clutter_backend_get_cogl_context (clutter_get_default_backend ()); |         clutter_backend_get_cogl_context (clutter_get_default_backend ()); | ||||||
|  |  | ||||||
|       texture_pipeline_template = cogl_pipeline_new (ctx); |       texture_pipeline_template = cogl_pipeline_new (ctx); | ||||||
|       cogl_pipeline_set_layer_null_texture (texture_pipeline_template, |       cogl_pipeline_set_layer_null_texture (texture_pipeline_template, 0); | ||||||
|                                             0, /* layer */ |  | ||||||
|                                             COGL_TEXTURE_TYPE_2D); |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   pipeline = cogl_pipeline_copy (texture_pipeline_template); |   pipeline = cogl_pipeline_copy (texture_pipeline_template); | ||||||
|   | |||||||
| @@ -30,6 +30,7 @@ | |||||||
| #define KEY_DRAG_THRESHOLD    "drag-threshold" | #define KEY_DRAG_THRESHOLD    "drag-threshold" | ||||||
| #define KEY_GTK_THEME         "gtk-theme" | #define KEY_GTK_THEME         "gtk-theme" | ||||||
| #define KEY_GTK_ICON_THEME    "icon-theme" | #define KEY_GTK_ICON_THEME    "icon-theme" | ||||||
|  | #define KEY_MAGNIFIER_ACTIVE "screen-magnifier-enabled" | ||||||
|  |  | ||||||
| enum { | enum { | ||||||
|   PROP_0, |   PROP_0, | ||||||
| @@ -38,6 +39,7 @@ enum { | |||||||
|   PROP_DRAG_THRESHOLD, |   PROP_DRAG_THRESHOLD, | ||||||
|   PROP_GTK_THEME, |   PROP_GTK_THEME, | ||||||
|   PROP_GTK_ICON_THEME, |   PROP_GTK_ICON_THEME, | ||||||
|  |   PROP_MAGNIFIER_ACTIVE, | ||||||
|   N_PROPS |   N_PROPS | ||||||
| }; | }; | ||||||
|  |  | ||||||
| @@ -48,11 +50,13 @@ struct _StSettings | |||||||
|   GObject parent_object; |   GObject parent_object; | ||||||
|   GSettings *interface_settings; |   GSettings *interface_settings; | ||||||
|   GSettings *mouse_settings; |   GSettings *mouse_settings; | ||||||
|  |   GSettings *a11y_settings; | ||||||
|  |  | ||||||
|   gchar *gtk_theme; |   gchar *gtk_theme; | ||||||
|   gchar *gtk_icon_theme; |   gchar *gtk_icon_theme; | ||||||
|   gboolean enable_animations; |   gboolean enable_animations; | ||||||
|   gboolean primary_paste; |   gboolean primary_paste; | ||||||
|  |   gboolean magnifier_active; | ||||||
|   gint drag_threshold; |   gint drag_threshold; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| @@ -105,6 +109,9 @@ st_settings_get_property (GObject    *object, | |||||||
|     case PROP_GTK_ICON_THEME: |     case PROP_GTK_ICON_THEME: | ||||||
|       g_value_set_string (value, settings->gtk_icon_theme); |       g_value_set_string (value, settings->gtk_icon_theme); | ||||||
|       break; |       break; | ||||||
|  |     case PROP_MAGNIFIER_ACTIVE: | ||||||
|  |       g_value_set_boolean (value, settings->magnifier_active); | ||||||
|  |       break; | ||||||
|     default: |     default: | ||||||
|       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); |       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); | ||||||
|     } |     } | ||||||
| @@ -144,6 +151,11 @@ st_settings_class_init (StSettingsClass *klass) | |||||||
|                                                     "GTK+ Icon Theme", |                                                     "GTK+ Icon Theme", | ||||||
|                                                     "", |                                                     "", | ||||||
|                                                     G_PARAM_READABLE); |                                                     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); |   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 | static void | ||||||
| st_settings_init (StSettings *settings) | st_settings_init (StSettings *settings) | ||||||
| { | { | ||||||
| @@ -201,6 +225,10 @@ st_settings_init (StSettings *settings) | |||||||
|   g_signal_connect (settings->interface_settings, "changed", |   g_signal_connect (settings->interface_settings, "changed", | ||||||
|                     G_CALLBACK (on_mouse_settings_changed), settings); |                     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, |   settings->enable_animations = g_settings_get_boolean (settings->interface_settings, | ||||||
|                                                         KEY_ENABLE_ANIMATIONS); |                                                         KEY_ENABLE_ANIMATIONS); | ||||||
|   settings->primary_paste = g_settings_get_boolean (settings->interface_settings, |   settings->primary_paste = g_settings_get_boolean (settings->interface_settings, | ||||||
| @@ -211,6 +239,8 @@ st_settings_init (StSettings *settings) | |||||||
|                                                     KEY_GTK_ICON_THEME); |                                                     KEY_GTK_ICON_THEME); | ||||||
|   settings->drag_threshold = g_settings_get_int (settings->mouse_settings, |   settings->drag_threshold = g_settings_get_int (settings->mouse_settings, | ||||||
|                                                  KEY_DRAG_THRESHOLD); |                                                  KEY_DRAG_THRESHOLD); | ||||||
|  |   settings->magnifier_active = g_settings_get_boolean (settings->a11y_settings, | ||||||
|  |                                                        KEY_MAGNIFIER_ACTIVE); | ||||||
| } | } | ||||||
|  |  | ||||||
| /** | /** | ||||||
|   | |||||||
| @@ -24,6 +24,8 @@ | |||||||
| #ifndef __ST_SETTINGS_H__ | #ifndef __ST_SETTINGS_H__ | ||||||
| #define __ST_SETTINGS_H__ | #define __ST_SETTINGS_H__ | ||||||
|  |  | ||||||
|  | #include <glib-object.h> | ||||||
|  |  | ||||||
| G_BEGIN_DECLS | G_BEGIN_DECLS | ||||||
|  |  | ||||||
| #define ST_TYPE_SETTINGS (st_settings_get_type ()) | #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); | StSettings * st_settings_get (void); | ||||||
|  |  | ||||||
|  | G_END_DECLS | ||||||
|  |  | ||||||
| #endif /* __ST_SETTINGS_H__ */ | #endif /* __ST_SETTINGS_H__ */ | ||||||
|   | |||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user