Merge ~3v1n0/ubuntu/+source/gnome-shell:ubuntu/master into ~ubuntu-desktop/ubuntu/+source/gnome-shell:ubuntu/master

Proposed by Marco Trevisan (Treviño) on 2019-04-29
Status: Merged
Merged at revision: d0274d5fef8c3023ff0b206708f907082a25ea2f
Proposed branch: ~3v1n0/ubuntu/+source/gnome-shell:ubuntu/master
Merge into: ~ubuntu-desktop/ubuntu/+source/gnome-shell:ubuntu/master
Diff against target: 2243 lines (+469/-710)
32 files modified
NEWS (+31/-0)
data/dbus-interfaces/org.gnome.Shell.xml (+0/-3)
data/gnome-shell-theme.gresource.xml (+0/-2)
data/theme/gnome-shell-sass/_common.scss (+9/-8)
data/theme/toggle-off-intl.svg (+45/-151)
data/theme/toggle-on-intl.svg (+45/-134)
debian/.gitignore (+10/-0)
debian/changelog (+76/-0)
debian/clean (+1/-0)
debian/patches/magnifier-Show-cursor-when-magnifier-is-enabled-and-scale.patch (+10/-10)
debian/patches/optional-hot-corner.patch (+1/-1)
debian/patches/ubuntu/resolve_alternate_theme_path.patch (+1/-1)
debian/patches/ubuntu/search-call-XUbuntuCancel-method-on-providers-when-no-dat.patch (+1/-1)
debian/rules (+13/-1)
dev/null (+0/-207)
js/extensionPrefs/main.js (+3/-3)
js/perf/hwtest.js (+6/-3)
js/ui/appFavorites.js (+16/-8)
js/ui/barLevel.js (+15/-12)
js/ui/boxpointer.js (+27/-61)
js/ui/dash.js (+5/-9)
js/ui/dateMenu.js (+11/-5)
js/ui/layout.js (+1/-1)
js/ui/osdMonitorLabeler.js (+0/-22)
js/ui/panel.js (+1/-2)
js/ui/popupMenu.js (+0/-6)
js/ui/screenshot.js (+6/-26)
js/ui/shellDBus.js (+7/-10)
js/ui/windowManager.js (+37/-11)
js/ui/workspacesView.js (+85/-10)
meson.build (+1/-1)
src/st/st-theme-node.c (+5/-1)
Reviewer Review Type Date Requested Status
Daniel van Vugt (community) Approve on 2019-04-30
Ubuntu Desktop 2019-04-29 Pending
Review via email: mp+366668@code.launchpad.net

Description of the change

Update to 3.32.1

To post a comment you must log in.
Daniel van Vugt (vanvugt) wrote :

I'm not directly familiar with recent changes to gnome-shell 3.32.1. It looks reasonable, except:

(1) Again I recommend not including the large section in changelog entries detailing what hasn't changed ("remaining changes:") because it is misleading to document in detail things that are not part of the update.

review: Approve
Iain Lane (laney) wrote :

> (1) Again I recommend not including the large section in changelog entries detailing what hasn't changed ("remaining changes:") because it is misleading to document in detail things that are not part of the update.

