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

Requested reviews:
  Ubuntu Desktop (ubuntu-desktop)
Related bugs:
  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 #1826182 in mutter (Ubuntu): "[DisplayLink][fixed upstream] GNOME 
libmutter crash on hotplugging a dock with a monitor"
  https://bugs.launchpad.net/ubuntu/+source/mutter/+bug/1826182
  Bug #1826933 in gnome-shell (Ubuntu): "gnome-shell crashes in 
meta_monitor_mode_get_resolution -> calculate_scale -> 
meta_monitor_calculate_mode_scale derive_calculated_global_scale -> 
meta_monitor_manager_rebuild_logical_monitors_derived"
  https://bugs.launchpad.net/ubuntu/+source/gnome-shell/+bug/1826933
  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/mutter/+git/mutter/+merge/366666

Merge 3.32 with debian, fix scale computation crash.
-- 
Your team Ubuntu Desktop is requested to review the proposed merge of 
~3v1n0/ubuntu/+source/mutter:ubuntu/master into 
~ubuntu-desktop/ubuntu/+source/mutter:ubuntu/master.
diff --git a/NEWS b/NEWS
index 720e28d..5606ee4 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,33 @@
+3.32.1
+======
+* Fix fallback app menu on wayland [Florian; #493]
+* Fix elogind support [Tom; !491]
+* Fix startup notifications not timing out [Carlos; #501]
+* Fix keyboard accessibility toggle from keys
+  [Olivier, Carlos; !501, #529, !531]
+* Fix touchscreen input on rotated displays [Carlos; #514]
+* Work around hangul text input bug [Carlos; #1365]
+* Fix blurry wallpaper scaling [Daniel; !505]
+* Fix placement of window menu when using fractional scaling [Jan; #527]
+* Fix repaint issues of offscreen effects on secondary monitors [Daniel; !511]
+* Fix windows not getting focus after launch [Daniel; #505]
+* Properly advertise support for 'underscan' property [Jonas; !507]
+* Improve power-saving handling [Jonas; !506]
+* Fix moving windows by super+touch [Jonas D.; !495]
+* Misc. bug fixes and cleanups [Benjamin, Florian, Adam, Marco, Pablo,
+  Erik, Jonas, Heiher, Pekka, Daniel, Olivier, Carlos; !478, !475, !480,
+  !482, #490, !488, #491, #480, !477, !496, !492, !485, !515, !519, !521,
+  !216, !538, #541, #523]
+
+Contributors:
+  Jonas Ådahl, Pablo Barciela, Benjamin Berg, Tom Briden, Jonas Dreßler,
+  Olivier Fourdan, Carlos Garnacho, Jan Alexander Steffens (heftig), Heiher,
+  Adam Jackson, Erik Kurzinger, Florian Müllner, Pekka Paalanen,
+  Marco Trevisan (Treviño), Daniel van Vugt
+
+Translators:
+  Khaled Hosny [ar], Goran Vidović [hr], Daniel Mustieles [es]
+
 3.32.0
 ======
 * Fix deadlock when cancelling a theme sound [Andrea; !474]
diff --git a/clutter/clutter/clutter-device-manager.c b/clutter/clutter/clutter-device-manager.c
index 1800d01..c676384 100644
--- a/clutter/clutter/clutter-device-manager.c
+++ b/clutter/clutter/clutter-device-manager.c
@@ -550,13 +550,7 @@ static gboolean
 are_kbd_a11y_settings_equal (ClutterKbdA11ySettings *a,
                              ClutterKbdA11ySettings *b)
 {
-  return (a->controls == b->controls &&
-          a->slowkeys_delay == b->slowkeys_delay &&
-          a->debounce_delay == b->debounce_delay &&
-          a->timeout_delay == b->timeout_delay &&
-          a->mousekeys_init_delay == b->mousekeys_init_delay &&
-          a->mousekeys_max_speed == b->mousekeys_max_speed &&
-          a->mousekeys_accel_time == b->mousekeys_accel_time);
+  return (memcmp (a, b, sizeof (ClutterKbdA11ySettings)) == 0);
 }
 
 void
diff --git a/clutter/clutter/evdev/clutter-input-device-evdev.c b/clutter/clutter/evdev/clutter-input-device-evdev.c
index b52689e..2ac2e11 100644
--- a/clutter/clutter/evdev/clutter-input-device-evdev.c
+++ b/clutter/clutter/evdev/clutter-input-device-evdev.c
@@ -1132,13 +1132,13 @@ clutter_input_device_evdev_process_kbd_a11y_event (ClutterEvent               *e
   if (event->key.flags & CLUTTER_EVENT_FLAG_INPUT_METHOD)
     goto emit_event;
 
-  if (!(device_evdev->a11y_flags & CLUTTER_A11Y_KEYBOARD_ENABLED))
-    goto emit_event;
-
-  if (event->type == CLUTTER_KEY_PRESS)
-    handle_enablekeys_press (event, device_evdev);
-  else
-    handle_enablekeys_release (event, device_evdev);
+  if (device_evdev->a11y_flags & CLUTTER_A11Y_KEYBOARD_ENABLED)
+    {
+      if (event->type == CLUTTER_KEY_PRESS)
+        handle_enablekeys_press (event, device_evdev);
+      else
+        handle_enablekeys_release (event, device_evdev);
+    }
 
   if (device_evdev->a11y_flags & CLUTTER_A11Y_MOUSE_KEYS_ENABLED)
     {
diff --git a/cogl/cogl/winsys/cogl-winsys-glx.c b/cogl/cogl/winsys/cogl-winsys-glx.c
index 2623d02..235cfe8 100644
--- a/cogl/cogl/winsys/cogl-winsys-glx.c
+++ b/cogl/cogl/winsys/cogl-winsys-glx.c
@@ -99,9 +99,9 @@ typedef struct _CoglOnscreenGLX
   CoglOnscreenXlib _parent;
   GLXDrawable glxwin;
   uint32_t last_swap_vsync_counter;
-  gboolean pending_sync_notify;
-  gboolean pending_complete_notify;
-  gboolean pending_resize_notify;
+  uint32_t pending_sync_notify;
+  uint32_t pending_complete_notify;
+  uint32_t pending_resize_notify;
 
   GThread *swap_wait_thread;
   GQueue *swap_wait_queue;
@@ -347,35 +347,35 @@ flush_pending_notifications_cb (void *data,
     {
       CoglOnscreen *onscreen = COGL_ONSCREEN (framebuffer);
       CoglOnscreenGLX *glx_onscreen = onscreen->winsys;
-      gboolean pending_sync_notify = glx_onscreen->pending_sync_notify;
-      gboolean pending_complete_notify = glx_onscreen->pending_complete_notify;
 
-      /* If swap_region is called then notifying the sync event could
-       * potentially immediately queue a subsequent pending notify so
-       * we need to clear the flag before invoking the callback */
-      glx_onscreen->pending_sync_notify = FALSE;
-      glx_onscreen->pending_complete_notify = FALSE;
-
-      if (pending_sync_notify)
+      while (glx_onscreen->pending_sync_notify > 0 ||
+             glx_onscreen->pending_complete_notify > 0 ||
+             glx_onscreen->pending_resize_notify > 0)
         {
-          CoglFrameInfo *info = g_queue_peek_head (&onscreen->pending_frame_infos);
-
-          _cogl_onscreen_notify_frame_sync (onscreen, info);
-        }
+          if (glx_onscreen->pending_sync_notify > 0)
+            {
+              CoglFrameInfo *info =
+                g_queue_peek_head (&onscreen->pending_frame_infos);
 
-      if (pending_complete_notify)
-        {
-          CoglFrameInfo *info = g_queue_pop_head (&onscreen->pending_frame_infos);
+              _cogl_onscreen_notify_frame_sync (onscreen, info);
+              glx_onscreen->pending_sync_notify--;
+            }
 
-          _cogl_onscreen_notify_complete (onscreen, info);
+          if (glx_onscreen->pending_complete_notify > 0)
+            {
+              CoglFrameInfo *info =
+                g_queue_pop_head (&onscreen->pending_frame_infos);
 
-          cogl_object_unref (info);
-        }
+              _cogl_onscreen_notify_complete (onscreen, info);
+              cogl_object_unref (info);
+              glx_onscreen->pending_complete_notify--;
+            }
 
-      if (glx_onscreen->pending_resize_notify)
-        {
-          _cogl_onscreen_notify_resize (onscreen);
-          glx_onscreen->pending_resize_notify = FALSE;
+          if (glx_onscreen->pending_resize_notify > 0)
+            {
+              _cogl_onscreen_notify_resize (onscreen);
+              glx_onscreen->pending_resize_notify--;
+            }
         }
     }
 }
@@ -417,7 +417,7 @@ set_sync_pending (CoglOnscreen *onscreen)
                                       NULL);
     }
 
-  glx_onscreen->pending_sync_notify = TRUE;
+  glx_onscreen->pending_sync_notify++;
 }
 
 static void
@@ -440,7 +440,7 @@ set_complete_pending (CoglOnscreen *onscreen)
                                       NULL);
     }
 
-  glx_onscreen->pending_complete_notify = TRUE;
+  glx_onscreen->pending_complete_notify++;
 }
 
 static void
@@ -533,7 +533,7 @@ notify_resize (CoglContext *context,
                                       NULL);
     }
 
-  glx_onscreen->pending_resize_notify = TRUE;
+  glx_onscreen->pending_resize_notify++;
 
   if (!xlib_onscreen->is_foreign_xwin)
     {
diff --git a/debian/changelog b/debian/changelog
index cd3e63e..353a3fe 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,29 @@
+mutter (3.32.1-1ubuntu1) UNRELEASED; urgency=medium
+
+  * Merge with debian
+    - Update to 3.32.1 upstream version (LP: #1826936)
+    - Fix applications aren't focused in Wayland session (LP: #1826176)
+    - Fix crash on hotplugging a dock with a monitor (LP: #1826182)
+    Remaining changes:
+    + debian/control:
+      - Update VCS flags to point to launchpad
+      - Update maintainer to ubuntu
+    + debian/gbp.conf: update branch to point to ubuntu/master
+    + debian/patches/x11-Add-support-for-fractional-scaling-using-Randr.patch:
+      - X11: Add support for fractional scaling using Randr
+  * d/p/x11-Add-support-for-fractional-scaling-using-Randr.patch:
+    - Fixed crash on calculation of global scale (LP: #1826933)
+
+ -- Marco Trevisan (Treviño) <[email protected]>  Mon, 29 Apr 2019 16:08:24 -0500
+
+mutter (3.32.1-1) experimental; urgency=medium
+
+  * New upstream release
+  * debian/patches: disable mousekeys with Numlock ON to match the
+    documentation (cherry picked from the 3.32 branch)
+
+ -- Laurent Bigonville <[email protected]>  Mon, 22 Apr 2019 21:57:33 +0200
+
 mutter (3.32.0+git20190410-2) experimental; urgency=medium
 
   [ Gunnar Hjalmarsson ]
diff --git a/debian/patches/clutter-evdev-disable-mousekeys-with-Numlock-ON.patch b/debian/patches/clutter-evdev-disable-mousekeys-with-Numlock-ON.patch
new file mode 100644
index 0000000..5c70efe
--- /dev/null
+++ b/debian/patches/clutter-evdev-disable-mousekeys-with-Numlock-ON.patch
@@ -0,0 +1,64 @@
+From: Olivier Fourdan <[email protected]>
+Date: Tue, 9 Apr 2019 13:39:59 +0200
+Subject: clutter/evdev: disable mousekeys with Numlock ON
+
+The clutter/evdev implementation of mousekeys is designed after the
+current implementation in X11, and works when the setting is enabled
+regardless of the status of NumLock.
+
+The GNOME documentation on accessibility features states however that
+mousekeys work only when NumLock is OFF:
+
+  https://help.gnome.org/users/gnome-help/stable/mouse-mousekeys.html
+
+Change the clutter/evdev implementation to match the documentation, i.e.
+disable mousekeys when NumLock in ON so that switching NumLock ON
+restores the numeric keypad behaviour.
+
+Closes: https://gitlab.gnome.org/GNOME/mutter/issues/530
+(cherry picked from commit 471b61bd1400435b7af977c47c21b8fc747530d9)
+---
+ clutter/clutter/evdev/clutter-input-device-evdev.c | 16 ++++++++++++++++
+ 1 file changed, 16 insertions(+)
+
+diff --git a/clutter/clutter/evdev/clutter-input-device-evdev.c b/clutter/clutter/evdev/clutter-input-device-evdev.c
+index 2ac2e11..73072b4 100644
+--- a/clutter/clutter/evdev/clutter-input-device-evdev.c
++++ b/clutter/clutter/evdev/clutter-input-device-evdev.c
+@@ -855,6 +855,14 @@ emulate_pointer_motion (ClutterInputDeviceEvdev *device,
+   clutter_virtual_input_device_notify_relative_motion (device->mousekeys_virtual_device,
+                                                        time_us, dx_motion, dy_motion);
+ }
++static gboolean
++is_numlock_active (ClutterInputDeviceEvdev *device)
++{
++  ClutterSeatEvdev *seat = device->seat;
++  return xkb_state_mod_name_is_active (seat->xkb,
++                                       "Mod2",
++                                       XKB_STATE_MODS_LOCKED);
++}
+ 
+ static void
+ enable_mousekeys (ClutterInputDeviceEvdev *device)
+@@ -1013,6 +1021,10 @@ handle_mousekeys_press (ClutterEvent            *event,
+   if (!(event->key.flags & CLUTTER_EVENT_FLAG_SYNTHETIC))
+     stop_mousekeys_move (device);
+ 
++  /* Do not handle mousekeys if NumLock is ON */
++  if (is_numlock_active (device))
++    return FALSE;
++
+   /* Button selection */
+   switch (event->key.keyval)
+     {
+@@ -1084,6 +1096,10 @@ static gboolean
+ handle_mousekeys_release (ClutterEvent            *event,
+                           ClutterInputDeviceEvdev *device)
+ {
++  /* Do not handle mousekeys if NumLock is ON */
++  if (is_numlock_active (device))
++    return FALSE;
++
+   switch (event->key.keyval)
+     {
+     case XKB_KEY_KP_0:
diff --git a/debian/patches/clutter-x11-disable-mousekeys-with-Numlock-ON.patch b/debian/patches/clutter-x11-disable-mousekeys-with-Numlock-ON.patch
new file mode 100644
index 0000000..d33c9aa
--- /dev/null
+++ b/debian/patches/clutter-x11-disable-mousekeys-with-Numlock-ON.patch
@@ -0,0 +1,85 @@
+From: Olivier Fourdan <[email protected]>
+Date: Tue, 9 Apr 2019 16:25:57 +0200
+Subject: clutter/x11: disable mousekeys with Numlock ON
+
+GNOME documentation on accessibility features states that mousekeys
+work only when NumLock is OFF:
+
+  https://help.gnome.org/users/gnome-help/stable/mouse-mousekeys.html
+
+Change the clutter/x11 implementation to match the documentation, i.e.
+disable mousekeys when NumLock in ON so that switching NumLock ON
+restores the numeric keypad behaviour.
+
+Closes: https://gitlab.gnome.org/GNOME/mutter/issues/530
+(cherry picked from commit 251fa024c416b1507a8cb1c9115082be87d25632)
+---
+ clutter/clutter/x11/clutter-backend-x11.c  | 20 ++++++++++++++++++++
+ clutter/clutter/x11/clutter-xkb-a11y-x11.c |  9 +++++++--
+ 2 files changed, 27 insertions(+), 2 deletions(-)
+
+diff --git a/clutter/clutter/x11/clutter-backend-x11.c b/clutter/clutter/x11/clutter-backend-x11.c
+index 0ddd0f8..8c5ebc8 100644
+--- a/clutter/clutter/x11/clutter-backend-x11.c
++++ b/clutter/clutter/x11/clutter-backend-x11.c
+@@ -54,6 +54,7 @@
+ #include "clutter-main.h"
+ #include "clutter-private.h"
+ #include "clutter-settings-private.h"
++#include "clutter-xkb-a11y-x11.h"
+ 
+ G_DEFINE_TYPE (ClutterBackendX11, clutter_backend_x11, CLUTTER_TYPE_BACKEND)
+ 
+@@ -276,6 +277,20 @@ clutter_backend_x11_create_device_manager (ClutterBackendX11 *backend_x11)
+   _clutter_backend_add_event_translator (backend, translator);
+ }
+ 
++static void
++on_keymap_state_change (ClutterKeymapX11 *keymap_x11,
++                        gpointer          data)
++{
++  ClutterDeviceManager *device_manager = CLUTTER_DEVICE_MANAGER (data);
++  ClutterKbdA11ySettings kbd_a11y_settings;
++
++  /* On keymaps state change, just reapply the current settings, it'll
++   * take care of enabling/disabling mousekeys based on NumLock state.
++   */
++  clutter_device_manager_get_kbd_a11y_settings (device_manager, &kbd_a11y_settings);
++  clutter_device_manager_x11_apply_kbd_a11y_settings (device_manager, &kbd_a11y_settings);
++}
++
+ static void
+ clutter_backend_x11_create_keymap (ClutterBackendX11 *backend_x11)
+ {
+@@ -292,6 +307,11 @@ clutter_backend_x11_create_keymap (ClutterBackendX11 *backend_x11)
+       backend = CLUTTER_BACKEND (backend_x11);
+       translator = CLUTTER_EVENT_TRANSLATOR (backend_x11->keymap);
+       _clutter_backend_add_event_translator (backend, translator);
++
++      g_signal_connect (backend_x11->keymap,
++                        "state-changed",
++                        G_CALLBACK (on_keymap_state_change),
++                        backend->device_manager);
+     }
+ }
+ 
+diff --git a/clutter/clutter/x11/clutter-xkb-a11y-x11.c b/clutter/clutter/x11/clutter-xkb-a11y-x11.c
+index 6adde81..6b782c7 100644
+--- a/clutter/clutter/x11/clutter-xkb-a11y-x11.c
++++ b/clutter/clutter/x11/clutter-xkb-a11y-x11.c
+@@ -241,8 +241,13 @@ clutter_device_manager_x11_apply_kbd_a11y_settings (ClutterDeviceManager   *devi
+     }
+ 
+   /* mouse keys */
+-  if (set_xkb_ctrl (desc, kbd_a11y_settings->controls,
+-                    CLUTTER_A11Y_MOUSE_KEYS_ENABLED, XkbMouseKeysMask | XkbMouseKeysAccelMask))
++  if (clutter_keymap_get_num_lock_state (CLUTTER_KEYMAP (backend_x11->keymap)))
++    {
++      /* Disable mousekeys when NumLock is ON */
++      desc->ctrls->enabled_ctrls &= ~(XkbMouseKeysMask | XkbMouseKeysAccelMask);
++    }
++  else if (set_xkb_ctrl (desc, kbd_a11y_settings->controls,
++                         CLUTTER_A11Y_MOUSE_KEYS_ENABLED, XkbMouseKeysMask | XkbMouseKeysAccelMask))
+     {
+       gint mk_max_speed;
+       gint mk_accel_time;
diff --git a/debian/patches/series b/debian/patches/series
index 5e2b370..71d998d 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -2,4 +2,6 @@ theme-use-gtk_render_icon_suface-to-paint-button-icon.patch
 theme-load-icons-as-Gtk-does-with-fallback-and-RTL-suppor.patch
 meson-add-back-default_driver-option.patch
 debian/synaptics-support.patch
+clutter-evdev-disable-mousekeys-with-Numlock-ON.patch
+clutter-x11-disable-mousekeys-with-Numlock-ON.patch
 x11-Add-support-for-fractional-scaling-using-Randr.patch
diff --git a/debian/patches/x11-Add-support-for-fractional-scaling-using-Randr.patch b/debian/patches/x11-Add-support-for-fractional-scaling-using-Randr.patch
index 7717be1..ea517c1 100644
--- a/debian/patches/x11-Add-support-for-fractional-scaling-using-Randr.patch
+++ b/debian/patches/x11-Add-support-for-fractional-scaling-using-Randr.patch
@@ -1,5 +1,5 @@
 From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= <[email protected]>
-Date: Wed, 3 Apr 2019 19:18:03 -0400
+Date: Wed, 3 Apr 2019 17:18:03 -0600
 Subject: x11-Add-support-for-fractional-scaling-using-Randr
 
 Add scaling support using randr under x11.
@@ -724,7 +724,7 @@ index cdb8f42..bf586ea 100644
                     meta_monitor_manager_get_capabilities (MetaMonitorManager *manager);
  
 diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c
-index 2d898c7..a78fb37 100644
+index 2d898c7..d8cf3ae 100644
 --- a/src/backends/meta-monitor-manager.c
 +++ b/src/backends/meta-monitor-manager.c
 @@ -110,8 +110,18 @@ static gboolean
@@ -838,7 +838,7 @@ index 2d898c7..a78fb37 100644
  
 -  if (!monitor || !meta_monitor_is_active (monitor))
 -    monitor = meta_monitor_manager_get_active_monitor (manager);
-+  if (monitor)
++  if (monitor && meta_monitor_is_active (monitor))
 +    {
 +      scale = calculate_monitor_scale (manager, monitor);
 +      if (meta_monitor_manager_is_scale_supported_by_other_monitors (manager,
diff --git a/meson.build b/meson.build
index 6ce9e59..1c86575 100644
--- a/meson.build
+++ b/meson.build
@@ -1,5 +1,5 @@
 project('mutter', 'c',
-  version: '3.32.0',
+  version: '3.32.1',
   meson_version: '>= 0.48.0',
   license: 'GPLv2+'
 )
diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c
index 086e8e4..dbfc97a 100644
--- a/src/backends/native/meta-renderer-native.c
+++ b/src/backends/native/meta-renderer-native.c
@@ -3787,16 +3787,13 @@ gpu_kms_is_hardware_rendering (MetaRendererNative *renderer_native,
   return data->secondary.is_hardware_rendering;
 }
 
-static MetaRendererNativeGpuData *
-create_renderer_gpu_data_gbm (MetaRendererNative  *renderer_native,
-                              MetaGpuKms          *gpu_kms,
-                              GError             **error)
+static EGLDisplay
+init_gbm_egl_display (MetaRendererNative  *renderer_native,
+                      struct gbm_device   *gbm_device,
+                      GError             **error)
 {
   MetaEgl *egl = meta_renderer_native_get_egl (renderer_native);
-  struct gbm_device *gbm_device;
   EGLDisplay egl_display;
-  int kms_fd;
-  MetaRendererNativeGpuData *renderer_gpu_data;
 
   if (!meta_egl_has_extensions (egl, EGL_NO_DISPLAY, NULL,
                                 "EGL_MESA_platform_gbm",
@@ -3808,9 +3805,31 @@ create_renderer_gpu_data_gbm (MetaRendererNative  *renderer_native,
       g_set_error (error, G_IO_ERROR,
                    G_IO_ERROR_FAILED,
                    "Missing extension for GBM renderer: EGL_KHR_platform_gbm");
-      return NULL;
+      return EGL_NO_DISPLAY;
     }
 
+  egl_display = meta_egl_get_platform_display (egl,
+                                               EGL_PLATFORM_GBM_KHR,
+                                               gbm_device, NULL, error);
+  if (egl_display == EGL_NO_DISPLAY)
+    return EGL_NO_DISPLAY;
+
+  if (!meta_egl_initialize (egl, egl_display, error))
+    return EGL_NO_DISPLAY;
+
+  return egl_display;
+}
+
+static MetaRendererNativeGpuData *
+create_renderer_gpu_data_gbm (MetaRendererNative  *renderer_native,
+                              MetaGpuKms          *gpu_kms,
+                              GError             **error)
+{
+  struct gbm_device *gbm_device;
+  int kms_fd;
+  MetaRendererNativeGpuData *renderer_gpu_data;
+  g_autoptr (GError) local_error = NULL;
+
   kms_fd = meta_gpu_kms_get_fd (gpu_kms);
 
   gbm_device = gbm_create_device (kms_fd);
@@ -3822,26 +3841,25 @@ create_renderer_gpu_data_gbm (MetaRendererNative  *renderer_native,
       return NULL;
     }
 
-  egl_display = meta_egl_get_platform_display (egl,
-                                               EGL_PLATFORM_GBM_KHR,
-                                               gbm_device, NULL, error);
-  if (egl_display == EGL_NO_DISPLAY)
-    {
-      gbm_device_destroy (gbm_device);
-      return NULL;
-    }
-
-  if (!meta_egl_initialize (egl, egl_display, error))
-    return NULL;
-
   renderer_gpu_data = meta_create_renderer_native_gpu_data (gpu_kms);
   renderer_gpu_data->renderer_native = renderer_native;
   renderer_gpu_data->gbm.device = gbm_device;
   renderer_gpu_data->mode = META_RENDERER_NATIVE_MODE_GBM;
-  renderer_gpu_data->egl_display = egl_display;
 
-  init_secondary_gpu_data (renderer_gpu_data);
+  renderer_gpu_data->egl_display = init_gbm_egl_display (renderer_native,
+                                                         gbm_device,
+                                                         &local_error);
+  if (renderer_gpu_data->egl_display == EGL_NO_DISPLAY)
+    {
+      g_debug ("GBM EGL init for %s failed: %s",
+               meta_gpu_kms_get_file_path (gpu_kms),
+               local_error->message);
 
+      init_secondary_gpu_data_cpu (renderer_gpu_data);
+      return renderer_gpu_data;
+    }
+
+  init_secondary_gpu_data (renderer_gpu_data);
   return renderer_gpu_data;
 }
 
@@ -4134,8 +4152,8 @@ on_gpu_added (MetaMonitorManager *monitor_manager,
 }
 
 static MetaGpuKms *
-choose_primary_gpu (MetaMonitorManager *manager,
-                    MetaRendererNative *renderer_native)
+choose_primary_gpu_unchecked (MetaMonitorManager *manager,
+                              MetaRendererNative *renderer_native)
 {
   GList *gpus = meta_monitor_manager_get_gpus (manager);
   GList *l;
@@ -4184,6 +4202,28 @@ choose_primary_gpu (MetaMonitorManager *manager,
   return NULL;
 }
 
+static MetaGpuKms *
+choose_primary_gpu (MetaMonitorManager  *manager,
+                    MetaRendererNative  *renderer_native,
+                    GError             **error)
+{
+  MetaGpuKms *gpu_kms;
+  MetaRendererNativeGpuData *renderer_gpu_data;
+
+  gpu_kms = choose_primary_gpu_unchecked (manager, renderer_native);
+  renderer_gpu_data = meta_renderer_native_get_gpu_data (renderer_native,
+                                                         gpu_kms);
+  if (renderer_gpu_data->egl_display == EGL_NO_DISPLAY)
+    {
+      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+                   "The GPU %s chosen as primary is not supported by EGL.",
+                   meta_gpu_kms_get_file_path (gpu_kms));
+      return NULL;
+    }
+
+  return gpu_kms;
+}
+
 static gboolean
 meta_renderer_native_initable_init (GInitable     *initable,
                                     GCancellable  *cancellable,
@@ -4207,7 +4247,10 @@ meta_renderer_native_initable_init (GInitable     *initable,
     }
 
   renderer_native->primary_gpu_kms = choose_primary_gpu (monitor_manager,
-                                                         renderer_native);
+                                                         renderer_native,
+                                                         error);
+  if (!renderer_native->primary_gpu_kms)
+    return FALSE;
 
   return TRUE;
 }
diff --git a/src/core/display.c b/src/core/display.c
index e1477d3..0de99ed 100644
--- a/src/core/display.c
+++ b/src/core/display.c
@@ -2236,7 +2236,7 @@ meta_display_get_tab_list (MetaDisplay   *display,
         MetaWindow *l_window = w->data;
 
         if (l_window->wm_state_demands_attention &&
-            l_window->workspace != workspace &&
+            !meta_window_located_on_workspace (l_window, workspace) &&
             IN_TAB_CHAIN (l_window, type))
           tab_list = g_list_prepend (tab_list, l_window);
       }
diff --git a/src/core/keybindings.c b/src/core/keybindings.c
index 478d4d8..a99899f 100644
--- a/src/core/keybindings.c
+++ b/src/core/keybindings.c
@@ -2214,6 +2214,8 @@ meta_keybindings_process_event (MetaDisplay        *display,
     {
     case CLUTTER_BUTTON_PRESS:
     case CLUTTER_BUTTON_RELEASE:
+    case CLUTTER_TOUCH_BEGIN:
+    case CLUTTER_TOUCH_END:
       keys->overlay_key_only_pressed = FALSE;
       return FALSE;
 
diff --git a/src/core/startup-notification.c b/src/core/startup-notification.c
index d2d0d13..4cd51ac 100644
--- a/src/core/startup-notification.c
+++ b/src/core/startup-notification.c
@@ -37,7 +37,7 @@
  * OpenOffice or whatever seems to stop launching - people
  * might decide they need to launch it again.
  */
-#define STARTUP_TIMEOUT 15000000
+#define STARTUP_TIMEOUT_MS 15000
 
 enum
 {
@@ -61,12 +61,19 @@ enum
 
 enum
 {
+  SEQ_COMPLETE,
+  N_SEQ_SIGNALS
+};
+
+enum
+{
   CHANGED,
   N_SIGNALS
 };
 
 static guint sn_signals[N_SIGNALS];
 static GParamSpec *sn_props[N_PROPS];
+static guint seq_signals[N_SEQ_SIGNALS];
 static GParamSpec *seq_props[N_SEQ_PROPS];
 
 typedef struct
@@ -106,12 +113,26 @@ G_DEFINE_TYPE_WITH_PRIVATE (MetaStartupSequence,
 
 static void meta_startup_notification_ensure_timeout  (MetaStartupNotification *sn);
 
+static gboolean
+meta_startup_notification_has_pending_sequences (MetaStartupNotification *sn)
+{
+  GSList *l;
+
+  for (l = sn->startup_sequences; l; l = l->next)
+    {
+      if (!meta_startup_sequence_get_completed (l->data))
+        return TRUE;
+    }
+
+  return FALSE;
+}
+
 static void
 meta_startup_notification_update_feedback (MetaStartupNotification *sn)
 {
   MetaDisplay *display = sn->display;
 
-  if (sn->startup_sequences != NULL)
+  if (meta_startup_notification_has_pending_sequences (sn))
     {
       meta_topic (META_DEBUG_STARTUP,
                   "Setting busy cursor\n");
@@ -239,6 +260,14 @@ meta_startup_sequence_class_init (MetaStartupSequenceClass *klass)
   object_class->set_property = meta_startup_sequence_set_property;
   object_class->get_property = meta_startup_sequence_get_property;
 
+  seq_signals[SEQ_COMPLETE] =
+    g_signal_new ("complete",
+                  META_TYPE_STARTUP_SEQUENCE,
+                  G_SIGNAL_RUN_LAST,
+                  G_STRUCT_OFFSET (MetaStartupSequenceClass, complete),
+                  NULL, NULL, NULL,
+                  G_TYPE_NONE, 0);
+
   seq_props[PROP_SEQ_ID] =
     g_param_spec_string ("id",
                          "ID",
@@ -317,7 +346,6 @@ meta_startup_sequence_get_timestamp (MetaStartupSequence *seq)
 void
 meta_startup_sequence_complete (MetaStartupSequence *seq)
 {
-  MetaStartupSequenceClass *klass;
   MetaStartupSequencePrivate *priv;
 
   g_return_if_fail (META_IS_STARTUP_SEQUENCE (seq));
@@ -327,10 +355,7 @@ meta_startup_sequence_complete (MetaStartupSequence *seq)
     return;
 
   priv->completed = TRUE;
-  klass = META_STARTUP_SEQUENCE_GET_CLASS (seq);
-
-  if (klass->complete)
-    klass->complete (seq);
+  g_signal_emit (seq, seq_signals[SEQ_COMPLETE], 0);
 }
 
 gboolean
@@ -399,12 +424,22 @@ meta_startup_sequence_get_wmclass (MetaStartupSequence *seq)
   return priv->wmclass;
 }
 
+static void
+on_sequence_completed (MetaStartupSequence     *seq,
+                       MetaStartupNotification *sn)
+{
+  meta_startup_notification_update_feedback (sn);
+  g_signal_emit (sn, sn_signals[CHANGED], 0, seq);
+}
+
 void
 meta_startup_notification_add_sequence (MetaStartupNotification *sn,
                                         MetaStartupSequence     *seq)
 {
   sn->startup_sequences = g_slist_prepend (sn->startup_sequences,
                                            g_object_ref (seq));
+  g_signal_connect (seq, "complete",
+                    G_CALLBACK (on_sequence_completed), sn);
 
   meta_startup_notification_ensure_timeout (sn);
   meta_startup_notification_update_feedback (sn);
@@ -425,10 +460,10 @@ collect_timed_out_foreach (void *element,
 
   meta_topic (META_DEBUG_STARTUP,
               "Sequence used %" G_GINT64_FORMAT " ms vs. %d max: %s\n",
-              elapsed, STARTUP_TIMEOUT,
+              elapsed, STARTUP_TIMEOUT_MS,
               meta_startup_sequence_get_id (sequence));
 
-  if (elapsed > STARTUP_TIMEOUT)
+  if (elapsed > STARTUP_TIMEOUT_MS)
     ctod->list = g_slist_prepend (ctod->list, sequence);
 }
 
@@ -440,7 +475,7 @@ startup_sequence_timeout (void *data)
   GSList *l;
 
   ctod.list = NULL;
-  ctod.now = g_get_monotonic_time ();
+  ctod.now = g_get_monotonic_time () / 1000;
   g_slist_foreach (sn->startup_sequences,
                    collect_timed_out_foreach,
                    &ctod);
@@ -494,6 +529,8 @@ meta_startup_notification_remove_sequence (MetaStartupNotification *sn,
   sn->startup_sequences = g_slist_remove (sn->startup_sequences, seq);
   meta_startup_notification_update_feedback (sn);
 
+  g_signal_handlers_disconnect_by_func (seq, on_sequence_completed, sn);
+
   if (sn->startup_sequences == NULL &&
       sn->startup_sequence_timeout != 0)
     {
diff --git a/src/wayland/meta-wayland-outputs.c b/src/wayland/meta-wayland-outputs.c
index 7695d86..099e87a 100644
--- a/src/wayland/meta-wayland-outputs.c
+++ b/src/wayland/meta-wayland-outputs.c
@@ -624,14 +624,14 @@ meta_xdg_output_manager_get_xdg_output (struct wl_client   *client,
                                             wl_resource_get_version (resource),
                                             id);
 
-  wl_resource_set_implementation (xdg_output_resource,
-                                  &meta_xdg_output_interface,
-                                  NULL, meta_xdg_output_destructor);
-
   wayland_output = wl_resource_get_user_data (output);
   if (!wayland_output)
     return;
 
+  wl_resource_set_implementation (xdg_output_resource,
+                                  &meta_xdg_output_interface,
+                                  wayland_output, meta_xdg_output_destructor);
+
   wayland_output->xdg_output_resources =
     g_list_prepend (wayland_output->xdg_output_resources, xdg_output_resource);
 
diff --git a/src/x11/meta-startup-notification-x11.c b/src/x11/meta-startup-notification-x11.c
index d681492..99fcf45 100644
--- a/src/x11/meta-startup-notification-x11.c
+++ b/src/x11/meta-startup-notification-x11.c
@@ -151,7 +151,7 @@ meta_startup_sequence_x11_new (SnStartupSequence *seq)
 {
   gint64 timestamp;
 
-  timestamp = sn_startup_sequence_get_timestamp (seq) * 1000;
+  timestamp = sn_startup_sequence_get_timestamp (seq);
   return g_object_new (META_TYPE_STARTUP_SEQUENCE_X11,
                        "id", sn_startup_sequence_get_id (seq),
                        "icon-name", sn_startup_sequence_get_icon_name (seq),
-- 
ubuntu-desktop mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-desktop

Reply via email to