Marco Trevisan (Treviño) has proposed merging 
~3v1n0/ubuntu/+source/gnome-shell:ubuntu/master into 
~ubuntu-desktop/ubuntu/+source/gnome-shell:ubuntu/master.

Requested reviews:
  Ubuntu Desktop (ubuntu-desktop)
Related bugs:
  Bug #1822846 in gnome-shell (Ubuntu): "Icon disappears from favorites in 
gnome-shell 3.32 (upstream dock, not the ubuntu-dock)"
  https://bugs.launchpad.net/ubuntu/+source/gnome-shell/+bug/1822846
  Bug #1826176 in gnome-shell (Ubuntu): "Applications do not receive focus in 
Wayland sessions"
  https://bugs.launchpad.net/ubuntu/+source/gnome-shell/+bug/1826176
  Bug #1826936 in gnome-shell (Ubuntu): "Upgrade to 3.32.1 and SRU it"
  https://bugs.launchpad.net/ubuntu/+source/gnome-shell/+bug/1826936

For more details, see:
https://code.launchpad.net/~3v1n0/ubuntu/+source/gnome-shell/+git/gnome-shell/+merge/366668

Update to 3.32.1
-- 
Your team Ubuntu Desktop is requested to review the proposed merge of 
~3v1n0/ubuntu/+source/gnome-shell:ubuntu/master into 
~ubuntu-desktop/ubuntu/+source/gnome-shell:ubuntu/master.
diff --git a/NEWS b/NEWS
index a86e5e4..fcfa060 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,34 @@
+3.32.1
+======
+* Fix avatar scaling on login screen [Florian; #1024]
+* Fix distortion of desktop zoom [Florian; #646]
+* Fix mouse cursor visibility when using desktop zoom [Florian, Marco; #1020]
+* Fix screen dimming after wake-up on lock screen [Xiaoguang; #900]
+* Fix Alt+Esc switcher [Florian; #1064]
+* Respect struts for popover placement [Andrea; #1102]
+* Fix app icons updates after theme changes [Florian; #1117]
+* Fix desktop zoom after resolution changes [Marco; #1120]
+* Implement stick-to-finger workspace switch overview gestures [Florian; #516]
+* Make World Clocks offsets relative to local time [Florian; #1157]
+* Fix top app icon disappearing from dash [Florian; #1053]
+* Update switch style to match new Adwaita [Jakub; !496]
+* Ensure CSS units are pixel-aligned when scaling is used [Carlos; #91]
+* Misc. bug fixes and cleanups [Florian, Jakub, Robert, Alex, Carlos, Phil,
+  Marco, Benjamin, AsciiWolf, Ray, verdre; !444, #1016, #1018, !449, #1036,
+  !455, #1094, !440, #1023, #624, #1017, !476, !473, !480, #1130, !485, !481,
+  !490, !489, #1151, !435, #1160, !482, #1150, #1166, !384]
+
+Contributors:
+  AsciiWolf, Andrea Azzarone, Benjamin Berg, Carlos Garnacho, Victor Ibragimov,
+  Robert Mader, Alex Monday, Florian Müllner, Jakub Steiner, Ray Strode,
+  Marco Trevisan (Treviño), verdre, Xiaoguang Wang, Phil Wyett
+
+Translators:
+  Victor Ibragimov [tg, af, et, ja], Bruce Cowan [en_GB], Piotr Drąg [tg],
+  Charles Monzat [fr], Khaled Hosny [ar], Goran Vidović [hr],
+  Cheng-Chia Tseng [zh_TW], Carmen Bianca BAKKER [eo], Daniel Mustieles [es],
+  Dušan Kazik [sk]
+
 3.32.0
 ======
 * Fix sizing issues in on-screen-keyboard emoji panel [Carlos; !439]
diff --git a/data/dbus-interfaces/org.gnome.Shell.xml b/data/dbus-interfaces/org.gnome.Shell.xml
index 1fef302..094c294 100644
--- a/data/dbus-interfaces/org.gnome.Shell.xml
+++ b/data/dbus-interfaces/org.gnome.Shell.xml
@@ -9,9 +9,6 @@
     <method name="ShowOSD">
       <arg type="a{sv}" direction="in" name="params"/>
     </method>
-    <method name="ShowMonitorLabels">
-      <arg type="a{uv}" direction="in" name="params"/>
-    </method>
     <method name="ShowMonitorLabels2">
       <arg type="a{sv}" direction="in" name="params"/>
     </method>
diff --git a/data/gnome-shell-theme.gresource.xml b/data/gnome-shell-theme.gresource.xml
index b778254..c05be6b 100644
--- a/data/gnome-shell-theme.gresource.xml
+++ b/data/gnome-shell-theme.gresource.xml
@@ -21,10 +21,8 @@
     <file>noise-texture.png</file>
     <file>pad-osd.css</file>
     <file>process-working.svg</file>
-    <file>toggle-off-us.svg</file>
     <file>toggle-off-intl.svg</file>
     <file>toggle-off-hc.svg</file>
-    <file>toggle-on-us.svg</file>
     <file>toggle-on-intl.svg</file>
     <file>toggle-on-hc.svg</file>
   </gresource>
diff --git a/data/theme/gnome-shell-sass/_common.scss b/data/theme/gnome-shell-sass/_common.scss
index c7485ae..a6357ba 100644
--- a/data/theme/gnome-shell-sass/_common.scss
+++ b/data/theme/gnome-shell-sass/_common.scss
@@ -157,18 +157,13 @@ StScrollBar {
 
 /* Switches */
 .toggle-switch {
-  width: 65px;
+  width: 46px;
   height: 22px;
   background-size: contain;
+  background-image: url("resource:///org/gnome/shell/theme/toggle-off-intl.svg");
+  &:checked { background-image: url("resource:///org/gnome/shell/theme/toggle-on-intl.svg"); }
 }
 
-  @each $v in us, intl {
-    .toggle-switch-#{$v} {
-      background-image: url("resource:///org/gnome/shell/theme/toggle-off-#{$v}.svg");
-      &:checked { background-image: url("resource:///org/gnome/shell/theme/toggle-on-#{$v}.svg"); }
-    }
-  }
-
 /* links */
 .shell-link {
   color: $link_color;
@@ -1142,6 +1137,12 @@ StScrollBar {
 
 .ripple-box:rtl { border-radius: 0 0 0 52px; } // just a simple change to the border radius position
 
+// Rubberband for select-area screenshots
+.select-area-rubberband {
+  background-color: transparentize($selected_bg_color,0.7);
+  border: 1px solid $selected_bg_color;
+}
+
 // not really top bar only
 .popup-menu-arrow { icon-size: 1.09em; }
 .popup-menu-icon { icon-size: 1.09em; }
diff --git a/data/theme/toggle-off-intl.svg b/data/theme/toggle-off-intl.svg
index a1734fb..cb08712 100644
--- a/data/theme/toggle-off-intl.svg
+++ b/data/theme/toggle-off-intl.svg
@@ -10,124 +10,62 @@
    xmlns:xlink="http://www.w3.org/1999/xlink";
    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd";
    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape";
-   width="65"
+   width="46"
    height="22"
-   id="svg2857"
+   viewBox="0 0 46 22"
    version="1.1"
-   inkscape:version="0.48.5 r10040"
-   sodipodi:docname="toggle-off-us.svg">
+   id="svg2751"
+   inkscape:version="0.92.4 5da689c313, 2019-01-14"
+   sodipodi:docname="toggle-off-intl.svg">
   <defs
-     id="defs2859">
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 526.18109 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="744.09448 : 526.18109 : 1"
-       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
-       id="perspective2865" />
-    <inkscape:perspective
-       id="perspective2843"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_x="0 : 0.5 : 1"
-       sodipodi:type="inkscape:persp3d" />
+     id="defs2745">
     <linearGradient
        inkscape:collect="always"
-       xlink:href="#linearGradient76469-7-7-4"
-       id="linearGradient38024"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0215462,0,0,1.0322581,717.22867,428.68472)"
-       x1="6"
-       y1="102.95528"
-       x2="6"
-       y2="84.505203" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient76469-7-7-4">
+       id="linearGradient3329">
       <stop
-         style="stop-color:#2e3232;stop-opacity:1"
+         style="stop-color:#39393a;stop-opacity:1;"
          offset="0"
-         id="stop76471-7-1-5" />
+         id="stop3325" />
       <stop
-         style="stop-color:#3e4545;stop-opacity:1"
+         style="stop-color:#302f30;stop-opacity:1"
          offset="1"
-         id="stop76473-9-0-0" />
+         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
-       y2="492.52756"
-       x2="610.13782"
-       y1="501.43866"
-       x1="610.13782"
-       gradientTransform="matrix(1.5918367,0,0,0.85714285,-900.56122,-423.92857)"
+       xlink:href="#linearGradient3329"
+       id="linearGradient3331"
+       x1="53"
+       y1="294.42917"
+       x2="53"
+       y2="309.80417"
        gradientUnits="userSpaceOnUse"
-       id="linearGradient13602"
-       xlink:href="#linearGradient37802-8"
-       inkscape:collect="always" />
+       gradientTransform="translate(-42.760724)" />
   </defs>
   <sodipodi:namedview
      id="base"
-     pagecolor="#000000"
+     pagecolor="#535353"
      bordercolor="#666666"
      borderopacity="1.0"
      inkscape:pageopacity="1"
      inkscape:pageshadow="2"
      inkscape:zoom="1"
-     inkscape:cx="-5.0602834"
-     inkscape:cy="16.473273"
+     inkscape:cx="-19.436775"
+     inkscape:cy="-13.499723"
      inkscape:document-units="px"
-     inkscape:current-layer="g37994"
+     inkscape:current-layer="layer1"
      showgrid="false"
-     inkscape:window-width="2560"
-     inkscape:window-height="1375"
-     inkscape:window-x="0"
-     inkscape:window-y="27"
-     inkscape:window-maximized="1"
+     units="px"
+     inkscape:pagecheckerboard="true"
      borderlayer="true"
      inkscape:showpageshadow="false"
-     inkscape:snap-nodes="false"
-     inkscape:snap-bbox="true"
      showborder="false">
     <inkscape:grid
        type="xygrid"
-       id="grid12954"
-       empspacing="5"
-       visible="true"
-       enabled="true"
-       snapvisiblegridlinesonly="true" />
+       id="grid3298" />
   </sodipodi:namedview>
   <metadata
-     id="metadata2862">
+     id="metadata2748">
     <rdf:RDF>
       <cc:Work
          rdf:about="">
@@ -142,68 +80,24 @@
      inkscape:label="Layer 1"
      inkscape:groupmode="layer"
      id="layer1"
-     transform="translate(-444.64286,-781.36218)">
-    <g
-       transform="matrix(0.6526046,0,0,0.80554422,99.592644,-636.32172)"
-       id="g37994">
-      <g
-         id="g37996"
-         transform="translate(-115,1277)">
-        <rect
-           style="color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964000000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0.19591837"
-           id="rect13475"
-           width="98"
-           height="25"
-           x="644.5"
-           y="484.61118"
-           rx="4.7429576"
-           ry="3.8424656" />
-        <rect
-           ry="3.8424656"
-           rx="4.7429576"
-           y="483.5"
-           x="644.5"
-           height="25"
-           width="98"
-           id="rect38000"
-           style="color:#000000;fill:url(#linearGradient12311-3-1-0-5-4);fill-opacity:1;fill-rule:nonzero;stroke:#16191a;stroke-width:1.37920942;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
-      </g>
-      <g
-         transform="translate(-49.946213,-1.890275)"
-         id="g38002">
-        <g
-           transform="translate(-115,1247)"
-           style="display:inline"
-           id="g38004">
-          <rect
-             ry="3.7972314"
-             rx="4.6871223"
-             y="515.5"
-             x="694.53046"
-             height="25"
-             width="45.969578"
-             id="rect38006"
-             style="color:#000000;fill:url(#linearGradient38024);fill-opacity:1;fill-rule:nonzero;stroke:#1f2020;stroke-width:1.37920964;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
-          <path
-             sodipodi:nodetypes="cc"
-             style="opacity:0.1;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-             d="m 699.09675,516.7365 36.86904,0"
-             id="path38016"
-             inkscape:path-effect="#path-effect77541-4"
-             inkscape:original-d="m 699.09675,516.7365 36.86904,0"
-             inkscape:connector-curvature="0" />
-        </g>
-      </g>
-      <path
-         sodipodi:type="arc"
-         style="color:#000000;fill:none;stroke:#ffffff;stroke-width:2.15627193;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
-         id="path13479"
-         sodipodi:cx="16.4375"
-         sodipodi:cy="10.8125"
-         sodipodi:rx="4.3125"
-         sodipodi:ry="4.3125"
-         d="m 20.75,10.8125 a 4.3125,4.3125 0 1 1 -8.625,0 4.3125,4.3125 0 1 1 8.625,0 z"
-         transform="matrix(1.4212691,0,0,1.1514287,577.38488,1761.1138)" />
-    </g>
+     transform="translate(0,-291.17916)">
+    <rect
+       style="opacity:1;vector-effect:none;fill:#323233;fill-opacity:1;stroke:#272728;stroke-width:1.08532763;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
+       id="rect3296"
+       width="44.446434"
+       height="20.910645"
+       x="0.625"
+       y="291.71494"
+       rx="10.455324"
+       ry="10.073335" />
+    <rect
+       ry="10.455322"
+       rx="10.455322"
+       y="291.71494"
+       x="0.5428465"
+       height="20.910645"
+       width="21.142862"
+       id="rect3300"
+       style="opacity:1;vector-effect:none;fill:url(#linearGradient3331);fill-opacity:1;stroke:#151515;stroke-width:1.08532763;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal" />
   </g>
 </svg>
diff --git a/data/theme/toggle-off-us.svg b/data/theme/toggle-off-us.svg
deleted file mode 100644
index 941501d..0000000
--- a/data/theme/toggle-off-us.svg
+++ /dev/null
@@ -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>
diff --git a/data/theme/toggle-on-intl.svg b/data/theme/toggle-on-intl.svg
index b007065..142e0a8 100644
--- a/data/theme/toggle-on-intl.svg
+++ b/data/theme/toggle-on-intl.svg
@@ -10,117 +10,69 @@
    xmlns:xlink="http://www.w3.org/1999/xlink";
    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd";
    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape";
-   width="65"
+   width="46"
    height="22"
-   id="svg2857"
+   viewBox="0 0 46 22"
    version="1.1"
-   inkscape:version="0.91 r13725"
+   id="svg2751"
+   inkscape:version="0.92.4 5da689c313, 2019-01-14"
    sodipodi:docname="toggle-on-intl.svg">
   <defs
-     id="defs2859">
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 526.18109 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="744.09448 : 526.18109 : 1"
-       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
-       id="perspective2865" />
-    <inkscape:perspective
-       id="perspective2843"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_x="0 : 0.5 : 1"
-       sodipodi:type="inkscape:persp3d" />
+     id="defs2745">
     <linearGradient
        inkscape:collect="always"
-       xlink:href="#linearGradient77461"
-       id="linearGradient77551"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.3066667,0,0,1,-841.64667,-483)"
-       x1="1164.7644"
-       y1="962.93695"
-       x2="1164.7644"
-       y2="970.51404" />
-    <linearGradient
-       id="linearGradient77461"
-       inkscape:collect="always">
+       id="linearGradient3329">
       <stop
-         id="stop77463"
+         style="stop-color:#39393a;stop-opacity:1;"
          offset="0"
-         style="stop-color:#182f4c;stop-opacity:1" />
+         id="stop3325" />
       <stop
-         id="stop77465"
+         style="stop-color:#302f30;stop-opacity:1"
          offset="1"
-         style="stop-color:#205b9a;stop-opacity:1" />
+         id="stop3327" />
     </linearGradient>
     <linearGradient
        inkscape:collect="always"
-       xlink:href="#linearGradient76469-7-7-4"
-       id="linearGradient38024"
+       xlink:href="#linearGradient3329"
+       id="linearGradient3331"
+       x1="53"
+       y1="294.42917"
+       x2="53"
+       y2="309.80417"
        gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0215462,0,0,1.0322581,717.22867,428.68472)"
-       x1="6"
-       y1="102.95528"
-       x2="6"
-       y2="84.505203" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient76469-7-7-4">
-      <stop
-         style="stop-color:#2e3232;stop-opacity:1"
-         offset="0"
-         id="stop76471-7-1-5" />
-      <stop
-         style="stop-color:#3e4545;stop-opacity:1"
-         offset="1"
-         id="stop76473-9-0-0" />
-    </linearGradient>
-    <inkscape:path-effect
-       effect="spiro"
-       id="path-effect77541-4"
-       is_visible="true" />
+       gradientTransform="translate(-19)" />
   </defs>
   <sodipodi:namedview
      id="base"
-     pagecolor="#000000"
+     pagecolor="#535353"
      bordercolor="#666666"
      borderopacity="1.0"
      inkscape:pageopacity="1"
      inkscape:pageshadow="2"
      inkscape:zoom="1"
-     inkscape:cx="37.410841"
-     inkscape:cy="16.009314"
+     inkscape:cx="13.588971"
+     inkscape:cy="14.124546"
      inkscape:document-units="px"
-     inkscape:current-layer="g37994"
+     inkscape:current-layer="layer1"
      showgrid="false"
-     inkscape:window-width="2560"
-     inkscape:window-height="1376"
-     inkscape:window-x="0"
-     inkscape:window-y="27"
-     inkscape:window-maximized="1"
+     units="px"
+     inkscape:pagecheckerboard="true"
      borderlayer="true"
      inkscape:showpageshadow="false"
-     inkscape:snap-nodes="false"
-     inkscape:snap-bbox="true"
      showborder="false">
     <inkscape:grid
        type="xygrid"
-       id="grid12954"
-       empspacing="5"
-       visible="true"
-       enabled="true"
-       snapvisiblegridlinesonly="true" />
+       id="grid3298" />
   </sodipodi:namedview>
   <metadata
-     id="metadata2862">
+     id="metadata2748">
     <rdf:RDF>
       <cc:Work
          rdf:about="">
         <dc:format>image/svg+xml</dc:format>
         <dc:type
            rdf:resource="http://purl.org/dc/dcmitype/StillImage"; />
-        <dc:title />
+        <dc:title></dc:title>
       </cc:Work>
     </rdf:RDF>
   </metadata>
@@ -128,65 +80,24 @@
      inkscape:label="Layer 1"
      inkscape:groupmode="layer"
      id="layer1"
-     transform="translate(-444.64286,-781.36218)">
-    <g
-       transform="matrix(0.6526046,0,0,0.80554422,99.592644,-636.32172)"
-       id="g37994">
-      <g
-         id="g37996"
-         transform="translate(-115,1277)">
-        <rect
-           style="color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964000000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0.19591837"
-           id="rect13475"
-           width="98"
-           height="25"
-           x="644.5"
-           y="484.61118"
-           rx="4.7429576"
-           ry="3.8424656" />
-        <rect
-           ry="3.8424656"
-           rx="4.7429576"
-           y="483.5"
-           x="644.5"
-           height="25"
-           width="98"
-           id="rect38000"
-           style="color:#000000;fill:url(#linearGradient77551);fill-opacity:1;fill-rule:nonzero;stroke:#182f4c;stroke-width:1.37920964;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
-      </g>
-      <g
-         transform="translate(2.0625,-2)"
-         id="g38002">
-        <g
-           transform="translate(-115,1247)"
-           style="display:inline"
-           id="g38004">
-          <rect
-             ry="3.7972314"
-             rx="4.6871223"
-             y="515.5"
-             x="694.53046"
-             height="25"
-             width="45.969578"
-             id="rect38006"
-             style="color:#000000;fill:url(#linearGradient38024);fill-opacity:1;fill-rule:nonzero;stroke:#1f2020;stroke-width:1.37920964;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
-          <path
-             sodipodi:nodetypes="cc"
-             style="opacity:0.1;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.37920964px;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-             d="m 699.09675,516.7365 36.86904,0"
-             id="path38016"
-             inkscape:path-effect="#path-effect77541-4"
-             inkscape:original-d="m 699.09675,516.7365 36.86904,0"
-             inkscape:connector-curvature="0" />
-        </g>
-      </g>
-      <rect
-         style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
-         id="rect13678"
-         width="3.0646207"
-         height="12.414008"
-         x="554.77728"
-         y="1767.3566" />
-    </g>
+     transform="translate(0,-291.17916)">
+    <rect
+       style="opacity:1;vector-effect:none;fill:#15539e;fill-opacity:1;stroke:#030e1b;stroke-width:1.08532763;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
+       id="rect3296"
+       width="44.446434"
+       height="20.910645"
+       x="0.625"
+       y="291.71494"
+       rx="10.455324"
+       ry="10.073335" />
+    <rect
+       ry="10.455322"
+       rx="10.455322"
+       y="291.71494"
+       x="24.30357"
+       height="20.910645"
+       width="21.142862"
+       id="rect3300"
+       style="opacity:1;vector-effect:none;fill:url(#linearGradient3331);fill-opacity:1;stroke:#030e1b;stroke-width:1.08532763;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal" />
   </g>
 </svg>
diff --git a/data/theme/toggle-on-us.svg b/data/theme/toggle-on-us.svg
deleted file mode 100644
index 501fc30..0000000
--- a/data/theme/toggle-on-us.svg
+++ /dev/null
@@ -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>
diff --git a/debian/.gitignore b/debian/.gitignore
new file mode 100644
index 0000000..a320335
--- /dev/null
+++ b/debian/.gitignore
@@ -0,0 +1,10 @@
+/*.debhelper
+/*.debhelper.log
+/*.substvars
+/.debhelper/
+/debhelper-build-stamp
+/files
+/gnome-shell-common/
+/gnome-shell/
+/home/
+/tmp/
diff --git a/debian/changelog b/debian/changelog
index f1dbe5d..9305cf7 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,77 @@
+gnome-shell (3.32.1-1ubuntu1) eoan; urgency=medium
+
+  * Merge with debian
+    - Update to 3.32.1 upstream version (LP: #1826936)
+    - Fixes Icon disappears from favorites (LP: #1822846)
+    - Fix applications aren't focused in Wayland session (LP: #1826176)
+    remaining changes:
+    + Replace gnome-backgrounds dep with ubuntu-wallpapers and Suggests
+      gnome-themes-standard-data, gnome-backgrounds
+    + Add some Recommends:
+      - ubuntu-session (| gnome-session) to have the ubuntu session available
+      - xserver-xorg-legacy
+      - yaru-theme-gnome-shell for the default ubuntu theming
+    + Update debian/gbp.conf with Ubuntu settings
+    + gnome-shell-common.install: Install Ubuntu mode
+    + gnome-shell-common.prerm: Remove deprecated ubuntu theme alternative
+    + ubuntu/desktop_detect.patch:
+      - add caching for desktop detection to avoid querying the current
+        desktop env variable as iterate through the list each time. For the
+        time of the Shell process, we can expect this env variable to stay
+        stable.
+    + ubuntu/smarter_alt_tab.patch:
+      - quick alt-tab (without showing up the switcher) switch only between
+        the last window of the last 2 applications to be focused instead of
+        raising all windows of those apps.
+    + ubuntu/lightdm-user-switching.patch:
+      - Allow user switching when using LightDM.
+    + ubuntu/lock_on_suspend.patch
+      - Respect Ubuntu's lock-on-suspend setting.
+    + ubuntu/gdm.patch
+      - as gdm is system-wide and not session-wide, ensure gdm has an ubuntu
+        styling by default, not impacting the gnome user session though.
+    + ubuntu/background_login.patch
+      - Change default background color as we modified the default GDM color
+        for our ubuntu session. Change it as well here, still applying the
+        background noise loading.
+    + ubuntu/gdm_alternatives.patch
+      - Add support for GDM3 theme alternatives
+    + ubuntu/block_mode_extension_update.patch
+      - Don't allow ubuntu mode extension to update
+    + optional-hot-corner.patch
+      - enable patch proposed by upstream developer already in package (but
+        not in series) to add a settings for optional hot corner activation.
+    + volume-Add-back-sound-feedback-on-scroll.patch
+      - Fix regression causing missing feedback on volume slider scroll
+    + main-show-an-error-message-on-gnome-shell-crash.patch,
+      global-make-possible-to-set-debug-flags-dynamically.patch,
+      main-increase-the-granularity-of-backtraces-in-SHELL_DEBU.patch,
+      main-add-backtrace-crashes-all-and-backtrace-all.patch,
+      sessionMode-add-support-for-debugFlags-parameter.patch:
+      - Improve debug JS tracing for crash reports
+    + st-scroll-view-Handle-the-case-where-scrollbars-are-NULL.patch,
+      st-scroll-view-Remove-scrollbars-references-on-dispose.patch:
+      - Fix crash on theme changes
+    + ubuntu/search-call-XUbuntuCancel-method-on-providers-when-no-dat.patch:
+      - stop searches when requested from UI
+    + magnifier-Show-cursor-when-magnifier-is-enabled-and-scale.patch:
+      - Show monitor scaled cursor when magnifier is enabled
+
+ -- Marco Trevisan (Treviño) <ma...@ubuntu.com>  Mon, 29 Apr 2019 17:29:23 -0500
+
+gnome-shell (3.32.1-1) experimental; urgency=medium
+
+  [ Simon McVittie ]
+  * d/rules: Create a temporary HOME, XDG_RUNTIME_DIR for the unit tests.
+    This goes some way towards fixing test failures and FTBFS on buster's
+    sbuild, as deployed on the s390x buildd.
+  * d/.gitignore: Add
+
+  [ Laurent Bigonville ]
+  * New upstream release
+
+ -- Laurent Bigonville <bi...@debian.org>  Mon, 22 Apr 2019 15:45:49 +0200
+
 gnome-shell (3.32.0+git20190410-1ubuntu1) disco; urgency=medium
 
   * Merging with debian git snapshot (LP: #1820775, LP: #1818790),
diff --git a/debian/clean b/debian/clean
new file mode 100644
index 0000000..3d6866b
--- /dev/null
+++ b/debian/clean
@@ -0,0 +1 @@
+debian/home/
diff --git a/debian/rules b/debian/rules
index 00c6fbf..0831ef7 100755
--- a/debian/rules
+++ b/debian/rules
@@ -38,4 +38,16 @@ override_dh_strip:
 	dh_strip --dbgsym-migration='gnome-shell-dbg (<< 3.20.2-2~)'
 
 override_dh_auto_test:
-	xvfb-run -a dh_auto_test
+ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS)))
+	# Avoid test failures on buildd environments where HOME,
+	# XDG_RUNTIME_DIR might be invalid
+	mkdir -p -m700 $(CURDIR)/debian/home/run
+	env \
+		-u XDG_CACHE_HOME \
+		-u XDG_CONFIG_DIRS \
+		-u XDG_CONFIG_HOME \
+		-u XDG_DATA_HOME \
+		HOME=$(CURDIR)/debian/home \
+		XDG_RUNTIME_DIR=$(CURDIR)/debian/home/run \
+		xvfb-run -a dh_auto_test
+endif
diff --git a/js/extensionPrefs/main.js b/js/extensionPrefs/main.js
index 438788f..43efa95 100644
--- a/js/extensionPrefs/main.js
+++ b/js/extensionPrefs/main.js
@@ -551,9 +551,9 @@ class ExtensionRow extends Gtk.ListBoxRow {
 
         let button = new Gtk.Button({ valign: Gtk.Align.CENTER,
                                       no_show_all: true });
-        button.add(new Gtk.Image({ icon_name: 'emblem-system-symbolic',
-                                   icon_size: Gtk.IconSize.BUTTON,
-                                   visible: true }));
+        button.set_image(new Gtk.Image({ icon_name: 'emblem-system-symbolic',
+                                         icon_size: Gtk.IconSize.BUTTON,
+                                         visible: true }));
         button.get_style_context().add_class('circular');
         hbox.add(button);
 
diff --git a/js/perf/hwtest.js b/js/perf/hwtest.js
index 31a25a7..661f2ef 100644
--- a/js/perf/hwtest.js
+++ b/js/perf/hwtest.js
@@ -1,4 +1,4 @@
-const { Clutter, Gio, Gtk, Shell } = imports.gi;
+const { Clutter, Gio, Shell } = imports.gi;
 const Main = imports.ui.main;
 const Scripting = imports.ui.scripting;
 
@@ -104,7 +104,10 @@ function *run() {
     yield Scripting.waitLeisure();
     Scripting.scriptEvent('desktopShown');
 
-    Gtk.Settings.get_default().gtk_enable_animations = false;
+    let interfaceSettings = new Gio.Settings({
+        schema_id: 'org.gnome.desktop.interface'
+    });
+    interfaceSettings.set_boolean('enable-animations', false);
 
     Scripting.scriptEvent('overviewShowStart');
     Main.overview.show();
@@ -200,7 +203,7 @@ function *run() {
 
     yield Scripting.sleep(1000);
 
-    Gtk.Settings.get_default().gtk_enable_animations = true;
+    interfaceSettings.set_boolean('enable-animations', true);
 }
 
 let overviewShowStart;
diff --git a/js/ui/appFavorites.js b/js/ui/appFavorites.js
index a80504c..657e159 100644
--- a/js/ui/appFavorites.js
+++ b/js/ui/appFavorites.js
@@ -14,39 +14,47 @@ const RENAMED_DESKTOP_IDS = {
     'epiphany.desktop': 'org.gnome.Epiphany.desktop',
     'evolution.desktop': 'org.gnome.Evolution.desktop',
     'file-roller.desktop': 'org.gnome.FileRoller.desktop',
+    'five-or-more.desktop': 'org.gnome.five-or-more.desktop',
+    'four-in-a-row.desktop': 'org.gnome.Four-in-a-row.desktop',
     'gcalctool.desktop': 'org.gnome.Calculator.desktop',
     'geary.desktop': 'org.gnome.Geary.desktop',
     'gedit.desktop': 'org.gnome.gedit.desktop',
-    'glchess.desktop': 'gnome-chess.desktop',
-    'glines.desktop': 'five-or-more.desktop',
-    'gnect.desktop': 'four-in-a-row.desktop',
+    'glchess.desktop': 'org.gnome.Chess.desktop',
+    'glines.desktop': 'org.gnome.five-or-more.desktop',
+    'gnect.desktop': 'org.gnome.Four-in-a-row.desktop',
     'gnibbles.desktop': 'org.gnome.Nibbles.desktop',
-    'gnobots2.desktop': 'gnome-robots.desktop',
+    'gnobots2.desktop': 'org.gnome.Robots.desktop',
     'gnome-boxes.desktop': 'org.gnome.Boxes.desktop',
     'gnome-calculator.desktop': 'org.gnome.Calculator.desktop',
+    'gnome-chess.desktop': 'org.gnome.Chess.desktop',
     'gnome-clocks.desktop': 'org.gnome.clocks.desktop',
     'gnome-contacts.desktop': 'org.gnome.Contacts.desktop',
     'gnome-documents.desktop': 'org.gnome.Documents.desktop',
     'gnome-font-viewer.desktop': 'org.gnome.font-viewer.desktop',
+    'gnome-klotski.desktop': 'org.gnome.Klotski.desktop',
     'gnome-nibbles.desktop': 'org.gnome.Nibbles.desktop',
     'gnome-mahjongg.desktop': 'org.gnome.Mahjongg.desktop',
+    'gnome-mines.desktop': 'org.gnome.Mines.desktop',
     'gnome-music.desktop': 'org.gnome.Music.desktop',
     'gnome-photos.desktop': 'org.gnome.Photos.desktop',
+    'gnome-robots.desktop': 'org.gnome.Robots.desktop',
     'gnome-screenshot.desktop': 'org.gnome.Screenshot.desktop',
     'gnome-software.desktop': 'org.gnome.Software.desktop',
     'gnome-terminal.desktop': 'org.gnome.Terminal.desktop',
+    'gnome-tetravex.desktop': 'org.gnome.Tetravex.desktop',
     'gnome-tweaks.desktop': 'org.gnome.tweaks.desktop',
     'gnome-weather.desktop': 'org.gnome.Weather.desktop',
-    'gnomine.desktop': 'gnome-mines.desktop',
-    'gnotravex.desktop': 'gnome-tetravex.desktop',
-    'gnotski.desktop': 'gnome-klotski.desktop',
-    'gtali.desktop': 'tali.desktop',
+    'gnomine.desktop': 'org.gnome.Mines.desktop',
+    'gnotravex.desktop': 'org.gnome.Tetravex.desktop',
+    'gnotski.desktop': 'org.gnome.Klotski.desktop',
+    'gtali.desktop': 'org.gnome.Tali.desktop',
     'iagno.desktop': 'org.gnome.Reversi.desktop',
     'nautilus.desktop': 'org.gnome.Nautilus.desktop',
     'org.gnome.gnome-2048.desktop': 'org.gnome.TwentyFortyEight.desktop',
     'org.gnome.taquin.desktop': 'org.gnome.Taquin.desktop',
     'org.gnome.Weather.Application.desktop': 'org.gnome.Weather.desktop',
     'polari.desktop': 'org.gnome.Polari.desktop',
+    'tali.desktop': 'org.gnome.Tali.desktop',
     'totem.desktop': 'org.gnome.Totem.desktop',
     'evince.desktop': 'org.gnome.Evince.desktop',
 };
diff --git a/js/ui/barLevel.js b/js/ui/barLevel.js
index d8d3736..c4072e2 100644
--- a/js/ui/barLevel.js
+++ b/js/ui/barLevel.js
@@ -121,7 +121,8 @@ var BarLevel = class {
         cr.lineTo(x, (height - barLevelHeight) / 2);
         cr.lineTo(x, (height + barLevelHeight) / 2);
         cr.lineTo(barLevelBorderRadius + barLevelBorderWidth, (height + barLevelHeight) / 2);
-        Clutter.cairo_set_source_color(cr, barLevelActiveColor);
+        if (this._value > 0)
+          Clutter.cairo_set_source_color(cr, barLevelActiveColor);
         cr.fillPreserve();
         Clutter.cairo_set_source_color(cr, barLevelActiveBorderColor);
         cr.setLineWidth(barLevelBorderWidth);
@@ -143,17 +144,19 @@ var BarLevel = class {
         }
 
         /* end progress bar arc */
-        if (this._value <= this._overdriveStart)
-            Clutter.cairo_set_source_color(cr, barLevelActiveColor);
-        else
-            Clutter.cairo_set_source_color(cr, barLevelOverdriveColor);
-        cr.arc(endX, height / 2, barLevelBorderRadius, TAU * 3 / 4, TAU * 1 / 4);
-        cr.lineTo(Math.floor(endX), (height + barLevelHeight) / 2);
-        cr.lineTo(Math.floor(endX), (height - barLevelHeight) / 2);
-        cr.lineTo(endX, (height - barLevelHeight) / 2);
-        cr.fillPreserve();
-        cr.setLineWidth(barLevelBorderWidth);
-        cr.stroke();
+        if (this._value > 0) {
+          if (this._value <= this._overdriveStart)
+              Clutter.cairo_set_source_color(cr, barLevelActiveColor);
+          else
+              Clutter.cairo_set_source_color(cr, barLevelOverdriveColor);
+          cr.arc(endX, height / 2, barLevelBorderRadius, TAU * 3 / 4, TAU * 1 / 4);
+          cr.lineTo(Math.floor(endX), (height + barLevelHeight) / 2);
+          cr.lineTo(Math.floor(endX), (height - barLevelHeight) / 2);
+          cr.lineTo(endX, (height - barLevelHeight) / 2);
+          cr.fillPreserve();
+          cr.setLineWidth(barLevelBorderWidth);
+          cr.stroke();
+        }
 
         /* draw overdrive separator */
         if (overdriveActive) {
diff --git a/js/ui/boxpointer.js b/js/ui/boxpointer.js
index 11b2bdd..c8e5ced 100644
--- a/js/ui/boxpointer.js
+++ b/js/ui/boxpointer.js
@@ -47,10 +47,6 @@ var BoxPointer = GObject.registerClass({
         this._border.connect('repaint', this._drawBorder.bind(this));
         this.add_actor(this._border);
         this.bin.raise(this._border);
-        this._xOffset = 0;
-        this._yOffset = 0;
-        this._xPosition = 0;
-        this._yPosition = 0;
         this._sourceAlignment = 0.5;
         this._capturedEventId = 0;
         this._muteInput();
@@ -118,23 +114,23 @@ var BoxPointer = GObject.registerClass({
         if (animate & PopupAnimation.SLIDE) {
             switch (this._arrowSide) {
                 case St.Side.TOP:
-                    this.yOffset = -rise;
+                    this.translation_y = -rise;
                     break;
                 case St.Side.BOTTOM:
-                    this.yOffset = rise;
+                    this.translation_y = rise;
                     break;
                 case St.Side.LEFT:
-                    this.xOffset = -rise;
+                    this.translation_x = -rise;
                     break;
                 case St.Side.RIGHT:
-                    this.xOffset = rise;
+                    this.translation_x = rise;
                     break;
             }
         }
 
         Tweener.addTween(this, { opacity: 255,
-                                 xOffset: 0,
-                                 yOffset: 0,
+                                 translation_x: 0,
+                                 translation_y: 0,
                                  transition: 'linear',
                                  onComplete: () => {
                                      this._unmuteInput();
@@ -148,8 +144,8 @@ var BoxPointer = GObject.registerClass({
         if (!this.visible)
             return;
 
-        let xOffset = 0;
-        let yOffset = 0;
+        let translationX = 0;
+        let translationY = 0;
         let themeNode = this.get_theme_node();
         let rise = themeNode.get_length('-arrow-rise');
         let fade = (animate & PopupAnimation.FADE);
@@ -158,16 +154,16 @@ var BoxPointer = GObject.registerClass({
         if (animate & PopupAnimation.SLIDE) {
             switch (this._arrowSide) {
                 case St.Side.TOP:
-                    yOffset = rise;
+                    translationY = rise;
                     break;
                 case St.Side.BOTTOM:
-                    yOffset = -rise;
+                    translationY = -rise;
                     break;
                 case St.Side.LEFT:
-                    xOffset = rise;
+                    translationX = rise;
                     break;
                 case St.Side.RIGHT:
-                    xOffset = -rise;
+                    translationX = -rise;
                     break;
             }
         }
@@ -176,15 +172,15 @@ var BoxPointer = GObject.registerClass({
 
         Tweener.removeTweens(this);
         Tweener.addTween(this, { opacity: fade ? 0 : 255,
-                                 xOffset: xOffset,
-                                 yOffset: yOffset,
+                                 translation_x: translationX,
+                                 translation_y: translationY,
                                  transition: 'linear',
                                  time: animationTime,
                                  onComplete: () => {
                                      this.hide();
                                      this.opacity = 0;
-                                     this.xOffset = 0;
-                                     this.yOffset = 0;
+                                     this.translation_x = 0;
+                                     this.translation_y = 0;
                                      if (onComplete)
                                          onComplete();
                                  }
@@ -477,11 +473,15 @@ var BoxPointer = GObject.registerClass({
     _reposition() {
         let sourceActor = this._sourceActor;
         let alignment = this._arrowAlignment;
+        let monitorIndex = Main.layoutManager.findIndexForActor(sourceActor);
+
+        this._sourceAllocation = Shell.util_get_transformed_allocation(sourceActor);
+        this._workArea = Main.layoutManager.getWorkAreaForMonitor(monitorIndex);
 
         // Position correctly relative to the sourceActor
         let sourceNode = sourceActor.get_theme_node();
         let sourceContentBox = sourceNode.get_content_box(sourceActor.get_allocation_box());
-        let sourceAllocation = Shell.util_get_transformed_allocation(sourceActor);
+        let sourceAllocation = this._sourceAllocation;
         let sourceCenterX = sourceAllocation.x1 + sourceContentBox.x1 + (sourceContentBox.x2 - sourceContentBox.x1) * this._sourceAlignment;
         let sourceCenterY = sourceAllocation.y1 + sourceContentBox.y1 + (sourceContentBox.y2 - sourceContentBox.y1) * this._sourceAlignment;
         let [minWidth, minHeight, natWidth, natHeight] = this.get_preferred_size();
@@ -489,8 +489,7 @@ var BoxPointer = GObject.registerClass({
         // We also want to keep it onscreen, and separated from the
         // edge by the same distance as the main part of the box is
         // separated from its sourceActor
-        let monitorIndex = Main.layoutManager.findIndexForActor(sourceActor);
-        let workarea = Main.layoutManager.getWorkAreaForMonitor(monitorIndex);
+        let workarea = this._workArea;
         let themeNode = this.get_theme_node();
         let borderWidth = themeNode.get_length('-arrow-border-width');
         let arrowBase = themeNode.get_length('-arrow-base');
@@ -584,9 +583,9 @@ var BoxPointer = GObject.registerClass({
             parent = parent.get_parent();
         }
 
-        this._xPosition = Math.floor(x);
-        this._yPosition = Math.floor(y);
-        this._shiftActor();
+        // Actually set the position
+        this.x = Math.floor(x);
+        this.y = Math.floor(y);
     }
 
     // @origin: Coordinate specifying middle of the arrow, along
@@ -609,25 +608,10 @@ var BoxPointer = GObject.registerClass({
         }
     }
 
-    _shiftActor() {
-        // Since the position of the BoxPointer depends on the allocated size
-        // of the BoxPointer and the position of the source actor, trying
-        // to position the BoxPointer via the x/y properties will result in
-        // allocation loops and warnings. Instead we do the positioning via
-        // the anchor point, which is independent of allocation, and leave
-        // x == y == 0.
-        this.set_anchor_point(-(this._xPosition + this._xOffset),
-                              -(this._yPosition + this._yOffset));
-    }
-
     _calculateArrowSide(arrowSide) {
-        let sourceAllocation = Shell.util_get_transformed_allocation(this._sourceActor);
+        let sourceAllocation = this._sourceAllocation;
         let [minWidth, minHeight, boxWidth, boxHeight] = this.get_preferred_size();
-        let monitorActor = this.sourceActor;
-        if (!monitorActor)
-            monitorActor = this;
-        let monitorIndex = Main.layoutManager.findIndexForActor(monitorActor);
-        let workarea = Main.layoutManager.getWorkAreaForMonitor(monitorIndex);
+        let workarea = this._workArea;
 
         switch (arrowSide) {
         case St.Side.TOP:
@@ -669,24 +653,6 @@ var BoxPointer = GObject.registerClass({
         }
     }
 
-    set xOffset(offset) {
-        this._xOffset = offset;
-        this._shiftActor();
-    }
-
-    get xOffset() {
-        return this._xOffset;
-    }
-
-    set yOffset(offset) {
-        this._yOffset = offset;
-        this._shiftActor();
-    }
-
-    get yOffset() {
-        return this._yOffset;
-    }
-
     updateArrowSide(side) {
         this._arrowSide = side;
         this._border.queue_repaint();
diff --git a/js/ui/dash.js b/js/ui/dash.js
index e60cdd8..6b5aeff 100644
--- a/js/ui/dash.js
+++ b/js/ui/dash.js
@@ -584,22 +584,18 @@ var Dash = class Dash {
         let firstButton = iconChildren[0].child;
         let firstIcon = firstButton._delegate.icon;
 
-        let minHeight, natHeight;
-        let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
-
-        // Enforce the current icon size during the size request
+        // Enforce valid spacings during the size request
         firstIcon.icon.ensure_style();
-        let [, currentHeight] = firstIcon.icon.get_size();
-        firstIcon.icon.set_height(this.iconSize * scaleFactor);
-        [minHeight, natHeight] = firstButton.get_preferred_height(-1);
-        firstIcon.icon.set_height(currentHeight);
+        let [, iconHeight] = firstIcon.icon.get_preferred_height(-1);
+        let [, buttonHeight] = firstButton.get_preferred_height(-1);
 
         // Subtract icon padding and box spacing from the available height
-        availHeight -= iconChildren.length * (natHeight - this.iconSize * scaleFactor) +
+        availHeight -= iconChildren.length * (buttonHeight - iconHeight) +
                        (iconChildren.length - 1) * spacing;
 
         let availSize = availHeight / iconChildren.length;
 
+        let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
         let iconSizes = baseIconSizes.map(s => s * scaleFactor);
 
         let newIconSize = baseIconSizes[0];
diff --git a/js/ui/dateMenu.js b/js/ui/dateMenu.js
index 697d6fb..fb32fbb 100644
--- a/js/ui/dateMenu.js
+++ b/js/ui/dateMenu.js
@@ -136,11 +136,12 @@ var WorldClocksSection = class WorldClocksSection {
         layout.attach(header, 0, 0, 2, 1);
         this.actor.label_actor = header;
 
+        let localOffset = GLib.DateTime.new_now_local().get_utc_offset();
+
         for (let i = 0; i < this._locations.length; i++) {
             let l = this._locations[i].location;
 
-            let name = l.get_level() == GWeather.LocationLevel.NAMED_TIMEZONE ? l.get_name()
-                                                                              : l.get_city_name();
+            let name = l.get_city_name() || l.get_name();
             let label = new St.Label({ style_class: 'world-clocks-city',
                                        text: name,
                                        x_align: Clutter.ActorAlign.START,
@@ -149,7 +150,8 @@ var WorldClocksSection = class WorldClocksSection {
 
             let time = new St.Label({ style_class: 'world-clocks-time' });
 
-            let offset = l.get_timezone().get_offset() / 60.;
+            let otherOffset = this._getTimeAtLocation(l).get_utc_offset();
+            let offset = (otherOffset - localOffset) / GLib.TIME_SPAN_HOUR;
             let fmt = (Math.trunc(offset) == offset) ? '%s%.0f' : '%s%.1f';
             let prefix = (offset >= 0) ? '+' : '-';
             let tz = new St.Label({ style_class: 'world-clocks-timezone',
@@ -182,11 +184,15 @@ var WorldClocksSection = class WorldClocksSection {
         }
     }
 
+    _getTimeAtLocation(location) {
+        let tz = GLib.TimeZone.new(location.get_timezone().get_tzid());
+        return GLib.DateTime.new_now(tz);
+    }
+
     _updateLabels() {
         for (let i = 0; i < this._locations.length; i++) {
             let l = this._locations[i];
-            let tz = GLib.TimeZone.new(l.location.get_timezone().get_tzid());
-            let now = GLib.DateTime.new_now(tz);
+            let now = this._getTimeAtLocation(l.location);
             l.actor.text = Util.formatTime(now, { timeOnly: true });
         }
     }
diff --git a/js/ui/layout.js b/js/ui/layout.js
index e3c93a9..30e750d 100644
--- a/js/ui/layout.js
+++ b/js/ui/layout.js
@@ -252,7 +252,7 @@ var LayoutManager = GObject.registerClass({
 
         // A dummy actor that tracks the mouse or text cursor, based on the
         // position and size set in setDummyCursorGeometry.
-        this.dummyCursor = new St.Widget({ width: 0, height: 0, visible: false });
+        this.dummyCursor = new St.Widget({ width: 0, height: 0, opacity: 0 });
         this.uiGroup.add_actor(this.dummyCursor);
 
         global.stage.remove_actor(global.top_window_group);
diff --git a/js/ui/osdMonitorLabeler.js b/js/ui/osdMonitorLabeler.js
index 55b4d3c..62feace 100644
--- a/js/ui/osdMonitorLabeler.js
+++ b/js/ui/osdMonitorLabeler.js
@@ -95,28 +95,6 @@ var OsdMonitorLabeler = class {
 
         this._reset();
 
-        for (let id in params) {
-            let monitor = this._monitorManager.get_monitor_for_output(id);
-            if (monitor == -1)
-                continue;
-            this._monitorLabels.get(monitor).push(params[id].deep_unpack());
-        }
-
-        // In mirrored display setups, more than one physical outputs
-        // might be showing the same logical monitor. In that case, we
-        // join each output's labels on the same OSD widget.
-        for (let [monitor, labels] of this._monitorLabels.entries()) {
-            labels.sort();
-            this._osdLabels.push(new OsdMonitorLabel(monitor, labels.join(' ')));
-        }
-    }
-
-    show2(client, params) {
-        if (!this._trackClient(client))
-            return;
-
-        this._reset();
-
         for (let connector in params) {
             let monitor = this._monitorManager.get_monitor_for_connector(connector);
             if (monitor == -1)
diff --git a/js/ui/panel.js b/js/ui/panel.js
index 0f052d3..36e16d3 100644
--- a/js/ui/panel.js
+++ b/js/ui/panel.js
@@ -1,6 +1,6 @@
 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 
-const { Atk, Clutter, Gio, GLib, GObject, Gtk, Meta, Shell, St } = imports.gi;
+const { Atk, Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi;
 const Cairo = imports.cairo;
 const Mainloop = imports.mainloop;
 
@@ -201,7 +201,6 @@ var AppMenuButton = GObject.registerClass({
         this._startingApps = [];
 
         this._menuManager = panel.menuManager;
-        this._gtkSettings = Gtk.Settings.get_default();
         this._targetApp = null;
         this._busyNotifyId = 0;
 
diff --git a/js/ui/popupMenu.js b/js/ui/popupMenu.js
index 283934c..4481853 100644
--- a/js/ui/popupMenu.js
+++ b/js/ui/popupMenu.js
@@ -277,12 +277,6 @@ var Switch = class {
         this.actor = new St.Bin({ style_class: 'toggle-switch',
                                   accessible_role: Atk.Role.CHECK_BOX,
                                   can_focus: true });
-        // Translators: this MUST be either "toggle-switch-us"
-        // (for toggle switches containing the English words
-        // "ON" and "OFF") or "toggle-switch-intl" (for toggle
-        // switches containing "◯" and "|"). Other values will
-        // simply result in invisible toggle switches.
-        this.actor.add_style_class_name(_("toggle-switch-us"));
         this.setToggleState(state);
     }
 
diff --git a/js/ui/screenshot.js b/js/ui/screenshot.js
index 9261535..c6896ff 100644
--- a/js/ui/screenshot.js
+++ b/js/ui/screenshot.js
@@ -1,6 +1,6 @@
 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 
-const { Clutter, Gio, GLib, Gtk, Meta, Shell, St } = imports.gi;
+const { Clutter, Gio, GLib, Meta, Shell, St } = imports.gi;
 const Signals = imports.signals;
 
 const GrabHelper = imports.ui.grabHelper;
@@ -227,8 +227,6 @@ var SelectArea = class {
         this._lastY = 0;
         this._result = null;
 
-        this._initRubberbandColors();
-
         this._group = new St.Widget({ visible: false,
                                       reactive: true,
                                       x: 0,
@@ -248,10 +246,10 @@ var SelectArea = class {
                                                       coordinate: Clutter.BindCoordinate.ALL });
         this._group.add_constraint(constraint);
 
-        this._rubberband = new Clutter.Rectangle({ color: this._background,
-                                                   has_border: true,
-                                                   border_width: 1,
-                                                   border_color: this._border });
+        this._rubberband = new St.Widget({
+            style_class: 'select-area-rubberband',
+            visible: false
+        });
         this._group.add_actor(this._rubberband);
     }
 
@@ -265,25 +263,6 @@ var SelectArea = class {
         this._group.visible = true;
     }
 
-    _initRubberbandColors() {
-        function colorFromRGBA(rgba) {
-            return new Clutter.Color({ red: rgba.red * 255,
-                                       green: rgba.green * 255,
-                                       blue: rgba.blue * 255,
-                                       alpha: rgba.alpha * 255 });
-        }
-
-        let path = new Gtk.WidgetPath();
-        path.append_type(Gtk.IconView);
-
-        let context = new Gtk.StyleContext();
-        context.set_path(path);
-        context.add_class('rubberband');
-
-        this._background = colorFromRGBA(context.get_background_color(Gtk.StateFlags.NORMAL));
-        this._border = colorFromRGBA(context.get_border_color(Gtk.StateFlags.NORMAL));
-    }
-
     _getGeometry() {
         return { x: Math.min(this._startX, this._lastX),
                  y: Math.min(this._startY, this._lastY),
@@ -302,6 +281,7 @@ var SelectArea = class {
 
         this._rubberband.set_position(geometry.x, geometry.y);
         this._rubberband.set_size(geometry.width, geometry.height);
+        this._rubberband.show();
 
         return Clutter.EVENT_PROPAGATE;
     }
diff --git a/js/ui/shellDBus.js b/js/ui/shellDBus.js
index 469a6c7..19d07ac 100644
--- a/js/ui/shellDBus.js
+++ b/js/ui/shellDBus.js
@@ -79,14 +79,17 @@ var GnomeShell = class {
         for (let param in params)
             params[param] = params[param].deep_unpack();
 
-        let { monitor: monitorIndex,
+        let { connector,
               label,
               level,
               max_level: maxLevel,
               icon: serializedIcon } = params;
 
-        if (monitorIndex === undefined)
-            monitorIndex = -1;
+        let monitorIndex = -1;
+        if (connector) {
+            let monitorManager = Meta.MonitorManager.get();
+            monitorIndex = monitorManager.get_monitor_for_connector(connector);
+        }
 
         let icon = null;
         if (serializedIcon)
@@ -203,16 +206,10 @@ var GnomeShell = class {
         this._grabbers.delete(name);
     }
 
-    ShowMonitorLabelsAsync(params, invocation) {
-        let sender = invocation.get_sender();
-        let [dict] = params;
-        Main.osdMonitorLabeler.show(sender, dict);
-    }
-
     ShowMonitorLabels2Async(params, invocation) {
         let sender = invocation.get_sender();
         let [dict] = params;
-        Main.osdMonitorLabeler.show2(sender, dict);
+        Main.osdMonitorLabeler.show(sender, dict);
     }
 
     HideMonitorLabelsAsync(params, invocation) {
diff --git a/js/ui/windowManager.js b/js/ui/windowManager.js
index ea9493d..b9f5fef 100644
--- a/js/ui/windowManager.js
+++ b/js/ui/windowManager.js
@@ -456,13 +456,28 @@ var TilePreview = class {
 };
 
 var TouchpadWorkspaceSwitchAction = class {
-    constructor(actor) {
+    constructor(actor, allowedModes) {
+        this._allowedModes = allowedModes;
         this._dx = 0;
         this._dy = 0;
+        this._enabled = true;
         actor.connect('captured-event', this._handleEvent.bind(this));
 	this._touchpadSettings = new Gio.Settings({schema_id: 'org.gnome.desktop.peripherals.touchpad'});
     }
 
+    get enabled() {
+        return this._enabled;
+    }
+
+    set enabled(enabled) {
+        if (this._enabled == enabled)
+            return;
+
+        this._enabled = enabled;
+        if (!enabled)
+            this.emit('cancel');
+    }
+
     _checkActivated() {
         let dir;
 
@@ -482,15 +497,16 @@ var TouchpadWorkspaceSwitchAction = class {
     }
 
     _handleEvent(actor, event) {
-        let allowedModes = Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW;
-
         if (event.type() != Clutter.EventType.TOUCHPAD_SWIPE)
             return Clutter.EVENT_PROPAGATE;
 
         if (event.get_touchpad_gesture_finger_count() != 4)
             return Clutter.EVENT_PROPAGATE;
 
-        if ((allowedModes & Main.actionMode) == 0)
+        if ((this._allowedModes & Main.actionMode) == 0)
+            return Clutter.EVENT_PROPAGATE;
+
+        if (!this._enabled)
             return Clutter.EVENT_PROPAGATE;
 
         if (event.get_gesture_phase() == Clutter.TouchpadGesturePhase.UPDATE) {
@@ -523,10 +539,11 @@ var WorkspaceSwitchAction = GObject.registerClass({
                'motion':    { param_types: [GObject.TYPE_DOUBLE, GObject.TYPE_DOUBLE] },
                'cancel':    { param_types: [] }},
 }, class WorkspaceSwitchAction extends Clutter.SwipeAction {
-    _init() {
+    _init(allowedModes) {
         super._init();
         this.set_n_touch_points(4);
         this._swept = false;
+        this._allowedModes = allowedModes;
 
         global.display.connect('grab-op-begin', () => {
             this.cancel();
@@ -534,14 +551,12 @@ var WorkspaceSwitchAction = GObject.registerClass({
     }
 
     vfunc_gesture_prepare(actor) {
-        let allowedModes = Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW;
-
         this._swept = false;
 
         if (!super.vfunc_gesture_prepare(actor))
             return false;
 
-        return (allowedModes & Main.actionMode);
+        return (this._allowedModes & Main.actionMode);
     }
 
     vfunc_gesture_progress(actor) {
@@ -1043,14 +1058,15 @@ var WindowManager = class {
         global.workspace_manager.override_workspace_layout(Meta.DisplayCorner.TOPLEFT,
                                                            false, -1, 1);
 
-        let gesture = new WorkspaceSwitchAction();
+        let allowedModes = Shell.ActionMode.NORMAL;
+        let gesture = new WorkspaceSwitchAction(allowedModes);
         gesture.connect('motion', this._switchWorkspaceMotion.bind(this));
         gesture.connect('activated', this._actionSwitchWorkspace.bind(this));
         gesture.connect('cancel', this._switchWorkspaceCancel.bind(this));
         global.stage.add_action(gesture);
 
         // This is not a normal Clutter.GestureAction, doesn't need add_action()
-        gesture = new TouchpadWorkspaceSwitchAction(global.stage);
+        gesture = new TouchpadWorkspaceSwitchAction(global.stage, allowedModes);
         gesture.connect('motion', this._switchWorkspaceMotion.bind(this));
         gesture.connect('activated', this._actionSwitchWorkspace.bind(this));
         gesture.connect('cancel', this._switchWorkspaceCancel.bind(this));
@@ -1202,6 +1218,10 @@ var WindowManager = class {
             // Same for OR windows
             if (window.is_override_redirect())
                 return;
+            // Sticky windows don't need moving, in fact moving would
+            // unstick them
+            if (window.on_all_workspaces)
+                return;
             // Windows on workspaces below pos don't need moving
             let index = window.get_workspace().index();
             if (index < pos)
@@ -1468,8 +1488,13 @@ var WindowManager = class {
         if (this._clearAnimationInfo(actor))
             this._shellwm.completed_size_change(actor);
 
+        let destroyId = actor.connect('destroy', () => {
+            this._clearAnimationInfo(actor);
+        });
+
         actor.__animationInfo = { clone: actorClone,
-                                  oldRect: oldFrameRect };
+                                  oldRect: oldFrameRect,
+                                  destroyId: destroyId };
     }
 
     _sizeChangedWindow(shellwm, actor) {
@@ -1530,6 +1555,7 @@ var WindowManager = class {
     _clearAnimationInfo(actor) {
         if (actor.__animationInfo) {
             actor.__animationInfo.clone.destroy();
+            actor.disconnect(actor.__animationInfo.destroyId);
             delete actor.__animationInfo;
             return true;
         }
diff --git a/js/ui/workspacesView.js b/js/ui/workspacesView.js
index d2557a4..f631781 100644
--- a/js/ui/workspacesView.js
+++ b/js/ui/workspacesView.js
@@ -1,10 +1,11 @@
 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 
-const { Clutter, Gio, GObject, Meta, St } = imports.gi;
+const { Clutter, Gio, GObject, Meta, Shell, St } = imports.gi;
 const Signals = imports.signals;
 
 const Main = imports.ui.main;
 const Tweener = imports.ui.tweener;
+const WindowManager = imports.ui.windowManager;
 const Workspace = imports.ui.workspace;
 
 var WORKSPACE_SWITCH_TIME = 0.25;
@@ -82,6 +83,7 @@ var WorkspacesView = class extends WorkspacesViewBase {
 
         this._animating = false; // tweening
         this._scrolling = false; // swipe-scrolling
+        this._gestureActive = false; // touch(pad) gestures
         this._animatingScroll = false; // programatically updating the adjustment
 
         let activeWorkspaceIndex = workspaceManager.get_active_workspace_index();
@@ -211,7 +213,7 @@ var WorkspacesView = class extends WorkspacesViewBase {
 
         for (let w = 0; w < this._workspaces.length; w++) {
             let workspace = this._workspaces[w];
-            if (this._animating || this._scrolling) {
+            if (this._animating || this._scrolling || this._gestureActive) {
                 workspace.actor.show();
             } else {
                 if (this._inDrag)
@@ -223,7 +225,7 @@ var WorkspacesView = class extends WorkspacesViewBase {
     }
 
     _updateScrollAdjustment(index) {
-        if (this._scrolling)
+        if (this._scrolling || this._gestureActive)
             return;
 
         this._animatingScroll = true;
@@ -300,6 +302,18 @@ var WorkspacesView = class extends WorkspacesViewBase {
         this._updateVisibility();
     }
 
+    startTouchGesture() {
+        this._gestureActive = true;
+    }
+
+    endTouchGesture() {
+        this._gestureActive = false;
+
+        // Make sure title captions etc are shown as necessary
+        this._scrollToActive();
+        this._updateVisibility();
+    }
+
     // sync the workspaces' positions to the value of the scroll adjustment
     // and change the active workspace if appropriate
     _onScroll(adj) {
@@ -310,7 +324,7 @@ var WorkspacesView = class extends WorkspacesViewBase {
         let active = workspaceManager.get_active_workspace_index();
         let current = Math.round(adj.value);
 
-        if (active != current) {
+        if (active != current && !this._gestureActive) {
             if (!this._workspaces[current]) {
                 // The current workspace was destroyed. This could happen
                 // when you are on the last empty workspace, and consolidate
@@ -391,6 +405,12 @@ var ExtraWorkspaceView = class extends WorkspacesViewBase {
 
     endSwipeScroll() {
     }
+
+    startTouchGesture() {
+    }
+
+    endTouchGesture() {
+    }
 };
 
 var DelegateFocusNavigator = GObject.registerClass(
@@ -430,23 +450,37 @@ var WorkspacesDisplay = class {
                     return false;
             }
 
-            for (let i = 0; i < this._workspacesViews.length; i++)
-                this._workspacesViews[i].startSwipeScroll();
+            this._startSwipeScroll();
             return true;
         });
         panAction.connect('gesture-cancel', () => {
             clickAction.release();
-            for (let i = 0; i < this._workspacesViews.length; i++)
-                this._workspacesViews[i].endSwipeScroll();
+            this._endSwipeScroll();
         });
         panAction.connect('gesture-end', () => {
             clickAction.release();
-            for (let i = 0; i < this._workspacesViews.length; i++)
-                this._workspacesViews[i].endSwipeScroll();
+            this._endSwipeScroll();
         });
         Main.overview.addAction(panAction);
         this.actor.bind_property('mapped', panAction, 'enabled', GObject.BindingFlags.SYNC_CREATE);
 
+        let allowedModes = Shell.ActionMode.OVERVIEW;
+        let switchGesture = new WindowManager.WorkspaceSwitchAction(allowedModes);
+        switchGesture.connect('motion', this._onSwitchWorkspaceMotion.bind(this));
+        switchGesture.connect('activated', this._onSwitchWorkspaceActivated.bind(this));
+        switchGesture.connect('cancel', this._endTouchGesture.bind(this));
+        Main.overview.addAction(switchGesture);
+        this.actor.bind_property('mapped', switchGesture, 'enabled', GObject.BindingFlags.SYNC_CREATE);
+
+        switchGesture = new WindowManager.TouchpadWorkspaceSwitchAction(global.stage, allowedModes);
+        switchGesture.connect('motion', this._onSwitchWorkspaceMotion.bind(this));
+        switchGesture.connect('activated', this._onSwitchWorkspaceActivated.bind(this));
+        switchGesture.connect('cancel', this._endTouchGesture.bind(this));
+        this.actor.connect('notify::mapped', () => {
+            switchGesture.enabled = this.actor.mapped;
+        });
+        switchGesture.enabled = this.actor.mapped;
+
         this._primaryIndex = Main.layoutManager.primaryIndex;
 
         this._workspacesViews = [];
@@ -474,6 +508,47 @@ var WorkspacesDisplay = class {
         return false;
     }
 
+    _startSwipeScroll() {
+        for (let i = 0; i < this._workspacesViews.length; i++)
+            this._workspacesViews[i].startSwipeScroll();
+    }
+
+    _endSwipeScroll() {
+        for (let i = 0; i < this._workspacesViews.length; i++)
+            this._workspacesViews[i].endSwipeScroll();
+    }
+
+    _startTouchGesture() {
+        for (let i = 0; i < this._workspacesViews.length; i++)
+            this._workspacesViews[i].startTouchGesture();
+    }
+
+    _endTouchGesture() {
+        for (let i = 0; i < this._workspacesViews.length; i++)
+            this._workspacesViews[i].endTouchGesture();
+    }
+
+    _onSwitchWorkspaceMotion(action, xRel, yRel) {
+        // We don't have a way to hook into start of touchpad actions,
+        // luckily this is safe to call repeatedly.
+        this._startTouchGesture();
+
+        let workspaceManager = global.workspace_manager;
+        let active = workspaceManager.get_active_workspace_index();
+        let adjustment = this._scrollAdjustment;
+        adjustment.value = (active - yRel / this.actor.height) * adjustment.page_size;
+    }
+
+    _onSwitchWorkspaceActivated(action, direction) {
+        let workspaceManager = global.workspace_manager;
+        let activeWorkspace = workspaceManager.get_active_workspace();
+        let newWs = activeWorkspace.get_neighbor(direction);
+        if (newWs != activeWorkspace)
+            newWs.activate(global.get_current_time());
+
+        this._endTouchGesture();
+    }
+
     navigateFocus(from, direction) {
         return this._getPrimaryView().actor.navigate_focus(from, direction, false);
     }
diff --git a/meson.build b/meson.build
index e42611e..e3500d4 100644
--- a/meson.build
+++ b/meson.build
@@ -1,5 +1,5 @@
 project('gnome-shell', 'c',
-  version: '3.32.0',
+  version: '3.32.1',
   meson_version: '>= 0.47.0',
   license: 'GPLv2+'
 )
diff --git a/src/st/st-theme-node.c b/src/st/st-theme-node.c
index c05ca78..8a6ebf0 100644
--- a/src/st/st-theme-node.c
+++ b/src/st/st-theme-node.c
@@ -1136,10 +1136,14 @@ get_length_from_term_int (StThemeNode *node,
 {
   double value;
   GetFromTermResult result;
+  int scale_factor;
 
   result = get_length_from_term (node, term, use_parent_font, &value);
   if (result == VALUE_FOUND)
-    *length = (int) (0.5 + value);
+    {
+      g_object_get (node->context, "scale-factor", &scale_factor, NULL);
+      *length = (int) ((value / scale_factor) + 0.5) * scale_factor;
+    }
   return result;
 }
 
-- 
ubuntu-desktop mailing list
ubuntu-desktop@lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/ubuntu-desktop

Reply via email to