This is Ubuntu merge policy. If you think it's wrong, a discussion on ubuntu-devel would be the way to go about getting it changed.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/NEWS b/NEWS
2index a86e5e4..fcfa060 100644
3--- a/NEWS
4+++ b/NEWS
5@@ -1,3 +1,34 @@
6+3.32.1
7+======
8+* Fix avatar scaling on login screen [Florian; #1024]
9+* Fix distortion of desktop zoom [Florian; #646]
10+* Fix mouse cursor visibility when using desktop zoom [Florian, Marco; #1020]
11+* Fix screen dimming after wake-up on lock screen [Xiaoguang; #900]
12+* Fix Alt+Esc switcher [Florian; #1064]
13+* Respect struts for popover placement [Andrea; #1102]
14+* Fix app icons updates after theme changes [Florian; #1117]
15+* Fix desktop zoom after resolution changes [Marco; #1120]
16+* Implement stick-to-finger workspace switch overview gestures [Florian; #516]
17+* Make World Clocks offsets relative to local time [Florian; #1157]
18+* Fix top app icon disappearing from dash [Florian; #1053]
19+* Update switch style to match new Adwaita [Jakub; !496]
20+* Ensure CSS units are pixel-aligned when scaling is used [Carlos; #91]
21+* Misc. bug fixes and cleanups [Florian, Jakub, Robert, Alex, Carlos, Phil,
22+ Marco, Benjamin, AsciiWolf, Ray, verdre; !444, #1016, #1018, !449, #1036,
23+ !455, #1094, !440, #1023, #624, #1017, !476, !473, !480, #1130, !485, !481,
24+ !490, !489, #1151, !435, #1160, !482, #1150, #1166, !384]
25+
26+Contributors:
27+ AsciiWolf, Andrea Azzarone, Benjamin Berg, Carlos Garnacho, Victor Ibragimov,
28+ Robert Mader, Alex Monday, Florian Müllner, Jakub Steiner, Ray Strode,
29+ Marco Trevisan (Treviño), verdre, Xiaoguang Wang, Phil Wyett
30+
31+Translators:
32+ Victor Ibragimov [tg, af, et, ja], Bruce Cowan [en_GB], Piotr Drąg [tg],
33+ Charles Monzat [fr], Khaled Hosny [ar], Goran Vidović [hr],
34+ Cheng-Chia Tseng [zh_TW], Carmen Bianca BAKKER [eo], Daniel Mustieles [es],
35+ Dušan Kazik [sk]
36+
37 3.32.0
38 ======
39 * Fix sizing issues in on-screen-keyboard emoji panel [Carlos; !439]
40diff --git a/data/dbus-interfaces/org.gnome.Shell.xml b/data/dbus-interfaces/org.gnome.Shell.xml
41index 1fef302..094c294 100644
42--- a/data/dbus-interfaces/org.gnome.Shell.xml
43+++ b/data/dbus-interfaces/org.gnome.Shell.xml
44@@ -9,9 +9,6 @@
45 <method name="ShowOSD">
46 <arg type="a{sv}" direction="in" name="params"/>
47 </method>
48- <method name="ShowMonitorLabels">
49- <arg type="a{uv}" direction="in" name="params"/>
50- </method>
51 <method name="ShowMonitorLabels2">
52 <arg type="a{sv}" direction="in" name="params"/>
53 </method>
54diff --git a/data/gnome-shell-theme.gresource.xml b/data/gnome-shell-theme.gresource.xml
55index b778254..c05be6b 100644
56--- a/data/gnome-shell-theme.gresource.xml
57+++ b/data/gnome-shell-theme.gresource.xml
58@@ -21,10 +21,8 @@
59 <file>noise-texture.png</file>
60 <file>pad-osd.css</file>
61 <file>process-working.svg</file>
62- <file>toggle-off-us.svg</file>
63 <file>toggle-off-intl.svg</file>
64 <file>toggle-off-hc.svg</file>
65- <file>toggle-on-us.svg</file>
66 <file>toggle-on-intl.svg</file>
67 <file>toggle-on-hc.svg</file>
68 </gresource>
69diff --git a/data/theme/gnome-shell-sass/_common.scss b/data/theme/gnome-shell-sass/_common.scss
70index c7485ae..a6357ba 100644
71--- a/data/theme/gnome-shell-sass/_common.scss
72+++ b/data/theme/gnome-shell-sass/_common.scss
73@@ -157,18 +157,13 @@ StScrollBar {
74
75 /* Switches */
76 .toggle-switch {
77- width: 65px;
78+ width: 46px;
79 height: 22px;
80 background-size: contain;
81+ background-image: url("resource:///org/gnome/shell/theme/toggle-off-intl.svg");
82+ &:checked { background-image: url("resource:///org/gnome/shell/theme/toggle-on-intl.svg"); }
83 }
84
85- @each $v in us, intl {
86- .toggle-switch-#{$v} {
87- background-image: url("resource:///org/gnome/shell/theme/toggle-off-#{$v}.svg");
88- &:checked { background-image: url("resource:///org/gnome/shell/theme/toggle-on-#{$v}.svg"); }
89- }
90- }
91-
92 /* links */
93 .shell-link {
94 color: $link_color;
95@@ -1142,6 +1137,12 @@ StScrollBar {
96
97 .ripple-box:rtl { border-radius: 0 0 0 52px; } // just a simple change to the border radius position
98
99+// Rubberband for select-area screenshots
100+.select-area-rubberband {
101+ background-color: transparentize($selected_bg_color,0.7);
102+ border: 1px solid $selected_bg_color;
103+}
104+
105 // not really top bar only
106 .popup-menu-arrow { icon-size: 1.09em; }
107 .popup-menu-icon { icon-size: 1.09em; }
108diff --git a/data/theme/toggle-off-intl.svg b/data/theme/toggle-off-intl.svg
109index a1734fb..cb08712 100644
110--- a/data/theme/toggle-off-intl.svg
111+++ b/data/theme/toggle-off-intl.svg
112@@ -10,124 +10,62 @@
113 xmlns:xlink="http://www.w3.org/1999/xlink"
114 xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
115 xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
116- width="65"
117+ width="46"
118 height="22"
119- id="svg2857"
120+ viewBox="0 0 46 22"
121 version="1.1"
122- inkscape:version="0.48.5 r10040"
123- sodipodi:docname="toggle-off-us.svg">
124+ id="svg2751"
125+ inkscape:version="0.92.4 5da689c313, 2019-01-14"
126+ sodipodi:docname="toggle-off-intl.svg">
127 <defs
128- id="defs2859">
129- <inkscape:perspective
130- sodipodi:type="inkscape:persp3d"
131- inkscape:vp_x="0 : 526.18109 : 1"
132- inkscape:vp_y="0 : 1000 : 0"
133- inkscape:vp_z="744.09448 : 526.18109 : 1"
134- inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
135- id="perspective2865" />
136- <inkscape:perspective
137- id="perspective2843"
138- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
139- inkscape:vp_z="1 : 0.5 : 1"
140- inkscape:vp_y="0 : 1000 : 0"
141- inkscape:vp_x="0 : 0.5 : 1"
142- sodipodi:type="inkscape:persp3d" />
143+ id="defs2745">
144 <linearGradient
145 inkscape:collect="always"
146- xlink:href="#linearGradient76469-7-7-4"
147- id="linearGradient38024"
148- gradientUnits="userSpaceOnUse"
149- gradientTransform="matrix(1.0215462,0,0,1.0322581,717.22867,428.68472)"
150- x1="6"
151- y1="102.95528"
152- x2="6"
153- y2="84.505203" />
154- <linearGradient
155- inkscape:collect="always"
156- id="linearGradient76469-7-7-4">
157+ id="linearGradient3329">
158 <stop
159- style="stop-color:#2e3232;stop-opacity:1"
160+ style="stop-color:#39393a;stop-opacity:1;"
161 offset="0"
162- id="stop76471-7-1-5" />
163+ id="stop3325" />
164 <stop
165- style="stop-color:#3e4545;stop-opacity:1"
166+ style="stop-color:#302f30;stop-opacity:1"
167 offset="1"
168- id="stop76473-9-0-0" />
169+ id="stop3327" />
170 </linearGradient>
171- <inkscape:path-effect
172- effect="spiro"
173- id="path-effect77541-4"
174- is_visible="true" />
175- <inkscape:path-effect
176- effect="spiro"
177- id="path-effect77541-4-0"
178- is_visible="true" />
179 <linearGradient
180 inkscape:collect="always"
181- xlink:href="#linearGradient37802-8"
182- id="linearGradient12311-3-1-0-5-4"
183- gradientUnits="userSpaceOnUse"
184- gradientTransform="matrix(1.5918367,0,0,0.85714285,-256.56122,59.071426)"
185- x1="610.13782"
186- y1="501.43866"
187- x2="610.13782"
188- y2="492.52756" />
189- <linearGradient
190- id="linearGradient37802-8"
191- inkscape:collect="always">
192- <stop
193- id="stop37804-1"
194- offset="0"
195- style="stop-color:#2c2c2c;stop-opacity:1" />
196- <stop
197- id="stop37806-8"
198- offset="1"
199- style="stop-color:#16191a;stop-opacity:1" />
200- </linearGradient>
201- <linearGradient
202- y2="492.52756"
203- x2="610.13782"
204- y1="501.43866"
205- x1="610.13782"
206- gradientTransform="matrix(1.5918367,0,0,0.85714285,-900.56122,-423.92857)"
207+ xlink:href="#linearGradient3329"
208+ id="linearGradient3331"
209+ x1="53"
210+ y1="294.42917"
211+ x2="53"
212+ y2="309.80417"
213 gradientUnits="userSpaceOnUse"
214- id="linearGradient13602"
215- xlink:href="#linearGradient37802-8"
216- inkscape:collect="always" />
217+ gradientTransform="translate(-42.760724)" />
218 </defs>
219 <sodipodi:namedview
220 id="base"
221- pagecolor="#000000"
222+ pagecolor="#535353"
223 bordercolor="#666666"
224 borderopacity="1.0"
225 inkscape:pageopacity="1"
226 inkscape:pageshadow="2"
227 inkscape:zoom="1"
228- inkscape:cx="-5.0602834"
229- inkscape:cy="16.473273"
230+ inkscape:cx="-19.436775"
231+ inkscape:cy="-13.499723"
232 inkscape:document-units="px"
233- inkscape:current-layer="g37994"
234+ inkscape:current-layer="layer1"
235 showgrid="false"
236- inkscape:window-width="2560"
237- inkscape:window-height="1375"
238- inkscape:window-x="0"
239- inkscape:window-y="27"
240- inkscape:window-maximized="1"
241+ units="px"
242+ inkscape:pagecheckerboard="true"
243 borderlayer="true"
244 inkscape:showpageshadow="false"
245- inkscape:snap-nodes="false"
246- inkscape:snap-bbox="true"
247 showborder="false">
248 <inkscape:grid
249 type="xygrid"
250- id="grid12954"
251- empspacing="5"
252- visible="true"
253- enabled="true"
254- snapvisiblegridlinesonly="true" />
255+ id="grid3298" />
256 </sodipodi:namedview>
257 <metadata
258- id="metadata2862">
259+ id="metadata2748">
260 <rdf:RDF>
261 <cc:Work
262 rdf:about="">
263@@ -142,68 +80,24 @@
264 inkscape:label="Layer 1"
265 inkscape:groupmode="layer"
266 id="layer1"
267- transform="translate(-444.64286,-781.36218)">
268- <g
269- transform="matrix(0.6526046,0,0,0.80554422,99.592644,-636.32172)"
270- id="g37994">
271- <g
272- id="g37996"
273- transform="translate(-115,1277)">
274- <rect
275- 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"
276- id="rect13475"
277- width="98"
278- height="25"
279- x="644.5"
280- y="484.61118"
281- rx="4.7429576"
282- ry="3.8424656" />
283- <rect
284- ry="3.8424656"
285- rx="4.7429576"
286- y="483.5"
287- x="644.5"
288- height="25"
289- width="98"
290- id="rect38000"
291- 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" />
292- </g>
293- <g
294- transform="translate(-49.946213,-1.890275)"
295- id="g38002">
296- <g
297- transform="translate(-115,1247)"
298- style="display:inline"
299- id="g38004">
300- <rect
301- ry="3.7972314"
302- rx="4.6871223"
303- y="515.5"
304- x="694.53046"
305- height="25"
306- width="45.969578"
307- id="rect38006"
308- 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" />
309- <path
310- sodipodi:nodetypes="cc"
311- 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"
312- d="m 699.09675,516.7365 36.86904,0"
313- id="path38016"
314- inkscape:path-effect="#path-effect77541-4"
315- inkscape:original-d="m 699.09675,516.7365 36.86904,0"
316- inkscape:connector-curvature="0" />
317- </g>
318- </g>
319- <path
320- sodipodi:type="arc"
321- 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"
322- id="path13479"
323- sodipodi:cx="16.4375"
324- sodipodi:cy="10.8125"
325- sodipodi:rx="4.3125"
326- sodipodi:ry="4.3125"
327- 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"
328- transform="matrix(1.4212691,0,0,1.1514287,577.38488,1761.1138)" />
329- </g>
330+ transform="translate(0,-291.17916)">
331+ <rect
332+ 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"
333+ id="rect3296"
334+ width="44.446434"
335+ height="20.910645"
336+ x="0.625"
337+ y="291.71494"
338+ rx="10.455324"
339+ ry="10.073335" />
340+ <rect
341+ ry="10.455322"
342+ rx="10.455322"
343+ y="291.71494"
344+ x="0.5428465"
345+ height="20.910645"
346+ width="21.142862"
347+ id="rect3300"
348+ 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" />
349 </g>
350 </svg>
351diff --git a/data/theme/toggle-off-us.svg b/data/theme/toggle-off-us.svg
352deleted file mode 100644
353index 941501d..0000000
354--- a/data/theme/toggle-off-us.svg
355+++ /dev/null
356@@ -1,255 +0,0 @@
357-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
358-<!-- Created with Inkscape (http://www.inkscape.org/) -->
359-
360-<svg
361- xmlns:dc="http://purl.org/dc/elements/1.1/"
362- xmlns:cc="http://creativecommons.org/ns#"
363- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
364- xmlns:svg="http://www.w3.org/2000/svg"
365- xmlns="http://www.w3.org/2000/svg"
366- xmlns:xlink="http://www.w3.org/1999/xlink"
367- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
368- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
369- width="65"
370- height="22"
371- id="svg2857"
372- version="1.1"
373- inkscape:version="0.48.5 r10040"
374- sodipodi:docname="toggle-on-intl.svg">
375- <defs
376- id="defs2859">
377- <inkscape:perspective
378- sodipodi:type="inkscape:persp3d"
379- inkscape:vp_x="0 : 526.18109 : 1"
380- inkscape:vp_y="0 : 1000 : 0"
381- inkscape:vp_z="744.09448 : 526.18109 : 1"
382- inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
383- id="perspective2865" />
384- <inkscape:perspective
385- id="perspective2843"
386- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
387- inkscape:vp_z="1 : 0.5 : 1"
388- inkscape:vp_y="0 : 1000 : 0"
389- inkscape:vp_x="0 : 0.5 : 1"
390- sodipodi:type="inkscape:persp3d" />
391- <linearGradient
392- inkscape:collect="always"
393- xlink:href="#linearGradient76469-7-7-4"
394- id="linearGradient38024"
395- gradientUnits="userSpaceOnUse"
396- gradientTransform="matrix(1.0215462,0,0,1.0322581,717.22867,428.68472)"
397- x1="6"
398- y1="102.95528"
399- x2="6"
400- y2="84.505203" />
401- <linearGradient
402- inkscape:collect="always"
403- id="linearGradient76469-7-7-4">
404- <stop
405- style="stop-color:#2e3232;stop-opacity:1"
406- offset="0"
407- id="stop76471-7-1-5" />
408- <stop
409- style="stop-color:#3e4545;stop-opacity:1"
410- offset="1"
411- id="stop76473-9-0-0" />
412- </linearGradient>
413- <inkscape:path-effect
414- effect="spiro"
415- id="path-effect77541-4"
416- is_visible="true" />
417- <linearGradient
418- inkscape:collect="always"
419- xlink:href="#linearGradient37802"
420- id="linearGradient12311-3-1-0-5"
421- gradientUnits="userSpaceOnUse"
422- gradientTransform="matrix(1.5918367,0,0,0.85714285,-256.56122,59.071426)"
423- x1="610.13782"
424- y1="501.43866"
425- x2="610.13782"
426- y2="492.52756" />
427- <linearGradient
428- id="linearGradient37802"
429- inkscape:collect="always">
430- <stop
431- id="stop37804"
432- offset="0"
433- style="stop-color:#2c2c2c;stop-opacity:1" />
434- <stop
435- id="stop37806"
436- offset="1"
437- style="stop-color:#16191a;stop-opacity:1" />
438- </linearGradient>
439- <linearGradient
440- inkscape:collect="always"
441- xlink:href="#linearGradient76469-7-7-4-3"
442- id="linearGradient77680"
443- gradientUnits="userSpaceOnUse"
444- gradientTransform="matrix(1,0,0,1.0322581,717.71949,428.68472)"
445- x1="6"
446- y1="102.95528"
447- x2="6"
448- y2="84.505203" />
449- <linearGradient
450- inkscape:collect="always"
451- id="linearGradient76469-7-7-4-3">
452- <stop
453- style="stop-color:#2e3232;stop-opacity:1"
454- offset="0"
455- id="stop76471-7-1-5-7" />
456- <stop
457- style="stop-color:#3e4545;stop-opacity:1"
458- offset="1"
459- id="stop76473-9-0-0-9" />
460- </linearGradient>
461- <inkscape:path-effect
462- effect="spiro"
463- id="path-effect77541-4-0"
464- is_visible="true" />
465- <linearGradient
466- inkscape:collect="always"
467- xlink:href="#linearGradient37802-8"
468- id="linearGradient12311-3-1-0-5-4"
469- gradientUnits="userSpaceOnUse"
470- gradientTransform="matrix(1.5918367,0,0,0.85714285,-256.56122,59.071426)"
471- x1="610.13782"
472- y1="501.43866"
473- x2="610.13782"
474- y2="492.52756" />
475- <linearGradient
476- id="linearGradient37802-8"
477- inkscape:collect="always">
478- <stop
479- id="stop37804-1"
480- offset="0"
481- style="stop-color:#2c2c2c;stop-opacity:1" />
482- <stop
483- id="stop37806-8"
484- offset="1"
485- style="stop-color:#16191a;stop-opacity:1" />
486- </linearGradient>
487- <linearGradient
488- y2="492.52756"
489- x2="610.13782"
490- y1="501.43866"
491- x1="610.13782"
492- gradientTransform="matrix(1.5918367,0,0,0.85714285,-900.56122,-423.92857)"
493- gradientUnits="userSpaceOnUse"
494- id="linearGradient13602"
495- xlink:href="#linearGradient37802-8"
496- inkscape:collect="always" />
497- </defs>
498- <sodipodi:namedview
499- id="base"
500- pagecolor="#000000"
501- bordercolor="#666666"
502- borderopacity="1.0"
503- inkscape:pageopacity="1"
504- inkscape:pageshadow="2"
505- inkscape:zoom="1"
506- inkscape:cx="16.760995"
507- inkscape:cy="21.955673"
508- inkscape:document-units="px"
509- inkscape:current-layer="g37994"
510- showgrid="false"
511- inkscape:window-width="2560"
512- inkscape:window-height="1375"
513- inkscape:window-x="0"
514- inkscape:window-y="27"
515- inkscape:window-maximized="1"
516- borderlayer="true"
517- inkscape:showpageshadow="false"
518- inkscape:snap-nodes="false"
519- inkscape:snap-bbox="true"
520- showborder="false">
521- <inkscape:grid
522- type="xygrid"
523- id="grid12954"
524- empspacing="5"
525- visible="true"
526- enabled="true"
527- snapvisiblegridlinesonly="true" />
528- </sodipodi:namedview>
529- <metadata
530- id="metadata2862">
531- <rdf:RDF>
532- <cc:Work
533- rdf:about="">
534- <dc:format>image/svg+xml</dc:format>
535- <dc:type
536- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
537- <dc:title></dc:title>
538- </cc:Work>
539- </rdf:RDF>
540- </metadata>
541- <g
542- inkscape:label="Layer 1"
543- inkscape:groupmode="layer"
544- id="layer1"
545- transform="translate(-444.64286,-781.36218)">
546- <g
547- transform="matrix(0.6526046,0,0,0.80554422,99.592644,-636.32172)"
548- id="g37994">
549- <g
550- id="g37996"
551- transform="translate(-115,1277)">
552- <rect
553- 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"
554- id="rect13475"
555- width="98"
556- height="25"
557- x="644.5"
558- y="484.61118"
559- rx="4.7429576"
560- ry="3.8424656" />
561- <rect
562- ry="3.8424656"
563- rx="4.7429576"
564- y="483.5"
565- x="644.5"
566- height="25"
567- width="98"
568- id="rect38000"
569- 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" />
570- </g>
571- <g
572- transform="translate(-49.946213,-1.890275)"
573- id="g38002">
574- <g
575- transform="translate(-115,1247)"
576- style="display:inline"
577- id="g38004">
578- <rect
579- ry="3.7972314"
580- rx="4.6871223"
581- y="515.5"
582- x="694.53046"
583- height="25"
584- width="45.969578"
585- id="rect38006"
586- 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" />
587- <path
588- sodipodi:nodetypes="cc"
589- 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"
590- d="m 699.09675,516.7365 36.86904,0"
591- id="path38016"
592- inkscape:path-effect="#path-effect77541-4"
593- inkscape:original-d="m 699.09675,516.7365 36.86904,0"
594- inkscape:connector-curvature="0" />
595- </g>
596- </g>
597- <text
598- xml:space="preserve"
599- 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"
600- x="520.29974"
601- y="1997.0011"
602- id="text75614"
603- sodipodi:linespacing="125%"
604- transform="scale(1.1236771,0.88993537)"><tspan
605- sodipodi:role="line"
606- id="tspan75616"
607- x="520.29974"
608- y="1997.0011">OFF</tspan></text>
609- </g>
610- </g>
611-</svg>
612diff --git a/data/theme/toggle-on-intl.svg b/data/theme/toggle-on-intl.svg
613index b007065..142e0a8 100644
614--- a/data/theme/toggle-on-intl.svg
615+++ b/data/theme/toggle-on-intl.svg
616@@ -10,117 +10,69 @@
617 xmlns:xlink="http://www.w3.org/1999/xlink"
618 xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
619 xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
620- width="65"
621+ width="46"
622 height="22"
623- id="svg2857"
624+ viewBox="0 0 46 22"
625 version="1.1"
626- inkscape:version="0.91 r13725"
627+ id="svg2751"
628+ inkscape:version="0.92.4 5da689c313, 2019-01-14"
629 sodipodi:docname="toggle-on-intl.svg">
630 <defs
631- id="defs2859">
632- <inkscape:perspective
633- sodipodi:type="inkscape:persp3d"
634- inkscape:vp_x="0 : 526.18109 : 1"
635- inkscape:vp_y="0 : 1000 : 0"
636- inkscape:vp_z="744.09448 : 526.18109 : 1"
637- inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
638- id="perspective2865" />
639- <inkscape:perspective
640- id="perspective2843"
641- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
642- inkscape:vp_z="1 : 0.5 : 1"
643- inkscape:vp_y="0 : 1000 : 0"
644- inkscape:vp_x="0 : 0.5 : 1"
645- sodipodi:type="inkscape:persp3d" />
646+ id="defs2745">
647 <linearGradient
648 inkscape:collect="always"
649- xlink:href="#linearGradient77461"
650- id="linearGradient77551"
651- gradientUnits="userSpaceOnUse"
652- gradientTransform="matrix(1.3066667,0,0,1,-841.64667,-483)"
653- x1="1164.7644"
654- y1="962.93695"
655- x2="1164.7644"
656- y2="970.51404" />
657- <linearGradient
658- id="linearGradient77461"
659- inkscape:collect="always">
660+ id="linearGradient3329">
661 <stop
662- id="stop77463"
663+ style="stop-color:#39393a;stop-opacity:1;"
664 offset="0"
665- style="stop-color:#182f4c;stop-opacity:1" />
666+ id="stop3325" />
667 <stop
668- id="stop77465"
669+ style="stop-color:#302f30;stop-opacity:1"
670 offset="1"
671- style="stop-color:#205b9a;stop-opacity:1" />
672+ id="stop3327" />
673 </linearGradient>
674 <linearGradient
675 inkscape:collect="always"
676- xlink:href="#linearGradient76469-7-7-4"
677- id="linearGradient38024"
678+ xlink:href="#linearGradient3329"
679+ id="linearGradient3331"
680+ x1="53"
681+ y1="294.42917"
682+ x2="53"
683+ y2="309.80417"
684 gradientUnits="userSpaceOnUse"
685- gradientTransform="matrix(1.0215462,0,0,1.0322581,717.22867,428.68472)"
686- x1="6"
687- y1="102.95528"
688- x2="6"
689- y2="84.505203" />
690- <linearGradient
691- inkscape:collect="always"
692- id="linearGradient76469-7-7-4">
693- <stop
694- style="stop-color:#2e3232;stop-opacity:1"
695- offset="0"
696- id="stop76471-7-1-5" />
697- <stop
698- style="stop-color:#3e4545;stop-opacity:1"
699- offset="1"
700- id="stop76473-9-0-0" />
701- </linearGradient>
702- <inkscape:path-effect
703- effect="spiro"
704- id="path-effect77541-4"
705- is_visible="true" />
706+ gradientTransform="translate(-19)" />
707 </defs>
708 <sodipodi:namedview
709 id="base"
710- pagecolor="#000000"
711+ pagecolor="#535353"
712 bordercolor="#666666"
713 borderopacity="1.0"
714 inkscape:pageopacity="1"
715 inkscape:pageshadow="2"
716 inkscape:zoom="1"
717- inkscape:cx="37.410841"
718- inkscape:cy="16.009314"
719+ inkscape:cx="13.588971"
720+ inkscape:cy="14.124546"
721 inkscape:document-units="px"
722- inkscape:current-layer="g37994"
723+ inkscape:current-layer="layer1"
724 showgrid="false"
725- inkscape:window-width="2560"
726- inkscape:window-height="1376"
727- inkscape:window-x="0"
728- inkscape:window-y="27"
729- inkscape:window-maximized="1"
730+ units="px"
731+ inkscape:pagecheckerboard="true"
732 borderlayer="true"
733 inkscape:showpageshadow="false"
734- inkscape:snap-nodes="false"
735- inkscape:snap-bbox="true"
736 showborder="false">
737 <inkscape:grid
738 type="xygrid"
739- id="grid12954"
740- empspacing="5"
741- visible="true"
742- enabled="true"
743- snapvisiblegridlinesonly="true" />
744+ id="grid3298" />
745 </sodipodi:namedview>
746 <metadata
747- id="metadata2862">
748+ id="metadata2748">
749 <rdf:RDF>
750 <cc:Work
751 rdf:about="">
752 <dc:format>image/svg+xml</dc:format>
753 <dc:type
754 rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
755- <dc:title />
756+ <dc:title></dc:title>
757 </cc:Work>
758 </rdf:RDF>
759 </metadata>
760@@ -128,65 +80,24 @@
761 inkscape:label="Layer 1"
762 inkscape:groupmode="layer"
763 id="layer1"
764- transform="translate(-444.64286,-781.36218)">
765- <g
766- transform="matrix(0.6526046,0,0,0.80554422,99.592644,-636.32172)"
767- id="g37994">
768- <g
769- id="g37996"
770- transform="translate(-115,1277)">
771- <rect
772- 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"
773- id="rect13475"
774- width="98"
775- height="25"
776- x="644.5"
777- y="484.61118"
778- rx="4.7429576"
779- ry="3.8424656" />
780- <rect
781- ry="3.8424656"
782- rx="4.7429576"
783- y="483.5"
784- x="644.5"
785- height="25"
786- width="98"
787- id="rect38000"
788- 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" />
789- </g>
790- <g
791- transform="translate(2.0625,-2)"
792- id="g38002">
793- <g
794- transform="translate(-115,1247)"
795- style="display:inline"
796- id="g38004">
797- <rect
798- ry="3.7972314"
799- rx="4.6871223"
800- y="515.5"
801- x="694.53046"
802- height="25"
803- width="45.969578"
804- id="rect38006"
805- 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" />
806- <path
807- sodipodi:nodetypes="cc"
808- 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"
809- d="m 699.09675,516.7365 36.86904,0"
810- id="path38016"
811- inkscape:path-effect="#path-effect77541-4"
812- inkscape:original-d="m 699.09675,516.7365 36.86904,0"
813- inkscape:connector-curvature="0" />
814- </g>
815- </g>
816- <rect
817- 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"
818- id="rect13678"
819- width="3.0646207"
820- height="12.414008"
821- x="554.77728"
822- y="1767.3566" />
823- </g>
824+ transform="translate(0,-291.17916)">
825+ <rect
826+ 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"
827+ id="rect3296"
828+ width="44.446434"
829+ height="20.910645"
830+ x="0.625"
831+ y="291.71494"
832+ rx="10.455324"
833+ ry="10.073335" />
834+ <rect
835+ ry="10.455322"
836+ rx="10.455322"
837+ y="291.71494"
838+ x="24.30357"
839+ height="20.910645"
840+ width="21.142862"
841+ id="rect3300"
842+ 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" />
843 </g>
844 </svg>
845diff --git a/data/theme/toggle-on-us.svg b/data/theme/toggle-on-us.svg
846deleted file mode 100644
847index 501fc30..0000000
848--- a/data/theme/toggle-on-us.svg
849+++ /dev/null
850@@ -1,207 +0,0 @@
851-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
852-<!-- Created with Inkscape (http://www.inkscape.org/) -->
853-
854-<svg
855- xmlns:dc="http://purl.org/dc/elements/1.1/"
856- xmlns:cc="http://creativecommons.org/ns#"
857- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
858- xmlns:svg="http://www.w3.org/2000/svg"
859- xmlns="http://www.w3.org/2000/svg"
860- xmlns:xlink="http://www.w3.org/1999/xlink"
861- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
862- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
863- width="65"
864- height="22"
865- id="svg2857"
866- version="1.1"
867- inkscape:version="0.91 r13725"
868- sodipodi:docname="toggle-on-us.svg">
869- <defs
870- id="defs2859">
871- <inkscape:perspective
872- sodipodi:type="inkscape:persp3d"
873- inkscape:vp_x="0 : 526.18109 : 1"
874- inkscape:vp_y="0 : 1000 : 0"
875- inkscape:vp_z="744.09448 : 526.18109 : 1"
876- inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
877- id="perspective2865" />
878- <inkscape:perspective
879- id="perspective2843"
880- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
881- inkscape:vp_z="1 : 0.5 : 1"
882- inkscape:vp_y="0 : 1000 : 0"
883- inkscape:vp_x="0 : 0.5 : 1"
884- sodipodi:type="inkscape:persp3d" />
885- <linearGradient
886- inkscape:collect="always"
887- xlink:href="#linearGradient76469-7-7-4"
888- id="linearGradient38024"
889- gradientUnits="userSpaceOnUse"
890- gradientTransform="matrix(1.0215462,0,0,1.0322581,717.22867,428.68472)"
891- x1="6"
892- y1="102.95528"
893- x2="6"
894- y2="84.505203" />
895- <linearGradient
896- inkscape:collect="always"
897- id="linearGradient76469-7-7-4">
898- <stop
899- style="stop-color:#2e3232;stop-opacity:1"
900- offset="0"
901- id="stop76471-7-1-5" />
902- <stop
903- style="stop-color:#3e4545;stop-opacity:1"
904- offset="1"
905- id="stop76473-9-0-0" />
906- </linearGradient>
907- <inkscape:path-effect
908- effect="spiro"
909- id="path-effect77541-4"
910- is_visible="true" />
911- <linearGradient
912- id="linearGradient77461-1"
913- inkscape:collect="always">
914- <stop
915- id="stop77463-1"
916- offset="0"
917- style="stop-color:#182f4c;stop-opacity:1" />
918- <stop
919- id="stop77465-4"
920- offset="1"
921- style="stop-color:#205b9a;stop-opacity:1" />
922- </linearGradient>
923- <linearGradient
924- inkscape:collect="always"
925- xlink:href="#linearGradient77461-1"
926- id="linearGradient77551-6-5"
927- gradientUnits="userSpaceOnUse"
928- gradientTransform="matrix(0.8527367,0,0,0.80554422,-969.41608,-778.00299)"
929- x1="1164.7644"
930- y1="962.93695"
931- x2="1164.7644"
932- y2="970.51404" />
933- <linearGradient
934- inkscape:collect="always"
935- xlink:href="#linearGradient77461-1"
936- id="linearGradient11198"
937- gradientUnits="userSpaceOnUse"
938- gradientTransform="matrix(1.3066667,0,0,1,-1066.3709,794.25325)"
939- x1="1322.5831"
940- y1="-312.51855"
941- x2="1322.5831"
942- y2="-306.53461" />
943- </defs>
944- <sodipodi:namedview
945- id="base"
946- pagecolor="#000000"
947- bordercolor="#666666"
948- borderopacity="1.0"
949- inkscape:pageopacity="1"
950- inkscape:pageshadow="2"
951- inkscape:zoom="1"
952- inkscape:cx="-26.798898"
953- inkscape:cy="5.3753009"
954- inkscape:document-units="px"
955- inkscape:current-layer="g37994"
956- showgrid="false"
957- inkscape:window-width="2560"
958- inkscape:window-height="1376"
959- inkscape:window-x="0"
960- inkscape:window-y="27"
961- inkscape:window-maximized="1"
962- borderlayer="true"
963- inkscape:showpageshadow="false"
964- inkscape:snap-nodes="false"
965- inkscape:snap-bbox="true"
966- showborder="false">
967- <inkscape:grid
968- type="xygrid"
969- id="grid12954"
970- empspacing="5"
971- visible="true"
972- enabled="true"
973- snapvisiblegridlinesonly="true" />
974- </sodipodi:namedview>
975- <metadata
976- id="metadata2862">
977- <rdf:RDF>
978- <cc:Work
979- rdf:about="">
980- <dc:format>image/svg+xml</dc:format>
981- <dc:type
982- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
983- <dc:title />
984- </cc:Work>
985- </rdf:RDF>
986- </metadata>
987- <g
988- inkscape:label="Layer 1"
989- inkscape:groupmode="layer"
990- id="layer1"
991- transform="translate(-444.64286,-781.36218)">
992- <g
993- transform="matrix(0.6526046,0,0,0.80554422,99.592644,-636.32172)"
994- id="g37994">
995- <g
996- id="g37996"
997- transform="translate(-115,1277)">
998- <rect
999- 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"
1000- id="rect13475"
1001- width="98"
1002- height="25"
1003- x="644.5"
1004- y="484.61118"
1005- rx="4.7429576"
1006- ry="3.8424656" />
1007- <rect
1008- ry="3.8424656"
1009- rx="4.7429576"
1010- y="483.5"
1011- x="644.5"
1012- height="25"
1013- width="98"
1014- id="rect38000"
1015- 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" />
1016- </g>
1017- <g
1018- transform="translate(2.0625,-2)"
1019- id="g38002">
1020- <g
1021- transform="translate(-115,1247)"
1022- style="display:inline"
1023- id="g38004">
1024- <rect
1025- ry="3.7972314"
1026- rx="4.6871223"
1027- y="515.5"
1028- x="694.53046"
1029- height="25"
1030- width="45.969578"
1031- id="rect38006"
1032- 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" />
1033- <path
1034- sodipodi:nodetypes="cc"
1035- 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"
1036- d="m 699.09675,516.7365 36.86904,0"
1037- id="path38016"
1038- inkscape:path-effect="#path-effect77541-4"
1039- inkscape:original-d="m 699.09675,516.7365 36.86904,0"
1040- inkscape:connector-curvature="0" />
1041- </g>
1042- </g>
1043- <text
1044- transform="scale(1.1000946,0.90901274)"
1045- sodipodi:linespacing="125%"
1046- id="text38018"
1047- y="1955.5205"
1048- x="495.94223"
1049- 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"
1050- xml:space="preserve"><tspan
1051- y="1955.5205"
1052- x="495.94223"
1053- id="tspan38020"
1054- sodipodi:role="line">ON</tspan></text>
1055- </g>
1056- </g>
1057-</svg>
1058diff --git a/debian/.gitignore b/debian/.gitignore
1059new file mode 100644
1060index 0000000..a320335
1061--- /dev/null
1062+++ b/debian/.gitignore
1063@@ -0,0 +1,10 @@
1064+/*.debhelper
1065+/*.debhelper.log
1066+/*.substvars
1067+/.debhelper/
1068+/debhelper-build-stamp
1069+/files
1070+/gnome-shell-common/
1071+/gnome-shell/
1072+/home/
1073+/tmp/
1074diff --git a/debian/changelog b/debian/changelog
1075index f1dbe5d..5ea2903 100644
1076--- a/debian/changelog
1077+++ b/debian/changelog
1078@@ -1,3 +1,79 @@
1079+gnome-shell (3.32.1-1ubuntu1) UNRELEASED; urgency=medium
1080+
1081+ * Merge with debian
1082+ - Update to 3.32.1 upstream version (LP: #1826936)
1083+ - Fixes Icon disappears from favorites (LP: #1822846)
1084+ - Fix applications aren't focused in Wayland session (LP: #1826176)
1085+ remaining changes:
1086+ + Replace gnome-backgrounds dep with ubuntu-wallpapers and Suggests
1087+ gnome-themes-standard-data, gnome-backgrounds
1088+ + Add some Recommends:
1089+ - ubuntu-session (| gnome-session) to have the ubuntu session available
1090+ - xserver-xorg-legacy
1091+ - yaru-theme-gnome-shell for the default ubuntu theming
1092+ + Update debian/gbp.conf with Ubuntu settings
1093+ + gnome-shell-common.install: Install Ubuntu mode
1094+ + gnome-shell-common.prerm: Remove deprecated ubuntu theme alternative
1095+ + ubuntu/desktop_detect.patch:
1096+ - add caching for desktop detection to avoid querying the current
1097+ desktop env variable as iterate through the list each time. For the
1098+ time of the Shell process, we can expect this env variable to stay
1099+ stable.
1100+ + ubuntu/smarter_alt_tab.patch:
1101+ - quick alt-tab (without showing up the switcher) switch only between
1102+ the last window of the last 2 applications to be focused instead of
1103+ raising all windows of those apps.
1104+ + ubuntu/lightdm-user-switching.patch:
1105+ - Allow user switching when using LightDM.
1106+ + ubuntu/lock_on_suspend.patch
1107+ - Respect Ubuntu's lock-on-suspend setting.
1108+ + ubuntu/gdm.patch
1109+ - as gdm is system-wide and not session-wide, ensure gdm has an ubuntu
1110+ styling by default, not impacting the gnome user session though.
1111+ + ubuntu/background_login.patch
1112+ - Change default background color as we modified the default GDM color
1113+ for our ubuntu session. Change it as well here, still applying the
1114+ background noise loading.
1115+ + ubuntu/gdm_alternatives.patch
1116+ - Add support for GDM3 theme alternatives
1117+ + ubuntu/block_mode_extension_update.patch
1118+ - Don't allow ubuntu mode extension to update
1119+ + optional-hot-corner.patch
1120+ - enable patch proposed by upstream developer already in package (but
1121+ not in series) to add a settings for optional hot corner activation.
1122+ + volume-Add-back-sound-feedback-on-scroll.patch
1123+ - Fix regression causing missing feedback on volume slider scroll
1124+ + main-show-an-error-message-on-gnome-shell-crash.patch,
1125+ global-make-possible-to-set-debug-flags-dynamically.patch,
1126+ main-increase-the-granularity-of-backtraces-in-SHELL_DEBU.patch,
1127+ main-add-backtrace-crashes-all-and-backtrace-all.patch,
1128+ sessionMode-add-support-for-debugFlags-parameter.patch:
1129+ - Improve debug JS tracing for crash reports
1130+ + st-scroll-view-Handle-the-case-where-scrollbars-are-NULL.patch,
1131+ st-scroll-view-Remove-scrollbars-references-on-dispose.patch:
1132+ - Fix crash on theme changes
1133+ + ubuntu/search-call-XUbuntuCancel-method-on-providers-when-no-dat.patch:
1134+ - stop searches when requested from UI
1135+ + magnifier-Show-cursor-when-magnifier-is-enabled-and-scale.patch:
1136+ - Show monitor scaled cursor when magnifier is enabled
1137+ * d/p/magnifier-Show-cursor-when-magnifier-is-enabled-and-scale.patch:
1138+ - Handle the no-monitor case (LP: #1826797)
1139+
1140+ -- Marco Trevisan (Treviño) <marco@ubuntu.com> Mon, 29 Apr 2019 17:29:23 -0500
1141+
1142+gnome-shell (3.32.1-1) experimental; urgency=medium
1143+
1144+ [ Simon McVittie ]
1145+ * d/rules: Create a temporary HOME, XDG_RUNTIME_DIR for the unit tests.
1146+ This goes some way towards fixing test failures and FTBFS on buster's
1147+ sbuild, as deployed on the s390x buildd.
1148+ * d/.gitignore: Add
1149+
1150+ [ Laurent Bigonville ]
1151+ * New upstream release
1152+
1153+ -- Laurent Bigonville <bigon@debian.org> Mon, 22 Apr 2019 15:45:49 +0200
1154+
1155 gnome-shell (3.32.0+git20190410-1ubuntu1) disco; urgency=medium
1156
1157 * Merging with debian git snapshot (LP: #1820775, LP: #1818790),
1158diff --git a/debian/clean b/debian/clean
1159new file mode 100644
1160index 0000000..3d6866b
1161--- /dev/null
1162+++ b/debian/clean
1163@@ -0,0 +1 @@
1164+debian/home/
1165diff --git a/debian/patches/magnifier-Show-cursor-when-magnifier-is-enabled-and-scale.patch b/debian/patches/magnifier-Show-cursor-when-magnifier-is-enabled-and-scale.patch
1166index 879b647..58a5ad5 100644
1167--- a/debian/patches/magnifier-Show-cursor-when-magnifier-is-enabled-and-scale.patch
1168+++ b/debian/patches/magnifier-Show-cursor-when-magnifier-is-enabled-and-scale.patch
1169@@ -1,7 +1,6 @@
1170 From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= <mail@3v1n0.net>
1171-Date: Wed, 27 Mar 2019 16:14:39 +0100
1172-Subject: magnifier: Scale the sprite to match the current monitor
1173- scaling
1174+Date: Wed, 27 Mar 2019 09:14:39 -0600
1175+Subject: magnifier: Scale the sprite to match the current monitor scaling
1176
1177 Compute the sprite texture scale (unfortunately using a workaround, based on
1178 mutter cursor size preferences, tying to figure out the closest texture integer
1179@@ -13,11 +12,11 @@ Applied-Upstream: no
1180 Forwarded: yes
1181 ---
1182 js/ui/layout.js | 24 ++++++++++++++++++++----
1183- js/ui/magnifier.js | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++--
1184- 2 files changed, 72 insertions(+), 6 deletions(-)
1185+ js/ui/magnifier.js | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++--
1186+ 2 files changed, 73 insertions(+), 6 deletions(-)
1187
1188 diff --git a/js/ui/layout.js b/js/ui/layout.js
1189-index 27a3099..376a585 100644
1190+index 2683213..1b5beaf 100644
1191 --- a/js/ui/layout.js
1192 +++ b/js/ui/layout.js
1193 @@ -930,22 +930,38 @@ var LayoutManager = GObject.registerClass({
1194@@ -64,7 +63,7 @@ index 27a3099..376a585 100644
1195 if (this._startingUp)
1196 return;
1197 diff --git a/js/ui/magnifier.js b/js/ui/magnifier.js
1198-index 021dbd8..2bbfcdd 100644
1199+index 021dbd8..611a656 100644
1200 --- a/js/ui/magnifier.js
1201 +++ b/js/ui/magnifier.js
1202 @@ -48,6 +48,8 @@ var MouseSpriteContent = GObject.registerClass({
1203@@ -148,20 +147,21 @@ index 021dbd8..2bbfcdd 100644
1204 St.Settings.get().connect('notify::magnifier-active', () => {
1205 this.setActive(St.Settings.get().magnifier_active);
1206 });
1207-@@ -126,6 +168,12 @@ var Magnifier = class Magnifier {
1208+@@ -126,6 +168,13 @@ var Magnifier = class Magnifier {
1209 this.setActive(St.Settings.get().magnifier_active);
1210 }
1211
1212 + _updateContentScale() {
1213 + let monitor = Main.layoutManager.findMonitorForPoint(this.xMouse,
1214 + this.yMouse);
1215-+ this._mouseSprite.content.monitorScale = monitor.geometry_scale;
1216++ this._mouseSprite.content.monitorScale = monitor ?
1217++ monitor.geometry_scale : 1;
1218 + }
1219 +
1220 /**
1221 * showSystemCursor:
1222 * Show the system mouse pointer.
1223-@@ -235,6 +283,8 @@ var Magnifier = class Magnifier {
1224+@@ -235,6 +284,8 @@ var Magnifier = class Magnifier {
1225 this.xMouse = xMouse;
1226 this.yMouse = yMouse;
1227
1228diff --git a/debian/patches/optional-hot-corner.patch b/debian/patches/optional-hot-corner.patch
1229index ab55e96..5255f74 100644
1230--- a/debian/patches/optional-hot-corner.patch
1231+++ b/debian/patches/optional-hot-corner.patch
1232@@ -33,7 +33,7 @@ index 24e2a75..2a5432a 100644
1233 <default>[ 'epiphany.desktop', 'evolution.desktop', 'rhythmbox.desktop', 'shotwell.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Software.desktop' ]</default>
1234 <summary>List of desktop file IDs for favorite applications</summary>
1235 diff --git a/js/ui/layout.js b/js/ui/layout.js
1236-index e3c93a9..27a3099 100644
1237+index 30e750d..2683213 100644
1238 --- a/js/ui/layout.js
1239 +++ b/js/ui/layout.js
1240 @@ -267,6 +267,9 @@ var LayoutManager = GObject.registerClass({
1241diff --git a/debian/patches/ubuntu/resolve_alternate_theme_path.patch b/debian/patches/ubuntu/resolve_alternate_theme_path.patch
1242index 6a2ca7d..ec839b2 100644
1243--- a/debian/patches/ubuntu/resolve_alternate_theme_path.patch
1244+++ b/debian/patches/ubuntu/resolve_alternate_theme_path.patch
1245@@ -1,5 +1,5 @@
1246 From: Didier Roche <didrocks@ubuntu.com>
1247-Date: Tue, 22 Oct 2019 11:22:06 +0200
1248+Date: Tue, 22 Oct 2019 04:22:06 -0500
1249 Subject: Resolve real path name for theme file
1250
1251 We are using alternative theme paths. Some of them are symlinks like
1252diff --git a/debian/patches/ubuntu/search-call-XUbuntuCancel-method-on-providers-when-no-dat.patch b/debian/patches/ubuntu/search-call-XUbuntuCancel-method-on-providers-when-no-dat.patch
1253index 611e61f..e1d7197 100644
1254--- a/debian/patches/ubuntu/search-call-XUbuntuCancel-method-on-providers-when-no-dat.patch
1255+++ b/debian/patches/ubuntu/search-call-XUbuntuCancel-method-on-providers-when-no-dat.patch
1256@@ -1,5 +1,5 @@
1257 From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= <mail@3v1n0.net>
1258-Date: Thu, 23 Aug 2018 20:00:57 +0200
1259+Date: Thu, 23 Aug 2018 13:00:57 -0500
1260 Subject: search: call XUbuntuCancel method on providers when no data is
1261 needed
1262
1263diff --git a/debian/rules b/debian/rules
1264index 00c6fbf..0831ef7 100755
1265--- a/debian/rules
1266+++ b/debian/rules
1267@@ -38,4 +38,16 @@ override_dh_strip:
1268 dh_strip --dbgsym-migration='gnome-shell-dbg (<< 3.20.2-2~)'
1269
1270 override_dh_auto_test:
1271- xvfb-run -a dh_auto_test
1272+ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS)))
1273+ # Avoid test failures on buildd environments where HOME,
1274+ # XDG_RUNTIME_DIR might be invalid
1275+ mkdir -p -m700 $(CURDIR)/debian/home/run
1276+ env \
1277+ -u XDG_CACHE_HOME \
1278+ -u XDG_CONFIG_DIRS \
1279+ -u XDG_CONFIG_HOME \
1280+ -u XDG_DATA_HOME \
1281+ HOME=$(CURDIR)/debian/home \
1282+ XDG_RUNTIME_DIR=$(CURDIR)/debian/home/run \
1283+ xvfb-run -a dh_auto_test
1284+endif
1285diff --git a/js/extensionPrefs/main.js b/js/extensionPrefs/main.js
1286index 438788f..43efa95 100644
1287--- a/js/extensionPrefs/main.js
1288+++ b/js/extensionPrefs/main.js
1289@@ -551,9 +551,9 @@ class ExtensionRow extends Gtk.ListBoxRow {
1290
1291 let button = new Gtk.Button({ valign: Gtk.Align.CENTER,
1292 no_show_all: true });
1293- button.add(new Gtk.Image({ icon_name: 'emblem-system-symbolic',
1294- icon_size: Gtk.IconSize.BUTTON,
1295- visible: true }));
1296+ button.set_image(new Gtk.Image({ icon_name: 'emblem-system-symbolic',
1297+ icon_size: Gtk.IconSize.BUTTON,
1298+ visible: true }));
1299 button.get_style_context().add_class('circular');
1300 hbox.add(button);
1301
1302diff --git a/js/perf/hwtest.js b/js/perf/hwtest.js
1303index 31a25a7..661f2ef 100644
1304--- a/js/perf/hwtest.js
1305+++ b/js/perf/hwtest.js
1306@@ -1,4 +1,4 @@
1307-const { Clutter, Gio, Gtk, Shell } = imports.gi;
1308+const { Clutter, Gio, Shell } = imports.gi;
1309 const Main = imports.ui.main;
1310 const Scripting = imports.ui.scripting;
1311
1312@@ -104,7 +104,10 @@ function *run() {
1313 yield Scripting.waitLeisure();
1314 Scripting.scriptEvent('desktopShown');
1315
1316- Gtk.Settings.get_default().gtk_enable_animations = false;
1317+ let interfaceSettings = new Gio.Settings({
1318+ schema_id: 'org.gnome.desktop.interface'
1319+ });
1320+ interfaceSettings.set_boolean('enable-animations', false);
1321
1322 Scripting.scriptEvent('overviewShowStart');
1323 Main.overview.show();
1324@@ -200,7 +203,7 @@ function *run() {
1325
1326 yield Scripting.sleep(1000);
1327
1328- Gtk.Settings.get_default().gtk_enable_animations = true;
1329+ interfaceSettings.set_boolean('enable-animations', true);
1330 }
1331
1332 let overviewShowStart;
1333diff --git a/js/ui/appFavorites.js b/js/ui/appFavorites.js
1334index a80504c..657e159 100644
1335--- a/js/ui/appFavorites.js
1336+++ b/js/ui/appFavorites.js
1337@@ -14,39 +14,47 @@ const RENAMED_DESKTOP_IDS = {
1338 'epiphany.desktop': 'org.gnome.Epiphany.desktop',
1339 'evolution.desktop': 'org.gnome.Evolution.desktop',
1340 'file-roller.desktop': 'org.gnome.FileRoller.desktop',
1341+ 'five-or-more.desktop': 'org.gnome.five-or-more.desktop',
1342+ 'four-in-a-row.desktop': 'org.gnome.Four-in-a-row.desktop',
1343 'gcalctool.desktop': 'org.gnome.Calculator.desktop',
1344 'geary.desktop': 'org.gnome.Geary.desktop',
1345 'gedit.desktop': 'org.gnome.gedit.desktop',
1346- 'glchess.desktop': 'gnome-chess.desktop',
1347- 'glines.desktop': 'five-or-more.desktop',
1348- 'gnect.desktop': 'four-in-a-row.desktop',
1349+ 'glchess.desktop': 'org.gnome.Chess.desktop',
1350+ 'glines.desktop': 'org.gnome.five-or-more.desktop',
1351+ 'gnect.desktop': 'org.gnome.Four-in-a-row.desktop',
1352 'gnibbles.desktop': 'org.gnome.Nibbles.desktop',
1353- 'gnobots2.desktop': 'gnome-robots.desktop',
1354+ 'gnobots2.desktop': 'org.gnome.Robots.desktop',
1355 'gnome-boxes.desktop': 'org.gnome.Boxes.desktop',
1356 'gnome-calculator.desktop': 'org.gnome.Calculator.desktop',
1357+ 'gnome-chess.desktop': 'org.gnome.Chess.desktop',
1358 'gnome-clocks.desktop': 'org.gnome.clocks.desktop',
1359 'gnome-contacts.desktop': 'org.gnome.Contacts.desktop',
1360 'gnome-documents.desktop': 'org.gnome.Documents.desktop',
1361 'gnome-font-viewer.desktop': 'org.gnome.font-viewer.desktop',
1362+ 'gnome-klotski.desktop': 'org.gnome.Klotski.desktop',
1363 'gnome-nibbles.desktop': 'org.gnome.Nibbles.desktop',
1364 'gnome-mahjongg.desktop': 'org.gnome.Mahjongg.desktop',
1365+ 'gnome-mines.desktop': 'org.gnome.Mines.desktop',
1366 'gnome-music.desktop': 'org.gnome.Music.desktop',
1367 'gnome-photos.desktop': 'org.gnome.Photos.desktop',
1368+ 'gnome-robots.desktop': 'org.gnome.Robots.desktop',
1369 'gnome-screenshot.desktop': 'org.gnome.Screenshot.desktop',
1370 'gnome-software.desktop': 'org.gnome.Software.desktop',
1371 'gnome-terminal.desktop': 'org.gnome.Terminal.desktop',
1372+ 'gnome-tetravex.desktop': 'org.gnome.Tetravex.desktop',
1373 'gnome-tweaks.desktop': 'org.gnome.tweaks.desktop',
1374 'gnome-weather.desktop': 'org.gnome.Weather.desktop',
1375- 'gnomine.desktop': 'gnome-mines.desktop',
1376- 'gnotravex.desktop': 'gnome-tetravex.desktop',
1377- 'gnotski.desktop': 'gnome-klotski.desktop',
1378- 'gtali.desktop': 'tali.desktop',
1379+ 'gnomine.desktop': 'org.gnome.Mines.desktop',
1380+ 'gnotravex.desktop': 'org.gnome.Tetravex.desktop',
1381+ 'gnotski.desktop': 'org.gnome.Klotski.desktop',
1382+ 'gtali.desktop': 'org.gnome.Tali.desktop',
1383 'iagno.desktop': 'org.gnome.Reversi.desktop',
1384 'nautilus.desktop': 'org.gnome.Nautilus.desktop',
1385 'org.gnome.gnome-2048.desktop': 'org.gnome.TwentyFortyEight.desktop',
1386 'org.gnome.taquin.desktop': 'org.gnome.Taquin.desktop',
1387 'org.gnome.Weather.Application.desktop': 'org.gnome.Weather.desktop',
1388 'polari.desktop': 'org.gnome.Polari.desktop',
1389+ 'tali.desktop': 'org.gnome.Tali.desktop',
1390 'totem.desktop': 'org.gnome.Totem.desktop',
1391 'evince.desktop': 'org.gnome.Evince.desktop',
1392 };
1393diff --git a/js/ui/barLevel.js b/js/ui/barLevel.js
1394index d8d3736..c4072e2 100644
1395--- a/js/ui/barLevel.js
1396+++ b/js/ui/barLevel.js
1397@@ -121,7 +121,8 @@ var BarLevel = class {
1398 cr.lineTo(x, (height - barLevelHeight) / 2);
1399 cr.lineTo(x, (height + barLevelHeight) / 2);
1400 cr.lineTo(barLevelBorderRadius + barLevelBorderWidth, (height + barLevelHeight) / 2);
1401- Clutter.cairo_set_source_color(cr, barLevelActiveColor);
1402+ if (this._value > 0)
1403+ Clutter.cairo_set_source_color(cr, barLevelActiveColor);
1404 cr.fillPreserve();
1405 Clutter.cairo_set_source_color(cr, barLevelActiveBorderColor);
1406 cr.setLineWidth(barLevelBorderWidth);
1407@@ -143,17 +144,19 @@ var BarLevel = class {
1408 }
1409
1410 /* end progress bar arc */
1411- if (this._value <= this._overdriveStart)
1412- Clutter.cairo_set_source_color(cr, barLevelActiveColor);
1413- else
1414- Clutter.cairo_set_source_color(cr, barLevelOverdriveColor);
1415- cr.arc(endX, height / 2, barLevelBorderRadius, TAU * 3 / 4, TAU * 1 / 4);
1416- cr.lineTo(Math.floor(endX), (height + barLevelHeight) / 2);
1417- cr.lineTo(Math.floor(endX), (height - barLevelHeight) / 2);
1418- cr.lineTo(endX, (height - barLevelHeight) / 2);
1419- cr.fillPreserve();
1420- cr.setLineWidth(barLevelBorderWidth);
1421- cr.stroke();
1422+ if (this._value > 0) {
1423+ if (this._value <= this._overdriveStart)
1424+ Clutter.cairo_set_source_color(cr, barLevelActiveColor);
1425+ else
1426+ Clutter.cairo_set_source_color(cr, barLevelOverdriveColor);
1427+ cr.arc(endX, height / 2, barLevelBorderRadius, TAU * 3 / 4, TAU * 1 / 4);
1428+ cr.lineTo(Math.floor(endX), (height + barLevelHeight) / 2);
1429+ cr.lineTo(Math.floor(endX), (height - barLevelHeight) / 2);
1430+ cr.lineTo(endX, (height - barLevelHeight) / 2);
1431+ cr.fillPreserve();
1432+ cr.setLineWidth(barLevelBorderWidth);
1433+ cr.stroke();
1434+ }
1435
1436 /* draw overdrive separator */
1437 if (overdriveActive) {
1438diff --git a/js/ui/boxpointer.js b/js/ui/boxpointer.js
1439index 11b2bdd..c8e5ced 100644
1440--- a/js/ui/boxpointer.js
1441+++ b/js/ui/boxpointer.js
1442@@ -47,10 +47,6 @@ var BoxPointer = GObject.registerClass({
1443 this._border.connect('repaint', this._drawBorder.bind(this));
1444 this.add_actor(this._border);
1445 this.bin.raise(this._border);
1446- this._xOffset = 0;
1447- this._yOffset = 0;
1448- this._xPosition = 0;
1449- this._yPosition = 0;
1450 this._sourceAlignment = 0.5;
1451 this._capturedEventId = 0;
1452 this._muteInput();
1453@@ -118,23 +114,23 @@ var BoxPointer = GObject.registerClass({
1454 if (animate & PopupAnimation.SLIDE) {
1455 switch (this._arrowSide) {
1456 case St.Side.TOP:
1457- this.yOffset = -rise;
1458+ this.translation_y = -rise;
1459 break;
1460 case St.Side.BOTTOM:
1461- this.yOffset = rise;
1462+ this.translation_y = rise;
1463 break;
1464 case St.Side.LEFT:
1465- this.xOffset = -rise;
1466+ this.translation_x = -rise;
1467 break;
1468 case St.Side.RIGHT:
1469- this.xOffset = rise;
1470+ this.translation_x = rise;
1471 break;
1472 }
1473 }
1474
1475 Tweener.addTween(this, { opacity: 255,
1476- xOffset: 0,
1477- yOffset: 0,
1478+ translation_x: 0,
1479+ translation_y: 0,
1480 transition: 'linear',
1481 onComplete: () => {
1482 this._unmuteInput();
1483@@ -148,8 +144,8 @@ var BoxPointer = GObject.registerClass({
1484 if (!this.visible)
1485 return;
1486
1487- let xOffset = 0;
1488- let yOffset = 0;
1489+ let translationX = 0;
1490+ let translationY = 0;
1491 let themeNode = this.get_theme_node();
1492 let rise = themeNode.get_length('-arrow-rise');
1493 let fade = (animate & PopupAnimation.FADE);
1494@@ -158,16 +154,16 @@ var BoxPointer = GObject.registerClass({
1495 if (animate & PopupAnimation.SLIDE) {
1496 switch (this._arrowSide) {
1497 case St.Side.TOP:
1498- yOffset = rise;
1499+ translationY = rise;
1500 break;
1501 case St.Side.BOTTOM:
1502- yOffset = -rise;
1503+ translationY = -rise;
1504 break;
1505 case St.Side.LEFT:
1506- xOffset = rise;
1507+ translationX = rise;
1508 break;
1509 case St.Side.RIGHT:
1510- xOffset = -rise;
1511+ translationX = -rise;
1512 break;
1513 }
1514 }
1515@@ -176,15 +172,15 @@ var BoxPointer = GObject.registerClass({
1516
1517 Tweener.removeTweens(this);
1518 Tweener.addTween(this, { opacity: fade ? 0 : 255,
1519- xOffset: xOffset,
1520- yOffset: yOffset,
1521+ translation_x: translationX,
1522+ translation_y: translationY,
1523 transition: 'linear',
1524 time: animationTime,
1525 onComplete: () => {
1526 this.hide();
1527 this.opacity = 0;
1528- this.xOffset = 0;
1529- this.yOffset = 0;
1530+ this.translation_x = 0;
1531+ this.translation_y = 0;
1532 if (onComplete)
1533 onComplete();
1534 }
1535@@ -477,11 +473,15 @@ var BoxPointer = GObject.registerClass({
1536 _reposition() {
1537 let sourceActor = this._sourceActor;
1538 let alignment = this._arrowAlignment;
1539+ let monitorIndex = Main.layoutManager.findIndexForActor(sourceActor);
1540+
1541+ this._sourceAllocation = Shell.util_get_transformed_allocation(sourceActor);
1542+ this._workArea = Main.layoutManager.getWorkAreaForMonitor(monitorIndex);
1543
1544 // Position correctly relative to the sourceActor
1545 let sourceNode = sourceActor.get_theme_node();
1546 let sourceContentBox = sourceNode.get_content_box(sourceActor.get_allocation_box());
1547- let sourceAllocation = Shell.util_get_transformed_allocation(sourceActor);
1548+ let sourceAllocation = this._sourceAllocation;
1549 let sourceCenterX = sourceAllocation.x1 + sourceContentBox.x1 + (sourceContentBox.x2 - sourceContentBox.x1) * this._sourceAlignment;
1550 let sourceCenterY = sourceAllocation.y1 + sourceContentBox.y1 + (sourceContentBox.y2 - sourceContentBox.y1) * this._sourceAlignment;
1551 let [minWidth, minHeight, natWidth, natHeight] = this.get_preferred_size();
1552@@ -489,8 +489,7 @@ var BoxPointer = GObject.registerClass({
1553 // We also want to keep it onscreen, and separated from the
1554 // edge by the same distance as the main part of the box is
1555 // separated from its sourceActor
1556- let monitorIndex = Main.layoutManager.findIndexForActor(sourceActor);
1557- let workarea = Main.layoutManager.getWorkAreaForMonitor(monitorIndex);
1558+ let workarea = this._workArea;
1559 let themeNode = this.get_theme_node();
1560 let borderWidth = themeNode.get_length('-arrow-border-width');
1561 let arrowBase = themeNode.get_length('-arrow-base');
1562@@ -584,9 +583,9 @@ var BoxPointer = GObject.registerClass({
1563 parent = parent.get_parent();
1564 }
1565
1566- this._xPosition = Math.floor(x);
1567- this._yPosition = Math.floor(y);
1568- this._shiftActor();
1569+ // Actually set the position
1570+ this.x = Math.floor(x);
1571+ this.y = Math.floor(y);
1572 }
1573
1574 // @origin: Coordinate specifying middle of the arrow, along
1575@@ -609,25 +608,10 @@ var BoxPointer = GObject.registerClass({
1576 }
1577 }
1578
1579- _shiftActor() {
1580- // Since the position of the BoxPointer depends on the allocated size
1581- // of the BoxPointer and the position of the source actor, trying
1582- // to position the BoxPointer via the x/y properties will result in
1583- // allocation loops and warnings. Instead we do the positioning via
1584- // the anchor point, which is independent of allocation, and leave
1585- // x == y == 0.
1586- this.set_anchor_point(-(this._xPosition + this._xOffset),
1587- -(this._yPosition + this._yOffset));
1588- }
1589-
1590 _calculateArrowSide(arrowSide) {
1591- let sourceAllocation = Shell.util_get_transformed_allocation(this._sourceActor);
1592+ let sourceAllocation = this._sourceAllocation;
1593 let [minWidth, minHeight, boxWidth, boxHeight] = this.get_preferred_size();
1594- let monitorActor = this.sourceActor;
1595- if (!monitorActor)
1596- monitorActor = this;
1597- let monitorIndex = Main.layoutManager.findIndexForActor(monitorActor);
1598- let workarea = Main.layoutManager.getWorkAreaForMonitor(monitorIndex);
1599+ let workarea = this._workArea;
1600
1601 switch (arrowSide) {
1602 case St.Side.TOP:
1603@@ -669,24 +653,6 @@ var BoxPointer = GObject.registerClass({
1604 }
1605 }
1606
1607- set xOffset(offset) {
1608- this._xOffset = offset;
1609- this._shiftActor();
1610- }
1611-
1612- get xOffset() {
1613- return this._xOffset;
1614- }
1615-
1616- set yOffset(offset) {
1617- this._yOffset = offset;
1618- this._shiftActor();
1619- }
1620-
1621- get yOffset() {
1622- return this._yOffset;
1623- }
1624-
1625 updateArrowSide(side) {
1626 this._arrowSide = side;
1627 this._border.queue_repaint();
1628diff --git a/js/ui/dash.js b/js/ui/dash.js
1629index e60cdd8..6b5aeff 100644
1630--- a/js/ui/dash.js
1631+++ b/js/ui/dash.js
1632@@ -584,22 +584,18 @@ var Dash = class Dash {
1633 let firstButton = iconChildren[0].child;
1634 let firstIcon = firstButton._delegate.icon;
1635
1636- let minHeight, natHeight;
1637- let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
1638-
1639- // Enforce the current icon size during the size request
1640+ // Enforce valid spacings during the size request
1641 firstIcon.icon.ensure_style();
1642- let [, currentHeight] = firstIcon.icon.get_size();
1643- firstIcon.icon.set_height(this.iconSize * scaleFactor);
1644- [minHeight, natHeight] = firstButton.get_preferred_height(-1);
1645- firstIcon.icon.set_height(currentHeight);
1646+ let [, iconHeight] = firstIcon.icon.get_preferred_height(-1);
1647+ let [, buttonHeight] = firstButton.get_preferred_height(-1);
1648
1649 // Subtract icon padding and box spacing from the available height
1650- availHeight -= iconChildren.length * (natHeight - this.iconSize * scaleFactor) +
1651+ availHeight -= iconChildren.length * (buttonHeight - iconHeight) +
1652 (iconChildren.length - 1) * spacing;
1653
1654 let availSize = availHeight / iconChildren.length;
1655
1656+ let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
1657 let iconSizes = baseIconSizes.map(s => s * scaleFactor);
1658
1659 let newIconSize = baseIconSizes[0];
1660diff --git a/js/ui/dateMenu.js b/js/ui/dateMenu.js
1661index 697d6fb..fb32fbb 100644
1662--- a/js/ui/dateMenu.js
1663+++ b/js/ui/dateMenu.js
1664@@ -136,11 +136,12 @@ var WorldClocksSection = class WorldClocksSection {
1665 layout.attach(header, 0, 0, 2, 1);
1666 this.actor.label_actor = header;
1667
1668+ let localOffset = GLib.DateTime.new_now_local().get_utc_offset();
1669+
1670 for (let i = 0; i < this._locations.length; i++) {
1671 let l = this._locations[i].location;
1672
1673- let name = l.get_level() == GWeather.LocationLevel.NAMED_TIMEZONE ? l.get_name()
1674- : l.get_city_name();
1675+ let name = l.get_city_name() || l.get_name();
1676 let label = new St.Label({ style_class: 'world-clocks-city',
1677 text: name,
1678 x_align: Clutter.ActorAlign.START,
1679@@ -149,7 +150,8 @@ var WorldClocksSection = class WorldClocksSection {
1680
1681 let time = new St.Label({ style_class: 'world-clocks-time' });
1682
1683- let offset = l.get_timezone().get_offset() / 60.;
1684+ let otherOffset = this._getTimeAtLocation(l).get_utc_offset();
1685+ let offset = (otherOffset - localOffset) / GLib.TIME_SPAN_HOUR;
1686 let fmt = (Math.trunc(offset) == offset) ? '%s%.0f' : '%s%.1f';
1687 let prefix = (offset >= 0) ? '+' : '-';
1688 let tz = new St.Label({ style_class: 'world-clocks-timezone',
1689@@ -182,11 +184,15 @@ var WorldClocksSection = class WorldClocksSection {
1690 }
1691 }
1692
1693+ _getTimeAtLocation(location) {
1694+ let tz = GLib.TimeZone.new(location.get_timezone().get_tzid());
1695+ return GLib.DateTime.new_now(tz);
1696+ }
1697+
1698 _updateLabels() {
1699 for (let i = 0; i < this._locations.length; i++) {
1700 let l = this._locations[i];
1701- let tz = GLib.TimeZone.new(l.location.get_timezone().get_tzid());
1702- let now = GLib.DateTime.new_now(tz);
1703+ let now = this._getTimeAtLocation(l.location);
1704 l.actor.text = Util.formatTime(now, { timeOnly: true });
1705 }
1706 }
1707diff --git a/js/ui/layout.js b/js/ui/layout.js
1708index e3c93a9..30e750d 100644
1709--- a/js/ui/layout.js
1710+++ b/js/ui/layout.js
1711@@ -252,7 +252,7 @@ var LayoutManager = GObject.registerClass({
1712
1713 // A dummy actor that tracks the mouse or text cursor, based on the
1714 // position and size set in setDummyCursorGeometry.
1715- this.dummyCursor = new St.Widget({ width: 0, height: 0, visible: false });
1716+ this.dummyCursor = new St.Widget({ width: 0, height: 0, opacity: 0 });
1717 this.uiGroup.add_actor(this.dummyCursor);
1718
1719 global.stage.remove_actor(global.top_window_group);
1720diff --git a/js/ui/osdMonitorLabeler.js b/js/ui/osdMonitorLabeler.js
1721index 55b4d3c..62feace 100644
1722--- a/js/ui/osdMonitorLabeler.js
1723+++ b/js/ui/osdMonitorLabeler.js
1724@@ -95,28 +95,6 @@ var OsdMonitorLabeler = class {
1725
1726 this._reset();
1727
1728- for (let id in params) {
1729- let monitor = this._monitorManager.get_monitor_for_output(id);
1730- if (monitor == -1)
1731- continue;
1732- this._monitorLabels.get(monitor).push(params[id].deep_unpack());
1733- }
1734-
1735- // In mirrored display setups, more than one physical outputs
1736- // might be showing the same logical monitor. In that case, we
1737- // join each output's labels on the same OSD widget.
1738- for (let [monitor, labels] of this._monitorLabels.entries()) {
1739- labels.sort();
1740- this._osdLabels.push(new OsdMonitorLabel(monitor, labels.join(' ')));
1741- }
1742- }
1743-
1744- show2(client, params) {
1745- if (!this._trackClient(client))
1746- return;
1747-
1748- this._reset();
1749-
1750 for (let connector in params) {
1751 let monitor = this._monitorManager.get_monitor_for_connector(connector);
1752 if (monitor == -1)
1753diff --git a/js/ui/panel.js b/js/ui/panel.js
1754index 0f052d3..36e16d3 100644
1755--- a/js/ui/panel.js
1756+++ b/js/ui/panel.js
1757@@ -1,6 +1,6 @@
1758 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
1759
1760-const { Atk, Clutter, Gio, GLib, GObject, Gtk, Meta, Shell, St } = imports.gi;
1761+const { Atk, Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi;
1762 const Cairo = imports.cairo;
1763 const Mainloop = imports.mainloop;
1764
1765@@ -201,7 +201,6 @@ var AppMenuButton = GObject.registerClass({
1766 this._startingApps = [];
1767
1768 this._menuManager = panel.menuManager;
1769- this._gtkSettings = Gtk.Settings.get_default();
1770 this._targetApp = null;
1771 this._busyNotifyId = 0;
1772
1773diff --git a/js/ui/popupMenu.js b/js/ui/popupMenu.js
1774index 283934c..4481853 100644
1775--- a/js/ui/popupMenu.js
1776+++ b/js/ui/popupMenu.js
1777@@ -277,12 +277,6 @@ var Switch = class {
1778 this.actor = new St.Bin({ style_class: 'toggle-switch',
1779 accessible_role: Atk.Role.CHECK_BOX,
1780 can_focus: true });
1781- // Translators: this MUST be either "toggle-switch-us"
1782- // (for toggle switches containing the English words
1783- // "ON" and "OFF") or "toggle-switch-intl" (for toggle
1784- // switches containing "◯" and "|"). Other values will
1785- // simply result in invisible toggle switches.
1786- this.actor.add_style_class_name(_("toggle-switch-us"));
1787 this.setToggleState(state);
1788 }
1789
1790diff --git a/js/ui/screenshot.js b/js/ui/screenshot.js
1791index 9261535..c6896ff 100644
1792--- a/js/ui/screenshot.js
1793+++ b/js/ui/screenshot.js
1794@@ -1,6 +1,6 @@
1795 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
1796
1797-const { Clutter, Gio, GLib, Gtk, Meta, Shell, St } = imports.gi;
1798+const { Clutter, Gio, GLib, Meta, Shell, St } = imports.gi;
1799 const Signals = imports.signals;
1800
1801 const GrabHelper = imports.ui.grabHelper;
1802@@ -227,8 +227,6 @@ var SelectArea = class {
1803 this._lastY = 0;
1804 this._result = null;
1805
1806- this._initRubberbandColors();
1807-
1808 this._group = new St.Widget({ visible: false,
1809 reactive: true,
1810 x: 0,
1811@@ -248,10 +246,10 @@ var SelectArea = class {
1812 coordinate: Clutter.BindCoordinate.ALL });
1813 this._group.add_constraint(constraint);
1814
1815- this._rubberband = new Clutter.Rectangle({ color: this._background,
1816- has_border: true,
1817- border_width: 1,
1818- border_color: this._border });
1819+ this._rubberband = new St.Widget({
1820+ style_class: 'select-area-rubberband',
1821+ visible: false
1822+ });
1823 this._group.add_actor(this._rubberband);
1824 }
1825
1826@@ -265,25 +263,6 @@ var SelectArea = class {
1827 this._group.visible = true;
1828 }
1829
1830- _initRubberbandColors() {
1831- function colorFromRGBA(rgba) {
1832- return new Clutter.Color({ red: rgba.red * 255,
1833- green: rgba.green * 255,
1834- blue: rgba.blue * 255,
1835- alpha: rgba.alpha * 255 });
1836- }
1837-
1838- let path = new Gtk.WidgetPath();
1839- path.append_type(Gtk.IconView);
1840-
1841- let context = new Gtk.StyleContext();
1842- context.set_path(path);
1843- context.add_class('rubberband');
1844-
1845- this._background = colorFromRGBA(context.get_background_color(Gtk.StateFlags.NORMAL));
1846- this._border = colorFromRGBA(context.get_border_color(Gtk.StateFlags.NORMAL));
1847- }
1848-
1849 _getGeometry() {
1850 return { x: Math.min(this._startX, this._lastX),
1851 y: Math.min(this._startY, this._lastY),
1852@@ -302,6 +281,7 @@ var SelectArea = class {
1853
1854 this._rubberband.set_position(geometry.x, geometry.y);
1855 this._rubberband.set_size(geometry.width, geometry.height);
1856+ this._rubberband.show();
1857
1858 return Clutter.EVENT_PROPAGATE;
1859 }
1860diff --git a/js/ui/shellDBus.js b/js/ui/shellDBus.js
1861index 469a6c7..19d07ac 100644
1862--- a/js/ui/shellDBus.js
1863+++ b/js/ui/shellDBus.js
1864@@ -79,14 +79,17 @@ var GnomeShell = class {
1865 for (let param in params)
1866 params[param] = params[param].deep_unpack();
1867
1868- let { monitor: monitorIndex,
1869+ let { connector,
1870 label,
1871 level,
1872 max_level: maxLevel,
1873 icon: serializedIcon } = params;
1874
1875- if (monitorIndex === undefined)
1876- monitorIndex = -1;
1877+ let monitorIndex = -1;
1878+ if (connector) {
1879+ let monitorManager = Meta.MonitorManager.get();
1880+ monitorIndex = monitorManager.get_monitor_for_connector(connector);
1881+ }
1882
1883 let icon = null;
1884 if (serializedIcon)
1885@@ -203,16 +206,10 @@ var GnomeShell = class {
1886 this._grabbers.delete(name);
1887 }
1888
1889- ShowMonitorLabelsAsync(params, invocation) {
1890- let sender = invocation.get_sender();
1891- let [dict] = params;
1892- Main.osdMonitorLabeler.show(sender, dict);
1893- }
1894-
1895 ShowMonitorLabels2Async(params, invocation) {
1896 let sender = invocation.get_sender();
1897 let [dict] = params;
1898- Main.osdMonitorLabeler.show2(sender, dict);
1899+ Main.osdMonitorLabeler.show(sender, dict);
1900 }
1901
1902 HideMonitorLabelsAsync(params, invocation) {
1903diff --git a/js/ui/windowManager.js b/js/ui/windowManager.js
1904index ea9493d..b9f5fef 100644
1905--- a/js/ui/windowManager.js
1906+++ b/js/ui/windowManager.js
1907@@ -456,13 +456,28 @@ var TilePreview = class {
1908 };
1909
1910 var TouchpadWorkspaceSwitchAction = class {
1911- constructor(actor) {
1912+ constructor(actor, allowedModes) {
1913+ this._allowedModes = allowedModes;
1914 this._dx = 0;
1915 this._dy = 0;
1916+ this._enabled = true;
1917 actor.connect('captured-event', this._handleEvent.bind(this));
1918 this._touchpadSettings = new Gio.Settings({schema_id: 'org.gnome.desktop.peripherals.touchpad'});
1919 }
1920
1921+ get enabled() {
1922+ return this._enabled;
1923+ }
1924+
1925+ set enabled(enabled) {
1926+ if (this._enabled == enabled)
1927+ return;
1928+
1929+ this._enabled = enabled;
1930+ if (!enabled)
1931+ this.emit('cancel');
1932+ }
1933+
1934 _checkActivated() {
1935 let dir;
1936
1937@@ -482,15 +497,16 @@ var TouchpadWorkspaceSwitchAction = class {
1938 }
1939
1940 _handleEvent(actor, event) {
1941- let allowedModes = Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW;
1942-
1943 if (event.type() != Clutter.EventType.TOUCHPAD_SWIPE)
1944 return Clutter.EVENT_PROPAGATE;
1945
1946 if (event.get_touchpad_gesture_finger_count() != 4)
1947 return Clutter.EVENT_PROPAGATE;
1948
1949- if ((allowedModes & Main.actionMode) == 0)
1950+ if ((this._allowedModes & Main.actionMode) == 0)
1951+ return Clutter.EVENT_PROPAGATE;
1952+
1953+ if (!this._enabled)
1954 return Clutter.EVENT_PROPAGATE;
1955
1956 if (event.get_gesture_phase() == Clutter.TouchpadGesturePhase.UPDATE) {
1957@@ -523,10 +539,11 @@ var WorkspaceSwitchAction = GObject.registerClass({
1958 'motion': { param_types: [GObject.TYPE_DOUBLE, GObject.TYPE_DOUBLE] },
1959 'cancel': { param_types: [] }},
1960 }, class WorkspaceSwitchAction extends Clutter.SwipeAction {
1961- _init() {
1962+ _init(allowedModes) {
1963 super._init();
1964 this.set_n_touch_points(4);
1965 this._swept = false;
1966+ this._allowedModes = allowedModes;
1967
1968 global.display.connect('grab-op-begin', () => {
1969 this.cancel();
1970@@ -534,14 +551,12 @@ var WorkspaceSwitchAction = GObject.registerClass({
1971 }
1972
1973 vfunc_gesture_prepare(actor) {
1974- let allowedModes = Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW;
1975-
1976 this._swept = false;
1977
1978 if (!super.vfunc_gesture_prepare(actor))
1979 return false;
1980
1981- return (allowedModes & Main.actionMode);
1982+ return (this._allowedModes & Main.actionMode);
1983 }
1984
1985 vfunc_gesture_progress(actor) {
1986@@ -1043,14 +1058,15 @@ var WindowManager = class {
1987 global.workspace_manager.override_workspace_layout(Meta.DisplayCorner.TOPLEFT,
1988 false, -1, 1);
1989
1990- let gesture = new WorkspaceSwitchAction();
1991+ let allowedModes = Shell.ActionMode.NORMAL;
1992+ let gesture = new WorkspaceSwitchAction(allowedModes);
1993 gesture.connect('motion', this._switchWorkspaceMotion.bind(this));
1994 gesture.connect('activated', this._actionSwitchWorkspace.bind(this));
1995 gesture.connect('cancel', this._switchWorkspaceCancel.bind(this));
1996 global.stage.add_action(gesture);
1997
1998 // This is not a normal Clutter.GestureAction, doesn't need add_action()
1999- gesture = new TouchpadWorkspaceSwitchAction(global.stage);
2000+ gesture = new TouchpadWorkspaceSwitchAction(global.stage, allowedModes);
2001 gesture.connect('motion', this._switchWorkspaceMotion.bind(this));
2002 gesture.connect('activated', this._actionSwitchWorkspace.bind(this));
2003 gesture.connect('cancel', this._switchWorkspaceCancel.bind(this));
2004@@ -1202,6 +1218,10 @@ var WindowManager = class {
2005 // Same for OR windows
2006 if (window.is_override_redirect())
2007 return;
2008+ // Sticky windows don't need moving, in fact moving would
2009+ // unstick them
2010+ if (window.on_all_workspaces)
2011+ return;
2012 // Windows on workspaces below pos don't need moving
2013 let index = window.get_workspace().index();
2014 if (index < pos)
2015@@ -1468,8 +1488,13 @@ var WindowManager = class {
2016 if (this._clearAnimationInfo(actor))
2017 this._shellwm.completed_size_change(actor);
2018
2019+ let destroyId = actor.connect('destroy', () => {
2020+ this._clearAnimationInfo(actor);
2021+ });
2022+
2023 actor.__animationInfo = { clone: actorClone,
2024- oldRect: oldFrameRect };
2025+ oldRect: oldFrameRect,
2026+ destroyId: destroyId };
2027 }
2028
2029 _sizeChangedWindow(shellwm, actor) {
2030@@ -1530,6 +1555,7 @@ var WindowManager = class {
2031 _clearAnimationInfo(actor) {
2032 if (actor.__animationInfo) {
2033 actor.__animationInfo.clone.destroy();
2034+ actor.disconnect(actor.__animationInfo.destroyId);
2035 delete actor.__animationInfo;
2036 return true;
2037 }
2038diff --git a/js/ui/workspacesView.js b/js/ui/workspacesView.js
2039index d2557a4..f631781 100644
2040--- a/js/ui/workspacesView.js
2041+++ b/js/ui/workspacesView.js
2042@@ -1,10 +1,11 @@
2043 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
2044
2045-const { Clutter, Gio, GObject, Meta, St } = imports.gi;
2046+const { Clutter, Gio, GObject, Meta, Shell, St } = imports.gi;
2047 const Signals = imports.signals;
2048
2049 const Main = imports.ui.main;
2050 const Tweener = imports.ui.tweener;
2051+const WindowManager = imports.ui.windowManager;
2052 const Workspace = imports.ui.workspace;
2053
2054 var WORKSPACE_SWITCH_TIME = 0.25;
2055@@ -82,6 +83,7 @@ var WorkspacesView = class extends WorkspacesViewBase {
2056
2057 this._animating = false; // tweening
2058 this._scrolling = false; // swipe-scrolling
2059+ this._gestureActive = false; // touch(pad) gestures
2060 this._animatingScroll = false; // programatically updating the adjustment
2061
2062 let activeWorkspaceIndex = workspaceManager.get_active_workspace_index();
2063@@ -211,7 +213,7 @@ var WorkspacesView = class extends WorkspacesViewBase {
2064
2065 for (let w = 0; w < this._workspaces.length; w++) {
2066 let workspace = this._workspaces[w];
2067- if (this._animating || this._scrolling) {
2068+ if (this._animating || this._scrolling || this._gestureActive) {
2069 workspace.actor.show();
2070 } else {
2071 if (this._inDrag)
2072@@ -223,7 +225,7 @@ var WorkspacesView = class extends WorkspacesViewBase {
2073 }
2074
2075 _updateScrollAdjustment(index) {
2076- if (this._scrolling)
2077+ if (this._scrolling || this._gestureActive)
2078 return;
2079
2080 this._animatingScroll = true;
2081@@ -300,6 +302,18 @@ var WorkspacesView = class extends WorkspacesViewBase {
2082 this._updateVisibility();
2083 }
2084
2085+ startTouchGesture() {
2086+ this._gestureActive = true;
2087+ }
2088+
2089+ endTouchGesture() {
2090+ this._gestureActive = false;
2091+
2092+ // Make sure title captions etc are shown as necessary
2093+ this._scrollToActive();
2094+ this._updateVisibility();
2095+ }
2096+
2097 // sync the workspaces' positions to the value of the scroll adjustment
2098 // and change the active workspace if appropriate
2099 _onScroll(adj) {
2100@@ -310,7 +324,7 @@ var WorkspacesView = class extends WorkspacesViewBase {
2101 let active = workspaceManager.get_active_workspace_index();
2102 let current = Math.round(adj.value);
2103
2104- if (active != current) {
2105+ if (active != current && !this._gestureActive) {
2106 if (!this._workspaces[current]) {
2107 // The current workspace was destroyed. This could happen
2108 // when you are on the last empty workspace, and consolidate
2109@@ -391,6 +405,12 @@ var ExtraWorkspaceView = class extends WorkspacesViewBase {
2110
2111 endSwipeScroll() {
2112 }
2113+
2114+ startTouchGesture() {
2115+ }
2116+
2117+ endTouchGesture() {
2118+ }
2119 };
2120
2121 var DelegateFocusNavigator = GObject.registerClass(
2122@@ -430,23 +450,37 @@ var WorkspacesDisplay = class {
2123 return false;
2124 }
2125
2126- for (let i = 0; i < this._workspacesViews.length; i++)
2127- this._workspacesViews[i].startSwipeScroll();
2128+ this._startSwipeScroll();
2129 return true;
2130 });
2131 panAction.connect('gesture-cancel', () => {
2132 clickAction.release();
2133- for (let i = 0; i < this._workspacesViews.length; i++)
2134- this._workspacesViews[i].endSwipeScroll();
2135+ this._endSwipeScroll();
2136 });
2137 panAction.connect('gesture-end', () => {
2138 clickAction.release();
2139- for (let i = 0; i < this._workspacesViews.length; i++)
2140- this._workspacesViews[i].endSwipeScroll();
2141+ this._endSwipeScroll();
2142 });
2143 Main.overview.addAction(panAction);
2144 this.actor.bind_property('mapped', panAction, 'enabled', GObject.BindingFlags.SYNC_CREATE);
2145
2146+ let allowedModes = Shell.ActionMode.OVERVIEW;
2147+ let switchGesture = new WindowManager.WorkspaceSwitchAction(allowedModes);
2148+ switchGesture.connect('motion', this._onSwitchWorkspaceMotion.bind(this));
2149+ switchGesture.connect('activated', this._onSwitchWorkspaceActivated.bind(this));
2150+ switchGesture.connect('cancel', this._endTouchGesture.bind(this));
2151+ Main.overview.addAction(switchGesture);
2152+ this.actor.bind_property('mapped', switchGesture, 'enabled', GObject.BindingFlags.SYNC_CREATE);
2153+
2154+ switchGesture = new WindowManager.TouchpadWorkspaceSwitchAction(global.stage, allowedModes);
2155+ switchGesture.connect('motion', this._onSwitchWorkspaceMotion.bind(this));
2156+ switchGesture.connect('activated', this._onSwitchWorkspaceActivated.bind(this));
2157+ switchGesture.connect('cancel', this._endTouchGesture.bind(this));
2158+ this.actor.connect('notify::mapped', () => {
2159+ switchGesture.enabled = this.actor.mapped;
2160+ });
2161+ switchGesture.enabled = this.actor.mapped;
2162+
2163 this._primaryIndex = Main.layoutManager.primaryIndex;
2164
2165 this._workspacesViews = [];
2166@@ -474,6 +508,47 @@ var WorkspacesDisplay = class {
2167 return false;
2168 }
2169
2170+ _startSwipeScroll() {
2171+ for (let i = 0; i < this._workspacesViews.length; i++)
2172+ this._workspacesViews[i].startSwipeScroll();
2173+ }
2174+
2175+ _endSwipeScroll() {
2176+ for (let i = 0; i < this._workspacesViews.length; i++)
2177+ this._workspacesViews[i].endSwipeScroll();
2178+ }
2179+
2180+ _startTouchGesture() {
2181+ for (let i = 0; i < this._workspacesViews.length; i++)
2182+ this._workspacesViews[i].startTouchGesture();
2183+ }
2184+
2185+ _endTouchGesture() {
2186+ for (let i = 0; i < this._workspacesViews.length; i++)
2187+ this._workspacesViews[i].endTouchGesture();
2188+ }
2189+
2190+ _onSwitchWorkspaceMotion(action, xRel, yRel) {
2191+ // We don't have a way to hook into start of touchpad actions,
2192+ // luckily this is safe to call repeatedly.
2193+ this._startTouchGesture();
2194+
2195+ let workspaceManager = global.workspace_manager;
2196+ let active = workspaceManager.get_active_workspace_index();
2197+ let adjustment = this._scrollAdjustment;
2198+ adjustment.value = (active - yRel / this.actor.height) * adjustment.page_size;
2199+ }
2200+
2201+ _onSwitchWorkspaceActivated(action, direction) {
2202+ let workspaceManager = global.workspace_manager;
2203+ let activeWorkspace = workspaceManager.get_active_workspace();
2204+ let newWs = activeWorkspace.get_neighbor(direction);
2205+ if (newWs != activeWorkspace)
2206+ newWs.activate(global.get_current_time());
2207+
2208+ this._endTouchGesture();
2209+ }
2210+
2211 navigateFocus(from, direction) {
2212 return this._getPrimaryView().actor.navigate_focus(from, direction, false);
2213 }
2214diff --git a/meson.build b/meson.build
2215index e42611e..e3500d4 100644
2216--- a/meson.build
2217+++ b/meson.build
2218@@ -1,5 +1,5 @@
2219 project('gnome-shell', 'c',
2220- version: '3.32.0',
2221+ version: '3.32.1',
2222 meson_version: '>= 0.47.0',
2223 license: 'GPLv2+'
2224 )
2225diff --git a/src/st/st-theme-node.c b/src/st/st-theme-node.c
2226index c05ca78..8a6ebf0 100644
2227--- a/src/st/st-theme-node.c
2228+++ b/src/st/st-theme-node.c
2229@@ -1136,10 +1136,14 @@ get_length_from_term_int (StThemeNode *node,
2230 {
2231 double value;
2232 GetFromTermResult result;
2233+ int scale_factor;
2234
2235 result = get_length_from_term (node, term, use_parent_font, &value);
2236 if (result == VALUE_FOUND)
2237- *length = (int) (0.5 + value);
2238+ {
2239+ g_object_get (node->context, "scale-factor", &scale_factor, NULL);
2240+ *length = (int) ((value / scale_factor) + 0.5) * scale_factor;
2241+ }
2242 return result;
2243 }
2244

Subscribers

People subscribed via source and target branches